]> git.ipfire.org Git - thirdparty/systemd.git/blame - meson.build
main: introduce a define HIGH_RLIMIT_MEMLOCK similar to HIGH_RLIMIT_NOFILE
[thirdparty/systemd.git] / meson.build
CommitLineData
3a726fcd 1# SPDX-License-Identifier: LGPL-2.1+
3a726fcd 2
5c23128d 3project('systemd', 'c',
de7436b0 4 version : '239',
5c23128d
ZJS
5 license : 'LGPLv2+',
6 default_options: [
37efbbd8
ZJS
7 'c_std=gnu99',
8 'prefix=/usr',
9 'sysconfdir=/etc',
10 'localstatedir=/var',
5c23128d 11 ],
7a6397d2 12 meson_version : '>= 0.46',
5c23128d
ZJS
13 )
14
de7436b0
LP
15libsystemd_version = '0.23.0'
16libudev_version = '1.6.11'
56d50ab1 17
348b4437 18# We need the same data in two different formats, ugh!
5c23128d
ZJS
19# Also, for hysterical reasons, we use different variable
20# names, sometimes. Not all variables are included in every
21# set. Ugh, ugh, ugh!
22conf = configuration_data()
23conf.set_quoted('PACKAGE_STRING', meson.project_name() + ' ' + meson.project_version())
24conf.set_quoted('PACKAGE_VERSION', meson.project_version())
25
26substs = configuration_data()
27substs.set('PACKAGE_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
28substs.set('PACKAGE_VERSION', meson.project_version())
29
c09edc79
ZJS
30want_ossfuzz = get_option('oss-fuzz')
31want_libfuzzer = get_option('llvm-fuzz')
32if want_ossfuzz and want_libfuzzer
33 error('only one of oss-fuzz and llvm-fuzz can be specified')
34endif
35fuzzer_build = want_ossfuzz or want_libfuzzer
36
5c23128d
ZJS
37#####################################################################
38
003c8879
ZJS
39# Try to install the git pre-commit hook
40git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
41if git_hook.returncode() == 0
42 message(git_hook.stdout().strip())
43endif
44
45#####################################################################
46
2675413e
ZJS
47if get_option('split-usr') == 'auto'
48 split_usr = run_command('test', '-L', '/bin').returncode() != 0
49else
50 split_usr = get_option('split-usr') == 'true'
51endif
671f0f8d
ZJS
52conf.set10('HAVE_SPLIT_USR', split_usr,
53 description : '/usr/bin and /bin directories are separate')
9a8e64b0 54
157baa87
ZJS
55if get_option('split-bin') == 'auto'
56 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
57else
58 split_bin = get_option('split-bin') == 'true'
59endif
671f0f8d
ZJS
60conf.set10('HAVE_SPLIT_BIN', split_bin,
61 description : 'bin and sbin directories are separate')
157baa87 62
74344a17 63rootprefixdir = get_option('rootprefix')
74344a17
ZJS
64# Unusual rootprefixdir values are used by some distros
65# (see https://github.com/systemd/systemd/pull/7461).
ba7f4ae6 66rootprefix_default = split_usr ? '/' : '/usr'
9a8e64b0
ZJS
67if rootprefixdir == ''
68 rootprefixdir = rootprefix_default
74344a17 69endif
5c23128d
ZJS
70
71sysvinit_path = get_option('sysvinit-path')
72sysvrcnd_path = get_option('sysvrcnd-path')
348b4437 73conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
349cc4a5 74 description : 'SysV init scripts and rcN.d links are supported')
5c23128d 75
a8b627aa
LP
76conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
77conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
78
5c23128d
ZJS
79# join_paths ignore the preceding arguments if an absolute component is
80# encountered, so this should canonicalize various paths when they are
81# absolute or relative.
82prefixdir = get_option('prefix')
83if not prefixdir.startswith('/')
37efbbd8 84 error('Prefix is not absolute: "@0@"'.format(prefixdir))
5c23128d
ZJS
85endif
86bindir = join_paths(prefixdir, get_option('bindir'))
87libdir = join_paths(prefixdir, get_option('libdir'))
88sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
89includedir = join_paths(prefixdir, get_option('includedir'))
90datadir = join_paths(prefixdir, get_option('datadir'))
91localstatedir = join_paths('/', get_option('localstatedir'))
92
93rootbindir = join_paths(rootprefixdir, 'bin')
157baa87 94rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
5c23128d
ZJS
95rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
96
97rootlibdir = get_option('rootlibdir')
98if rootlibdir == ''
37efbbd8 99 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
5c23128d
ZJS
100endif
101
102# Dirs of external packages
a95696e3
BM
103pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
104pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
e17e5ba9
MB
105polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
106polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
107polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
108varlogdir = join_paths(localstatedir, 'log')
109xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
8a38aac3
YW
110rpmmacrosdir = get_option('rpmmacrosdir')
111if rpmmacrosdir != 'no'
112 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
113endif
02fa054d 114modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
5c23128d
ZJS
115
116# Our own paths
e17e5ba9
MB
117pkgdatadir = join_paths(datadir, 'systemd')
118environmentdir = join_paths(prefixdir, 'lib/environment.d')
119pkgsysconfdir = join_paths(sysconfdir, 'systemd')
120userunitdir = join_paths(prefixdir, 'lib/systemd/user')
121userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
122tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
123sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
124sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
125binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
126modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
127networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
128pkgincludedir = join_paths(includedir, 'systemd')
129systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
130usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
131systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
132userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
133systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
134systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
135systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
136systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
137udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
138udevhomedir = udevlibexecdir
139udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
140udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
141catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
142kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
143factorydir = join_paths(datadir, 'factory')
e17e5ba9
MB
144bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
145testsdir = join_paths(prefixdir, 'lib/systemd/tests')
146systemdstatedir = join_paths(localstatedir, 'lib/systemd')
147catalogstatedir = join_paths(systemdstatedir, 'catalog')
148randomseeddir = join_paths(localstatedir, 'lib/systemd')
61d0578b 149profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
5c23128d 150
75aaade1
TB
151docdir = get_option('docdir')
152if docdir == ''
153 docdir = join_paths(datadir, 'doc/systemd')
154endif
155
5c23128d
ZJS
156dbuspolicydir = get_option('dbuspolicydir')
157if dbuspolicydir == ''
37efbbd8 158 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
5c23128d
ZJS
159endif
160
161dbussessionservicedir = get_option('dbussessionservicedir')
162if dbussessionservicedir == ''
37efbbd8 163 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
5c23128d
ZJS
164endif
165
166dbussystemservicedir = get_option('dbussystemservicedir')
167if dbussystemservicedir == ''
37efbbd8 168 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
5c23128d
ZJS
169endif
170
171pamlibdir = get_option('pamlibdir')
172if pamlibdir == ''
37efbbd8 173 pamlibdir = join_paths(rootlibdir, 'security')
5c23128d
ZJS
174endif
175
176pamconfdir = get_option('pamconfdir')
177if pamconfdir == ''
37efbbd8 178 pamconfdir = join_paths(sysconfdir, 'pam.d')
5c23128d
ZJS
179endif
180
444d5863
ZJS
181memory_accounting_default = get_option('memory-accounting-default')
182
5c23128d 183conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
e17e5ba9 184conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
5c23128d
ZJS
185conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
186conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
187conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
2a4c156d
ZJS
188conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
189conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
96164a39 190
f7c5427c 191conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
96164a39 192
e17e5ba9 193conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
5c23128d
ZJS
194conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
195conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
e17e5ba9
MB
196conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
197conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
198conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
199conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
da495a03 200conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
7f2806d5 201conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
e17e5ba9
MB
202conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
203conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
204conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
205conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
206conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
74344a17 207conf.set_quoted('ROOTPREFIX', rootprefixdir)
3131bfe3 208conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
e17e5ba9
MB
209conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
210conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
5c23128d
ZJS
211conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
212conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
213conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
214conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
215conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
216conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
e17e5ba9
MB
217conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
218conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
e2d41370 219conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
49cdae63 220conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
5c23128d 221conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
e17e5ba9 222conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
5c23128d
ZJS
223conf.set_quoted('LIBDIR', libdir)
224conf.set_quoted('ROOTLIBDIR', rootlibdir)
225conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
226conf.set_quoted('BOOTLIBDIR', bootlibdir)
e17e5ba9
MB
227conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
228conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
229conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
230conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
231conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
232conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
444d5863 233conf.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'true' : 'false')
7f672e86 234conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
5c23128d 235
5c23128d 236substs.set('prefix', prefixdir)
3131bfe3
ZJS
237substs.set('exec_prefix', prefixdir)
238substs.set('libdir', libdir)
239substs.set('rootlibdir', rootlibdir)
240substs.set('includedir', includedir)
5c23128d 241substs.set('pkgsysconfdir', pkgsysconfdir)
3131bfe3
ZJS
242substs.set('bindir', bindir)
243substs.set('rootbindir', rootbindir)
5c23128d
ZJS
244substs.set('rootlibexecdir', rootlibexecdir)
245substs.set('systemunitdir', systemunitdir)
246substs.set('userunitdir', userunitdir)
247substs.set('systempresetdir', systempresetdir)
248substs.set('userpresetdir', userpresetdir)
249substs.set('udevhwdbdir', udevhwdbdir)
250substs.set('udevrulesdir', udevrulesdir)
3131bfe3 251substs.set('udevlibexecdir', udevlibexecdir)
424e80b4 252substs.set('environmentdir', environmentdir)
5c23128d
ZJS
253substs.set('catalogdir', catalogdir)
254substs.set('tmpfilesdir', tmpfilesdir)
255substs.set('sysusersdir', sysusersdir)
256substs.set('sysctldir', sysctldir)
257substs.set('binfmtdir', binfmtdir)
258substs.set('modulesloaddir', modulesloaddir)
424e80b4 259substs.set('modprobedir', modprobedir)
5c23128d
ZJS
260substs.set('systemgeneratordir', systemgeneratordir)
261substs.set('usergeneratordir', usergeneratordir)
262substs.set('systemenvgeneratordir', systemenvgeneratordir)
263substs.set('userenvgeneratordir', userenvgeneratordir)
264substs.set('systemshutdowndir', systemshutdowndir)
265substs.set('systemsleepdir', systemsleepdir)
2a4c156d
ZJS
266substs.set('VARLOGDIR', varlogdir)
267substs.set('CERTIFICATEROOT', get_option('certificate-root'))
e17e5ba9
MB
268substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
269substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
2a4c156d
ZJS
270substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
271substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
272substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
273substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
444d5863 274substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
5c23128d
ZJS
275
276#####################################################################
277
278cc = meson.get_compiler('c')
279pkgconfig = import('pkgconfig')
6e2afb1c 280check_compilation_sh = find_program('tools/meson-check-compilation.sh')
b68dfb9e 281meson_build_sh = find_program('tools/meson-build.sh')
5c23128d 282
d3da291e
ZJS
283want_tests = get_option('tests')
284slow_tests = want_tests != 'false' and get_option('slow-tests')
285install_tests = get_option('install-tests')
286
c09edc79 287cxx = find_program('c++', required : fuzzer_build)
3b2bdd62
ZJS
288if cxx.found()
289 # Used only for tests
290 add_languages('cpp')
9b0ca019 291 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
1b2acaa7 292else
9b0ca019 293 cxx_cmd = ''
94e2523b
ZJS
294endif
295
31e57a35
JR
296if want_libfuzzer
297 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
c09edc79 298elif want_ossfuzz
7db7d5b7
JR
299 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
300endif
301
30a4ddff
YW
302possible_cc_flags = [
303 '-Wextra',
304 '-Werror=undef',
305 '-Wlogical-op',
306 '-Wmissing-include-dirs',
307 '-Wold-style-definition',
308 '-Wpointer-arith',
309 '-Winit-self',
30a4ddff
YW
310 '-Wfloat-equal',
311 '-Wsuggest-attribute=noreturn',
312 '-Werror=missing-prototypes',
313 '-Werror=implicit-function-declaration',
314 '-Werror=missing-declarations',
315 '-Werror=return-type',
316 '-Werror=incompatible-pointer-types',
317 '-Werror=format=2',
318 '-Wstrict-prototypes',
319 '-Wredundant-decls',
320 '-Wmissing-noreturn',
321 '-Wimplicit-fallthrough=5',
322 '-Wshadow',
323 '-Wendif-labels',
324 '-Wstrict-aliasing=2',
325 '-Wwrite-strings',
326 '-Werror=overflow',
b05ecb8c 327 '-Werror=shift-count-overflow',
d28b67d4 328 '-Werror=shift-overflow=2',
30a4ddff
YW
329 '-Wdate-time',
330 '-Wnested-externs',
bf7efeb1
FB
331
332 # negative arguments are correctly detected starting with meson 0.46.
333 '-Wno-unused-parameter',
334 '-Wno-missing-field-initializers',
335 '-Wno-unused-result',
336 '-Wno-format-signedness',
337
338 # work-around for gcc 7.1 turning this on on its own.
339 '-Wno-error=nonnull',
340
341 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
342 # optimizations enabled, producing essentially false positives.
343 '-Wno-maybe-uninitialized',
344
30a4ddff
YW
345 '-ffast-math',
346 '-fno-common',
347 '-fdiagnostics-show-option',
348 '-fno-strict-aliasing',
349 '-fvisibility=hidden',
350 '-fstack-protector',
351 '-fstack-protector-strong',
352 '--param=ssp-buffer-size=4',
353]
354
355# --as-needed and --no-undefined are provided by meson by default,
356# run mesonconf to see what is enabled
357possible_link_flags = [
358 '-Wl,-z,relro',
359 '-Wl,-z,now',
360]
5c23128d 361
7db7d5b7
JR
362# the oss-fuzz fuzzers are not built with -fPIE, so don't
363# enable it when we are linking against them
31e57a35 364if not fuzzer_build
30a4ddff
YW
365 possible_cc_flags += '-fPIE'
366 possible_link_flags += '-pie'
7db7d5b7
JR
367endif
368
30a4ddff
YW
369if cc.get_id() == 'clang'
370 possible_cc_flags += [
371 '-Wno-typedef-redefinition',
372 '-Wno-gnu-variable-sized-type-not-at-end',
373 ]
374endif
375
376if get_option('buildtype') != 'debug'
377 possible_cc_flags += [
378 '-ffunction-sections',
379 '-fdata-sections',
380 ]
381
382 possible_link_flags += '-Wl,--gc-sections'
383endif
384
385add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
7a6397d2 386add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
30a4ddff 387
9e70f2f8 388if cc.compiles('''
5c23128d
ZJS
389 #include <time.h>
390 #include <inttypes.h>
391 typedef uint64_t usec_t;
392 usec_t now(clockid_t clock);
393 int main(void) {
394 struct timespec now;
395 return 0;
396 }
9e70f2f8 397''', name : '-Werror=shadow with local shadowing')
37efbbd8 398 add_project_arguments('-Werror=shadow', language : 'c')
5c23128d
ZJS
399endif
400
0e3cc902 401cpp = ' '.join(cc.cmd_array()) + ' -E'
9cc0e6e9 402
5c23128d
ZJS
403#####################################################################
404# compilation result tests
405
2c201c21
ZJS
406conf.set('_GNU_SOURCE', true)
407conf.set('__SANE_USERSPACE_TYPES__', true)
5c23128d
ZJS
408
409conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
410conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
411conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
412conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
413conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
414conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
415conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
416
417decl_headers = '''
418#include <uchar.h>
419#include <linux/ethtool.h>
bce67bbe 420#include <linux/fib_rules.h>
4c2e1b39 421#include <sys/stat.h>
5c23128d 422'''
5c23128d
ZJS
423
424foreach decl : ['char16_t',
425 'char32_t',
5c23128d 426 'struct ethtool_link_settings',
bce67bbe 427 'struct fib_rule_uid_range',
4c2e1b39 428 'struct statx',
5c23128d 429 ]
2c201c21
ZJS
430
431 # We get -1 if the size cannot be determined
9c869d08
ZJS
432 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
433
434 if decl == 'struct statx'
435 if have
436 want_linux_stat_h = false
437 else
438 have = cc.sizeof(decl,
439 prefix : decl_headers + '#include <linux/stat.h>',
440 args : '-D_GNU_SOURCE') > 0
441 want_linux_stat_h = have
442 endif
443 endif
444
349cc4a5 445 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
5c23128d
ZJS
446endforeach
447
9c869d08 448conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
75720bff 449
5c23128d
ZJS
450foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
451 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
452 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
453 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
d384826f 454 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
5c23128d
ZJS
455 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
456 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
457 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
458 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
459 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
9dfed8dd 460 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
5c23128d
ZJS
461 # if_tunnel.h is buggy and cannot be included on its own
462 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
463 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
464 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
465 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
466 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
467 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
468 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
d384826f 469 ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
5c23128d
ZJS
470 ['NDA_IFINDEX', 'linux/neighbour.h'],
471 ['IFA_FLAGS', 'linux/if_addr.h'],
bce67bbe 472 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
5c23128d 473 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
d6df583c 474 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
53cb501a
SS
475 ['FOU_ATTR_REMCSUM_NOPARTIAL', 'linux/fou.h'],
476 ['FOU_CMD_GET', 'linux/fou.h'],
477 ['FOU_ENCAP_GUE', 'linux/fou.h'],
5c23128d 478 ]
37efbbd8
ZJS
479 prefix = decl.length() > 2 ? decl[2] : ''
480 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
4b9545f1 481 conf.set10('HAVE_' + decl[0], have)
5c23128d
ZJS
482endforeach
483
5c23128d 484foreach ident : ['secure_getenv', '__secure_getenv']
349cc4a5 485 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
5c23128d
ZJS
486endforeach
487
488foreach ident : [
85db59b7 489 ['memfd_create', '''#include <sys/mman.h>'''],
7b961e40
LP
490 ['gettid', '''#include <sys/types.h>
491 #include <unistd.h>'''],
3c042add
LP
492 ['pivot_root', '''#include <stdlib.h>
493 #include <unistd.h>'''], # no known header declares pivot_root
85db59b7 494 ['name_to_handle_at', '''#include <sys/types.h>
37efbbd8
ZJS
495 #include <sys/stat.h>
496 #include <fcntl.h>'''],
85db59b7 497 ['setns', '''#include <sched.h>'''],
2acfd0ff
LP
498 ['renameat2', '''#include <stdio.h>
499 #include <fcntl.h>'''],
37efbbd8
ZJS
500 ['kcmp', '''#include <linux/kcmp.h>'''],
501 ['keyctl', '''#include <sys/types.h>
502 #include <keyutils.h>'''],
85db59b7 503 ['copy_file_range', '''#include <sys/syscall.h>
37efbbd8 504 #include <unistd.h>'''],
71e5200f
DM
505 ['bpf', '''#include <sys/syscall.h>
506 #include <unistd.h>'''],
4c2e1b39
LP
507 ['statx', '''#include <sys/types.h>
508 #include <sys/stat.h>
509 #include <unistd.h>'''],
aa484f35
ZJS
510 ['explicit_bzero' , '''#include <string.h>'''],
511 ['reallocarray', '''#include <malloc.h>'''],
37efbbd8
ZJS
512]
513
85db59b7 514 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
4b9545f1 515 conf.set10('HAVE_' + ident[0].to_upper(), have)
5c23128d
ZJS
516endforeach
517
85db59b7 518if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
349cc4a5 519 conf.set10('USE_SYS_RANDOM_H', true)
4b9545f1 520 conf.set10('HAVE_GETRANDOM', true)
4984c8be
ZJS
521else
522 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
349cc4a5 523 conf.set10('USE_SYS_RANDOM_H', false)
4b9545f1 524 conf.set10('HAVE_GETRANDOM', have)
4984c8be
ZJS
525endif
526
5c23128d
ZJS
527#####################################################################
528
529sed = find_program('sed')
5c23128d 530awk = find_program('awk')
d730e2d1 531m4 = find_program('m4')
5c23128d 532stat = find_program('stat')
d68b342b 533git = find_program('git', required : false)
b68dfb9e 534env = find_program('env')
b1ffacb6 535perl = find_program('perl', required : false)
5c23128d 536
7b76fce1 537meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
94e75a54 538mkdir_p = 'mkdir -p $DESTDIR/@0@'
d83f4f50
ZJS
539test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
540splash_bmp = files('test/splash.bmp')
94e75a54 541
5c23128d
ZJS
542# if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
543# /usr/sbin, /sbin, and fall back to the default from middle column.
2fa645f1 544progs = [['quotaon', '/usr/sbin/quotaon' ],
5c23128d 545 ['quotacheck', '/usr/sbin/quotacheck' ],
5c23128d
ZJS
546 ['kmod', '/usr/bin/kmod' ],
547 ['kexec', '/usr/sbin/kexec' ],
548 ['sulogin', '/usr/sbin/sulogin' ],
549 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
550 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
551 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
552 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
553 ]
554foreach prog : progs
37efbbd8
ZJS
555 path = get_option(prog[0] + '-path')
556 if path != ''
557 message('Using @1@ for @0@'.format(prog[0], path))
558 else
559 exe = find_program(prog[0],
560 '/usr/sbin/' + prog[0],
561 '/sbin/' + prog[0],
562 required: false)
563 path = exe.found() ? exe.path() : prog[1]
564 endif
565 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
566 conf.set_quoted(name, path)
567 substs.set(name, path)
5c23128d
ZJS
568endforeach
569
2fa645f1
MG
570conf.set_quoted('TELINIT', get_option('telinit-path'))
571
1276a9f6 572if run_command('ln', '--relative', '--help').returncode() != 0
cd001016 573 error('ln does not support --relative (added in coreutils 8.16)')
1276a9f6 574endif
5c23128d
ZJS
575
576############################################################
577
578gperf = find_program('gperf')
579
580gperf_test_format = '''
581#include <string.h>
582const char * in_word_set(const char *, @0@);
583@1@
584'''
585gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
586gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
587gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
588if cc.compiles(gperf_test)
37efbbd8 589 gperf_len_type = 'size_t'
5c23128d 590else
37efbbd8
ZJS
591 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
592 if cc.compiles(gperf_test)
593 gperf_len_type = 'unsigned'
594 else
595 error('unable to determine gperf len type')
596 endif
5c23128d
ZJS
597endif
598message('gperf len type is @0@'.format(gperf_len_type))
37efbbd8
ZJS
599conf.set('GPERF_LEN_TYPE', gperf_len_type,
600 description : 'The type of gperf "len" parameter')
5c23128d
ZJS
601
602############################################################
603
604if not cc.has_header('sys/capability.h')
37efbbd8 605 error('POSIX caps headers not found')
5c23128d 606endif
9f555bba
BE
607foreach header : ['crypt.h',
608 'linux/btrfs.h',
5c23128d
ZJS
609 'linux/memfd.h',
610 'linux/vm_sockets.h',
af8786b1 611 'sys/auxv.h',
5c23128d
ZJS
612 'valgrind/memcheck.h',
613 'valgrind/valgrind.h',
614 ]
2c201c21 615
349cc4a5
ZJS
616 conf.set10('HAVE_' + header.underscorify().to_upper(),
617 cc.has_header(header))
5c23128d
ZJS
618endforeach
619
620############################################################
621
622conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
5248e7e1
ZJS
623conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
624gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
5c23128d
ZJS
625
626default_hierarchy = get_option('default-hierarchy')
627conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
628 description : 'default cgroup hierarchy as string')
629if default_hierarchy == 'legacy'
37efbbd8 630 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
5c23128d 631elif default_hierarchy == 'hybrid'
37efbbd8 632 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
5c23128d 633else
37efbbd8 634 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
5c23128d
ZJS
635endif
636
637time_epoch = get_option('time-epoch')
ac09340e 638if time_epoch == -1
37efbbd8 639 NEWS = files('NEWS')
ac09340e 640 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
5c23128d 641endif
5c23128d
ZJS
642conf.set('TIME_EPOCH', time_epoch)
643
644system_uid_max = get_option('system-uid-max')
ac09340e 645if system_uid_max == -1
37efbbd8
ZJS
646 system_uid_max = run_command(
647 awk,
2f62cf35
CMOF
648 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
649 '/etc/login.defs').stdout().strip()
650 if system_uid_max == ''
ac09340e
YW
651 system_uid_max = 999
652 else
653 system_uid_max = system_uid_max.to_int()
2f62cf35 654 endif
5c23128d 655endif
5c23128d
ZJS
656conf.set('SYSTEM_UID_MAX', system_uid_max)
657substs.set('systemuidmax', system_uid_max)
5c23128d 658
5c23128d 659system_gid_max = get_option('system-gid-max')
ac09340e 660if system_gid_max == -1
37efbbd8
ZJS
661 system_gid_max = run_command(
662 awk,
2f62cf35
CMOF
663 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
664 '/etc/login.defs').stdout().strip()
665 if system_gid_max == ''
ac09340e
YW
666 system_gid_max = 999
667 else
668 system_gid_max = system_gid_max.to_int()
2f62cf35 669 endif
5c23128d 670endif
5c23128d
ZJS
671conf.set('SYSTEM_GID_MAX', system_gid_max)
672substs.set('systemgidmax', system_gid_max)
5c23128d 673
ac09340e
YW
674dynamic_uid_min = get_option('dynamic-uid-min')
675dynamic_uid_max = get_option('dynamic-uid-max')
87d5e4f2
LP
676conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
677conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
678substs.set('dynamicuidmin', dynamic_uid_min)
679substs.set('dynamicuidmax', dynamic_uid_max)
680
ac09340e
YW
681container_uid_base_min = get_option('container-uid-base-min')
682container_uid_base_max = get_option('container-uid-base-max')
87d5e4f2
LP
683conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
684conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
685substs.set('containeruidbasemin', container_uid_base_min)
686substs.set('containeruidbasemax', container_uid_base_max)
687
afde4574
LP
688nobody_user = get_option('nobody-user')
689nobody_group = get_option('nobody-group')
690
2484bff3
CQ
691if not meson.is_cross_build()
692 getent_result = run_command('getent', 'passwd', '65534')
693 if getent_result.returncode() == 0
694 name = getent_result.stdout().split(':')[0]
695 if name != nobody_user
696 warning('\n' +
697 'The local user with the UID 65534 does not match the configured user name "@0@" of the nobody user (its name is @1@).\n'.format(nobody_user, name) +
698 'Your build will result in an user table setup that is incompatible with the local system.')
699 endif
afde4574 700 endif
2484bff3
CQ
701 id_result = run_command('id', '-u', nobody_user)
702 if id_result.returncode() == 0
703 id = id_result.stdout().to_int()
704 if id != 65534
705 warning('\n' +
706 'The local user with the configured user name "@0@" of the nobody user does not have UID 65534 (it has @1@).\n'.format(nobody_user, id) +
707 'Your build will result in an user table setup that is incompatible with the local system.')
708 endif
afde4574 709 endif
afde4574 710
2484bff3
CQ
711 getent_result = run_command('getent', 'group', '65534')
712 if getent_result.returncode() == 0
713 name = getent_result.stdout().split(':')[0]
714 if name != nobody_group
715 warning('\n' +
716 'The local group with the GID 65534 does not match the configured group name "@0@" of the nobody group (its name is @1@).\n'.format(nobody_group, name) +
717 'Your build will result in an group table setup that is incompatible with the local system.')
718 endif
afde4574 719 endif
2484bff3
CQ
720 id_result = run_command('id', '-g', nobody_group)
721 if id_result.returncode() == 0
722 id = id_result.stdout().to_int()
723 if id != 65534
724 warning('\n' +
725 'The local group with the configured group name "@0@" of the nobody group does not have UID 65534 (it has @1@).\n'.format(nobody_group, id) +
726 'Your build will result in an group table setup that is incompatible with the local system.')
727 endif
afde4574
LP
728 endif
729endif
8374cc62 730if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
8ea9fad7
YW
731 warning('\n' +
732 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
733 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
8374cc62 734endif
afde4574
LP
735
736conf.set_quoted('NOBODY_USER_NAME', nobody_user)
737conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
60712021
YW
738substs.set('NOBODY_USER_NAME', nobody_user)
739substs.set('NOBODY_GROUP_NAME', nobody_group)
87d5e4f2 740
5c23128d
ZJS
741tty_gid = get_option('tty-gid')
742conf.set('TTY_GID', tty_gid)
2a4c156d 743substs.set('TTY_GID', tty_gid)
5c23128d 744
84786b8e 745# Ensure provided GID argument is numeric, otherwise fallback to default assignment
ac09340e
YW
746users_gid = get_option('users-gid')
747substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
84786b8e 748
348b4437
YW
749conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
750conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
5c23128d 751
ace5e311
MB
752dev_kvm_mode = get_option('dev-kvm-mode')
753substs.set('DEV_KVM_MODE', dev_kvm_mode)
754conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
4e15a734 755substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
5c23128d 756
2a4c156d
ZJS
757kill_user_processes = get_option('default-kill-user-processes')
758conf.set10('KILL_USER_PROCESSES', kill_user_processes)
c7f7e859 759conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
2a4c156d 760substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
5c23128d 761
829257d1
ZJS
762dns_servers = get_option('dns-servers')
763conf.set_quoted('DNS_SERVERS', dns_servers)
764substs.set('DNS_SERVERS', dns_servers)
5c23128d 765
829257d1
ZJS
766ntp_servers = get_option('ntp-servers')
767conf.set_quoted('NTP_SERVERS', ntp_servers)
768substs.set('NTP_SERVERS', ntp_servers)
5c23128d
ZJS
769
770conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
771
3131bfe3
ZJS
772substs.set('SUSHELL', get_option('debug-shell'))
773substs.set('DEBUGTTY', get_option('debug-tty'))
774
349cc4a5
ZJS
775enable_debug_hashmap = false
776enable_debug_mmap_cache = false
8f6b442a 777foreach name : get_option('debug-extra')
ad7aa760
YW
778 if name == 'hashmap'
779 enable_debug_hashmap = true
780 elif name == 'mmap-cache'
781 enable_debug_mmap_cache = true
782 else
783 message('unknown debug option "@0@", ignoring'.format(name))
784 endif
785endforeach
349cc4a5
ZJS
786conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
787conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
671677da 788
d18cb393 789conf.set10('VALGRIND', get_option('valgrind'))
fd5dec9a 790conf.set10('LOG_TRACE', get_option('log-trace'))
d18cb393 791
5c23128d
ZJS
792#####################################################################
793
794threads = dependency('threads')
795librt = cc.find_library('rt')
796libm = cc.find_library('m')
797libdl = cc.find_library('dl')
798libcrypt = cc.find_library('crypt')
799
1800cc85
ZJS
800libcap = dependency('libcap', required : false)
801if not libcap.found()
802 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
803 libcap = cc.find_library('cap')
804endif
805
5c23128d 806libmount = dependency('mount',
c0b4b0f8 807 version : fuzzer_build ? '>= 0' : '>= 2.30')
5c23128d
ZJS
808
809want_seccomp = get_option('seccomp')
31e57a35 810if want_seccomp != 'false' and not fuzzer_build
37efbbd8 811 libseccomp = dependency('libseccomp',
9f0e9c01 812 version : '>= 2.3.1',
37efbbd8 813 required : want_seccomp == 'true')
349cc4a5 814 have = libseccomp.found()
5c23128d 815else
349cc4a5 816 have = false
37efbbd8 817 libseccomp = []
5c23128d 818endif
349cc4a5 819conf.set10('HAVE_SECCOMP', have)
5c23128d
ZJS
820
821want_selinux = get_option('selinux')
31e57a35 822if want_selinux != 'false' and not fuzzer_build
37efbbd8
ZJS
823 libselinux = dependency('libselinux',
824 version : '>= 2.1.9',
825 required : want_selinux == 'true')
349cc4a5 826 have = libselinux.found()
5c23128d 827else
349cc4a5 828 have = false
37efbbd8 829 libselinux = []
5c23128d 830endif
349cc4a5 831conf.set10('HAVE_SELINUX', have)
5c23128d
ZJS
832
833want_apparmor = get_option('apparmor')
31e57a35 834if want_apparmor != 'false' and not fuzzer_build
37efbbd8
ZJS
835 libapparmor = dependency('libapparmor',
836 required : want_apparmor == 'true')
349cc4a5 837 have = libapparmor.found()
5c23128d 838else
349cc4a5 839 have = false
37efbbd8 840 libapparmor = []
5c23128d 841endif
349cc4a5 842conf.set10('HAVE_APPARMOR', have)
5c23128d 843
5c23128d
ZJS
844smack_run_label = get_option('smack-run-label')
845if smack_run_label != ''
37efbbd8 846 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
5c23128d
ZJS
847endif
848
3ca0cb73
ZJS
849want_polkit = get_option('polkit')
850install_polkit = false
851install_polkit_pkla = false
31e57a35 852if want_polkit != 'false' and not fuzzer_build
37efbbd8 853 install_polkit = true
3ca0cb73 854
37efbbd8
ZJS
855 libpolkit = dependency('polkit-gobject-1',
856 required : false)
857 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
858 message('Old polkit detected, will install pkla files')
859 install_polkit_pkla = true
860 endif
3ca0cb73 861endif
349cc4a5 862conf.set10('ENABLE_POLKIT', install_polkit)
3ca0cb73 863
36f0387e 864want_acl = get_option('acl')
31e57a35 865if want_acl != 'false' and not fuzzer_build
36f0387e 866 libacl = cc.find_library('acl', required : want_acl == 'true')
349cc4a5 867 have = libacl.found()
36f0387e 868else
349cc4a5 869 have = false
36f0387e
ZJS
870 libacl = []
871endif
349cc4a5 872conf.set10('HAVE_ACL', have)
36f0387e 873
5c23128d 874want_audit = get_option('audit')
31e57a35 875if want_audit != 'false' and not fuzzer_build
37efbbd8 876 libaudit = dependency('audit', required : want_audit == 'true')
349cc4a5 877 have = libaudit.found()
5c23128d 878else
349cc4a5 879 have = false
37efbbd8 880 libaudit = []
5c23128d 881endif
349cc4a5 882conf.set10('HAVE_AUDIT', have)
5c23128d
ZJS
883
884want_blkid = get_option('blkid')
31e57a35 885if want_blkid != 'false' and not fuzzer_build
37efbbd8 886 libblkid = dependency('blkid', required : want_blkid == 'true')
349cc4a5 887 have = libblkid.found()
5c23128d 888else
349cc4a5 889 have = false
37efbbd8 890 libblkid = []
5c23128d 891endif
349cc4a5 892conf.set10('HAVE_BLKID', have)
5c23128d
ZJS
893
894want_kmod = get_option('kmod')
31e57a35 895if want_kmod != 'false' and not fuzzer_build
37efbbd8
ZJS
896 libkmod = dependency('libkmod',
897 version : '>= 15',
898 required : want_kmod == 'true')
349cc4a5 899 have = libkmod.found()
5c23128d 900else
349cc4a5 901 have = false
37efbbd8 902 libkmod = []
5c23128d 903endif
349cc4a5 904conf.set10('HAVE_KMOD', have)
5c23128d
ZJS
905
906want_pam = get_option('pam')
31e57a35 907if want_pam != 'false' and not fuzzer_build
37efbbd8
ZJS
908 libpam = cc.find_library('pam', required : want_pam == 'true')
909 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
349cc4a5 910 have = libpam.found() and libpam_misc.found()
5c23128d 911else
349cc4a5 912 have = false
37efbbd8
ZJS
913 libpam = []
914 libpam_misc = []
5c23128d 915endif
349cc4a5 916conf.set10('HAVE_PAM', have)
5c23128d
ZJS
917
918want_microhttpd = get_option('microhttpd')
31e57a35 919if want_microhttpd != 'false' and not fuzzer_build
37efbbd8
ZJS
920 libmicrohttpd = dependency('libmicrohttpd',
921 version : '>= 0.9.33',
922 required : want_microhttpd == 'true')
349cc4a5 923 have = libmicrohttpd.found()
5c23128d 924else
349cc4a5 925 have = false
37efbbd8 926 libmicrohttpd = []
5c23128d 927endif
349cc4a5 928conf.set10('HAVE_MICROHTTPD', have)
5c23128d
ZJS
929
930want_libcryptsetup = get_option('libcryptsetup')
31e57a35 931if want_libcryptsetup != 'false' and not fuzzer_build
37efbbd8
ZJS
932 libcryptsetup = dependency('libcryptsetup',
933 version : '>= 1.6.0',
934 required : want_libcryptsetup == 'true')
349cc4a5 935 have = libcryptsetup.found()
a9fc6406
DJL
936 have_sector = cc.has_member(
937 'struct crypt_params_plain',
938 'sector_size',
939 prefix : '#include <libcryptsetup.h>')
5c23128d 940else
349cc4a5 941 have = false
a9fc6406 942 have_sector = false
37efbbd8 943 libcryptsetup = []
5c23128d 944endif
349cc4a5 945conf.set10('HAVE_LIBCRYPTSETUP', have)
a9fc6406 946conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
5c23128d
ZJS
947
948want_libcurl = get_option('libcurl')
31e57a35 949if want_libcurl != 'false' and not fuzzer_build
37efbbd8
ZJS
950 libcurl = dependency('libcurl',
951 version : '>= 7.32.0',
952 required : want_libcurl == 'true')
349cc4a5 953 have = libcurl.found()
5c23128d 954else
349cc4a5 955 have = false
37efbbd8 956 libcurl = []
5c23128d 957endif
349cc4a5 958conf.set10('HAVE_LIBCURL', have)
5c23128d
ZJS
959
960want_libidn = get_option('libidn')
87057e24
ZJS
961want_libidn2 = get_option('libidn2')
962if want_libidn == 'true' and want_libidn2 == 'true'
963 error('libidn and libidn2 cannot be requested simultaneously')
964endif
965
31e57a35 966if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
7f7ab228
ZJS
967 libidn = dependency('libidn',
968 required : want_libidn == 'true')
349cc4a5 969 have = libidn.found()
87057e24 970else
349cc4a5 971 have = false
87057e24
ZJS
972 libidn = []
973endif
349cc4a5 974conf.set10('HAVE_LIBIDN', have)
31e57a35 975if not have and want_libidn2 != 'false' and not fuzzer_build
7f7ab228
ZJS
976 # libidn is used for both libidn and libidn2 objects
977 libidn = dependency('libidn2',
978 required : want_libidn2 == 'true')
349cc4a5
ZJS
979 have = libidn.found()
980else
981 have = false
5c23128d 982endif
349cc4a5 983conf.set10('HAVE_LIBIDN2', have)
5c23128d
ZJS
984
985want_libiptc = get_option('libiptc')
31e57a35 986if want_libiptc != 'false' and not fuzzer_build
37efbbd8
ZJS
987 libiptc = dependency('libiptc',
988 required : want_libiptc == 'true')
349cc4a5 989 have = libiptc.found()
5c23128d 990else
349cc4a5 991 have = false
37efbbd8 992 libiptc = []
5c23128d 993endif
349cc4a5 994conf.set10('HAVE_LIBIPTC', have)
5c23128d
ZJS
995
996want_qrencode = get_option('qrencode')
31e57a35 997if want_qrencode != 'false' and not fuzzer_build
37efbbd8
ZJS
998 libqrencode = dependency('libqrencode',
999 required : want_qrencode == 'true')
349cc4a5 1000 have = libqrencode.found()
5c23128d 1001else
349cc4a5 1002 have = false
37efbbd8 1003 libqrencode = []
5c23128d 1004endif
349cc4a5 1005conf.set10('HAVE_QRENCODE', have)
5c23128d 1006
a44fb601 1007want_gcrypt = get_option('gcrypt')
31e57a35 1008if want_gcrypt != 'false' and not fuzzer_build
a44fb601
ZJS
1009 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1010 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
349cc4a5 1011 have = libgcrypt.found() and libgpg_error.found()
a44fb601 1012else
349cc4a5
ZJS
1013 have = false
1014endif
1015if not have
1016 # link to neither of the libs if one is not found
a44fb601
ZJS
1017 libgcrypt = []
1018 libgpg_error = []
1019endif
349cc4a5 1020conf.set10('HAVE_GCRYPT', have)
a44fb601 1021
5c23128d 1022want_gnutls = get_option('gnutls')
31e57a35 1023if want_gnutls != 'false' and not fuzzer_build
37efbbd8
ZJS
1024 libgnutls = dependency('gnutls',
1025 version : '>= 3.1.4',
1026 required : want_gnutls == 'true')
349cc4a5 1027 have = libgnutls.found()
5c23128d 1028else
349cc4a5 1029 have = false
37efbbd8 1030 libgnutls = []
5c23128d 1031endif
349cc4a5 1032conf.set10('HAVE_GNUTLS', have)
5c23128d 1033
096cbdce
IT
1034want_openssl = get_option('openssl')
1035if want_openssl != 'false' and not fuzzer_build
1036 libopenssl = dependency('openssl',
1037 version : '>= 1.1.0',
1038 required : want_openssl == 'true')
1039 have = libopenssl.found()
1040else
1041 have = false
1042 libopenssl = []
1043endif
1044conf.set10('HAVE_OPENSSL', have)
1045
5c23128d 1046want_elfutils = get_option('elfutils')
31e57a35 1047if want_elfutils != 'false' and not fuzzer_build
37efbbd8
ZJS
1048 libdw = dependency('libdw',
1049 required : want_elfutils == 'true')
349cc4a5 1050 have = libdw.found()
5c23128d 1051else
349cc4a5 1052 have = false
37efbbd8 1053 libdw = []
5c23128d 1054endif
349cc4a5 1055conf.set10('HAVE_ELFUTILS', have)
5c23128d
ZJS
1056
1057want_zlib = get_option('zlib')
31e57a35 1058if want_zlib != 'false' and not fuzzer_build
37efbbd8
ZJS
1059 libz = dependency('zlib',
1060 required : want_zlib == 'true')
349cc4a5 1061 have = libz.found()
5c23128d 1062else
349cc4a5 1063 have = false
37efbbd8 1064 libz = []
5c23128d 1065endif
349cc4a5 1066conf.set10('HAVE_ZLIB', have)
5c23128d
ZJS
1067
1068want_bzip2 = get_option('bzip2')
31e57a35 1069if want_bzip2 != 'false' and not fuzzer_build
37efbbd8
ZJS
1070 libbzip2 = cc.find_library('bz2',
1071 required : want_bzip2 == 'true')
349cc4a5 1072 have = libbzip2.found()
5c23128d 1073else
349cc4a5 1074 have = false
37efbbd8 1075 libbzip2 = []
5c23128d 1076endif
349cc4a5 1077conf.set10('HAVE_BZIP2', have)
5c23128d
ZJS
1078
1079want_xz = get_option('xz')
31e57a35 1080if want_xz != 'false' and not fuzzer_build
37efbbd8
ZJS
1081 libxz = dependency('liblzma',
1082 required : want_xz == 'true')
349cc4a5 1083 have = libxz.found()
5c23128d 1084else
349cc4a5 1085 have = false
37efbbd8 1086 libxz = []
5c23128d 1087endif
349cc4a5 1088conf.set10('HAVE_XZ', have)
5c23128d
ZJS
1089
1090want_lz4 = get_option('lz4')
31e57a35 1091if want_lz4 != 'false' and not fuzzer_build
37efbbd8
ZJS
1092 liblz4 = dependency('liblz4',
1093 required : want_lz4 == 'true')
349cc4a5 1094 have = liblz4.found()
5c23128d 1095else
349cc4a5 1096 have = false
37efbbd8 1097 liblz4 = []
5c23128d 1098endif
349cc4a5 1099conf.set10('HAVE_LZ4', have)
5c23128d 1100
a44fb601 1101want_xkbcommon = get_option('xkbcommon')
31e57a35 1102if want_xkbcommon != 'false' and not fuzzer_build
a44fb601
ZJS
1103 libxkbcommon = dependency('xkbcommon',
1104 version : '>= 0.3.0',
1105 required : want_xkbcommon == 'true')
349cc4a5 1106 have = libxkbcommon.found()
a44fb601 1107else
349cc4a5 1108 have = false
a44fb601
ZJS
1109 libxkbcommon = []
1110endif
349cc4a5 1111conf.set10('HAVE_XKBCOMMON', have)
a44fb601 1112
c4c978a0
ZJS
1113want_pcre2 = get_option('pcre2')
1114if want_pcre2 != 'false'
1115 libpcre2 = dependency('libpcre2-8',
1116 required : want_pcre2 == 'true')
1117 have = libpcre2.found()
1118else
1119 have = false
1120 libpcre2 = []
1121endif
1122conf.set10('HAVE_PCRE2', have)
1123
69e96427 1124want_glib = get_option('glib')
31e57a35 1125if want_glib != 'false' and not fuzzer_build
37efbbd8
ZJS
1126 libglib = dependency('glib-2.0',
1127 version : '>= 2.22.0',
1128 required : want_glib == 'true')
1129 libgobject = dependency('gobject-2.0',
1130 version : '>= 2.22.0',
1131 required : want_glib == 'true')
1132 libgio = dependency('gio-2.0',
1133 required : want_glib == 'true')
2c201c21 1134 have = libglib.found() and libgobject.found() and libgio.found()
69e96427 1135else
349cc4a5 1136 have = false
37efbbd8
ZJS
1137 libglib = []
1138 libgobject = []
1139 libgio = []
69e96427 1140endif
349cc4a5 1141conf.set10('HAVE_GLIB', have)
69e96427
ZJS
1142
1143want_dbus = get_option('dbus')
31e57a35 1144if want_dbus != 'false' and not fuzzer_build
37efbbd8
ZJS
1145 libdbus = dependency('dbus-1',
1146 version : '>= 1.3.2',
1147 required : want_dbus == 'true')
349cc4a5 1148 have = libdbus.found()
69e96427 1149else
349cc4a5 1150 have = false
37efbbd8 1151 libdbus = []
69e96427 1152endif
349cc4a5 1153conf.set10('HAVE_DBUS', have)
69e96427 1154
42303dcb 1155default_dnssec = get_option('default-dnssec')
31e57a35 1156if fuzzer_build
b4081f3e
JR
1157 default_dnssec = 'no'
1158endif
349cc4a5 1159if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
42303dcb
YW
1160 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1161 default_dnssec = 'no'
1162endif
1163conf.set('DEFAULT_DNSSEC_MODE',
1164 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1165substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1166
56ddbf10
YW
1167dns_over_tls = get_option('dns-over-tls')
1168if dns_over_tls != 'false'
096cbdce
IT
1169 if dns_over_tls == 'openssl'
1170 have_gnutls = false
1171 else
1172 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1173 if dns_over_tls == 'gnutls' and not have_gnutls
1174 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1175 endif
56ddbf10 1176 endif
096cbdce
IT
1177 if dns_over_tls == 'gnutls' or have_gnutls
1178 have_openssl = false
1179 else
1180 have_openssl = conf.get('HAVE_OPENSSL') == 1
1181 if dns_over_tls != 'auto' and not have_openssl
1182 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1183 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1184 endif
1185 endif
1186 have = have_gnutls or have_openssl
56ddbf10 1187else
096cbdce 1188 have = have_gnutls = have_openssl = false
56ddbf10
YW
1189endif
1190conf.set10('ENABLE_DNS_OVER_TLS', have)
096cbdce
IT
1191conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1192conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
56ddbf10 1193
c9299be2 1194default_dns_over_tls = get_option('default-dns-over-tls')
5d67a7ae 1195if fuzzer_build
c9299be2 1196 default_dns_over_tls = 'no'
5d67a7ae 1197endif
56ddbf10
YW
1198if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1199 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
c9299be2 1200 default_dns_over_tls = 'no'
5d67a7ae 1201endif
c9299be2
IT
1202conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1203 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1204substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
5d67a7ae 1205
5c23128d 1206want_importd = get_option('importd')
4390be30 1207if want_importd != 'false'
349cc4a5
ZJS
1208 have = (conf.get('HAVE_LIBCURL') == 1 and
1209 conf.get('HAVE_ZLIB') == 1 and
349cc4a5
ZJS
1210 conf.get('HAVE_XZ') == 1 and
1211 conf.get('HAVE_GCRYPT') == 1)
1212 if want_importd == 'true' and not have
37efbbd8
ZJS
1213 error('importd support was requested, but dependencies are not available')
1214 endif
349cc4a5
ZJS
1215else
1216 have = false
5c23128d 1217endif
349cc4a5 1218conf.set10('ENABLE_IMPORTD', have)
5c23128d
ZJS
1219
1220want_remote = get_option('remote')
4390be30 1221if want_remote != 'false'
349cc4a5
ZJS
1222 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1223 conf.get('HAVE_LIBCURL') == 1]
37efbbd8
ZJS
1224 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1225 # it's possible to build one without the other. Complain only if
1226 # support was explictly requested. The auxiliary files like sysusers
1227 # config should be installed when any of the programs are built.
1228 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1229 error('remote support was requested, but dependencies are not available')
1230 endif
349cc4a5
ZJS
1231 have = have_deps[0] or have_deps[1]
1232else
1233 have = false
5c23128d 1234endif
349cc4a5 1235conf.set10('ENABLE_REMOTE', have)
5c23128d 1236
a9149d87
ZJS
1237foreach term : ['utmp',
1238 'hibernate',
1239 'environment-d',
1240 'binfmt',
1241 'coredump',
1242 'resolve',
1243 'logind',
1244 'hostnamed',
1245 'localed',
1246 'machined',
61d0578b 1247 'portabled',
a9149d87
ZJS
1248 'networkd',
1249 'timedated',
1250 'timesyncd',
a9149d87
ZJS
1251 'firstboot',
1252 'randomseed',
1253 'backlight',
1254 'vconsole',
1255 'quotacheck',
1256 'sysusers',
1257 'tmpfiles',
1258 'hwdb',
1259 'rfkill',
1260 'ldconfig',
1261 'efi',
1262 'tpm',
1263 'ima',
1264 'smack',
1265 'gshadow',
1266 'idn',
08540a95 1267 'nss-myhostname',
a9149d87
ZJS
1268 'nss-systemd']
1269 have = get_option(term)
1270 name = 'ENABLE_' + term.underscorify().to_upper()
1271 conf.set10(name, have)
5c23128d
ZJS
1272endforeach
1273
08540a95
YW
1274foreach tuple : [['nss-mymachines', 'machined'],
1275 ['nss-resolve', 'resolve']]
1276 want = get_option(tuple[0])
1277 if want != 'false'
1278 have = get_option(tuple[1])
1279 if want == 'true' and not have
1280 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1281 endif
1282 else
1283 have = false
1284 endif
1285 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1286 conf.set10(name, have)
1287endforeach
1288
1289enable_nss = false
1290foreach term : ['ENABLE_NSS_MYHOSTNAME',
1291 'ENABLE_NSS_MYMACHINES',
1292 'ENABLE_NSS_RESOLVE',
1293 'ENABLE_NSS_SYSTEMD']
1294 if conf.get(term) == 1
1295 enable_nss = true
1296 endif
1297endforeach
1298conf.set10('ENABLE_NSS', enable_nss)
1299
348b4437 1300conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
6129ec85 1301
69e96427 1302tests = []
7db7d5b7 1303fuzzers = []
69e96427 1304
b68dfb9e 1305conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
00d82c81 1306
5c23128d
ZJS
1307#####################################################################
1308
1309if get_option('efi')
37efbbd8 1310 efi_arch = host_machine.cpu_family()
b710072d 1311
6800fe7f 1312 if efi_arch == 'x86'
37efbbd8 1313 EFI_MACHINE_TYPE_NAME = 'ia32'
6800fe7f 1314 gnu_efi_arch = 'ia32'
37efbbd8
ZJS
1315 elif efi_arch == 'x86_64'
1316 EFI_MACHINE_TYPE_NAME = 'x64'
6800fe7f 1317 gnu_efi_arch = 'x86_64'
37efbbd8
ZJS
1318 elif efi_arch == 'arm'
1319 EFI_MACHINE_TYPE_NAME = 'arm'
6800fe7f 1320 gnu_efi_arch = 'arm'
37efbbd8
ZJS
1321 elif efi_arch == 'aarch64'
1322 EFI_MACHINE_TYPE_NAME = 'aa64'
6800fe7f 1323 gnu_efi_arch = 'aarch64'
37efbbd8
ZJS
1324 else
1325 EFI_MACHINE_TYPE_NAME = ''
6800fe7f 1326 gnu_efi_arch = ''
37efbbd8 1327 endif
5c23128d 1328
349cc4a5 1329 have = true
37efbbd8 1330 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
80c6fce8 1331
ac09340e 1332 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
349cc4a5
ZJS
1333else
1334 have = false
5c23128d 1335endif
349cc4a5 1336conf.set10('ENABLE_EFI', have)
5c23128d
ZJS
1337
1338#####################################################################
1339
1340config_h = configure_file(
37efbbd8
ZJS
1341 output : 'config.h',
1342 configuration : conf)
5c23128d 1343
348b4437
YW
1344meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1345
5c23128d
ZJS
1346includes = include_directories('src/basic',
1347 'src/shared',
1348 'src/systemd',
1349 'src/journal',
a38f7fec 1350 'src/journal-remote',
97d90615 1351 'src/nspawn',
5c23128d
ZJS
1352 'src/resolve',
1353 'src/timesync',
5c3376ef 1354 'src/time-wait-sync',
5c23128d
ZJS
1355 'src/login',
1356 'src/udev',
1357 'src/libudev',
1358 'src/core',
1359 'src/libsystemd/sd-bus',
1360 'src/libsystemd/sd-device',
1361 'src/libsystemd/sd-hwdb',
1362 'src/libsystemd/sd-id128',
1363 'src/libsystemd/sd-netlink',
1364 'src/libsystemd/sd-network',
1365 'src/libsystemd-network',
2d4ceca8 1366 '.')
5c23128d
ZJS
1367
1368add_project_arguments('-include', 'config.h', language : 'c')
1369
5c23128d
ZJS
1370subdir('po')
1371subdir('catalog')
1372subdir('src/systemd')
1373subdir('src/basic')
1374subdir('src/libsystemd')
1375subdir('src/libsystemd-network')
5c23128d 1376subdir('src/journal')
5c23128d 1377subdir('src/login')
5c23128d
ZJS
1378
1379libjournal_core = static_library(
37efbbd8
ZJS
1380 'journal-core',
1381 libjournal_core_sources,
1382 journald_gperf_c,
1383 include_directories : includes,
1384 install : false)
5c23128d 1385
37ab1a25 1386libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
5c23128d 1387libsystemd = shared_library(
37efbbd8 1388 'systemd',
a5d8835c 1389 disable_mempool_c,
56d50ab1 1390 version : libsystemd_version,
37efbbd8
ZJS
1391 include_directories : includes,
1392 link_args : ['-shared',
1393 '-Wl,--version-script=' + libsystemd_sym_path],
34e221a5
ZJS
1394 link_with : [libbasic,
1395 libbasic_gcrypt],
5e3cec87
ZJS
1396 link_whole : [libsystemd_static,
1397 libjournal_client],
37efbbd8
ZJS
1398 dependencies : [threads,
1399 librt,
1400 libxz,
1401 liblz4],
1402 link_depends : libsystemd_sym,
1403 install : true,
1404 install_dir : rootlibdir)
5c23128d 1405
70848ecf
DC
1406static_libsystemd = get_option('static-libsystemd')
1407static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1408
1409install_libsystemd_static = static_library(
1410 'systemd',
1411 libsystemd_sources,
1412 journal_client_sources,
975464e0
ZJS
1413 basic_sources,
1414 basic_gcrypt_sources,
be44b572 1415 disable_mempool_c,
70848ecf 1416 include_directories : includes,
70848ecf
DC
1417 build_by_default : static_libsystemd != 'false',
1418 install : static_libsystemd != 'false',
1419 install_dir : rootlibdir,
1420 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1421 dependencies : [threads,
1422 librt,
1423 libxz,
1424 liblz4,
975464e0
ZJS
1425 libcap,
1426 libblkid,
1427 libmount,
1428 libselinux,
70848ecf
DC
1429 libgcrypt],
1430 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1431
5c23128d
ZJS
1432############################################################
1433
83b6af36
ZJS
1434# binaries that have --help and are intended for use by humans,
1435# usually, but not always, installed in /bin.
1436public_programs = []
1437
1438subdir('src/libudev')
1439subdir('src/shared')
1440subdir('src/core')
1441subdir('src/udev')
1442subdir('src/network')
1443
1444subdir('src/analyze')
1445subdir('src/journal-remote')
1446subdir('src/coredump')
1447subdir('src/hostname')
1448subdir('src/import')
1449subdir('src/kernel-install')
1450subdir('src/locale')
1451subdir('src/machine')
61d0578b 1452subdir('src/portable')
83b6af36
ZJS
1453subdir('src/nspawn')
1454subdir('src/resolve')
1455subdir('src/timedate')
1456subdir('src/timesync')
1457subdir('src/vconsole')
83b6af36
ZJS
1458subdir('src/boot/efi')
1459
1460subdir('src/test')
7db7d5b7 1461subdir('src/fuzz')
6b97bf22 1462subdir('rules')
83b6af36
ZJS
1463subdir('test')
1464
1465############################################################
1466
1467# only static linking apart from libdl, to make sure that the
1468# module is linked to all libraries that it uses.
1469test_dlopen = executable(
37efbbd8
ZJS
1470 'test-dlopen',
1471 test_dlopen_c,
a5d8835c 1472 disable_mempool_c,
37efbbd8
ZJS
1473 include_directories : includes,
1474 link_with : [libbasic],
fd1939fb
YW
1475 dependencies : [libdl],
1476 build_by_default : want_tests != 'false')
83b6af36 1477
08540a95 1478foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
e7e11bbf 1479 ['systemd', 'ENABLE_NSS_SYSTEMD'],
08540a95
YW
1480 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1481 ['resolve', 'ENABLE_NSS_RESOLVE']]
5c23128d 1482
349cc4a5 1483 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
37efbbd8
ZJS
1484 if condition
1485 module = tuple[0]
37efbbd8
ZJS
1486
1487 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
243e5cec 1488 version_script_arg = join_paths(meson.source_root(), sym)
37efbbd8
ZJS
1489
1490 nss = shared_library(
1491 'nss_' + module,
1492 'src/nss-@0@/nss-@0@.c'.format(module),
a5d8835c 1493 disable_mempool_c,
37efbbd8
ZJS
1494 version : '2',
1495 include_directories : includes,
b4b36f44
LP
1496 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1497 link_args : ['-Wl,-z,nodelete',
1498 '-shared',
37efbbd8
ZJS
1499 '-Wl,--version-script=' + version_script_arg,
1500 '-Wl,--undefined'],
37e4d7a8 1501 link_with : [libsystemd_static,
37efbbd8
ZJS
1502 libbasic],
1503 dependencies : [threads,
5486a31d 1504 librt],
37efbbd8
ZJS
1505 link_depends : sym,
1506 install : true,
1507 install_dir : rootlibdir)
1508
1509 # We cannot use shared_module because it does not support version suffix.
1510 # Unfortunately shared_library insists on creating the symlink…
1511 meson.add_install_script('sh', '-c',
1512 'rm $DESTDIR@0@/libnss_@1@.so'
1513 .format(rootlibdir, module))
1514
938be089
ZJS
1515 if want_tests != 'false'
1516 test('dlopen-nss_' + module,
1517 test_dlopen,
1518 # path to dlopen must include a slash
1519 args : nss.full_path())
1520 endif
37efbbd8 1521 endif
5c23128d
ZJS
1522endforeach
1523
1524############################################################
1525
5c23128d
ZJS
1526executable('systemd',
1527 systemd_sources,
1528 include_directories : includes,
1529 link_with : [libcore,
34ce0a52 1530 libshared],
5c23128d
ZJS
1531 dependencies : [threads,
1532 librt,
1533 libseccomp,
1534 libselinux,
f4ee10a2
ZJS
1535 libmount,
1536 libblkid],
421f0012 1537 install_rpath : rootlibexecdir,
5c23128d
ZJS
1538 install : true,
1539 install_dir : rootlibexecdir)
1540
ba7f4ae6
ZJS
1541meson.add_install_script(meson_make_symlink,
1542 join_paths(rootlibexecdir, 'systemd'),
1543 join_paths(rootsbindir, 'init'))
1544
005a29f2
ZJS
1545exe = executable('systemd-analyze',
1546 systemd_analyze_sources,
1547 include_directories : includes,
1548 link_with : [libcore,
005a29f2
ZJS
1549 libshared],
1550 dependencies : [threads,
1551 librt,
1552 libseccomp,
1553 libselinux,
1554 libmount,
1555 libblkid],
1556 install_rpath : rootlibexecdir,
1557 install : true)
5a8b1640 1558public_programs += exe
5c23128d
ZJS
1559
1560executable('systemd-journald',
1561 systemd_journald_sources,
1562 include_directories : includes,
aac26058 1563 link_with : [libjournal_core,
34ce0a52 1564 libshared],
5c23128d
ZJS
1565 dependencies : [threads,
1566 libxz,
aac26058
ZJS
1567 liblz4,
1568 libselinux],
421f0012 1569 install_rpath : rootlibexecdir,
5c23128d
ZJS
1570 install : true,
1571 install_dir : rootlibexecdir)
1572
005a29f2
ZJS
1573exe = executable('systemd-cat',
1574 systemd_cat_sources,
1575 include_directories : includes,
1576 link_with : [libjournal_core,
34ce0a52 1577 libshared],
005a29f2
ZJS
1578 dependencies : [threads],
1579 install_rpath : rootlibexecdir,
1580 install : true)
5a8b1640 1581public_programs += exe
005a29f2
ZJS
1582
1583exe = executable('journalctl',
1584 journalctl_sources,
1585 include_directories : includes,
34ce0a52 1586 link_with : [libshared],
005a29f2
ZJS
1587 dependencies : [threads,
1588 libqrencode,
1589 libxz,
6becf48c
ZJS
1590 liblz4,
1591 libpcre2],
005a29f2
ZJS
1592 install_rpath : rootlibexecdir,
1593 install : true,
1594 install_dir : rootbindir)
5a8b1640 1595public_programs += exe
5c23128d
ZJS
1596
1597executable('systemd-getty-generator',
1598 'src/getty-generator/getty-generator.c',
5c23128d 1599 include_directories : includes,
b2fc5836
ZJS
1600 link_with : [libshared],
1601 install_rpath : rootlibexecdir,
1602 install : true,
1603 install_dir : systemgeneratordir)
5c23128d
ZJS
1604
1605executable('systemd-debug-generator',
1606 'src/debug-generator/debug-generator.c',
5c23128d 1607 include_directories : includes,
b2fc5836
ZJS
1608 link_with : [libshared],
1609 install_rpath : rootlibexecdir,
1610 install : true,
1611 install_dir : systemgeneratordir)
5c23128d
ZJS
1612
1613executable('systemd-fstab-generator',
1614 'src/fstab-generator/fstab-generator.c',
1615 'src/core/mount-setup.c',
5c23128d 1616 include_directories : includes,
b2fc5836
ZJS
1617 link_with : [libshared],
1618 install_rpath : rootlibexecdir,
1619 install : true,
1620 install_dir : systemgeneratordir)
5c23128d 1621
349cc4a5 1622if conf.get('ENABLE_ENVIRONMENT_D') == 1
37efbbd8
ZJS
1623 executable('30-systemd-environment-d-generator',
1624 'src/environment-d-generator/environment-d-generator.c',
1625 include_directories : includes,
1626 link_with : [libshared],
1627 install_rpath : rootlibexecdir,
1628 install : true,
1629 install_dir : userenvgeneratordir)
7b76fce1 1630
37efbbd8
ZJS
1631 meson.add_install_script(meson_make_symlink,
1632 join_paths(sysconfdir, 'environment'),
1633 join_paths(environmentdir, '99-environment.conf'))
5c23128d
ZJS
1634endif
1635
349cc4a5 1636if conf.get('ENABLE_HIBERNATE') == 1
37efbbd8
ZJS
1637 executable('systemd-hibernate-resume-generator',
1638 'src/hibernate-resume/hibernate-resume-generator.c',
1639 include_directories : includes,
1640 link_with : [libshared],
1641 install_rpath : rootlibexecdir,
1642 install : true,
1643 install_dir : systemgeneratordir)
5c23128d 1644
37efbbd8
ZJS
1645 executable('systemd-hibernate-resume',
1646 'src/hibernate-resume/hibernate-resume.c',
005a29f2
ZJS
1647 include_directories : includes,
1648 link_with : [libshared],
1649 install_rpath : rootlibexecdir,
1650 install : true,
1651 install_dir : rootlibexecdir)
37efbbd8
ZJS
1652endif
1653
349cc4a5 1654if conf.get('HAVE_BLKID') == 1
37efbbd8
ZJS
1655 executable('systemd-gpt-auto-generator',
1656 'src/gpt-auto-generator/gpt-auto-generator.c',
1657 'src/basic/blkid-util.h',
1658 include_directories : includes,
34ce0a52 1659 link_with : [libshared],
37efbbd8
ZJS
1660 dependencies : libblkid,
1661 install_rpath : rootlibexecdir,
1662 install : true,
1663 install_dir : systemgeneratordir)
1664
1665 exe = executable('systemd-dissect',
1666 'src/dissect/dissect.c',
1667 include_directories : includes,
1668 link_with : [libshared],
1669 install_rpath : rootlibexecdir,
1670 install : true,
1671 install_dir : rootlibexecdir)
5a8b1640 1672 public_programs += exe
5c23128d
ZJS
1673endif
1674
1ec57f33 1675if conf.get('ENABLE_RESOLVE') == 1
37efbbd8
ZJS
1676 executable('systemd-resolved',
1677 systemd_resolved_sources,
005a29f2 1678 include_directories : includes,
34e221a5 1679 link_with : [libshared,
568a4ff8
ZJS
1680 libbasic_gcrypt,
1681 libsystemd_resolve_core],
56ddbf10 1682 dependencies : systemd_resolved_dependencies,
005a29f2 1683 install_rpath : rootlibexecdir,
37efbbd8
ZJS
1684 install : true,
1685 install_dir : rootlibexecdir)
1686
c2e84cab
YW
1687 exe = executable('resolvectl',
1688 resolvectl_sources,
37efbbd8 1689 include_directories : includes,
34e221a5 1690 link_with : [libshared,
568a4ff8
ZJS
1691 libbasic_gcrypt,
1692 libsystemd_resolve_core],
37efbbd8 1693 dependencies : [threads,
76c87410 1694 libgpg_error,
37efbbd8
ZJS
1695 libm,
1696 libidn],
1697 install_rpath : rootlibexecdir,
1698 install : true)
5a8b1640 1699 public_programs += exe
088c1363
LP
1700
1701 meson.add_install_script(meson_make_symlink,
c2e84cab 1702 join_paths(bindir, 'resolvectl'),
088c1363 1703 join_paths(rootsbindir, 'resolvconf'))
c2e84cab
YW
1704
1705 meson.add_install_script(meson_make_symlink,
1706 join_paths(bindir, 'resolvectl'),
1707 join_paths(bindir, 'systemd-resolve'))
5c23128d
ZJS
1708endif
1709
349cc4a5 1710if conf.get('ENABLE_LOGIND') == 1
37efbbd8
ZJS
1711 executable('systemd-logind',
1712 systemd_logind_sources,
005a29f2 1713 include_directories : includes,
37efbbd8 1714 link_with : [liblogind_core,
34ce0a52 1715 libshared],
005a29f2 1716 dependencies : [threads,
37efbbd8 1717 libacl],
005a29f2
ZJS
1718 install_rpath : rootlibexecdir,
1719 install : true,
37efbbd8
ZJS
1720 install_dir : rootlibexecdir)
1721
1722 exe = executable('loginctl',
1723 loginctl_sources,
1724 include_directories : includes,
34ce0a52 1725 link_with : [libshared],
37efbbd8
ZJS
1726 dependencies : [threads,
1727 liblz4,
1728 libxz],
1729 install_rpath : rootlibexecdir,
1730 install : true,
1731 install_dir : rootbindir)
5a8b1640 1732 public_programs += exe
37efbbd8
ZJS
1733
1734 exe = executable('systemd-inhibit',
1735 'src/login/inhibit.c',
1736 include_directories : includes,
1737 link_with : [libshared],
1738 install_rpath : rootlibexecdir,
1739 install : true,
1740 install_dir : rootbindir)
5a8b1640 1741 public_programs += exe
37efbbd8 1742
349cc4a5 1743 if conf.get('HAVE_PAM') == 1
243e5cec 1744 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
37efbbd8
ZJS
1745 pam_systemd = shared_library(
1746 'pam_systemd',
1747 pam_systemd_c,
1748 name_prefix : '',
1749 include_directories : includes,
1750 link_args : ['-shared',
1751 '-Wl,--version-script=' + version_script_arg],
37e4d7a8 1752 link_with : [libsystemd_static,
37efbbd8
ZJS
1753 libshared_static],
1754 dependencies : [threads,
1755 libpam,
1756 libpam_misc],
1757 link_depends : pam_systemd_sym,
1758 install : true,
1759 install_dir : pamlibdir)
1760
938be089
ZJS
1761 if want_tests != 'false'
1762 test('dlopen-pam_systemd',
1763 test_dlopen,
1764 # path to dlopen must include a slash
c1cd6743 1765 args : pam_systemd.full_path())
938be089 1766 endif
37efbbd8 1767 endif
005a29f2 1768
07ee5adb
LP
1769 executable('systemd-user-runtime-dir',
1770 user_runtime_dir_sources,
1771 include_directories : includes,
1772 link_with : [libshared],
1773 install_rpath : rootlibexecdir,
1774 install : true,
1775 install_dir : rootlibexecdir)
1776endif
a9f0f5e5 1777
349cc4a5 1778if conf.get('HAVE_PAM') == 1
37efbbd8
ZJS
1779 executable('systemd-user-sessions',
1780 'src/user-sessions/user-sessions.c',
005a29f2 1781 include_directories : includes,
aac26058 1782 link_with : [libshared],
005a29f2
ZJS
1783 install_rpath : rootlibexecdir,
1784 install : true,
37efbbd8 1785 install_dir : rootlibexecdir)
5c23128d
ZJS
1786endif
1787
349cc4a5 1788if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
37efbbd8
ZJS
1789 exe = executable('bootctl',
1790 'src/boot/bootctl.c',
1791 include_directories : includes,
1792 link_with : [libshared],
1793 dependencies : [libblkid],
1794 install_rpath : rootlibexecdir,
1795 install : true)
5a8b1640 1796 public_programs += exe
005a29f2
ZJS
1797endif
1798
1799exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1800 include_directories : includes,
1801 link_with : [libshared],
1802 dependencies : [threads],
1803 install_rpath : rootlibexecdir,
1804 install : true)
5a8b1640 1805public_programs += exe
005a29f2 1806
f3794366
FS
1807
1808if get_option('link-systemctl-shared')
1809 systemctl_link_with = [libshared]
1810else
1811 systemctl_link_with = [libsystemd_static,
1812 libshared_static,
1813 libjournal_client,
1814 libbasic_gcrypt]
1815endif
1816
005a29f2
ZJS
1817exe = executable('systemctl', 'src/systemctl/systemctl.c',
1818 include_directories : includes,
f3794366 1819 link_with : systemctl_link_with,
005a29f2
ZJS
1820 dependencies : [threads,
1821 libcap,
1822 libselinux,
1823 libxz,
1824 liblz4],
1825 install_rpath : rootlibexecdir,
1826 install : true,
1827 install_dir : rootbindir)
5a8b1640 1828public_programs += exe
5c23128d 1829
61d0578b
LP
1830if conf.get('ENABLE_PORTABLED') == 1
1831 executable('systemd-portabled',
1832 systemd_portabled_sources,
1833 include_directories : includes,
1834 link_with : [libshared],
1835 dependencies : [threads],
1836 install_rpath : rootlibexecdir,
1837 install : true,
1838 install_dir : rootlibexecdir)
1839
1840 exe = executable('portablectl', 'src/portable/portablectl.c',
1841 include_directories : includes,
1842 link_with : [libshared],
1843 dependencies : [threads],
1844 install_rpath : rootlibexecdir,
1845 install : true,
80f39b81 1846 install_dir : rootbindir)
5a8b1640 1847 public_programs += exe
61d0578b
LP
1848endif
1849
ba7f4ae6
ZJS
1850foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1851 meson.add_install_script(meson_make_symlink,
1852 join_paths(rootbindir, 'systemctl'),
1853 join_paths(rootsbindir, alias))
1854endforeach
1855
349cc4a5 1856if conf.get('ENABLE_BACKLIGHT') == 1
37efbbd8
ZJS
1857 executable('systemd-backlight',
1858 'src/backlight/backlight.c',
1859 include_directories : includes,
34ce0a52 1860 link_with : [libshared],
37efbbd8
ZJS
1861 install_rpath : rootlibexecdir,
1862 install : true,
1863 install_dir : rootlibexecdir)
5c23128d
ZJS
1864endif
1865
349cc4a5 1866if conf.get('ENABLE_RFKILL') == 1
37efbbd8
ZJS
1867 executable('systemd-rfkill',
1868 'src/rfkill/rfkill.c',
1869 include_directories : includes,
34ce0a52 1870 link_with : [libshared],
37efbbd8
ZJS
1871 install_rpath : rootlibexecdir,
1872 install : true,
1873 install_dir : rootlibexecdir)
5c23128d
ZJS
1874endif
1875
1876executable('systemd-system-update-generator',
1877 'src/system-update-generator/system-update-generator.c',
1878 include_directories : includes,
1879 link_with : [libshared],
b2fc5836 1880 install_rpath : rootlibexecdir,
5c23128d
ZJS
1881 install : true,
1882 install_dir : systemgeneratordir)
1883
349cc4a5 1884if conf.get('HAVE_LIBCRYPTSETUP') == 1
37efbbd8
ZJS
1885 executable('systemd-cryptsetup',
1886 'src/cryptsetup/cryptsetup.c',
1887 include_directories : includes,
1888 link_with : [libshared],
1889 dependencies : [libcryptsetup],
1890 install_rpath : rootlibexecdir,
1891 install : true,
1892 install_dir : rootlibexecdir)
1893
1894 executable('systemd-cryptsetup-generator',
1895 'src/cryptsetup/cryptsetup-generator.c',
1896 include_directories : includes,
1897 link_with : [libshared],
1898 dependencies : [libcryptsetup],
1899 install_rpath : rootlibexecdir,
1900 install : true,
1901 install_dir : systemgeneratordir)
1902
1903 executable('systemd-veritysetup',
1904 'src/veritysetup/veritysetup.c',
1905 include_directories : includes,
1906 link_with : [libshared],
1907 dependencies : [libcryptsetup],
1908 install_rpath : rootlibexecdir,
1909 install : true,
1910 install_dir : rootlibexecdir)
1911
1912 executable('systemd-veritysetup-generator',
1913 'src/veritysetup/veritysetup-generator.c',
1914 include_directories : includes,
1915 link_with : [libshared],
1916 dependencies : [libcryptsetup],
1917 install_rpath : rootlibexecdir,
1918 install : true,
1919 install_dir : systemgeneratordir)
5c23128d
ZJS
1920endif
1921
349cc4a5 1922if conf.get('HAVE_SYSV_COMPAT') == 1
37efbbd8
ZJS
1923 executable('systemd-sysv-generator',
1924 'src/sysv-generator/sysv-generator.c',
1925 include_directories : includes,
1926 link_with : [libshared],
1927 install_rpath : rootlibexecdir,
1928 install : true,
1929 install_dir : systemgeneratordir)
1930
1931 executable('systemd-rc-local-generator',
1932 'src/rc-local-generator/rc-local-generator.c',
1933 include_directories : includes,
1934 link_with : [libshared],
1935 install_rpath : rootlibexecdir,
1936 install : true,
1937 install_dir : systemgeneratordir)
5c23128d
ZJS
1938endif
1939
349cc4a5 1940if conf.get('ENABLE_HOSTNAMED') == 1
37efbbd8
ZJS
1941 executable('systemd-hostnamed',
1942 'src/hostname/hostnamed.c',
005a29f2 1943 include_directories : includes,
aac26058 1944 link_with : [libshared],
005a29f2 1945 install_rpath : rootlibexecdir,
37efbbd8
ZJS
1946 install : true,
1947 install_dir : rootlibexecdir)
1948
1949 exe = executable('hostnamectl',
1950 'src/hostname/hostnamectl.c',
1951 include_directories : includes,
1952 link_with : [libshared],
1953 install_rpath : rootlibexecdir,
1954 install : true)
5a8b1640 1955 public_programs += exe
5c23128d
ZJS
1956endif
1957
349cc4a5
ZJS
1958if conf.get('ENABLE_LOCALED') == 1
1959 if conf.get('HAVE_XKBCOMMON') == 1
37efbbd8
ZJS
1960 # logind will load libxkbcommon.so dynamically on its own
1961 deps = [libdl]
1962 else
1963 deps = []
1964 endif
1965
1966 executable('systemd-localed',
1967 systemd_localed_sources,
005a29f2 1968 include_directories : includes,
aac26058 1969 link_with : [libshared],
37efbbd8 1970 dependencies : deps,
005a29f2 1971 install_rpath : rootlibexecdir,
37efbbd8
ZJS
1972 install : true,
1973 install_dir : rootlibexecdir)
1974
1975 exe = executable('localectl',
1976 localectl_sources,
1977 include_directories : includes,
1978 link_with : [libshared],
1979 install_rpath : rootlibexecdir,
1980 install : true)
5a8b1640 1981 public_programs += exe
5c23128d
ZJS
1982endif
1983
349cc4a5 1984if conf.get('ENABLE_TIMEDATED') == 1
37efbbd8
ZJS
1985 executable('systemd-timedated',
1986 'src/timedate/timedated.c',
005a29f2 1987 include_directories : includes,
aac26058 1988 link_with : [libshared],
37efbbd8
ZJS
1989 install_rpath : rootlibexecdir,
1990 install : true,
1991 install_dir : rootlibexecdir)
6129ec85 1992endif
5c23128d 1993
6129ec85 1994if conf.get('ENABLE_TIMEDATECTL') == 1
37efbbd8
ZJS
1995 exe = executable('timedatectl',
1996 'src/timedate/timedatectl.c',
1997 include_directories : includes,
1998 install_rpath : rootlibexecdir,
1999 link_with : [libshared],
6129ec85 2000 dependencies : [libm],
37efbbd8 2001 install : true)
5a8b1640 2002 public_programs += exe
5c23128d
ZJS
2003endif
2004
349cc4a5 2005if conf.get('ENABLE_TIMESYNCD') == 1
37efbbd8
ZJS
2006 executable('systemd-timesyncd',
2007 systemd_timesyncd_sources,
005a29f2 2008 include_directories : includes,
aac26058 2009 link_with : [libshared],
005a29f2 2010 dependencies : [threads,
37efbbd8 2011 libm],
005a29f2
ZJS
2012 install_rpath : rootlibexecdir,
2013 install : true,
37efbbd8 2014 install_dir : rootlibexecdir)
5c3376ef
PB
2015
2016 executable('systemd-time-wait-sync',
2017 'src/time-wait-sync/time-wait-sync.c',
2018 include_directories : includes,
2019 link_with : [libshared],
2020 install_rpath : rootlibexecdir,
2021 install : true,
2022 install_dir : rootlibexecdir)
5c23128d
ZJS
2023endif
2024
349cc4a5 2025if conf.get('ENABLE_MACHINED') == 1
37efbbd8
ZJS
2026 executable('systemd-machined',
2027 systemd_machined_sources,
2028 include_directories : includes,
2029 link_with : [libmachine_core,
2030 libshared],
2031 install_rpath : rootlibexecdir,
2032 install : true,
2033 install_dir : rootlibexecdir)
2034
2035 exe = executable('machinectl',
2036 'src/machine/machinectl.c',
2037 include_directories : includes,
2038 link_with : [libshared],
2039 dependencies : [threads,
2040 libxz,
2041 liblz4],
2042 install_rpath : rootlibexecdir,
2043 install : true,
2044 install_dir : rootbindir)
5a8b1640 2045 public_programs += exe
5c23128d
ZJS
2046endif
2047
349cc4a5 2048if conf.get('ENABLE_IMPORTD') == 1
37efbbd8
ZJS
2049 executable('systemd-importd',
2050 systemd_importd_sources,
005a29f2 2051 include_directories : includes,
aac26058 2052 link_with : [libshared],
37efbbd8 2053 dependencies : [threads],
005a29f2
ZJS
2054 install_rpath : rootlibexecdir,
2055 install : true,
2056 install_dir : rootlibexecdir)
37efbbd8
ZJS
2057
2058 systemd_pull = executable('systemd-pull',
2059 systemd_pull_sources,
2060 include_directories : includes,
2061 link_with : [libshared],
2062 dependencies : [libcurl,
2063 libz,
2064 libbzip2,
2065 libxz,
2066 libgcrypt],
2067 install_rpath : rootlibexecdir,
2068 install : true,
2069 install_dir : rootlibexecdir)
2070
2071 systemd_import = executable('systemd-import',
2072 systemd_import_sources,
2073 include_directories : includes,
2074 link_with : [libshared],
2075 dependencies : [libcurl,
2076 libz,
2077 libbzip2,
2078 libxz],
2079 install_rpath : rootlibexecdir,
2080 install : true,
2081 install_dir : rootlibexecdir)
2082
2083 systemd_export = executable('systemd-export',
2084 systemd_export_sources,
2085 include_directories : includes,
2086 link_with : [libshared],
2087 dependencies : [libcurl,
2088 libz,
2089 libbzip2,
2090 libxz],
2091 install_rpath : rootlibexecdir,
2092 install : true,
2093 install_dir : rootlibexecdir)
2094 public_programs += [systemd_pull, systemd_import, systemd_export]
2095endif
2096
349cc4a5 2097if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
37efbbd8
ZJS
2098 exe = executable('systemd-journal-upload',
2099 systemd_journal_upload_sources,
2100 include_directories : includes,
2101 link_with : [libshared],
2102 dependencies : [threads,
2103 libcurl,
2104 libgnutls,
2105 libxz,
2106 liblz4],
2107 install_rpath : rootlibexecdir,
2108 install : true,
2109 install_dir : rootlibexecdir)
5a8b1640 2110 public_programs += exe
5c23128d
ZJS
2111endif
2112
349cc4a5 2113if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
37efbbd8
ZJS
2114 s_j_remote = executable('systemd-journal-remote',
2115 systemd_journal_remote_sources,
2116 include_directories : includes,
c064d8db
ZJS
2117 link_with : [libshared,
2118 libsystemd_journal_remote],
37efbbd8
ZJS
2119 dependencies : [threads,
2120 libmicrohttpd,
2121 libgnutls,
2122 libxz,
2123 liblz4],
2124 install_rpath : rootlibexecdir,
2125 install : true,
2126 install_dir : rootlibexecdir)
2127
2128 s_j_gatewayd = executable('systemd-journal-gatewayd',
2129 systemd_journal_gatewayd_sources,
2130 include_directories : includes,
2131 link_with : [libshared],
2132 dependencies : [threads,
2133 libmicrohttpd,
2134 libgnutls,
2135 libxz,
2136 liblz4],
2137 install_rpath : rootlibexecdir,
2138 install : true,
2139 install_dir : rootlibexecdir)
2140 public_programs += [s_j_remote, s_j_gatewayd]
5c23128d
ZJS
2141endif
2142
349cc4a5 2143if conf.get('ENABLE_COREDUMP') == 1
37efbbd8
ZJS
2144 executable('systemd-coredump',
2145 systemd_coredump_sources,
005a29f2 2146 include_directories : includes,
aac26058 2147 link_with : [libshared],
005a29f2 2148 dependencies : [threads,
37efbbd8
ZJS
2149 libacl,
2150 libdw,
005a29f2
ZJS
2151 libxz,
2152 liblz4],
2153 install_rpath : rootlibexecdir,
37efbbd8
ZJS
2154 install : true,
2155 install_dir : rootlibexecdir)
2156
2157 exe = executable('coredumpctl',
2158 coredumpctl_sources,
2159 include_directories : includes,
2160 link_with : [libshared],
2161 dependencies : [threads,
2162 libxz,
2163 liblz4],
2164 install_rpath : rootlibexecdir,
2165 install : true)
5a8b1640 2166 public_programs += exe
5c23128d
ZJS
2167endif
2168
349cc4a5 2169if conf.get('ENABLE_BINFMT') == 1
37efbbd8
ZJS
2170 exe = executable('systemd-binfmt',
2171 'src/binfmt/binfmt.c',
2172 include_directories : includes,
2173 link_with : [libshared],
2174 install_rpath : rootlibexecdir,
2175 install : true,
2176 install_dir : rootlibexecdir)
5a8b1640 2177 public_programs += exe
37efbbd8
ZJS
2178
2179 meson.add_install_script('sh', '-c',
2180 mkdir_p.format(binfmtdir))
2181 meson.add_install_script('sh', '-c',
2182 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2183endif
2184
349cc4a5 2185if conf.get('ENABLE_VCONSOLE') == 1
37efbbd8
ZJS
2186 executable('systemd-vconsole-setup',
2187 'src/vconsole/vconsole-setup.c',
005a29f2
ZJS
2188 include_directories : includes,
2189 link_with : [libshared],
2190 install_rpath : rootlibexecdir,
2191 install : true,
2192 install_dir : rootlibexecdir)
5c23128d
ZJS
2193endif
2194
349cc4a5 2195if conf.get('ENABLE_RANDOMSEED') == 1
37efbbd8
ZJS
2196 executable('systemd-random-seed',
2197 'src/random-seed/random-seed.c',
2198 include_directories : includes,
2199 link_with : [libshared],
2200 install_rpath : rootlibexecdir,
2201 install : true,
2202 install_dir : rootlibexecdir)
5c23128d
ZJS
2203endif
2204
349cc4a5 2205if conf.get('ENABLE_FIRSTBOOT') == 1
37efbbd8
ZJS
2206 executable('systemd-firstboot',
2207 'src/firstboot/firstboot.c',
2208 include_directories : includes,
2209 link_with : [libshared],
2210 dependencies : [libcrypt],
2211 install_rpath : rootlibexecdir,
2212 install : true,
2213 install_dir : rootbindir)
5c23128d
ZJS
2214endif
2215
2216executable('systemd-remount-fs',
2217 'src/remount-fs/remount-fs.c',
2218 'src/core/mount-setup.c',
2219 'src/core/mount-setup.h',
2220 include_directories : includes,
2221 link_with : [libshared],
b2fc5836 2222 install_rpath : rootlibexecdir,
5c23128d
ZJS
2223 install : true,
2224 install_dir : rootlibexecdir)
2225
2226executable('systemd-machine-id-setup',
2227 'src/machine-id-setup/machine-id-setup-main.c',
2228 'src/core/machine-id-setup.c',
2229 'src/core/machine-id-setup.h',
2230 include_directories : includes,
aac26058 2231 link_with : [libshared],
b2fc5836 2232 install_rpath : rootlibexecdir,
5c23128d
ZJS
2233 install : true,
2234 install_dir : rootbindir)
2235
2236executable('systemd-fsck',
2237 'src/fsck/fsck.c',
2238 include_directories : includes,
aac26058 2239 link_with : [libshared],
421f0012 2240 install_rpath : rootlibexecdir,
5c23128d
ZJS
2241 install : true,
2242 install_dir : rootlibexecdir)
2243
80750adb
ZJS
2244executable('systemd-growfs',
2245 'src/partition/growfs.c',
2246 include_directories : includes,
2247 link_with : [libshared],
c34b75a1 2248 dependencies : [libcryptsetup],
80750adb
ZJS
2249 install_rpath : rootlibexecdir,
2250 install : true,
2251 install_dir : rootlibexecdir)
2252
b7f28ac5
ZJS
2253executable('systemd-makefs',
2254 'src/partition/makefs.c',
2255 include_directories : includes,
2256 link_with : [libshared],
2257 install_rpath : rootlibexecdir,
2258 install : true,
2259 install_dir : rootlibexecdir)
2260
5c23128d
ZJS
2261executable('systemd-sleep',
2262 'src/sleep/sleep.c',
2263 include_directories : includes,
2264 link_with : [libshared],
421f0012 2265 install_rpath : rootlibexecdir,
5c23128d
ZJS
2266 install : true,
2267 install_dir : rootlibexecdir)
2268
005a29f2
ZJS
2269exe = executable('systemd-sysctl',
2270 'src/sysctl/sysctl.c',
2271 include_directories : includes,
2272 link_with : [libshared],
2273 install_rpath : rootlibexecdir,
2274 install : true,
2275 install_dir : rootlibexecdir)
5a8b1640 2276public_programs += exe
5c23128d
ZJS
2277
2278executable('systemd-ac-power',
2279 'src/ac-power/ac-power.c',
2280 include_directories : includes,
2281 link_with : [libshared],
421f0012 2282 install_rpath : rootlibexecdir,
5c23128d
ZJS
2283 install : true,
2284 install_dir : rootlibexecdir)
2285
005a29f2
ZJS
2286exe = executable('systemd-detect-virt',
2287 'src/detect-virt/detect-virt.c',
2288 include_directories : includes,
2289 link_with : [libshared],
2290 install_rpath : rootlibexecdir,
2291 install : true)
5a8b1640 2292public_programs += exe
005a29f2
ZJS
2293
2294exe = executable('systemd-delta',
2295 'src/delta/delta.c',
2296 include_directories : includes,
2297 link_with : [libshared],
2298 install_rpath : rootlibexecdir,
2299 install : true)
5a8b1640 2300public_programs += exe
005a29f2
ZJS
2301
2302exe = executable('systemd-escape',
2303 'src/escape/escape.c',
2304 include_directories : includes,
2305 link_with : [libshared],
2306 install_rpath : rootlibexecdir,
2307 install : true,
2308 install_dir : rootbindir)
5a8b1640 2309public_programs += exe
005a29f2
ZJS
2310
2311exe = executable('systemd-notify',
2312 'src/notify/notify.c',
2313 include_directories : includes,
2314 link_with : [libshared],
2315 install_rpath : rootlibexecdir,
2316 install : true,
2317 install_dir : rootbindir)
5a8b1640 2318public_programs += exe
5c23128d
ZJS
2319
2320executable('systemd-volatile-root',
2321 'src/volatile-root/volatile-root.c',
2322 include_directories : includes,
2323 link_with : [libshared],
421f0012 2324 install_rpath : rootlibexecdir,
5c23128d
ZJS
2325 install : true,
2326 install_dir : rootlibexecdir)
2327
2328executable('systemd-cgroups-agent',
2329 'src/cgroups-agent/cgroups-agent.c',
2330 include_directories : includes,
2331 link_with : [libshared],
421f0012 2332 install_rpath : rootlibexecdir,
5c23128d
ZJS
2333 install : true,
2334 install_dir : rootlibexecdir)
2335
0d1d512f
ZJS
2336exe = executable('systemd-id128',
2337 'src/id128/id128.c',
2338 include_directories : includes,
2339 link_with : [libshared],
2340 install_rpath : rootlibexecdir,
2341 install : true)
2342public_programs += exe
2343
005a29f2
ZJS
2344exe = executable('systemd-path',
2345 'src/path/path.c',
2346 include_directories : includes,
aac26058 2347 link_with : [libshared],
005a29f2
ZJS
2348 install_rpath : rootlibexecdir,
2349 install : true)
5a8b1640 2350public_programs += exe
005a29f2
ZJS
2351
2352exe = executable('systemd-ask-password',
2353 'src/ask-password/ask-password.c',
2354 include_directories : includes,
aac26058 2355 link_with : [libshared],
005a29f2
ZJS
2356 install_rpath : rootlibexecdir,
2357 install : true,
2358 install_dir : rootbindir)
5a8b1640 2359public_programs += exe
5c23128d
ZJS
2360
2361executable('systemd-reply-password',
2362 'src/reply-password/reply-password.c',
2363 include_directories : includes,
aac26058 2364 link_with : [libshared],
421f0012 2365 install_rpath : rootlibexecdir,
5c23128d
ZJS
2366 install : true,
2367 install_dir : rootlibexecdir)
2368
005a29f2
ZJS
2369exe = executable('systemd-tty-ask-password-agent',
2370 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2371 include_directories : includes,
aac26058 2372 link_with : [libshared],
005a29f2
ZJS
2373 install_rpath : rootlibexecdir,
2374 install : true,
2375 install_dir : rootbindir)
5a8b1640 2376public_programs += exe
005a29f2
ZJS
2377
2378exe = executable('systemd-cgls',
2379 'src/cgls/cgls.c',
2380 include_directories : includes,
aac26058 2381 link_with : [libshared],
005a29f2
ZJS
2382 install_rpath : rootlibexecdir,
2383 install : true)
5a8b1640 2384public_programs += exe
005a29f2
ZJS
2385
2386exe = executable('systemd-cgtop',
2387 'src/cgtop/cgtop.c',
2388 include_directories : includes,
aac26058 2389 link_with : [libshared],
005a29f2
ZJS
2390 install_rpath : rootlibexecdir,
2391 install : true)
5a8b1640 2392public_programs += exe
5c23128d
ZJS
2393
2394executable('systemd-initctl',
2395 'src/initctl/initctl.c',
2396 include_directories : includes,
aac26058 2397 link_with : [libshared],
421f0012 2398 install_rpath : rootlibexecdir,
5c23128d
ZJS
2399 install : true,
2400 install_dir : rootlibexecdir)
2401
005a29f2
ZJS
2402exe = executable('systemd-mount',
2403 'src/mount/mount-tool.c',
2404 include_directories : includes,
34ce0a52 2405 link_with : [libshared],
005a29f2
ZJS
2406 install_rpath : rootlibexecdir,
2407 install : true)
5a8b1640 2408public_programs += exe
5c23128d 2409
7b76fce1 2410meson.add_install_script(meson_make_symlink,
e17e5ba9 2411 'systemd-mount', join_paths(bindir, 'systemd-umount'))
7b76fce1 2412
005a29f2
ZJS
2413exe = executable('systemd-run',
2414 'src/run/run.c',
2415 include_directories : includes,
aac26058 2416 link_with : [libshared],
005a29f2
ZJS
2417 install_rpath : rootlibexecdir,
2418 install : true)
5a8b1640 2419public_programs += exe
005a29f2
ZJS
2420
2421exe = executable('systemd-stdio-bridge',
2422 'src/stdio-bridge/stdio-bridge.c',
2423 include_directories : includes,
aac26058 2424 link_with : [libshared],
005a29f2
ZJS
2425 install_rpath : rootlibexecdir,
2426 install : true)
5a8b1640 2427public_programs += exe
005a29f2
ZJS
2428
2429exe = executable('busctl',
2430 'src/busctl/busctl.c',
2431 'src/busctl/busctl-introspect.c',
2432 'src/busctl/busctl-introspect.h',
2433 include_directories : includes,
aac26058 2434 link_with : [libshared],
005a29f2
ZJS
2435 install_rpath : rootlibexecdir,
2436 install : true)
5a8b1640 2437public_programs += exe
5c23128d 2438
349cc4a5 2439if conf.get('ENABLE_SYSUSERS') == 1
37efbbd8
ZJS
2440 exe = executable('systemd-sysusers',
2441 'src/sysusers/sysusers.c',
2442 include_directories : includes,
2443 link_with : [libshared],
2444 install_rpath : rootlibexecdir,
2445 install : true,
2446 install_dir : rootbindir)
5a8b1640 2447 public_programs += exe
5c23128d
ZJS
2448endif
2449
349cc4a5 2450if conf.get('ENABLE_TMPFILES') == 1
37efbbd8
ZJS
2451 exe = executable('systemd-tmpfiles',
2452 'src/tmpfiles/tmpfiles.c',
2453 include_directories : includes,
2454 link_with : [libshared],
2455 dependencies : [libacl],
2456 install_rpath : rootlibexecdir,
2457 install : true,
2458 install_dir : rootbindir)
5a8b1640 2459 public_programs += exe
d9daae55 2460
938be089
ZJS
2461 if want_tests != 'false'
2462 test('test-systemd-tmpfiles',
2463 test_systemd_tmpfiles_py,
2464 # https://github.com/mesonbuild/meson/issues/2681
2465 args : exe.full_path())
2466 endif
5c23128d
ZJS
2467endif
2468
349cc4a5 2469if conf.get('ENABLE_HWDB') == 1
37efbbd8
ZJS
2470 exe = executable('systemd-hwdb',
2471 'src/hwdb/hwdb.c',
2472 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2473 include_directories : includes,
0c06b506 2474 link_with : [libudev_static],
0da6f396 2475 install_rpath : udev_rpath,
37efbbd8
ZJS
2476 install : true,
2477 install_dir : rootbindir)
5a8b1640 2478 public_programs += exe
37efbbd8
ZJS
2479endif
2480
349cc4a5 2481if conf.get('ENABLE_QUOTACHECK') == 1
37efbbd8
ZJS
2482 executable('systemd-quotacheck',
2483 'src/quotacheck/quotacheck.c',
005a29f2 2484 include_directories : includes,
aac26058 2485 link_with : [libshared],
005a29f2
ZJS
2486 install_rpath : rootlibexecdir,
2487 install : true,
37efbbd8 2488 install_dir : rootlibexecdir)
5c23128d
ZJS
2489endif
2490
005a29f2
ZJS
2491exe = executable('systemd-socket-proxyd',
2492 'src/socket-proxy/socket-proxyd.c',
2493 include_directories : includes,
aac26058 2494 link_with : [libshared],
005a29f2
ZJS
2495 dependencies : [threads],
2496 install_rpath : rootlibexecdir,
2497 install : true,
2498 install_dir : rootlibexecdir)
5a8b1640 2499public_programs += exe
005a29f2
ZJS
2500
2501exe = executable('systemd-udevd',
2502 systemd_udevd_sources,
2503 include_directories : includes,
c1cd6743 2504 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
005a29f2 2505 link_with : [libudev_core,
005a29f2 2506 libsystemd_network,
0c06b506 2507 libudev_static],
3a30f21f
ZJS
2508 dependencies : [threads,
2509 libkmod,
005a29f2 2510 libidn,
aac26058
ZJS
2511 libacl,
2512 libblkid],
1aec3ed9 2513 install_rpath : udev_rpath,
005a29f2
ZJS
2514 install : true,
2515 install_dir : rootlibexecdir)
5a8b1640 2516public_programs += exe
005a29f2
ZJS
2517
2518exe = executable('udevadm',
2519 udevadm_sources,
c1cd6743 2520 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
005a29f2
ZJS
2521 include_directories : includes,
2522 link_with : [libudev_core,
005a29f2 2523 libsystemd_network,
0c06b506 2524 libudev_static],
3a30f21f
ZJS
2525 dependencies : [threads,
2526 libkmod,
005a29f2 2527 libidn,
aac26058
ZJS
2528 libacl,
2529 libblkid],
1aec3ed9 2530 install_rpath : udev_rpath,
005a29f2
ZJS
2531 install : true,
2532 install_dir : rootbindir)
5a8b1640 2533public_programs += exe
5c23128d
ZJS
2534
2535executable('systemd-shutdown',
2536 systemd_shutdown_sources,
2537 include_directories : includes,
34ce0a52 2538 link_with : [libshared],
95b862b0 2539 dependencies : [libmount],
421f0012 2540 install_rpath : rootlibexecdir,
5c23128d
ZJS
2541 install : true,
2542 install_dir : rootlibexecdir)
2543
2544executable('systemd-update-done',
2545 'src/update-done/update-done.c',
2546 include_directories : includes,
2547 link_with : [libshared],
421f0012 2548 install_rpath : rootlibexecdir,
5c23128d
ZJS
2549 install : true,
2550 install_dir : rootlibexecdir)
2551
2552executable('systemd-update-utmp',
2553 'src/update-utmp/update-utmp.c',
2554 include_directories : includes,
aac26058 2555 link_with : [libshared],
5c23128d 2556 dependencies : [libaudit],
421f0012 2557 install_rpath : rootlibexecdir,
5c23128d
ZJS
2558 install : true,
2559 install_dir : rootlibexecdir)
2560
349cc4a5 2561if conf.get('HAVE_KMOD') == 1
37efbbd8
ZJS
2562 executable('systemd-modules-load',
2563 'src/modules-load/modules-load.c',
2564 include_directories : includes,
2565 link_with : [libshared],
2566 dependencies : [libkmod],
2567 install_rpath : rootlibexecdir,
2568 install : true,
2569 install_dir : rootlibexecdir)
94e75a54 2570
37efbbd8
ZJS
2571 meson.add_install_script('sh', '-c',
2572 mkdir_p.format(modulesloaddir))
2573 meson.add_install_script('sh', '-c',
2574 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
5c23128d
ZJS
2575endif
2576
005a29f2
ZJS
2577exe = executable('systemd-nspawn',
2578 systemd_nspawn_sources,
2579 'src/core/mount-setup.c', # FIXME: use a variable?
2580 'src/core/mount-setup.h',
2581 'src/core/loopback-setup.c',
2582 'src/core/loopback-setup.h',
97d90615
ZJS
2583 include_directories : includes,
2584 link_with : [libnspawn_core,
2585 libshared],
2586 dependencies : [libblkid],
005a29f2
ZJS
2587 install_rpath : rootlibexecdir,
2588 install : true)
5a8b1640 2589public_programs += exe
5c23128d 2590
349cc4a5 2591if conf.get('ENABLE_NETWORKD') == 1
37efbbd8
ZJS
2592 executable('systemd-networkd',
2593 systemd_networkd_sources,
2594 include_directories : includes,
2595 link_with : [libnetworkd_core,
37efbbd8 2596 libsystemd_network,
0c06b506 2597 libudev_static,
37efbbd8 2598 libshared],
4b57a272 2599 dependencies : [threads],
37efbbd8
ZJS
2600 install_rpath : rootlibexecdir,
2601 install : true,
2602 install_dir : rootlibexecdir)
2603
2604 executable('systemd-networkd-wait-online',
2605 systemd_networkd_wait_online_sources,
2606 include_directories : includes,
2607 link_with : [libnetworkd_core,
2608 libshared],
2609 install_rpath : rootlibexecdir,
2610 install : true,
2611 install_dir : rootlibexecdir)
5c23128d 2612
dcfe072a
FS
2613 exe = executable('networkctl',
2614 networkctl_sources,
2615 include_directories : includes,
2616 link_with : [libsystemd_network,
aac26058 2617 libshared],
dcfe072a
FS
2618 install_rpath : rootlibexecdir,
2619 install : true,
2620 install_dir : rootbindir)
5a8b1640 2621 public_programs += exe
dcfe072a 2622endif
e821f6a9
ZJS
2623
2624executable('systemd-sulogin-shell',
2625 ['src/sulogin-shell/sulogin-shell.c'],
2626 include_directories : includes,
2627 link_with : [libshared],
2628 install_rpath : rootlibexecdir,
2629 install : true,
2630 install_dir : rootlibexecdir)
2631
69e96427
ZJS
2632############################################################
2633
e2d41370
FB
2634custom_target(
2635 'systemd-runtest.env',
2636 output : 'systemd-runtest.env',
2637 command : ['sh', '-c', '{ ' +
2638 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
49cdae63 2639 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
e2d41370
FB
2640 '} >@OUTPUT@'],
2641 build_by_default : true)
2642
69e96427 2643foreach tuple : tests
37efbbd8
ZJS
2644 sources = tuple[0]
2645 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2646 dependencies = tuple[2]
2647 condition = tuple.length() >= 4 ? tuple[3] : ''
2648 type = tuple.length() >= 5 ? tuple[4] : ''
2649 defs = tuple.length() >= 6 ? tuple[5] : []
2650 incs = tuple.length() >= 7 ? tuple[6] : includes
2651 timeout = 30
2652
2653 name = sources[0].split('/')[-1].split('.')[0]
2654 if type.startswith('timeout=')
2655 timeout = type.split('=')[1].to_int()
2656 type = ''
2657 endif
3b2bdd62
ZJS
2658
2659 if condition == '' or conf.get(condition) == 1
37efbbd8
ZJS
2660 exe = executable(
2661 name,
2662 sources,
2663 include_directories : incs,
2664 link_with : link_with,
2665 dependencies : dependencies,
2666 c_args : defs,
3b2bdd62 2667 build_by_default : want_tests != 'false',
37efbbd8 2668 install_rpath : rootlibexecdir,
7cdd9783
MB
2669 install : install_tests,
2670 install_dir : join_paths(testsdir, type))
37efbbd8
ZJS
2671
2672 if type == 'manual'
2673 message('@0@ is a manual test'.format(name))
2674 elif type == 'unsafe' and want_tests != 'unsafe'
2675 message('@0@ is an unsafe test'.format(name))
3b2bdd62 2676 elif want_tests != 'false'
37efbbd8
ZJS
2677 test(name, exe,
2678 env : test_env,
2679 timeout : timeout)
2680 endif
2681 else
2682 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2683 endif
69e96427
ZJS
2684endforeach
2685
0632b4cd 2686exe = executable(
37efbbd8
ZJS
2687 'test-libsystemd-sym',
2688 test_libsystemd_sym_c,
2689 include_directories : includes,
2690 link_with : [libsystemd],
fd1939fb 2691 build_by_default : want_tests != 'false',
37efbbd8
ZJS
2692 install : install_tests,
2693 install_dir : testsdir)
938be089
ZJS
2694if want_tests != 'false'
2695 test('test-libsystemd-sym', exe)
2696endif
37ab1a25 2697
0632b4cd
ZJS
2698exe = executable(
2699 'test-libsystemd-static-sym',
2700 test_libsystemd_sym_c,
2701 include_directories : includes,
0632b4cd
ZJS
2702 link_with : [install_libsystemd_static],
2703 dependencies : [threads], # threads is already included in dependencies on the library,
2704 # but does not seem to get propagated. Add here as a work-around.
fd1939fb 2705 build_by_default : want_tests != 'false' and static_libsystemd_pic,
20f3d32d 2706 install : install_tests and static_libsystemd_pic,
0632b4cd 2707 install_dir : testsdir)
938be089 2708if want_tests != 'false' and static_libsystemd_pic
0632b4cd
ZJS
2709 test('test-libsystemd-static-sym', exe)
2710endif
37ab1a25 2711
0632b4cd 2712exe = executable(
37efbbd8
ZJS
2713 'test-libudev-sym',
2714 test_libudev_sym_c,
2715 include_directories : includes,
c1cd6743 2716 c_args : '-Wno-deprecated-declarations',
37efbbd8 2717 link_with : [libudev],
fd1939fb 2718 build_by_default : want_tests != 'false',
37efbbd8
ZJS
2719 install : install_tests,
2720 install_dir : testsdir)
938be089
ZJS
2721if want_tests != 'false'
2722 test('test-libudev-sym', exe)
2723endif
0632b4cd
ZJS
2724
2725exe = executable(
2726 'test-libudev-static-sym',
2727 test_libudev_sym_c,
2728 include_directories : includes,
c1cd6743 2729 c_args : '-Wno-deprecated-declarations',
0632b4cd 2730 link_with : [install_libudev_static],
fd1939fb 2731 build_by_default : want_tests != 'false' and static_libudev_pic,
20f3d32d 2732 install : install_tests and static_libudev_pic,
0632b4cd 2733 install_dir : testsdir)
938be089 2734if want_tests != 'false' and static_libudev_pic
0632b4cd
ZJS
2735 test('test-libudev-static-sym', exe)
2736endif
e0bec52f 2737
69e96427 2738############################################################
5c23128d 2739
7db7d5b7
JR
2740fuzzer_exes = []
2741
2742foreach tuple : fuzzers
2743 sources = tuple[0]
2744 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2745 dependencies = tuple[2]
2746 defs = tuple.length() >= 4 ? tuple[3] : []
2747 incs = tuple.length() >= 5 ? tuple[4] : includes
2748
31e57a35 2749 if fuzzer_build
7db7d5b7
JR
2750 dependencies += fuzzing_engine
2751 else
2752 sources += 'src/fuzz/fuzz-main.c'
2753 endif
2754
2755 name = sources[0].split('/')[-1].split('.')[0]
2756
2757 fuzzer_exes += executable(
2758 name,
2759 sources,
2760 include_directories : [incs, include_directories('src/fuzz')],
2761 link_with : link_with,
2762 dependencies : dependencies,
2763 c_args : defs,
2764 install : false)
2765endforeach
2766
2767run_target('fuzzers',
2768 depends : fuzzer_exes,
2769 command : ['true'])
2770
2771############################################################
2772
5c23128d
ZJS
2773make_directive_index_py = find_program('tools/make-directive-index.py')
2774make_man_index_py = find_program('tools/make-man-index.py')
b184e8fe 2775xml_helper_py = find_program('tools/xml_helper.py')
abba22c5 2776hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
5c23128d
ZJS
2777
2778subdir('units')
2779subdir('sysctl.d')
2780subdir('sysusers.d')
2781subdir('tmpfiles.d')
e783f957 2782subdir('presets')
5c23128d
ZJS
2783subdir('hwdb')
2784subdir('network')
2785subdir('man')
2786subdir('shell-completion/bash')
2787subdir('shell-completion/zsh')
9e825ebf
FB
2788subdir('docs/sysvinit')
2789subdir('docs/var-log')
5c23128d 2790
5c23128d
ZJS
2791install_subdir('factory/etc',
2792 install_dir : factorydir)
2793
5c23128d
ZJS
2794install_data('xorg/50-systemd-user.sh',
2795 install_dir : xinitrcdir)
582faeb4
DJL
2796install_data('modprobe.d/systemd.conf',
2797 install_dir : modprobedir)
f09eb768 2798install_data('LICENSE.GPL2',
5c23128d 2799 'LICENSE.LGPL2.1',
f09eb768
LP
2800 'NEWS',
2801 'README',
9e825ebf 2802 'docs/CODING_STYLE',
1d1cb168 2803 'docs/DISTRO_PORTING.md',
9e825ebf
FB
2804 'docs/ENVIRONMENT.md',
2805 'docs/HACKING',
2806 'docs/TRANSIENT-SETTINGS.md',
b6dc0d7d 2807 'docs/TRANSLATORS.md',
9e825ebf 2808 'docs/UIDS-GIDS.md',
5c23128d
ZJS
2809 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2810 install_dir : docdir)
d68b342b 2811
94e75a54
ZJS
2812meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2813meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2814
d68b342b
ZJS
2815############################################################
2816
005a29f2
ZJS
2817meson_check_help = find_program('tools/meson-check-help.sh')
2818
2819foreach exec : public_programs
37efbbd8 2820 name = exec.full_path().split('/')[-1]
938be089
ZJS
2821 if want_tests != 'false'
2822 test('check-help-' + name,
2823 meson_check_help,
c1cd6743 2824 args : exec.full_path())
938be089 2825 endif
005a29f2
ZJS
2826endforeach
2827
2828############################################################
2829
52d4d1d3
ZJS
2830# Enable tests for all supported sanitizers
2831foreach tuple : sanitizers
2832 sanitizer = tuple[0]
2833 build = tuple[1]
b68dfb9e 2834
7a6397d2 2835 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
52d4d1d3
ZJS
2836 prev = ''
2837 foreach p : fuzz_regression_tests
2838 b = p.split('/')[-2]
2839 c = p.split('/')[-1]
2840
2841 name = '@0@:@1@'.format(b, sanitizer)
2842
2843 if name != prev
2844 if want_tests == 'false'
2845 message('Not compiling @0@ because tests is set to false'.format(name))
2846 elif slow_tests
2847 exe = custom_target(
2848 name,
2849 output : name,
2850 depends : build,
2851 command : [env, 'ln', '-fs',
2852 join_paths(build.full_path(), b),
2853 '@OUTPUT@'],
2854 build_by_default : true)
2855 else
2856 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2857 endif
2858 endif
2859 prev = name
2860
2861 if want_tests != 'false' and slow_tests
2862 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2863 env,
2864 args : [exe.full_path(),
e6bad674 2865 join_paths(meson.source_root(), p)])
52d4d1d3
ZJS
2866 endif
2867 endforeach
b68dfb9e
ZJS
2868 endif
2869endforeach
2870
52d4d1d3 2871
b68dfb9e
ZJS
2872############################################################
2873
0700e8ba 2874if git.found()
37efbbd8
ZJS
2875 all_files = run_command(
2876 git,
243e5cec 2877 ['--git-dir=@0@/.git'.format(meson.source_root()),
37efbbd8
ZJS
2878 'ls-files',
2879 ':/*.[ch]'])
2880 all_files = files(all_files.stdout().split())
d68b342b 2881
e85a690b 2882 custom_target(
0700e8ba 2883 'tags',
e85a690b 2884 output : 'tags',
243e5cec 2885 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
2f09974f 2886 run_target(
0700e8ba 2887 'ctags',
243e5cec 2888 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
d68b342b 2889endif
177929c2
ZJS
2890
2891if git.found()
37efbbd8 2892 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
a923e085 2893 run_target(
37efbbd8 2894 'git-contrib',
37efbbd8 2895 command : [meson_git_contrib_sh])
177929c2 2896endif
dd6ab3df
ZJS
2897
2898if git.found()
2899 git_head = run_command(
2900 git,
243e5cec 2901 ['--git-dir=@0@/.git'.format(meson.source_root()),
dd6ab3df
ZJS
2902 'rev-parse', 'HEAD']).stdout().strip()
2903 git_head_short = run_command(
2904 git,
243e5cec 2905 ['--git-dir=@0@/.git'.format(meson.source_root()),
dd6ab3df
ZJS
2906 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2907
2908 run_target(
2909 'git-snapshot',
2910 command : ['git', 'archive',
243e5cec 2911 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
dd6ab3df
ZJS
2912 git_head_short),
2913 '--prefix', 'systemd-@0@/'.format(git_head),
2914 'HEAD'])
2915endif
829257d1
ZJS
2916
2917############################################################
2918
51b13863
LP
2919meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2920run_target(
2921 'check-api-docs',
2922 depends : [man, libsystemd, libudev],
2923 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2924
0bc7a22d
LP
2925run_target(
2926 'make-index-md',
2927 command : ['sh', '@0@/tools/make-index-md.sh'.format(meson.source_root()), meson.source_root()])
2928
51b13863
LP
2929############################################################
2930
829257d1
ZJS
2931status = [
2932 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2933
2675413e 2934 'split /usr: @0@'.format(split_usr),
157baa87 2935 'split bin-sbin: @0@'.format(split_bin),
359b496f
YW
2936 'prefix directory: @0@'.format(prefixdir),
2937 'rootprefix directory: @0@'.format(rootprefixdir),
2938 'sysconf directory: @0@'.format(sysconfdir),
2939 'include directory: @0@'.format(includedir),
2940 'lib directory: @0@'.format(libdir),
2941 'rootlib directory: @0@'.format(rootlibdir),
829257d1
ZJS
2942 'SysV init scripts: @0@'.format(sysvinit_path),
2943 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
359b496f
YW
2944 'PAM modules directory: @0@'.format(pamlibdir),
2945 'PAM configuration directory: @0@'.format(pamconfdir),
2946 'RPM macros directory: @0@'.format(rpmmacrosdir),
2947 'modprobe.d directory: @0@'.format(modprobedir),
2948 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2949 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2950 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2951 'bash completions directory: @0@'.format(bashcompletiondir),
2952 'zsh completions directory: @0@'.format(zshcompletiondir),
829257d1
ZJS
2953 'extra start script: @0@'.format(get_option('rc-local')),
2954 'extra stop script: @0@'.format(get_option('halt-local')),
2955 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2956 get_option('debug-tty')),
2957 'TTY GID: @0@'.format(tty_gid),
ac09340e 2958 'users GID: @0@'.format(substs.get('USERS_GID')),
829257d1
ZJS
2959 'maximum system UID: @0@'.format(system_uid_max),
2960 'maximum system GID: @0@'.format(system_gid_max),
87d5e4f2
LP
2961 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2962 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2963 'minimum container UID base: @0@'.format(container_uid_base_min),
2964 'maximum container UID base: @0@'.format(container_uid_base_max),
829257d1 2965 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
4e15a734 2966 'render group access mode: @0@'.format(get_option('group-render-mode')),
359b496f 2967 'certificate root directory: @0@'.format(get_option('certificate-root')),
829257d1 2968 'support URL: @0@'.format(support_url),
afde4574
LP
2969 'nobody user name: @0@'.format(nobody_user),
2970 'nobody group name: @0@'.format(nobody_group),
829257d1 2971 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
5248e7e1 2972 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
829257d1
ZJS
2973
2974 'default DNSSEC mode: @0@'.format(default_dnssec),
c9299be2 2975 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
829257d1
ZJS
2976 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2977 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2978
2979alt_dns_servers = '\n '.join(dns_servers.split(' '))
2980alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2981status += [
2982 'default DNS servers: @0@'.format(alt_dns_servers),
2983 'default NTP servers: @0@'.format(alt_ntp_servers)]
2984
2985alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2986 '@@0@'.format(time_epoch)).stdout().strip()
2987status += [
2988 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2989
19d8c9c9 2990status += [
abc8caf7
ZJS
2991 'static libsystemd: @0@'.format(static_libsystemd),
2992 'static libudev: @0@'.format(static_libudev)]
19d8c9c9 2993
829257d1
ZJS
2994# TODO:
2995# CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2996# CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2997# LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2998
349cc4a5 2999if conf.get('ENABLE_EFI') == 1
5a8b1640 3000 status += 'efi arch: @0@'.format(efi_arch)
829257d1
ZJS
3001
3002 if have_gnu_efi
3003 status += [
3004 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3005 'EFI CC @0@'.format(efi_cc),
359b496f
YW
3006 'EFI lib directory: @0@'.format(efi_libdir),
3007 'EFI lds directory: @0@'.format(efi_ldsdir),
3008 'EFI include directory: @0@'.format(efi_incdir)]
829257d1
ZJS
3009 endif
3010endif
3011
3012found = []
3013missing = []
3014
3015foreach tuple : [
3016 ['libcryptsetup'],
3017 ['PAM'],
3018 ['AUDIT'],
3019 ['IMA'],
3020 ['AppArmor'],
3021 ['SELinux'],
3022 ['SECCOMP'],
3023 ['SMACK'],
3024 ['zlib'],
3025 ['xz'],
3026 ['lz4'],
3027 ['bzip2'],
3028 ['ACL'],
3029 ['gcrypt'],
3030 ['qrencode'],
3031 ['microhttpd'],
3032 ['gnutls'],
096cbdce 3033 ['openssl'],
829257d1 3034 ['libcurl'],
d1bf5675 3035 ['idn'],
87057e24 3036 ['libidn2'],
829257d1
ZJS
3037 ['libidn'],
3038 ['libiptc'],
3039 ['elfutils'],
3040 ['binfmt'],
3041 ['vconsole'],
3042 ['quotacheck'],
3043 ['tmpfiles'],
3044 ['environment.d'],
3045 ['sysusers'],
3046 ['firstboot'],
3047 ['randomseed'],
3048 ['backlight'],
3049 ['rfkill'],
3050 ['logind'],
3051 ['machined'],
61d0578b 3052 ['portabled'],
829257d1
ZJS
3053 ['importd'],
3054 ['hostnamed'],
3055 ['timedated'],
3056 ['timesyncd'],
3057 ['localed'],
3058 ['networkd'],
a7456af5 3059 ['resolve'],
096cbdce
IT
3060 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3061 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
829257d1
ZJS
3062 ['coredump'],
3063 ['polkit'],
3064 ['legacy pkla', install_polkit_pkla],
3065 ['efi'],
3066 ['gnu-efi', have_gnu_efi],
3067 ['kmod'],
3068 ['xkbcommon'],
c4c978a0 3069 ['pcre2'],
829257d1
ZJS
3070 ['blkid'],
3071 ['dbus'],
3072 ['glib'],
6bd2bc8e
ZJS
3073 ['nss-myhostname'],
3074 ['nss-mymachines'],
3075 ['nss-resolve'],
3076 ['nss-systemd'],
829257d1
ZJS
3077 ['hwdb'],
3078 ['tpm'],
3079 ['man pages', want_man],
3080 ['html pages', want_html],
3081 ['man page indices', want_man and have_lxml],
829257d1
ZJS
3082 ['SysV compat'],
3083 ['utmp'],
3084 ['ldconfig'],
3085 ['hibernate'],
3086 ['adm group', get_option('adm-group')],
3087 ['wheel group', get_option('wheel-group')],
b14e1b43 3088 ['gshadow'],
829257d1
ZJS
3089 ['debug hashmap'],
3090 ['debug mmap cache'],
d18cb393 3091 ['valgrind', conf.get('VALGRIND') == 1],
fd5dec9a 3092 ['trace logging', conf.get('LOG_TRACE') == 1],
19d8c9c9
LP
3093 ['link-udev-shared', get_option('link-udev-shared')],
3094 ['link-systemctl-shared', get_option('link-systemctl-shared')],
829257d1
ZJS
3095]
3096
af4d7860
ZJS
3097 if tuple.length() >= 2
3098 cond = tuple[1]
3099 else
829257d1
ZJS
3100 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3101 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
349cc4a5 3102 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
829257d1
ZJS
3103 endif
3104 if cond
5a8b1640 3105 found += tuple[0]
829257d1 3106 else
5a8b1640 3107 missing += tuple[0]
829257d1
ZJS
3108 endif
3109endforeach
3110
3111status += [
9d39c1bf 3112 '',
829257d1 3113 'enabled features: @0@'.format(', '.join(found)),
9d39c1bf
ZJS
3114 '',
3115 'disabled features: @0@'.format(', '.join(missing)),
3116 '']
829257d1 3117message('\n '.join(status))
9a8e64b0
ZJS
3118
3119if rootprefixdir != rootprefix_default
8ea9fad7
YW
3120 warning('\n' +
3121 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3122 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3123 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
9a8e64b0 3124endif