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