]> git.ipfire.org Git - thirdparty/systemd.git/blame - meson.build
Merge pull request #16793 from poettering/path-join-more
[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',
e71f5585 893 version : '>= 2.33',
e594a3b1
LP
894 required : want_libfdisk == 'true')
895 have = libfdisk.found()
896else
897 have = false
898 libfdisk = []
899endif
900conf.set10('HAVE_LIBFDISK', have)
901
70a5db58
LP
902want_pwquality = get_option('pwquality')
903if want_pwquality != 'false' and not skip_deps
904 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
905 have = libpwquality.found()
906else
907 have = false
908 libpwquality = []
909endif
910conf.set10('HAVE_PWQUALITY', have)
911
5c23128d 912want_seccomp = get_option('seccomp')
87ac55a1 913if want_seccomp != 'false' and not skip_deps
37efbbd8 914 libseccomp = dependency('libseccomp',
9f0e9c01 915 version : '>= 2.3.1',
37efbbd8 916 required : want_seccomp == 'true')
349cc4a5 917 have = libseccomp.found()
5c23128d 918else
349cc4a5 919 have = false
37efbbd8 920 libseccomp = []
5c23128d 921endif
349cc4a5 922conf.set10('HAVE_SECCOMP', have)
5c23128d
ZJS
923
924want_selinux = get_option('selinux')
87ac55a1 925if want_selinux != 'false' and not skip_deps
37efbbd8
ZJS
926 libselinux = dependency('libselinux',
927 version : '>= 2.1.9',
928 required : want_selinux == 'true')
349cc4a5 929 have = libselinux.found()
5c23128d 930else
349cc4a5 931 have = false
37efbbd8 932 libselinux = []
5c23128d 933endif
349cc4a5 934conf.set10('HAVE_SELINUX', have)
5c23128d
ZJS
935
936want_apparmor = get_option('apparmor')
87ac55a1 937if want_apparmor != 'false' and not skip_deps
37efbbd8 938 libapparmor = dependency('libapparmor',
2ffadd3c 939 version : '>= 2.13',
37efbbd8 940 required : want_apparmor == 'true')
349cc4a5 941 have = libapparmor.found()
5c23128d 942else
349cc4a5 943 have = false
37efbbd8 944 libapparmor = []
5c23128d 945endif
349cc4a5 946conf.set10('HAVE_APPARMOR', have)
5c23128d 947
5c23128d
ZJS
948smack_run_label = get_option('smack-run-label')
949if smack_run_label != ''
37efbbd8 950 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
5c23128d
ZJS
951endif
952
3ca0cb73
ZJS
953want_polkit = get_option('polkit')
954install_polkit = false
955install_polkit_pkla = false
87ac55a1 956if want_polkit != 'false' and not skip_deps
37efbbd8 957 install_polkit = true
3ca0cb73 958
37efbbd8
ZJS
959 libpolkit = dependency('polkit-gobject-1',
960 required : false)
961 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
962 message('Old polkit detected, will install pkla files')
963 install_polkit_pkla = true
964 endif
3ca0cb73 965endif
349cc4a5 966conf.set10('ENABLE_POLKIT', install_polkit)
3ca0cb73 967
36f0387e 968want_acl = get_option('acl')
87ac55a1 969if want_acl != 'false' and not skip_deps
36f0387e 970 libacl = cc.find_library('acl', required : want_acl == 'true')
349cc4a5 971 have = libacl.found()
36f0387e 972else
349cc4a5 973 have = false
36f0387e
ZJS
974 libacl = []
975endif
349cc4a5 976conf.set10('HAVE_ACL', have)
36f0387e 977
5c23128d 978want_audit = get_option('audit')
87ac55a1 979if want_audit != 'false' and not skip_deps
37efbbd8 980 libaudit = dependency('audit', required : want_audit == 'true')
349cc4a5 981 have = libaudit.found()
5c23128d 982else
349cc4a5 983 have = false
37efbbd8 984 libaudit = []
5c23128d 985endif
349cc4a5 986conf.set10('HAVE_AUDIT', have)
5c23128d
ZJS
987
988want_blkid = get_option('blkid')
87ac55a1 989if want_blkid != 'false' and not skip_deps
37efbbd8 990 libblkid = dependency('blkid', required : want_blkid == 'true')
349cc4a5 991 have = libblkid.found()
5c23128d 992else
349cc4a5 993 have = false
37efbbd8 994 libblkid = []
5c23128d 995endif
349cc4a5 996conf.set10('HAVE_BLKID', have)
5c23128d
ZJS
997
998want_kmod = get_option('kmod')
87ac55a1 999if want_kmod != 'false' and not skip_deps
37efbbd8
ZJS
1000 libkmod = dependency('libkmod',
1001 version : '>= 15',
1002 required : want_kmod == 'true')
349cc4a5 1003 have = libkmod.found()
5c23128d 1004else
349cc4a5 1005 have = false
37efbbd8 1006 libkmod = []
5c23128d 1007endif
349cc4a5 1008conf.set10('HAVE_KMOD', have)
5c23128d
ZJS
1009
1010want_pam = get_option('pam')
87ac55a1 1011if want_pam != 'false' and not skip_deps
37efbbd8
ZJS
1012 libpam = cc.find_library('pam', required : want_pam == 'true')
1013 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
349cc4a5 1014 have = libpam.found() and libpam_misc.found()
5c23128d 1015else
349cc4a5 1016 have = false
37efbbd8
ZJS
1017 libpam = []
1018 libpam_misc = []
5c23128d 1019endif
349cc4a5 1020conf.set10('HAVE_PAM', have)
5c23128d
ZJS
1021
1022want_microhttpd = get_option('microhttpd')
87ac55a1 1023if want_microhttpd != 'false' and not skip_deps
37efbbd8
ZJS
1024 libmicrohttpd = dependency('libmicrohttpd',
1025 version : '>= 0.9.33',
1026 required : want_microhttpd == 'true')
349cc4a5 1027 have = libmicrohttpd.found()
5c23128d 1028else
349cc4a5 1029 have = false
37efbbd8 1030 libmicrohttpd = []
5c23128d 1031endif
349cc4a5 1032conf.set10('HAVE_MICROHTTPD', have)
5c23128d
ZJS
1033
1034want_libcryptsetup = get_option('libcryptsetup')
87ac55a1 1035if want_libcryptsetup != 'false' and not skip_deps
37efbbd8 1036 libcryptsetup = dependency('libcryptsetup',
d90874b4 1037 version : '>= 2.0.1',
37efbbd8 1038 required : want_libcryptsetup == 'true')
349cc4a5 1039 have = libcryptsetup.found()
70a5db58
LP
1040
1041 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1042 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
c2923fdc
LB
1043 conf.set10('HAVE_CRYPT_ACTIVATE_BY_SIGNED_KEY',
1044 have and cc.has_function('crypt_activate_by_signed_key', dependencies : libcryptsetup))
5c23128d 1045else
349cc4a5 1046 have = false
37efbbd8 1047 libcryptsetup = []
5c23128d 1048endif
349cc4a5 1049conf.set10('HAVE_LIBCRYPTSETUP', have)
5c23128d
ZJS
1050
1051want_libcurl = get_option('libcurl')
87ac55a1 1052if want_libcurl != 'false' and not skip_deps
37efbbd8
ZJS
1053 libcurl = dependency('libcurl',
1054 version : '>= 7.32.0',
1055 required : want_libcurl == 'true')
349cc4a5 1056 have = libcurl.found()
5c23128d 1057else
349cc4a5 1058 have = false
37efbbd8 1059 libcurl = []
5c23128d 1060endif
349cc4a5 1061conf.set10('HAVE_LIBCURL', have)
5c23128d
ZJS
1062
1063want_libidn = get_option('libidn')
87057e24
ZJS
1064want_libidn2 = get_option('libidn2')
1065if want_libidn == 'true' and want_libidn2 == 'true'
1066 error('libidn and libidn2 cannot be requested simultaneously')
1067endif
1068
1b931399
YW
1069if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1070 libidn = dependency('libidn2',
1071 required : want_libidn2 == 'true')
349cc4a5 1072 have = libidn.found()
87057e24 1073else
349cc4a5 1074 have = false
87057e24
ZJS
1075 libidn = []
1076endif
1b931399
YW
1077conf.set10('HAVE_LIBIDN2', have)
1078if not have and want_libidn != 'false' and not skip_deps
7f7ab228 1079 # libidn is used for both libidn and libidn2 objects
1b931399
YW
1080 libidn = dependency('libidn',
1081 required : want_libidn == 'true')
349cc4a5
ZJS
1082 have = libidn.found()
1083else
1084 have = false
5c23128d 1085endif
1b931399 1086conf.set10('HAVE_LIBIDN', have)
5c23128d
ZJS
1087
1088want_libiptc = get_option('libiptc')
87ac55a1 1089if want_libiptc != 'false' and not skip_deps
37efbbd8
ZJS
1090 libiptc = dependency('libiptc',
1091 required : want_libiptc == 'true')
349cc4a5 1092 have = libiptc.found()
5c23128d 1093else
349cc4a5 1094 have = false
37efbbd8 1095 libiptc = []
5c23128d 1096endif
349cc4a5 1097conf.set10('HAVE_LIBIPTC', have)
5c23128d
ZJS
1098
1099want_qrencode = get_option('qrencode')
87ac55a1 1100if want_qrencode != 'false' and not skip_deps
37efbbd8
ZJS
1101 libqrencode = dependency('libqrencode',
1102 required : want_qrencode == 'true')
349cc4a5 1103 have = libqrencode.found()
5c23128d 1104else
349cc4a5 1105 have = false
37efbbd8 1106 libqrencode = []
5c23128d 1107endif
349cc4a5 1108conf.set10('HAVE_QRENCODE', have)
5c23128d 1109
a44fb601 1110want_gcrypt = get_option('gcrypt')
87ac55a1 1111if want_gcrypt != 'false' and not skip_deps
a44fb601
ZJS
1112 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1113 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
349cc4a5 1114 have = libgcrypt.found() and libgpg_error.found()
a44fb601 1115else
349cc4a5
ZJS
1116 have = false
1117endif
1118if not have
1119 # link to neither of the libs if one is not found
a44fb601
ZJS
1120 libgcrypt = []
1121 libgpg_error = []
1122endif
349cc4a5 1123conf.set10('HAVE_GCRYPT', have)
a44fb601 1124
5c23128d 1125want_gnutls = get_option('gnutls')
87ac55a1 1126if want_gnutls != 'false' and not skip_deps
37efbbd8
ZJS
1127 libgnutls = dependency('gnutls',
1128 version : '>= 3.1.4',
1129 required : want_gnutls == 'true')
349cc4a5 1130 have = libgnutls.found()
5c23128d 1131else
349cc4a5 1132 have = false
37efbbd8 1133 libgnutls = []
5c23128d 1134endif
349cc4a5 1135conf.set10('HAVE_GNUTLS', have)
5c23128d 1136
096cbdce 1137want_openssl = get_option('openssl')
87ac55a1 1138if want_openssl != 'false' and not skip_deps
096cbdce
IT
1139 libopenssl = dependency('openssl',
1140 version : '>= 1.1.0',
1141 required : want_openssl == 'true')
1142 have = libopenssl.found()
1143else
1144 have = false
1145 libopenssl = []
1146endif
1147conf.set10('HAVE_OPENSSL', have)
1148
839fddbe
LP
1149want_p11kit = get_option('p11kit')
1150if want_p11kit != 'false' and not skip_deps
1151 libp11kit = dependency('p11-kit-1',
6164ec4c
ZJS
1152 version : '>= 0.23.3',
1153 required : want_p11kit == 'true')
839fddbe
LP
1154 have = libp11kit.found()
1155else
1156 have = false
1157 libp11kit = []
1158endif
1159conf.set10('HAVE_P11KIT', have)
1160
af4fbd46
LP
1161want_libfido2 = get_option('libfido2')
1162if want_libfido2 != 'false' and not skip_deps
1163 libfido2 = dependency('libfido2',
1164 required : want_libfido2 == 'true')
1165 have = libfido2.found()
1166else
1167 have = false
1168 libfido2 = []
1169endif
1170conf.set10('HAVE_LIBFIDO2', have)
1171
5c23128d 1172want_elfutils = get_option('elfutils')
87ac55a1 1173if want_elfutils != 'false' and not skip_deps
37efbbd8
ZJS
1174 libdw = dependency('libdw',
1175 required : want_elfutils == 'true')
349cc4a5 1176 have = libdw.found()
5c23128d 1177else
349cc4a5 1178 have = false
37efbbd8 1179 libdw = []
5c23128d 1180endif
349cc4a5 1181conf.set10('HAVE_ELFUTILS', have)
5c23128d
ZJS
1182
1183want_zlib = get_option('zlib')
87ac55a1 1184if want_zlib != 'false' and not skip_deps
37efbbd8
ZJS
1185 libz = dependency('zlib',
1186 required : want_zlib == 'true')
349cc4a5 1187 have = libz.found()
5c23128d 1188else
349cc4a5 1189 have = false
37efbbd8 1190 libz = []
5c23128d 1191endif
349cc4a5 1192conf.set10('HAVE_ZLIB', have)
5c23128d
ZJS
1193
1194want_bzip2 = get_option('bzip2')
87ac55a1 1195if want_bzip2 != 'false' and not skip_deps
37efbbd8
ZJS
1196 libbzip2 = cc.find_library('bz2',
1197 required : want_bzip2 == 'true')
349cc4a5 1198 have = libbzip2.found()
5c23128d 1199else
349cc4a5 1200 have = false
37efbbd8 1201 libbzip2 = []
5c23128d 1202endif
349cc4a5 1203conf.set10('HAVE_BZIP2', have)
5c23128d
ZJS
1204
1205want_xz = get_option('xz')
87ac55a1 1206if want_xz != 'false' and not skip_deps
37efbbd8
ZJS
1207 libxz = dependency('liblzma',
1208 required : want_xz == 'true')
d80b051c 1209 have_xz = libxz.found()
5c23128d 1210else
d80b051c 1211 have_xz = false
37efbbd8 1212 libxz = []
5c23128d 1213endif
d80b051c 1214conf.set10('HAVE_XZ', have_xz)
5c23128d
ZJS
1215
1216want_lz4 = get_option('lz4')
87ac55a1 1217if want_lz4 != 'false' and not skip_deps
37efbbd8 1218 liblz4 = dependency('liblz4',
e0a1d4b0 1219 version : '>= 1.3.0',
37efbbd8 1220 required : want_lz4 == 'true')
d80b051c 1221 have_lz4 = liblz4.found()
5c23128d 1222else
d80b051c 1223 have_lz4 = false
37efbbd8 1224 liblz4 = []
5c23128d 1225endif
d80b051c 1226conf.set10('HAVE_LZ4', have_lz4)
5c23128d 1227
ef5924aa
NL
1228want_zstd = get_option('zstd')
1229if want_zstd != 'false' and not skip_deps
1230 libzstd = dependency('libzstd',
1231 required : want_zstd == 'true',
1232 version : '>= 1.4.0')
d80b051c 1233 have_zstd = libzstd.found()
ef5924aa 1234else
d80b051c 1235 have_zstd = false
ef5924aa
NL
1236 libzstd = []
1237endif
d80b051c
LP
1238conf.set10('HAVE_ZSTD', have_zstd)
1239
1240conf.set10('HAVE_COMPRESSION', have_xz or have_lz4 or have_zstd)
ef5924aa 1241
a44fb601 1242want_xkbcommon = get_option('xkbcommon')
87ac55a1 1243if want_xkbcommon != 'false' and not skip_deps
a44fb601
ZJS
1244 libxkbcommon = dependency('xkbcommon',
1245 version : '>= 0.3.0',
1246 required : want_xkbcommon == 'true')
349cc4a5 1247 have = libxkbcommon.found()
a44fb601 1248else
349cc4a5 1249 have = false
a44fb601
ZJS
1250 libxkbcommon = []
1251endif
349cc4a5 1252conf.set10('HAVE_XKBCOMMON', have)
a44fb601 1253
c4c978a0
ZJS
1254want_pcre2 = get_option('pcre2')
1255if want_pcre2 != 'false'
1256 libpcre2 = dependency('libpcre2-8',
1257 required : want_pcre2 == 'true')
1258 have = libpcre2.found()
1259else
1260 have = false
1261 libpcre2 = []
1262endif
1263conf.set10('HAVE_PCRE2', have)
1264
69e96427 1265want_glib = get_option('glib')
87ac55a1 1266if want_glib != 'false' and not skip_deps
37efbbd8
ZJS
1267 libglib = dependency('glib-2.0',
1268 version : '>= 2.22.0',
1269 required : want_glib == 'true')
1270 libgobject = dependency('gobject-2.0',
1271 version : '>= 2.22.0',
1272 required : want_glib == 'true')
1273 libgio = dependency('gio-2.0',
1274 required : want_glib == 'true')
2c201c21 1275 have = libglib.found() and libgobject.found() and libgio.found()
69e96427 1276else
349cc4a5 1277 have = false
37efbbd8
ZJS
1278 libglib = []
1279 libgobject = []
1280 libgio = []
69e96427 1281endif
349cc4a5 1282conf.set10('HAVE_GLIB', have)
69e96427
ZJS
1283
1284want_dbus = get_option('dbus')
87ac55a1 1285if want_dbus != 'false' and not skip_deps
37efbbd8
ZJS
1286 libdbus = dependency('dbus-1',
1287 version : '>= 1.3.2',
1288 required : want_dbus == 'true')
349cc4a5 1289 have = libdbus.found()
69e96427 1290else
349cc4a5 1291 have = false
37efbbd8 1292 libdbus = []
69e96427 1293endif
349cc4a5 1294conf.set10('HAVE_DBUS', have)
69e96427 1295
42303dcb 1296default_dnssec = get_option('default-dnssec')
87ac55a1 1297if skip_deps
b4081f3e
JR
1298 default_dnssec = 'no'
1299endif
349cc4a5 1300if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
42303dcb
YW
1301 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1302 default_dnssec = 'no'
1303endif
1304conf.set('DEFAULT_DNSSEC_MODE',
1305 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1306substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1307
56ddbf10
YW
1308dns_over_tls = get_option('dns-over-tls')
1309if dns_over_tls != 'false'
096cbdce
IT
1310 if dns_over_tls == 'openssl'
1311 have_gnutls = false
1312 else
38e053c5 1313 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
096cbdce
IT
1314 if dns_over_tls == 'gnutls' and not have_gnutls
1315 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1316 endif
56ddbf10 1317 endif
096cbdce
IT
1318 if dns_over_tls == 'gnutls' or have_gnutls
1319 have_openssl = false
1320 else
1321 have_openssl = conf.get('HAVE_OPENSSL') == 1
1322 if dns_over_tls != 'auto' and not have_openssl
1323 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
b349bc59 1324 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
096cbdce
IT
1325 endif
1326 endif
1327 have = have_gnutls or have_openssl
56ddbf10 1328else
be5536a6
MO
1329 have = false
1330 have_gnutls = false
1331 have_openssl = false
56ddbf10
YW
1332endif
1333conf.set10('ENABLE_DNS_OVER_TLS', have)
096cbdce
IT
1334conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1335conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
56ddbf10 1336
c9299be2 1337default_dns_over_tls = get_option('default-dns-over-tls')
87ac55a1 1338if skip_deps
c9299be2 1339 default_dns_over_tls = 'no'
5d67a7ae 1340endif
56ddbf10 1341if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
4310bfc2 1342 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 1343 default_dns_over_tls = 'no'
5d67a7ae 1344endif
c9299be2
IT
1345conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1346 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1347substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
5d67a7ae 1348
3614df05
ZJS
1349default_mdns = get_option('default-mdns')
1350conf.set('DEFAULT_MDNS_MODE',
1351 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
1352substs.set('DEFAULT_MDNS_MODE', default_mdns)
1353
1354default_llmnr = get_option('default-llmnr')
1355conf.set('DEFAULT_LLMNR_MODE',
1356 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
1357substs.set('DEFAULT_LLMNR_MODE', default_llmnr)
1358
e594a3b1
LP
1359want_repart = get_option('repart')
1360if want_repart != 'false'
1361 have = (conf.get('HAVE_OPENSSL') == 1 and
1362 conf.get('HAVE_LIBFDISK') == 1)
1363 if want_repart == 'true' and not have
1364 error('repart support was requested, but dependencies are not available')
1365 endif
1366else
1367 have = false
1368endif
1369conf.set10('ENABLE_REPART', have)
1370
5c23128d 1371want_importd = get_option('importd')
4390be30 1372if want_importd != 'false'
349cc4a5
ZJS
1373 have = (conf.get('HAVE_LIBCURL') == 1 and
1374 conf.get('HAVE_ZLIB') == 1 and
349cc4a5
ZJS
1375 conf.get('HAVE_XZ') == 1 and
1376 conf.get('HAVE_GCRYPT') == 1)
1377 if want_importd == 'true' and not have
37efbbd8
ZJS
1378 error('importd support was requested, but dependencies are not available')
1379 endif
349cc4a5
ZJS
1380else
1381 have = false
5c23128d 1382endif
349cc4a5 1383conf.set10('ENABLE_IMPORTD', have)
5c23128d 1384
70a5db58
LP
1385want_homed = get_option('homed')
1386if want_homed != 'false'
1387 have = (conf.get('HAVE_OPENSSL') == 1 and
1388 conf.get('HAVE_LIBFDISK') == 1 and
1389 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1390 if want_homed == 'true' and not have
1391 error('homed support was requested, but dependencies are not available')
1392 endif
1393else
1394 have = false
1395endif
1396conf.set10('ENABLE_HOMED', have)
1397
af06ddf5
YW
1398have = have and conf.get('HAVE_PAM') == 1
1399conf.set10('ENABLE_PAM_HOME', have)
1400
5c23128d 1401want_remote = get_option('remote')
4390be30 1402if want_remote != 'false'
349cc4a5
ZJS
1403 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1404 conf.get('HAVE_LIBCURL') == 1]
37efbbd8
ZJS
1405 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1406 # it's possible to build one without the other. Complain only if
5238e957 1407 # support was explicitly requested. The auxiliary files like sysusers
37efbbd8
ZJS
1408 # config should be installed when any of the programs are built.
1409 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1410 error('remote support was requested, but dependencies are not available')
1411 endif
349cc4a5
ZJS
1412 have = have_deps[0] or have_deps[1]
1413else
1414 have = false
5c23128d 1415endif
349cc4a5 1416conf.set10('ENABLE_REMOTE', have)
5c23128d 1417
a9149d87
ZJS
1418foreach term : ['utmp',
1419 'hibernate',
1420 'environment-d',
1421 'binfmt',
1422 'coredump',
9b4abc69 1423 'pstore',
a9149d87
ZJS
1424 'resolve',
1425 'logind',
1426 'hostnamed',
1427 'localed',
1428 'machined',
61d0578b 1429 'portabled',
d093b62c 1430 'userdb',
a9149d87
ZJS
1431 'networkd',
1432 'timedated',
1433 'timesyncd',
a9149d87
ZJS
1434 'firstboot',
1435 'randomseed',
1436 'backlight',
1437 'vconsole',
1438 'quotacheck',
1439 'sysusers',
1440 'tmpfiles',
1441 'hwdb',
1442 'rfkill',
8feca247 1443 'xdg-autostart',
a9149d87
ZJS
1444 'ldconfig',
1445 'efi',
1446 'tpm',
1447 'ima',
1448 'smack',
1449 'gshadow',
1450 'idn',
cdf7ad38 1451 'initrd',
08540a95 1452 'nss-myhostname',
a9149d87
ZJS
1453 'nss-systemd']
1454 have = get_option(term)
1455 name = 'ENABLE_' + term.underscorify().to_upper()
1456 conf.set10(name, have)
5c23128d
ZJS
1457endforeach
1458
08540a95
YW
1459foreach tuple : [['nss-mymachines', 'machined'],
1460 ['nss-resolve', 'resolve']]
1461 want = get_option(tuple[0])
1462 if want != 'false'
1463 have = get_option(tuple[1])
1464 if want == 'true' and not have
1465 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1466 endif
1467 else
1468 have = false
1469 endif
1470 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1471 conf.set10(name, have)
1472endforeach
1473
1474enable_nss = false
1475foreach term : ['ENABLE_NSS_MYHOSTNAME',
1476 'ENABLE_NSS_MYMACHINES',
1477 'ENABLE_NSS_RESOLVE',
1478 'ENABLE_NSS_SYSTEMD']
1479 if conf.get(term) == 1
1480 enable_nss = true
1481 endif
1482endforeach
1483conf.set10('ENABLE_NSS', enable_nss)
1484
348b4437 1485conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
6129ec85 1486
69e96427 1487tests = []
7db7d5b7 1488fuzzers = []
69e96427 1489
b68dfb9e 1490conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
00d82c81 1491
5c23128d
ZJS
1492#####################################################################
1493
1494if get_option('efi')
37efbbd8 1495 efi_arch = host_machine.cpu_family()
b710072d 1496
6800fe7f 1497 if efi_arch == 'x86'
37efbbd8 1498 EFI_MACHINE_TYPE_NAME = 'ia32'
6800fe7f 1499 gnu_efi_arch = 'ia32'
37efbbd8
ZJS
1500 elif efi_arch == 'x86_64'
1501 EFI_MACHINE_TYPE_NAME = 'x64'
6800fe7f 1502 gnu_efi_arch = 'x86_64'
37efbbd8
ZJS
1503 elif efi_arch == 'arm'
1504 EFI_MACHINE_TYPE_NAME = 'arm'
6800fe7f 1505 gnu_efi_arch = 'arm'
37efbbd8
ZJS
1506 elif efi_arch == 'aarch64'
1507 EFI_MACHINE_TYPE_NAME = 'aa64'
6800fe7f 1508 gnu_efi_arch = 'aarch64'
37efbbd8
ZJS
1509 else
1510 EFI_MACHINE_TYPE_NAME = ''
6800fe7f 1511 gnu_efi_arch = ''
37efbbd8 1512 endif
5c23128d 1513
349cc4a5 1514 have = true
37efbbd8 1515 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
80c6fce8 1516
ac09340e 1517 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
349cc4a5
ZJS
1518else
1519 have = false
5c23128d 1520endif
349cc4a5 1521conf.set10('ENABLE_EFI', have)
5c23128d
ZJS
1522
1523#####################################################################
1524
1525config_h = configure_file(
37efbbd8
ZJS
1526 output : 'config.h',
1527 configuration : conf)
5c23128d 1528
348b4437
YW
1529meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1530
5c23128d 1531includes = include_directories('src/basic',
91b08bb0 1532 'src/boot',
c76dd733 1533 'src/home',
5c23128d
ZJS
1534 'src/shared',
1535 'src/systemd',
1536 'src/journal',
a38f7fec 1537 'src/journal-remote',
97d90615 1538 'src/nspawn',
5c23128d
ZJS
1539 'src/resolve',
1540 'src/timesync',
5c3376ef 1541 'src/time-wait-sync',
5c23128d
ZJS
1542 'src/login',
1543 'src/udev',
1544 'src/libudev',
1545 'src/core',
9e71f5d9 1546 'src/shutdown',
8feca247 1547 'src/xdg-autostart-generator',
5c23128d
ZJS
1548 'src/libsystemd/sd-bus',
1549 'src/libsystemd/sd-device',
a137a1c3 1550 'src/libsystemd/sd-event',
5c23128d
ZJS
1551 'src/libsystemd/sd-hwdb',
1552 'src/libsystemd/sd-id128',
1553 'src/libsystemd/sd-netlink',
1554 'src/libsystemd/sd-network',
ceb26cdb 1555 'src/libsystemd/sd-resolve',
5c23128d 1556 'src/libsystemd-network',
2d4ceca8 1557 '.')
5c23128d
ZJS
1558
1559add_project_arguments('-include', 'config.h', language : 'c')
1560
6ec439fd
YW
1561generate_gperfs = find_program('tools/generate-gperfs.py')
1562
5c23128d
ZJS
1563subdir('po')
1564subdir('catalog')
1565subdir('src/systemd')
1566subdir('src/basic')
1567subdir('src/libsystemd')
1568subdir('src/libsystemd-network')
5c23128d 1569subdir('src/journal')
5c23128d 1570subdir('src/login')
5c23128d
ZJS
1571
1572libjournal_core = static_library(
37efbbd8
ZJS
1573 'journal-core',
1574 libjournal_core_sources,
1575 journald_gperf_c,
1576 include_directories : includes,
1577 install : false)
5c23128d 1578
1485aacb 1579libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
5c23128d 1580libsystemd = shared_library(
37efbbd8 1581 'systemd',
a5d8835c 1582 disable_mempool_c,
56d50ab1 1583 version : libsystemd_version,
37efbbd8
ZJS
1584 include_directories : includes,
1585 link_args : ['-shared',
1586 '-Wl,--version-script=' + libsystemd_sym_path],
34e221a5
ZJS
1587 link_with : [libbasic,
1588 libbasic_gcrypt],
5e3cec87
ZJS
1589 link_whole : [libsystemd_static,
1590 libjournal_client],
37efbbd8
ZJS
1591 dependencies : [threads,
1592 librt,
1593 libxz,
ef5924aa 1594 libzstd,
37efbbd8
ZJS
1595 liblz4],
1596 link_depends : libsystemd_sym,
1597 install : true,
1598 install_dir : rootlibdir)
5c23128d 1599
70848ecf
DC
1600static_libsystemd = get_option('static-libsystemd')
1601static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1602
1603install_libsystemd_static = static_library(
1604 'systemd',
1605 libsystemd_sources,
1606 journal_client_sources,
975464e0
ZJS
1607 basic_sources,
1608 basic_gcrypt_sources,
be44b572 1609 disable_mempool_c,
70848ecf 1610 include_directories : includes,
70848ecf
DC
1611 build_by_default : static_libsystemd != 'false',
1612 install : static_libsystemd != 'false',
1613 install_dir : rootlibdir,
1614 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1615 dependencies : [threads,
1616 librt,
1617 libxz,
ef5924aa 1618 libzstd,
70848ecf 1619 liblz4,
975464e0
ZJS
1620 libcap,
1621 libblkid,
1622 libmount,
1623 libselinux,
70848ecf
DC
1624 libgcrypt],
1625 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1626
6164ec4c 1627# Generate autosuspend rules
b61d777a
ML
1628make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1629
5c23128d
ZJS
1630############################################################
1631
83b6af36
ZJS
1632# binaries that have --help and are intended for use by humans,
1633# usually, but not always, installed in /bin.
1634public_programs = []
1635
1636subdir('src/libudev')
1637subdir('src/shared')
1638subdir('src/core')
9e71f5d9 1639subdir('src/shutdown')
83b6af36
ZJS
1640subdir('src/udev')
1641subdir('src/network')
1642
1643subdir('src/analyze')
1644subdir('src/journal-remote')
1645subdir('src/coredump')
9b4abc69 1646subdir('src/pstore')
83b6af36
ZJS
1647subdir('src/hostname')
1648subdir('src/import')
e594a3b1 1649subdir('src/partition')
83b6af36
ZJS
1650subdir('src/kernel-install')
1651subdir('src/locale')
1652subdir('src/machine')
61d0578b 1653subdir('src/portable')
d093b62c 1654subdir('src/userdb')
70a5db58 1655subdir('src/home')
83b6af36
ZJS
1656subdir('src/nspawn')
1657subdir('src/resolve')
1658subdir('src/timedate')
1659subdir('src/timesync')
db64ba81 1660subdir('src/tmpfiles')
83b6af36 1661subdir('src/vconsole')
83b6af36
ZJS
1662subdir('src/boot/efi')
1663
1664subdir('src/test')
7db7d5b7 1665subdir('src/fuzz')
ef2ad30a 1666subdir('rules.d')
83b6af36
ZJS
1667subdir('test')
1668
1669############################################################
1670
1671# only static linking apart from libdl, to make sure that the
1672# module is linked to all libraries that it uses.
1673test_dlopen = executable(
37efbbd8
ZJS
1674 'test-dlopen',
1675 test_dlopen_c,
a5d8835c 1676 disable_mempool_c,
37efbbd8
ZJS
1677 include_directories : includes,
1678 link_with : [libbasic],
fd1939fb
YW
1679 dependencies : [libdl],
1680 build_by_default : want_tests != 'false')
83b6af36 1681
08540a95 1682foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
037b0a47 1683 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h src/nss-systemd/nss-systemd.h'],
08540a95
YW
1684 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1685 ['resolve', 'ENABLE_NSS_RESOLVE']]
5c23128d 1686
349cc4a5 1687 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
37efbbd8
ZJS
1688 if condition
1689 module = tuple[0]
37efbbd8
ZJS
1690
1691 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1485aacb 1692 version_script_arg = join_paths(project_source_root, sym)
37efbbd8 1693
1684c56f
LP
1694 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1695 if tuple.length() > 2
1696 sources += tuple[2].split()
1697 endif
1698
37efbbd8
ZJS
1699 nss = shared_library(
1700 'nss_' + module,
1684c56f 1701 sources,
a5d8835c 1702 disable_mempool_c,
37efbbd8
ZJS
1703 version : '2',
1704 include_directories : includes,
b4b36f44
LP
1705 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1706 link_args : ['-Wl,-z,nodelete',
1707 '-shared',
700805f6 1708 '-Wl,--version-script=' + version_script_arg],
37e4d7a8 1709 link_with : [libsystemd_static,
733cbd00 1710 libshared_static,
37efbbd8
ZJS
1711 libbasic],
1712 dependencies : [threads,
5486a31d 1713 librt],
37efbbd8
ZJS
1714 link_depends : sym,
1715 install : true,
1716 install_dir : rootlibdir)
1717
1718 # We cannot use shared_module because it does not support version suffix.
1719 # Unfortunately shared_library insists on creating the symlink…
1720 meson.add_install_script('sh', '-c',
1721 'rm $DESTDIR@0@/libnss_@1@.so'
1722 .format(rootlibdir, module))
1723
938be089
ZJS
1724 if want_tests != 'false'
1725 test('dlopen-nss_' + module,
1726 test_dlopen,
1727 # path to dlopen must include a slash
1728 args : nss.full_path())
1729 endif
37efbbd8 1730 endif
5c23128d
ZJS
1731endforeach
1732
1733############################################################
1734
6164ec4c
ZJS
1735executable(
1736 'systemd',
1737 systemd_sources,
1738 include_directories : includes,
1739 link_with : [libcore,
1740 libshared],
1741 dependencies : [versiondep,
1742 threads,
1743 librt,
1744 libseccomp,
1745 libselinux,
1746 libmount,
1747 libblkid],
1748 install_rpath : rootlibexecdir,
1749 install : true,
1750 install_dir : rootlibexecdir)
5c23128d 1751
ba7f4ae6
ZJS
1752meson.add_install_script(meson_make_symlink,
1753 join_paths(rootlibexecdir, 'systemd'),
1754 join_paths(rootsbindir, 'init'))
1755
6164ec4c
ZJS
1756public_programs += executable(
1757 'systemd-analyze',
1758 systemd_analyze_sources,
1759 include_directories : includes,
1760 link_with : [libcore,
1761 libshared],
1762 dependencies : [versiondep,
1763 threads,
1764 librt,
1765 libseccomp,
1766 libselinux,
1767 libmount,
1768 libblkid],
1769 install_rpath : rootlibexecdir,
1770 install : get_option('analyze'))
5c23128d 1771
6164ec4c
ZJS
1772executable(
1773 'systemd-journald',
1774 systemd_journald_sources,
1775 include_directories : includes,
1776 link_with : [libjournal_core,
1777 libshared],
1778 dependencies : [threads,
1779 libxz,
1780 liblz4,
ef5924aa
NL
1781 libselinux,
1782 libzstd],
6164ec4c
ZJS
1783 install_rpath : rootlibexecdir,
1784 install : true,
1785 install_dir : rootlibexecdir)
5c23128d 1786
6164ec4c
ZJS
1787public_programs += executable(
1788 'systemd-cat',
1789 systemd_cat_sources,
1790 include_directories : includes,
1791 link_with : [libjournal_core,
1792 libshared],
1793 dependencies : [threads],
1794 install_rpath : rootlibexecdir,
1795 install : true)
1796
1797public_programs += executable(
1798 'journalctl',
1799 journalctl_sources,
1800 include_directories : includes,
1801 link_with : [libshared],
1802 dependencies : [threads,
e44b5004 1803 libdl,
6164ec4c
ZJS
1804 libxz,
1805 liblz4,
9200bb30
LP
1806 libzstd,
1807 libdl],
6164ec4c
ZJS
1808 install_rpath : rootlibexecdir,
1809 install : true,
1810 install_dir : rootbindir)
35a1ff4c 1811
6164ec4c
ZJS
1812executable(
1813 'systemd-getty-generator',
1814 'src/getty-generator/getty-generator.c',
1815 include_directories : includes,
1816 link_with : [libshared],
1817 install_rpath : rootlibexecdir,
1818 install : true,
1819 install_dir : systemgeneratordir)
5c23128d 1820
6164ec4c
ZJS
1821executable(
1822 'systemd-debug-generator',
1823 'src/debug-generator/debug-generator.c',
1824 include_directories : includes,
1825 link_with : [libshared],
1826 install_rpath : rootlibexecdir,
1827 install : true,
1828 install_dir : systemgeneratordir)
1829
1830executable(
1831 'systemd-run-generator',
1832 'src/run-generator/run-generator.c',
1833 include_directories : includes,
1834 link_with : [libshared],
1835 install_rpath : rootlibexecdir,
1836 install : true,
1837 install_dir : systemgeneratordir)
1838
1839executable(
1840 'systemd-fstab-generator',
1841 'src/fstab-generator/fstab-generator.c',
1842 include_directories : includes,
1843 link_with : [libcore_shared,
1844 libshared],
1845 install_rpath : rootlibexecdir,
1846 install : true,
1847 install_dir : systemgeneratordir)
5c23128d 1848
349cc4a5 1849if conf.get('ENABLE_ENVIRONMENT_D') == 1
6164ec4c
ZJS
1850 executable(
1851 '30-systemd-environment-d-generator',
1852 'src/environment-d-generator/environment-d-generator.c',
1853 include_directories : includes,
1854 link_with : [libshared],
1855 install_rpath : rootlibexecdir,
1856 install : true,
1857 install_dir : userenvgeneratordir)
7b76fce1 1858
37efbbd8
ZJS
1859 meson.add_install_script(meson_make_symlink,
1860 join_paths(sysconfdir, 'environment'),
1861 join_paths(environmentdir, '99-environment.conf'))
5c23128d
ZJS
1862endif
1863
349cc4a5 1864if conf.get('ENABLE_HIBERNATE') == 1
6164ec4c
ZJS
1865 executable(
1866 'systemd-hibernate-resume-generator',
1867 'src/hibernate-resume/hibernate-resume-generator.c',
1868 include_directories : includes,
1869 link_with : [libshared],
1870 install_rpath : rootlibexecdir,
1871 install : true,
1872 install_dir : systemgeneratordir)
1873
1874 executable(
1875 'systemd-hibernate-resume',
1876 'src/hibernate-resume/hibernate-resume.c',
1877 include_directories : includes,
1878 link_with : [libshared],
1879 install_rpath : rootlibexecdir,
1880 install : true,
1881 install_dir : rootlibexecdir)
37efbbd8
ZJS
1882endif
1883
349cc4a5 1884if conf.get('HAVE_BLKID') == 1
6164ec4c
ZJS
1885 executable(
1886 'systemd-gpt-auto-generator',
1887 'src/gpt-auto-generator/gpt-auto-generator.c',
1888 'src/shared/blkid-util.h',
1889 include_directories : includes,
1890 link_with : [libshared],
1891 dependencies : libblkid,
1892 install_rpath : rootlibexecdir,
1893 install : true,
1894 install_dir : systemgeneratordir)
1895
1896 public_programs += executable(
1897 'systemd-dissect',
1898 'src/dissect/dissect.c',
1899 include_directories : includes,
1900 link_with : [libshared],
1901 install_rpath : rootlibexecdir,
5a151082 1902 install : true)
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,
679badd7 2177 libopenssl],
6164ec4c
ZJS
2178 install_rpath : rootlibexecdir,
2179 install : true,
2180 install_dir : rootlibexecdir)
2181
460e5af0 2182 public_programs += executable(
6164ec4c
ZJS
2183 'homectl',
2184 homectl_sources,
2185 include_directories : includes,
2186 link_with : [libshared],
2187 dependencies : [threads,
2188 libcrypt,
2189 libopenssl,
2190 libp11kit,
679badd7 2191 libfido2],
6164ec4c
ZJS
2192 install_rpath : rootlibexecdir,
2193 install : true,
2194 install_dir : rootbindir)
26cf9fb7
LP
2195
2196 if conf.get('HAVE_PAM') == 1
2197 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2198 pam_systemd = shared_library(
2199 'pam_systemd_home',
2200 pam_systemd_home_c,
2201 name_prefix : '',
2202 include_directories : includes,
2203 link_args : ['-shared',
2204 '-Wl,--version-script=' + version_script_arg],
2205 link_with : [libsystemd_static,
2206 libshared_static],
2207 dependencies : [threads,
2208 libpam,
2209 libpam_misc,
2210 libcrypt],
2211 link_depends : pam_systemd_home_sym,
2212 install : true,
2213 install_dir : pamlibdir)
2214 endif
70a5db58
LP
2215endif
2216
6589a569
NL
2217foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
2218 (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
ba7f4ae6
ZJS
2219 meson.add_install_script(meson_make_symlink,
2220 join_paths(rootbindir, 'systemctl'),
2221 join_paths(rootsbindir, alias))
2222endforeach
2223
63e2d171
NL
2224meson.add_install_script(meson_make_symlink,
2225 join_paths(rootbindir, 'udevadm'),
2226 join_paths(rootlibexecdir, 'systemd-udevd'))
2227
349cc4a5 2228if conf.get('ENABLE_BACKLIGHT') == 1
6164ec4c
ZJS
2229 executable(
2230 'systemd-backlight',
2231 'src/backlight/backlight.c',
2232 include_directories : includes,
2233 link_with : [libshared],
2234 install_rpath : rootlibexecdir,
2235 install : true,
2236 install_dir : rootlibexecdir)
5c23128d
ZJS
2237endif
2238
349cc4a5 2239if conf.get('ENABLE_RFKILL') == 1
6164ec4c
ZJS
2240 executable(
2241 'systemd-rfkill',
2242 'src/rfkill/rfkill.c',
2243 include_directories : includes,
2244 link_with : [libshared],
2245 install_rpath : rootlibexecdir,
2246 install : true,
2247 install_dir : rootlibexecdir)
2248endif
2249
2250executable(
2251 'systemd-system-update-generator',
2252 'src/system-update-generator/system-update-generator.c',
2253 include_directories : includes,
2254 link_with : [libshared],
2255 install_rpath : rootlibexecdir,
2256 install : true,
2257 install_dir : systemgeneratordir)
5c23128d 2258
349cc4a5 2259if conf.get('HAVE_LIBCRYPTSETUP') == 1
08669709 2260 systemd_cryptsetup_sources = files('''
08669709 2261 src/cryptsetup/cryptsetup-pkcs11.h
23769fb3
LP
2262 src/cryptsetup/cryptsetup-util.c
2263 src/cryptsetup/cryptsetup-util.h
2264 src/cryptsetup/cryptsetup.c
08669709
LP
2265'''.split())
2266
2267 if conf.get('HAVE_P11KIT') == 1
2268 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2269 endif
2270
6164ec4c
ZJS
2271 executable(
2272 'systemd-cryptsetup',
2273 systemd_cryptsetup_sources,
2274 include_directories : includes,
2275 link_with : [libshared],
2276 dependencies : [libcryptsetup,
2277 libp11kit],
2278 install_rpath : rootlibexecdir,
2279 install : true,
2280 install_dir : rootlibexecdir)
2281
2282 executable(
2283 'systemd-cryptsetup-generator',
2284 'src/cryptsetup/cryptsetup-generator.c',
2285 include_directories : includes,
2286 link_with : [libshared],
2287 dependencies : [libcryptsetup],
2288 install_rpath : rootlibexecdir,
2289 install : true,
2290 install_dir : systemgeneratordir)
2291
2292 executable(
2293 'systemd-veritysetup',
2294 'src/veritysetup/veritysetup.c',
2295 include_directories : includes,
2296 link_with : [libshared],
2297 dependencies : [libcryptsetup],
2298 install_rpath : rootlibexecdir,
2299 install : true,
2300 install_dir : rootlibexecdir)
2301
2302 executable(
2303 'systemd-veritysetup-generator',
2304 'src/veritysetup/veritysetup-generator.c',
2305 include_directories : includes,
2306 link_with : [libshared],
2307 dependencies : [libcryptsetup],
2308 install_rpath : rootlibexecdir,
2309 install : true,
2310 install_dir : systemgeneratordir)
5c23128d
ZJS
2311endif
2312
349cc4a5 2313if conf.get('HAVE_SYSV_COMPAT') == 1
6164ec4c
ZJS
2314 executable(
2315 'systemd-sysv-generator',
2316 'src/sysv-generator/sysv-generator.c',
2317 include_directories : includes,
2318 link_with : [libshared],
2319 install_rpath : rootlibexecdir,
2320 install : true,
2321 install_dir : systemgeneratordir)
2322
2323 executable(
2324 'systemd-rc-local-generator',
2325 'src/rc-local-generator/rc-local-generator.c',
2326 include_directories : includes,
2327 link_with : [libshared],
2328 install_rpath : rootlibexecdir,
2329 install : true,
2330 install_dir : systemgeneratordir)
5c23128d
ZJS
2331endif
2332
8feca247
BB
2333if conf.get('ENABLE_XDG_AUTOSTART') == 1
2334 executable(
2335 'systemd-xdg-autostart-generator',
2336 'src/xdg-autostart-generator/xdg-autostart-generator.c',
2337 'src/xdg-autostart-generator/xdg-autostart-service.c',
2338 include_directories : includes,
2339 link_with : [libshared],
2340 install_rpath : rootlibexecdir,
2341 install : true,
2342 install_dir : usergeneratordir)
2343
2344 executable(
2345 'systemd-xdg-autostart-condition',
2346 'src/xdg-autostart-generator/xdg-autostart-condition.c',
2347 include_directories : includes,
2348 link_with : [libshared],
2349 install_rpath : rootlibexecdir,
2350 install : true,
2351 install_dir : rootlibexecdir)
2352endif
2353
349cc4a5 2354if conf.get('ENABLE_HOSTNAMED') == 1
6164ec4c
ZJS
2355 executable(
2356 'systemd-hostnamed',
2357 'src/hostname/hostnamed.c',
2358 include_directories : includes,
2359 link_with : [libshared],
2360 install_rpath : rootlibexecdir,
2361 install : true,
2362 install_dir : rootlibexecdir)
2363
2364 public_programs += executable(
2365 'hostnamectl',
2366 'src/hostname/hostnamectl.c',
2367 include_directories : includes,
2368 link_with : [libshared],
2369 install_rpath : rootlibexecdir,
2370 install : true)
5c23128d
ZJS
2371endif
2372
349cc4a5
ZJS
2373if conf.get('ENABLE_LOCALED') == 1
2374 if conf.get('HAVE_XKBCOMMON') == 1
37efbbd8
ZJS
2375 # logind will load libxkbcommon.so dynamically on its own
2376 deps = [libdl]
2377 else
2378 deps = []
2379 endif
2380
6164ec4c
ZJS
2381 executable(
2382 'systemd-localed',
2383 systemd_localed_sources,
2384 include_directories : includes,
2385 link_with : [libshared],
2386 dependencies : deps,
2387 install_rpath : rootlibexecdir,
2388 install : true,
2389 install_dir : rootlibexecdir)
2390
2391 public_programs += executable(
2392 'localectl',
2393 localectl_sources,
2394 include_directories : includes,
2395 link_with : [libshared],
2396 install_rpath : rootlibexecdir,
2397 install : true)
5c23128d
ZJS
2398endif
2399
349cc4a5 2400if conf.get('ENABLE_TIMEDATED') == 1
6164ec4c
ZJS
2401 executable(
2402 'systemd-timedated',
2403 'src/timedate/timedated.c',
2404 include_directories : includes,
2405 link_with : [libshared],
2406 install_rpath : rootlibexecdir,
2407 install : true,
2408 install_dir : rootlibexecdir)
6129ec85 2409endif
5c23128d 2410
6129ec85 2411if conf.get('ENABLE_TIMEDATECTL') == 1
6164ec4c
ZJS
2412 public_programs += executable(
2413 'timedatectl',
2414 'src/timedate/timedatectl.c',
2415 include_directories : includes,
2416 install_rpath : rootlibexecdir,
2417 link_with : [libshared],
2418 dependencies : [libm],
2419 install : true)
5c23128d
ZJS
2420endif
2421
349cc4a5 2422if conf.get('ENABLE_TIMESYNCD') == 1
fd74a13e
RS
2423 if get_option('link-timesyncd-shared')
2424 timesyncd_link_with = [libshared]
2425 else
2426 timesyncd_link_with = [libsystemd_static,
2427 libshared_static,
2428 libjournal_client,
2429 libbasic_gcrypt]
2430 endif
2431
6164ec4c
ZJS
2432 executable(
2433 'systemd-timesyncd',
2434 systemd_timesyncd_sources,
2435 include_directories : includes,
2436 link_with : [timesyncd_link_with],
2437 dependencies : [threads,
2438 libm],
2439 install_rpath : rootlibexecdir,
2440 install : true,
2441 install_dir : rootlibexecdir)
2442
2443 executable(
2444 'systemd-time-wait-sync',
2445 'src/time-wait-sync/time-wait-sync.c',
2446 include_directories : includes,
2447 link_with : [timesyncd_link_with],
2448 install_rpath : rootlibexecdir,
2449 install : true,
2450 install_dir : rootlibexecdir)
5c23128d
ZJS
2451endif
2452
349cc4a5 2453if conf.get('ENABLE_MACHINED') == 1
6164ec4c
ZJS
2454 executable(
2455 'systemd-machined',
2456 systemd_machined_sources,
2457 include_directories : includes,
2458 link_with : [libmachine_core,
2459 libshared],
2460 install_rpath : rootlibexecdir,
2461 install : true,
2462 install_dir : rootlibexecdir)
2463
2464 public_programs += executable(
2465 'machinectl',
2466 'src/machine/machinectl.c',
2467 include_directories : includes,
2468 link_with : [libshared],
2469 dependencies : [threads,
2470 libxz,
ef5924aa
NL
2471 liblz4,
2472 libzstd],
6164ec4c
ZJS
2473 install_rpath : rootlibexecdir,
2474 install : true,
2475 install_dir : rootbindir)
5c23128d
ZJS
2476endif
2477
349cc4a5 2478if conf.get('ENABLE_IMPORTD') == 1
6164ec4c
ZJS
2479 executable(
2480 'systemd-importd',
2481 systemd_importd_sources,
2482 include_directories : includes,
2483 link_with : [libshared],
2484 dependencies : [threads],
2485 install_rpath : rootlibexecdir,
2486 install : true,
2487 install_dir : rootlibexecdir)
2488
2489 systemd_pull = executable(
2490 'systemd-pull',
2491 systemd_pull_sources,
2492 include_directories : includes,
2493 link_with : [libshared],
2494 dependencies : [versiondep,
2495 libcurl,
2496 libz,
2497 libbzip2,
2498 libxz,
2499 libgcrypt],
2500 install_rpath : rootlibexecdir,
2501 install : true,
2502 install_dir : rootlibexecdir)
2503
2504 systemd_import = executable(
2505 'systemd-import',
2506 systemd_import_sources,
2507 include_directories : includes,
2508 link_with : [libshared],
2509 dependencies : [libcurl,
2510 libz,
2511 libbzip2,
2512 libxz],
2513 install_rpath : rootlibexecdir,
2514 install : true,
2515 install_dir : rootlibexecdir)
2516
2517 systemd_import_fs = executable(
2518 'systemd-import-fs',
2519 systemd_import_fs_sources,
2520 include_directories : includes,
2521 link_with : [libshared],
2522 install_rpath : rootlibexecdir,
2523 install : true,
2524 install_dir : rootlibexecdir)
2525
2526 systemd_export = executable(
2527 'systemd-export',
2528 systemd_export_sources,
2529 include_directories : includes,
2530 link_with : [libshared],
2531 dependencies : [libcurl,
2532 libz,
2533 libbzip2,
2534 libxz],
2535 install_rpath : rootlibexecdir,
2536 install : true,
2537 install_dir : rootlibexecdir)
1d7579c4
LP
2538
2539 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
37efbbd8
ZJS
2540endif
2541
349cc4a5 2542if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
6164ec4c
ZJS
2543 public_programs += executable(
2544 'systemd-journal-upload',
2545 systemd_journal_upload_sources,
2546 include_directories : includes,
2547 link_with : [libshared],
2548 dependencies : [versiondep,
2549 threads,
2550 libcurl,
2551 libgnutls,
2552 libxz,
ef5924aa
NL
2553 liblz4,
2554 libzstd],
6164ec4c
ZJS
2555 install_rpath : rootlibexecdir,
2556 install : true,
2557 install_dir : rootlibexecdir)
5c23128d
ZJS
2558endif
2559
349cc4a5 2560if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
6164ec4c
ZJS
2561 public_programs += executable(
2562 'systemd-journal-remote',
2563 systemd_journal_remote_sources,
2564 include_directories : includes,
2565 link_with : [libshared,
2566 libsystemd_journal_remote],
2567 dependencies : [threads,
2568 libmicrohttpd,
2569 libgnutls,
2570 libxz,
ef5924aa
NL
2571 liblz4,
2572 libzstd],
6164ec4c
ZJS
2573 install_rpath : rootlibexecdir,
2574 install : true,
2575 install_dir : rootlibexecdir)
2576
2577 public_programs += executable(
2578 'systemd-journal-gatewayd',
2579 systemd_journal_gatewayd_sources,
2580 include_directories : includes,
2581 link_with : [libshared],
2582 dependencies : [threads,
2583 libmicrohttpd,
2584 libgnutls,
2585 libxz,
ef5924aa
NL
2586 liblz4,
2587 libzstd],
6164ec4c
ZJS
2588 install_rpath : rootlibexecdir,
2589 install : true,
2590 install_dir : rootlibexecdir)
5c23128d
ZJS
2591endif
2592
349cc4a5 2593if conf.get('ENABLE_COREDUMP') == 1
6164ec4c
ZJS
2594 executable(
2595 'systemd-coredump',
2596 systemd_coredump_sources,
2597 include_directories : includes,
2598 link_with : [libshared],
2599 dependencies : [threads,
2600 libacl,
2601 libdw,
2602 libxz,
ef5924aa
NL
2603 liblz4,
2604 libzstd],
6164ec4c
ZJS
2605 install_rpath : rootlibexecdir,
2606 install : true,
2607 install_dir : rootlibexecdir)
2608
2609 public_programs += executable(
2610 'coredumpctl',
2611 coredumpctl_sources,
2612 include_directories : includes,
2613 link_with : [libshared],
2614 dependencies : [threads,
2615 libxz,
ef5924aa
NL
2616 liblz4,
2617 libzstd],
6164ec4c
ZJS
2618 install_rpath : rootlibexecdir,
2619 install : true)
5c23128d
ZJS
2620endif
2621
9b4abc69 2622if conf.get('ENABLE_PSTORE') == 1
6164ec4c
ZJS
2623 executable(
2624 'systemd-pstore',
2625 systemd_pstore_sources,
2626 include_directories : includes,
2627 link_with : [libshared],
2628 dependencies : [threads,
2629 libacl,
2630 libdw,
2631 libxz,
ef5924aa
NL
2632 liblz4,
2633 libzstd],
6164ec4c
ZJS
2634 install_rpath : rootlibexecdir,
2635 install : true,
2636 install_dir : rootlibexecdir)
9b4abc69
ED
2637endif
2638
349cc4a5 2639if conf.get('ENABLE_BINFMT') == 1
6164ec4c
ZJS
2640 public_programs += executable(
2641 'systemd-binfmt',
2642 'src/binfmt/binfmt.c',
2643 include_directories : includes,
2644 link_with : [libshared],
2645 install_rpath : rootlibexecdir,
2646 install : true,
2647 install_dir : rootlibexecdir)
37efbbd8
ZJS
2648
2649 meson.add_install_script('sh', '-c',
2650 mkdir_p.format(binfmtdir))
2651 meson.add_install_script('sh', '-c',
2652 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2653endif
2654
e594a3b1 2655if conf.get('ENABLE_REPART') == 1
6164ec4c
ZJS
2656 exe = executable(
2657 'systemd-repart',
2658 systemd_repart_sources,
2659 include_directories : includes,
2660 link_with : [libshared],
2661 dependencies : [threads,
2662 libcryptsetup,
2663 libblkid,
2664 libfdisk,
2665 libopenssl],
2666 install_rpath : rootlibexecdir,
2667 install : true,
2668 install_dir : rootbindir)
2d2d0a57 2669 public_programs += exe
e29e4d57
ZJS
2670
2671 if want_tests != 'false'
2672 test('test-repart',
2673 test_repart_sh,
2674 args : exe.full_path())
2675 endif
e594a3b1
LP
2676endif
2677
349cc4a5 2678if conf.get('ENABLE_VCONSOLE') == 1
6164ec4c
ZJS
2679 executable(
2680 'systemd-vconsole-setup',
2681 'src/vconsole/vconsole-setup.c',
2682 include_directories : includes,
2683 link_with : [libshared],
2684 install_rpath : rootlibexecdir,
2685 install : true,
2686 install_dir : rootlibexecdir)
5c23128d
ZJS
2687endif
2688
349cc4a5 2689if conf.get('ENABLE_RANDOMSEED') == 1
6164ec4c
ZJS
2690 executable(
2691 'systemd-random-seed',
2692 'src/random-seed/random-seed.c',
2693 include_directories : includes,
2694 link_with : [libshared],
2695 install_rpath : rootlibexecdir,
2696 install : true,
2697 install_dir : rootlibexecdir)
5c23128d
ZJS
2698endif
2699
349cc4a5 2700if conf.get('ENABLE_FIRSTBOOT') == 1
6164ec4c
ZJS
2701 executable(
2702 'systemd-firstboot',
2703 'src/firstboot/firstboot.c',
2704 include_directories : includes,
2705 link_with : [libshared],
2706 dependencies : [libcrypt],
2707 install_rpath : rootlibexecdir,
2708 install : true,
2709 install_dir : rootbindir)
2710endif
2711
2712executable(
2713 'systemd-remount-fs',
2714 'src/remount-fs/remount-fs.c',
2715 include_directories : includes,
2716 link_with : [libcore_shared,
2717 libshared],
2718 install_rpath : rootlibexecdir,
2719 install : true,
2720 install_dir : rootlibexecdir)
5c23128d 2721
6164ec4c
ZJS
2722executable(
2723 'systemd-machine-id-setup',
2724 'src/machine-id-setup/machine-id-setup-main.c',
2725 include_directories : includes,
2726 link_with : [libcore_shared,
2727 libshared],
2728 install_rpath : rootlibexecdir,
2729 install : true,
2730 install_dir : rootbindir)
5c23128d 2731
6164ec4c
ZJS
2732executable(
2733 'systemd-fsck',
2734 'src/fsck/fsck.c',
2735 include_directories : includes,
2736 link_with : [libshared],
2737 install_rpath : rootlibexecdir,
2738 install : true,
2739 install_dir : rootlibexecdir)
5c23128d 2740
80750adb
ZJS
2741executable('systemd-growfs',
2742 'src/partition/growfs.c',
2743 include_directories : includes,
2744 link_with : [libshared],
c34b75a1 2745 dependencies : [libcryptsetup],
80750adb
ZJS
2746 install_rpath : rootlibexecdir,
2747 install : true,
2748 install_dir : rootlibexecdir)
2749
6164ec4c
ZJS
2750executable(
2751 'systemd-makefs',
2752 'src/partition/makefs.c',
2753 include_directories : includes,
2754 link_with : [libshared],
2755 install_rpath : rootlibexecdir,
2756 install : true,
2757 install_dir : rootlibexecdir)
b7f28ac5 2758
6164ec4c
ZJS
2759executable(
2760 'systemd-sleep',
2761 'src/sleep/sleep.c',
2762 include_directories : includes,
2763 link_with : [libshared],
2764 install_rpath : rootlibexecdir,
2765 install : true,
2766 install_dir : rootlibexecdir)
5c23128d 2767
d25e127d
YW
2768install_data('src/sleep/sleep.conf',
2769 install_dir : pkgsysconfdir)
2770
6164ec4c
ZJS
2771public_programs += executable(
2772 'systemd-sysctl',
2773 'src/sysctl/sysctl.c',
2774 include_directories : includes,
2775 link_with : [libshared],
2776 install_rpath : rootlibexecdir,
2777 install : true,
2778 install_dir : rootlibexecdir)
5c23128d 2779
6164ec4c
ZJS
2780executable(
2781 'systemd-ac-power',
2782 'src/ac-power/ac-power.c',
2783 include_directories : includes,
2784 link_with : [libshared],
2785 install_rpath : rootlibexecdir,
2786 install : true,
2787 install_dir : rootlibexecdir)
5c23128d 2788
6164ec4c
ZJS
2789public_programs += executable(
2790 'systemd-detect-virt',
2791 'src/detect-virt/detect-virt.c',
2792 include_directories : includes,
2793 link_with : [libshared],
2794 install_rpath : rootlibexecdir,
2795 install : true)
5c23128d 2796
6164ec4c
ZJS
2797public_programs += executable(
2798 'systemd-delta',
2799 'src/delta/delta.c',
2800 include_directories : includes,
2801 link_with : [libshared],
2802 install_rpath : rootlibexecdir,
2803 install : true)
5c23128d 2804
6164ec4c
ZJS
2805public_programs += executable(
2806 'systemd-escape',
2807 'src/escape/escape.c',
2808 include_directories : includes,
2809 link_with : [libshared],
2810 install_rpath : rootlibexecdir,
2811 install : true,
2812 install_dir : rootbindir)
2813
2814public_programs += executable(
2815 'systemd-notify',
2816 'src/notify/notify.c',
2817 include_directories : includes,
2818 link_with : [libshared],
2819 install_rpath : rootlibexecdir,
2820 install : true,
2821 install_dir : rootbindir)
2822
2823executable(
2824 'systemd-volatile-root',
2825 'src/volatile-root/volatile-root.c',
2826 include_directories : includes,
2827 link_with : [libshared],
2828 install_rpath : rootlibexecdir,
cdf7ad38 2829 install : conf.get('ENABLE_INITRD') == 1,
6164ec4c
ZJS
2830 install_dir : rootlibexecdir)
2831
2832executable(
2833 'systemd-cgroups-agent',
2834 'src/cgroups-agent/cgroups-agent.c',
2835 include_directories : includes,
2836 link_with : [libshared],
2837 install_rpath : rootlibexecdir,
2838 install : true,
2839 install_dir : rootlibexecdir)
2840
2841public_programs += executable(
2842 'systemd-id128',
2843 'src/id128/id128.c',
2844 include_directories : includes,
2845 link_with : [libshared],
2846 install_rpath : rootlibexecdir,
2847 install : true)
2848
2849public_programs += executable(
2850 'systemd-path',
2851 'src/path/path.c',
2852 include_directories : includes,
2853 link_with : [libshared],
2854 install_rpath : rootlibexecdir,
2855 install : true)
2856
2857public_programs += executable(
2858 'systemd-ask-password',
2859 'src/ask-password/ask-password.c',
2860 include_directories : includes,
2861 link_with : [libshared],
2862 install_rpath : rootlibexecdir,
2863 install : true,
2864 install_dir : rootbindir)
2865
2866executable(
2867 'systemd-reply-password',
2868 'src/reply-password/reply-password.c',
2869 include_directories : includes,
2870 link_with : [libshared],
2871 install_rpath : rootlibexecdir,
2872 install : true,
2873 install_dir : rootlibexecdir)
2874
2875public_programs += executable(
2876 'systemd-tty-ask-password-agent',
2877 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2878 include_directories : includes,
2879 link_with : [libshared],
2880 install_rpath : rootlibexecdir,
2881 install : true,
2882 install_dir : rootbindir)
2883
2884public_programs += executable(
2885 'systemd-cgls',
2886 'src/cgls/cgls.c',
2887 include_directories : includes,
2888 link_with : [libshared],
2889 install_rpath : rootlibexecdir,
2890 install : true)
2891
2892public_programs += executable(
2893 'systemd-cgtop',
2894 'src/cgtop/cgtop.c',
2895 include_directories : includes,
2896 link_with : [libshared],
2897 install_rpath : rootlibexecdir,
2898 install : true)
2899
2900executable(
2901 'systemd-initctl',
2902 'src/initctl/initctl.c',
2903 include_directories : includes,
2904 link_with : [libshared],
2905 install_rpath : rootlibexecdir,
6589a569 2906 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
6164ec4c 2907 install_dir : rootlibexecdir)
5c23128d 2908
6164ec4c
ZJS
2909public_programs += executable(
2910 'systemd-mount',
2911 'src/mount/mount-tool.c',
2912 include_directories : includes,
2913 link_with : [libshared],
2914 dependencies: [libmount],
2915 install_rpath : rootlibexecdir,
2916 install : true)
5c23128d 2917
7b76fce1 2918meson.add_install_script(meson_make_symlink,
e17e5ba9 2919 'systemd-mount', join_paths(bindir, 'systemd-umount'))
7b76fce1 2920
6164ec4c
ZJS
2921public_programs += executable(
2922 'systemd-run',
2923 'src/run/run.c',
2924 include_directories : includes,
2925 link_with : [libshared],
2926 install_rpath : rootlibexecdir,
2927 install : true)
2928
2929public_programs += executable(
2930 'systemd-stdio-bridge',
2931 'src/stdio-bridge/stdio-bridge.c',
2932 include_directories : includes,
2933 link_with : [libshared],
2934 dependencies : [versiondep],
2935 install_rpath : rootlibexecdir,
2936 install : true)
2937
2938public_programs += executable(
2939 'busctl',
2940 'src/busctl/busctl.c',
2941 'src/busctl/busctl-introspect.c',
2942 'src/busctl/busctl-introspect.h',
2943 include_directories : includes,
2944 link_with : [libshared],
2945 install_rpath : rootlibexecdir,
2946 install : true)
5c23128d 2947
349cc4a5 2948if conf.get('ENABLE_SYSUSERS') == 1
6164ec4c
ZJS
2949 public_programs += executable(
2950 'systemd-sysusers',
2951 'src/sysusers/sysusers.c',
2952 include_directories : includes,
2953 link_with : [libshared],
2954 install_rpath : rootlibexecdir,
2955 install : true,
2956 install_dir : rootbindir)
8ef8f3d5
FB
2957
2958 if have_standalone_binaries
2959 public_programs += executable(
2960 'systemd-sysusers.standalone',
2961 'src/sysusers/sysusers.c',
2962 include_directories : includes,
2963 link_with : [libshared_static,
2964 libbasic,
2965 libbasic_gcrypt,
2966 libsystemd_static,
2967 libjournal_client],
2968 install : true,
2969 install_dir : rootbindir)
2970 endif
5c23128d
ZJS
2971endif
2972
349cc4a5 2973if conf.get('ENABLE_TMPFILES') == 1
6164ec4c
ZJS
2974 exe = executable(
2975 'systemd-tmpfiles',
db64ba81 2976 systemd_tmpfiles_sources,
6164ec4c
ZJS
2977 include_directories : includes,
2978 link_with : [libshared],
2979 dependencies : [libacl],
2980 install_rpath : rootlibexecdir,
2981 install : true,
2982 install_dir : rootbindir)
5a8b1640 2983 public_programs += exe
d9daae55 2984
938be089
ZJS
2985 if want_tests != 'false'
2986 test('test-systemd-tmpfiles',
2987 test_systemd_tmpfiles_py,
2988 # https://github.com/mesonbuild/meson/issues/2681
2989 args : exe.full_path())
2990 endif
db64ba81
FB
2991
2992 if have_standalone_binaries
2993 public_programs += executable(
2994 'systemd-tmpfiles.standalone',
2995 systemd_tmpfiles_sources,
2996 include_directories : includes,
2997 link_with : [libshared_static,
2998 libbasic,
2999 libbasic_gcrypt,
3000 libsystemd_static,
3001 libjournal_client],
3002 dependencies : [libacl],
3003 install : true,
3004 install_dir : rootbindir)
3005 endif
5c23128d
ZJS
3006endif
3007
349cc4a5 3008if conf.get('ENABLE_HWDB') == 1
6164ec4c
ZJS
3009 public_programs += executable(
3010 'systemd-hwdb',
3011 'src/hwdb/hwdb.c',
3012 'src/libsystemd/sd-hwdb/hwdb-internal.h',
3013 include_directories : includes,
3014 link_with : [libudev_static],
3015 install_rpath : udev_rpath,
3016 install : true,
3017 install_dir : rootbindir)
37efbbd8
ZJS
3018endif
3019
349cc4a5 3020if conf.get('ENABLE_QUOTACHECK') == 1
6164ec4c
ZJS
3021 executable(
3022 'systemd-quotacheck',
3023 'src/quotacheck/quotacheck.c',
3024 include_directories : includes,
3025 link_with : [libshared],
3026 install_rpath : rootlibexecdir,
3027 install : true,
3028 install_dir : rootlibexecdir)
3029endif
3030
3031public_programs += executable(
3032 'systemd-socket-proxyd',
3033 'src/socket-proxy/socket-proxyd.c',
3034 include_directories : includes,
3035 link_with : [libshared],
3036 dependencies : [threads],
3037 install_rpath : rootlibexecdir,
3038 install : true,
3039 install_dir : rootlibexecdir)
5c23128d 3040
6164ec4c
ZJS
3041public_programs += executable(
3042 'udevadm',
3043 udevadm_sources,
3044 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
3045 include_directories : includes,
3046 link_with : [libudev_core,
3047 libsystemd_network,
3048 libudev_static],
3049 dependencies : [versiondep,
3050 threads,
3051 libkmod,
3052 libidn,
3053 libacl,
3054 libblkid],
3055 install_rpath : udev_rpath,
3056 install : true,
3057 install_dir : rootbindir)
3058
3059executable(
3060 'systemd-shutdown',
3061 systemd_shutdown_sources,
3062 include_directories : includes,
3063 link_with : [libcore_shared,
3064 libshared],
3065 dependencies : [libmount],
3066 install_rpath : rootlibexecdir,
3067 install : true,
3068 install_dir : rootlibexecdir)
3069
3070executable(
3071 'systemd-update-done',
3072 'src/update-done/update-done.c',
3073 include_directories : includes,
3074 link_with : [libshared],
3075 install_rpath : rootlibexecdir,
3076 install : true,
3077 install_dir : rootlibexecdir)
3078
3079executable(
3080 'systemd-update-utmp',
3081 'src/update-utmp/update-utmp.c',
3082 include_directories : includes,
3083 link_with : [libshared],
3084 dependencies : [libaudit],
3085 install_rpath : rootlibexecdir,
55678b9e 3086 install : (conf.get('ENABLE_UTMP') == 1),
6164ec4c 3087 install_dir : rootlibexecdir)
5c23128d 3088
349cc4a5 3089if conf.get('HAVE_KMOD') == 1
6164ec4c
ZJS
3090 executable(
3091 'systemd-modules-load',
3092 'src/modules-load/modules-load.c',
3093 include_directories : includes,
3094 link_with : [libshared],
3095 dependencies : [libkmod],
3096 install_rpath : rootlibexecdir,
3097 install : true,
3098 install_dir : rootlibexecdir)
94e75a54 3099
37efbbd8
ZJS
3100 meson.add_install_script('sh', '-c',
3101 mkdir_p.format(modulesloaddir))
3102 meson.add_install_script('sh', '-c',
3103 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
5c23128d
ZJS
3104endif
3105
6164ec4c
ZJS
3106public_programs += executable(
3107 'systemd-nspawn',
3108 systemd_nspawn_sources,
3109 include_directories : includes,
3110 link_with : [libcore_shared,
3111 libnspawn_core,
3112 libshared],
3113 dependencies : [libblkid,
3114 libseccomp],
3115 install_rpath : rootlibexecdir,
3116 install : true)
5c23128d 3117
349cc4a5 3118if conf.get('ENABLE_NETWORKD') == 1
6164ec4c
ZJS
3119 executable(
3120 'systemd-networkd',
3121 systemd_networkd_sources,
3122 include_directories : network_include_dir,
3123 link_with : [libnetworkd_core,
3124 libsystemd_network,
3125 libudev_static,
3126 networkd_link_with],
3127 dependencies : [threads],
3128 install_rpath : rootlibexecdir,
3129 install : true,
3130 install_dir : rootlibexecdir)
3131
3132 executable(
3133 'systemd-networkd-wait-online',
3134 systemd_networkd_wait_online_sources,
3135 include_directories : includes,
3136 link_with : [libnetworkd_core,
3137 networkd_link_with],
3138 install_rpath : rootlibexecdir,
3139 install : true,
3140 install_dir : rootlibexecdir)
3141
3142 public_programs += executable(
3143 'networkctl',
3144 networkctl_sources,
3145 include_directories : includes,
3146 link_with : [libsystemd_network,
3147 networkd_link_with],
3148 install_rpath : rootlibexecdir,
3149 install : true,
3150 install_dir : rootbindir)
3151
3152 exe = executable(
3153 'systemd-network-generator',
3154 network_generator_sources,
3155 include_directories : includes,
3156 link_with : [networkd_link_with],
3157 install_rpath : rootlibexecdir,
3158 install : true,
3159 install_dir : rootlibexecdir)
fbaa1137
ZJS
3160
3161 if want_tests != 'false'
3162 test('test-network-generator-conversion',
3163 test_network_generator_conversion_sh,
3164 # https://github.com/mesonbuild/meson/issues/2681
3165 args : exe.full_path())
3166 endif
dcfe072a 3167endif
e821f6a9 3168
6164ec4c
ZJS
3169executable(
3170 'systemd-sulogin-shell',
3171 ['src/sulogin-shell/sulogin-shell.c'],
3172 include_directories : includes,
3173 link_with : [libshared],
3174 install_rpath : rootlibexecdir,
3175 install : true,
3176 install_dir : rootlibexecdir)
e821f6a9 3177
69e96427
ZJS
3178############################################################
3179
e2d41370
FB
3180custom_target(
3181 'systemd-runtest.env',
3182 output : 'systemd-runtest.env',
3183 command : ['sh', '-c', '{ ' +
1485aacb 3184 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
81e06775 3185 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
e2d41370
FB
3186 '} >@OUTPUT@'],
3187 build_by_default : true)
3188
69e96427 3189foreach tuple : tests
37efbbd8
ZJS
3190 sources = tuple[0]
3191 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3192 dependencies = tuple[2]
3193 condition = tuple.length() >= 4 ? tuple[3] : ''
3194 type = tuple.length() >= 5 ? tuple[4] : ''
3195 defs = tuple.length() >= 6 ? tuple[5] : []
3196 incs = tuple.length() >= 7 ? tuple[6] : includes
3197 timeout = 30
3198
3199 name = sources[0].split('/')[-1].split('.')[0]
3200 if type.startswith('timeout=')
3201 timeout = type.split('=')[1].to_int()
3202 type = ''
3203 endif
3b2bdd62
ZJS
3204
3205 if condition == '' or conf.get(condition) == 1
37efbbd8
ZJS
3206 exe = executable(
3207 name,
3208 sources,
3209 include_directories : incs,
3210 link_with : link_with,
60722ad7
ZJS
3211 dependencies : [versiondep,
3212 dependencies],
37efbbd8 3213 c_args : defs,
3b2bdd62 3214 build_by_default : want_tests != 'false',
37efbbd8 3215 install_rpath : rootlibexecdir,
7cdd9783
MB
3216 install : install_tests,
3217 install_dir : join_paths(testsdir, type))
37efbbd8
ZJS
3218
3219 if type == 'manual'
3220 message('@0@ is a manual test'.format(name))
3221 elif type == 'unsafe' and want_tests != 'unsafe'
3222 message('@0@ is an unsafe test'.format(name))
3b2bdd62 3223 elif want_tests != 'false'
37efbbd8
ZJS
3224 test(name, exe,
3225 env : test_env,
3226 timeout : timeout)
3227 endif
3228 else
3229 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3230 endif
69e96427
ZJS
3231endforeach
3232
0632b4cd 3233exe = executable(
37efbbd8
ZJS
3234 'test-libsystemd-sym',
3235 test_libsystemd_sym_c,
3236 include_directories : includes,
3237 link_with : [libsystemd],
fd1939fb 3238 build_by_default : want_tests != 'false',
37efbbd8
ZJS
3239 install : install_tests,
3240 install_dir : testsdir)
938be089
ZJS
3241if want_tests != 'false'
3242 test('test-libsystemd-sym', exe)
3243endif
37ab1a25 3244
0632b4cd
ZJS
3245exe = executable(
3246 'test-libsystemd-static-sym',
3247 test_libsystemd_sym_c,
3248 include_directories : includes,
0632b4cd
ZJS
3249 link_with : [install_libsystemd_static],
3250 dependencies : [threads], # threads is already included in dependencies on the library,
3251 # but does not seem to get propagated. Add here as a work-around.
fd1939fb 3252 build_by_default : want_tests != 'false' and static_libsystemd_pic,
20f3d32d 3253 install : install_tests and static_libsystemd_pic,
0632b4cd 3254 install_dir : testsdir)
938be089 3255if want_tests != 'false' and static_libsystemd_pic
0632b4cd
ZJS
3256 test('test-libsystemd-static-sym', exe)
3257endif
37ab1a25 3258
0632b4cd 3259exe = executable(
37efbbd8
ZJS
3260 'test-libudev-sym',
3261 test_libudev_sym_c,
3262 include_directories : includes,
c1cd6743 3263 c_args : '-Wno-deprecated-declarations',
37efbbd8 3264 link_with : [libudev],
fd1939fb 3265 build_by_default : want_tests != 'false',
37efbbd8
ZJS
3266 install : install_tests,
3267 install_dir : testsdir)
938be089
ZJS
3268if want_tests != 'false'
3269 test('test-libudev-sym', exe)
3270endif
0632b4cd
ZJS
3271
3272exe = executable(
3273 'test-libudev-static-sym',
3274 test_libudev_sym_c,
3275 include_directories : includes,
c1cd6743 3276 c_args : '-Wno-deprecated-declarations',
0632b4cd 3277 link_with : [install_libudev_static],
fd1939fb 3278 build_by_default : want_tests != 'false' and static_libudev_pic,
20f3d32d 3279 install : install_tests and static_libudev_pic,
0632b4cd 3280 install_dir : testsdir)
938be089 3281if want_tests != 'false' and static_libudev_pic
0632b4cd
ZJS
3282 test('test-libudev-static-sym', exe)
3283endif
e0bec52f 3284
69e96427 3285############################################################
5c23128d 3286
7db7d5b7
JR
3287fuzzer_exes = []
3288
5996740a 3289if get_option('tests') != 'false'
6164ec4c
ZJS
3290 foreach tuple : fuzzers
3291 sources = tuple[0]
3292 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3293 dependencies = tuple[2]
3294 defs = tuple.length() >= 4 ? tuple[3] : []
3295 incs = tuple.length() >= 5 ? tuple[4] : includes
3296 link_args = []
3297
3298 if want_ossfuzz
9c5c4677 3299 dependencies += fuzzing_engine
6164ec4c
ZJS
3300 elif want_libfuzzer
3301 if fuzzing_engine.found()
3302 dependencies += fuzzing_engine
3303 else
3304 link_args += ['-fsanitize=fuzzer']
3305 endif
9c5c4677 3306 else
6164ec4c 3307 sources += 'src/fuzz/fuzz-main.c'
9c5c4677 3308 endif
7db7d5b7 3309
6164ec4c 3310 name = sources[0].split('/')[-1].split('.')[0]
7db7d5b7 3311
6164ec4c
ZJS
3312 fuzzer_exes += executable(
3313 name,
3314 sources,
3315 include_directories : [incs, include_directories('src/fuzz')],
3316 link_with : link_with,
3317 dependencies : dependencies,
3318 c_args : defs,
3319 link_args: link_args,
3320 install : false)
3321 endforeach
5996740a 3322endif
7db7d5b7 3323
6164ec4c
ZJS
3324run_target(
3325 'fuzzers',
63058f43 3326 depends : fuzzer_exes,
7db7d5b7
JR
3327 command : ['true'])
3328
3329############################################################
3330
5c23128d
ZJS
3331make_directive_index_py = find_program('tools/make-directive-index.py')
3332make_man_index_py = find_program('tools/make-man-index.py')
b184e8fe 3333xml_helper_py = find_program('tools/xml_helper.py')
dd1e33c8
ZJS
3334hwdb_update_sh = find_program('tools/hwdb-update.sh')
3335autosuspend_update_sh = find_program('tools/autosuspend-update.sh')
5c23128d 3336
5c23128d
ZJS
3337subdir('sysctl.d')
3338subdir('sysusers.d')
3339subdir('tmpfiles.d')
4f10b807
ZJS
3340subdir('hwdb.d')
3341subdir('units')
e783f957 3342subdir('presets')
5c23128d
ZJS
3343subdir('network')
3344subdir('man')
3345subdir('shell-completion/bash')
3346subdir('shell-completion/zsh')
9e825ebf
FB
3347subdir('docs/sysvinit')
3348subdir('docs/var-log')
5c23128d 3349
5c23128d
ZJS
3350install_subdir('factory/etc',
3351 install_dir : factorydir)
3352
5c23128d
ZJS
3353install_data('xorg/50-systemd-user.sh',
3354 install_dir : xinitrcdir)
582faeb4
DJL
3355install_data('modprobe.d/systemd.conf',
3356 install_dir : modprobedir)
f09eb768 3357install_data('LICENSE.GPL2',
5c23128d 3358 'LICENSE.LGPL2.1',
f09eb768
LP
3359 'NEWS',
3360 'README',
eea98402 3361 'docs/CODING_STYLE.md',
1d1cb168 3362 'docs/DISTRO_PORTING.md',
9e825ebf 3363 'docs/ENVIRONMENT.md',
5425f8a5 3364 'docs/HACKING.md',
9e825ebf 3365 'docs/TRANSIENT-SETTINGS.md',
b6dc0d7d 3366 'docs/TRANSLATORS.md',
9e825ebf 3367 'docs/UIDS-GIDS.md',
5c23128d
ZJS
3368 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3369 install_dir : docdir)
d68b342b 3370
94e75a54
ZJS
3371meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3372meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3373
d68b342b
ZJS
3374############################################################
3375
dd1e33c8 3376check_help = find_program('tools/check-help.sh')
005a29f2
ZJS
3377
3378foreach exec : public_programs
37efbbd8 3379 name = exec.full_path().split('/')[-1]
938be089
ZJS
3380 if want_tests != 'false'
3381 test('check-help-' + name,
dd1e33c8 3382 check_help,
c1cd6743 3383 args : exec.full_path())
938be089 3384 endif
005a29f2
ZJS
3385endforeach
3386
3387############################################################
3388
c6448ee3
ZJS
3389check_directives_sh = find_program('tools/check-directives.sh')
3390
3391if want_tests != 'false'
3392 test('check-directives',
3393 check_directives_sh,
3394 args : project_source_root)
3395endif
3396
3397############################################################
3398
52d4d1d3
ZJS
3399# Enable tests for all supported sanitizers
3400foreach tuple : sanitizers
3401 sanitizer = tuple[0]
3402 build = tuple[1]
b68dfb9e 3403
7a6397d2 3404 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
52d4d1d3
ZJS
3405 prev = ''
3406 foreach p : fuzz_regression_tests
3407 b = p.split('/')[-2]
3408 c = p.split('/')[-1]
3409
3410 name = '@0@:@1@'.format(b, sanitizer)
3411
3412 if name != prev
3413 if want_tests == 'false'
3414 message('Not compiling @0@ because tests is set to false'.format(name))
c56463fd 3415 elif slow_tests or fuzz_tests
52d4d1d3
ZJS
3416 exe = custom_target(
3417 name,
3418 output : name,
3419 depends : build,
3420 command : [env, 'ln', '-fs',
3421 join_paths(build.full_path(), b),
3422 '@OUTPUT@'],
3423 build_by_default : true)
3424 else
c56463fd 3425 message('Not compiling @0@ because slow-tests/fuzz-tests is set to false'.format(name))
52d4d1d3
ZJS
3426 endif
3427 endif
3428 prev = name
3429
c56463fd 3430 if want_tests != 'false' and (slow_tests or fuzz_tests)
52d4d1d3
ZJS
3431 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3432 env,
89767158
EV
3433 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
3434 timeout : 60,
52d4d1d3 3435 args : [exe.full_path(),
1485aacb 3436 join_paths(project_source_root, p)])
52d4d1d3
ZJS
3437 endif
3438 endforeach
b68dfb9e
ZJS
3439 endif
3440endforeach
3441
52d4d1d3 3442
b68dfb9e
ZJS
3443############################################################
3444
0700e8ba 3445if git.found()
37efbbd8
ZJS
3446 all_files = run_command(
3447 git,
1485aacb 3448 ['--git-dir=@0@/.git'.format(project_source_root),
37efbbd8
ZJS
3449 'ls-files',
3450 ':/*.[ch]'])
3451 all_files = files(all_files.stdout().split())
d68b342b 3452
e85a690b 3453 custom_target(
0700e8ba 3454 'tags',
e85a690b 3455 output : 'tags',
1485aacb 3456 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
2f09974f 3457 run_target(
0700e8ba 3458 'ctags',
1485aacb 3459 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
d68b342b 3460endif
177929c2
ZJS
3461
3462if git.found()
dd1e33c8 3463 git_contrib_sh = find_program('tools/git-contrib.sh')
a923e085 3464 run_target(
37efbbd8 3465 'git-contrib',
dd1e33c8 3466 command : [git_contrib_sh])
177929c2 3467endif
dd6ab3df
ZJS
3468
3469if git.found()
3470 git_head = run_command(
3471 git,
1485aacb 3472 ['--git-dir=@0@/.git'.format(project_source_root),
dd6ab3df
ZJS
3473 'rev-parse', 'HEAD']).stdout().strip()
3474 git_head_short = run_command(
3475 git,
1485aacb 3476 ['--git-dir=@0@/.git'.format(project_source_root),
dd6ab3df
ZJS
3477 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3478
3479 run_target(
3480 'git-snapshot',
3481 command : ['git', 'archive',
1485aacb 3482 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
dd6ab3df
ZJS
3483 git_head_short),
3484 '--prefix', 'systemd-@0@/'.format(git_head),
3485 'HEAD'])
3486endif
829257d1
ZJS
3487
3488############################################################
3489
dd1e33c8 3490check_api_docs_sh = find_program('tools/check-api-docs.sh')
51b13863
LP
3491run_target(
3492 'check-api-docs',
3493 depends : [man, libsystemd, libudev],
dd1e33c8 3494 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
51b13863
LP
3495
3496############################################################
7bc9ea51 3497watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
51b13863 3498
829257d1
ZJS
3499status = [
3500 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3501
2675413e 3502 'split /usr: @0@'.format(split_usr),
157baa87 3503 'split bin-sbin: @0@'.format(split_bin),
359b496f
YW
3504 'prefix directory: @0@'.format(prefixdir),
3505 'rootprefix directory: @0@'.format(rootprefixdir),
3506 'sysconf directory: @0@'.format(sysconfdir),
3507 'include directory: @0@'.format(includedir),
3508 'lib directory: @0@'.format(libdir),
3509 'rootlib directory: @0@'.format(rootlibdir),
829257d1
ZJS
3510 'SysV init scripts: @0@'.format(sysvinit_path),
3511 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
359b496f
YW
3512 'PAM modules directory: @0@'.format(pamlibdir),
3513 'PAM configuration directory: @0@'.format(pamconfdir),
3514 'RPM macros directory: @0@'.format(rpmmacrosdir),
3515 'modprobe.d directory: @0@'.format(modprobedir),
3516 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3517 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3518 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3519 'bash completions directory: @0@'.format(bashcompletiondir),
3520 'zsh completions directory: @0@'.format(zshcompletiondir),
829257d1 3521 'extra start script: @0@'.format(get_option('rc-local')),
829257d1
ZJS
3522 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3523 get_option('debug-tty')),
3524 'TTY GID: @0@'.format(tty_gid),
ac09340e 3525 'users GID: @0@'.format(substs.get('USERS_GID')),
829257d1
ZJS
3526 'maximum system UID: @0@'.format(system_uid_max),
3527 'maximum system GID: @0@'.format(system_gid_max),
87d5e4f2
LP
3528 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3529 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3530 'minimum container UID base: @0@'.format(container_uid_base_min),
3531 'maximum container UID base: @0@'.format(container_uid_base_max),
829257d1 3532 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
4e15a734 3533 'render group access mode: @0@'.format(get_option('group-render-mode')),
359b496f 3534 'certificate root directory: @0@'.format(get_option('certificate-root')),
829257d1 3535 'support URL: @0@'.format(support_url),
afde4574
LP
3536 'nobody user name: @0@'.format(nobody_user),
3537 'nobody group name: @0@'.format(nobody_group),
829257d1 3538 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
5248e7e1 3539 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
829257d1
ZJS
3540
3541 'default DNSSEC mode: @0@'.format(default_dnssec),
c9299be2 3542 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3614df05
ZJS
3543 'default mDNS mode: @0@'.format(default_mdns),
3544 'default LLMNR mode: @0@'.format(default_llmnr),
829257d1 3545 'default cgroup hierarchy: @0@'.format(default_hierarchy),
06da5c63 3546 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
8ca9e92c 3547 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
21d0dd5a 3548 'default locale: @0@'.format(default_locale),
5bc655cd 3549 'default user $PATH: @0@'.format(default_user_path_display),
7bc9ea51 3550 'systemd service watchdog: @0@'.format(watchdog_opt)]
829257d1
ZJS
3551
3552alt_dns_servers = '\n '.join(dns_servers.split(' '))
3553alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3554status += [
3555 'default DNS servers: @0@'.format(alt_dns_servers),
3556 'default NTP servers: @0@'.format(alt_ntp_servers)]
3557
3558alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3559 '@@0@'.format(time_epoch)).stdout().strip()
3560status += [
3561 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3562
19d8c9c9 3563status += [
abc8caf7
ZJS
3564 'static libsystemd: @0@'.format(static_libsystemd),
3565 'static libudev: @0@'.format(static_libudev)]
19d8c9c9 3566
829257d1
ZJS
3567# TODO:
3568# CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3569# CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3570# LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3571
349cc4a5 3572if conf.get('ENABLE_EFI') == 1
5a8b1640 3573 status += 'efi arch: @0@'.format(efi_arch)
829257d1
ZJS
3574
3575 if have_gnu_efi
3576 status += [
3577 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
c512dfb9 3578 'EFI CC @0@'.format(' '.join(efi_cc)),
ce4121c6
ZJS
3579 'EFI lds: @0@'.format(efi_lds),
3580 'EFI crt0: @0@'.format(efi_crt0),
359b496f 3581 'EFI include directory: @0@'.format(efi_incdir)]
829257d1
ZJS
3582 endif
3583endif
3584
3585found = []
3586missing = []
3587
3588foreach tuple : [
3589 ['libcryptsetup'],
3590 ['PAM'],
70a5db58 3591 ['pwquality'],
c757517d 3592 ['libfdisk'],
839fddbe 3593 ['p11kit'],
af4fbd46 3594 ['libfido2'],
829257d1
ZJS
3595 ['AUDIT'],
3596 ['IMA'],
3597 ['AppArmor'],
3598 ['SELinux'],
3599 ['SECCOMP'],
3600 ['SMACK'],
3601 ['zlib'],
3602 ['xz'],
ef5924aa 3603 ['zstd'],
829257d1
ZJS
3604 ['lz4'],
3605 ['bzip2'],
3606 ['ACL'],
3607 ['gcrypt'],
3608 ['qrencode'],
3609 ['microhttpd'],
3610 ['gnutls'],
096cbdce 3611 ['openssl'],
829257d1 3612 ['libcurl'],
d1bf5675 3613 ['idn'],
cdf7ad38 3614 ['initrd'],
87057e24 3615 ['libidn2'],
829257d1
ZJS
3616 ['libidn'],
3617 ['libiptc'],
3618 ['elfutils'],
3619 ['binfmt'],
e594a3b1 3620 ['repart'],
829257d1
ZJS
3621 ['vconsole'],
3622 ['quotacheck'],
3623 ['tmpfiles'],
3624 ['environment.d'],
3625 ['sysusers'],
3626 ['firstboot'],
3627 ['randomseed'],
3628 ['backlight'],
3629 ['rfkill'],
8feca247 3630 ['xdg-autostart'],
829257d1
ZJS
3631 ['logind'],
3632 ['machined'],
61d0578b 3633 ['portabled'],
d093b62c 3634 ['userdb'],
70a5db58 3635 ['homed'],
829257d1
ZJS
3636 ['importd'],
3637 ['hostnamed'],
3638 ['timedated'],
3639 ['timesyncd'],
3640 ['localed'],
3641 ['networkd'],
a7456af5 3642 ['resolve'],
096cbdce
IT
3643 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3644 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
829257d1 3645 ['coredump'],
9b4abc69 3646 ['pstore'],
829257d1
ZJS
3647 ['polkit'],
3648 ['legacy pkla', install_polkit_pkla],
3649 ['efi'],
3650 ['gnu-efi', have_gnu_efi],
3651 ['kmod'],
3652 ['xkbcommon'],
c4c978a0 3653 ['pcre2'],
829257d1
ZJS
3654 ['blkid'],
3655 ['dbus'],
3656 ['glib'],
6bd2bc8e
ZJS
3657 ['nss-myhostname'],
3658 ['nss-mymachines'],
3659 ['nss-resolve'],
3660 ['nss-systemd'],
829257d1
ZJS
3661 ['hwdb'],
3662 ['tpm'],
3663 ['man pages', want_man],
3664 ['html pages', want_html],
3665 ['man page indices', want_man and have_lxml],
829257d1
ZJS
3666 ['SysV compat'],
3667 ['utmp'],
3668 ['ldconfig'],
3669 ['hibernate'],
3670 ['adm group', get_option('adm-group')],
3671 ['wheel group', get_option('wheel-group')],
b14e1b43 3672 ['gshadow'],
829257d1
ZJS
3673 ['debug hashmap'],
3674 ['debug mmap cache'],
d6601495 3675 ['debug siphash'],
d18cb393 3676 ['valgrind', conf.get('VALGRIND') == 1],
fd5dec9a 3677 ['trace logging', conf.get('LOG_TRACE') == 1],
b6261be8 3678 ['install tests', install_tests],
19d8c9c9
LP
3679 ['link-udev-shared', get_option('link-udev-shared')],
3680 ['link-systemctl-shared', get_option('link-systemctl-shared')],
5ac8b50d 3681 ['link-networkd-shared', get_option('link-networkd-shared')],
fd74a13e 3682 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
f30bf4d9
JS
3683 ['kernel-install', get_option('kernel-install')],
3684 ['systemd-analyze', get_option('analyze')],
829257d1
ZJS
3685]
3686
af4d7860
ZJS
3687 if tuple.length() >= 2
3688 cond = tuple[1]
3689 else
829257d1
ZJS
3690 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3691 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
349cc4a5 3692 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
829257d1
ZJS
3693 endif
3694 if cond
5a8b1640 3695 found += tuple[0]
829257d1 3696 else
5a8b1640 3697 missing += tuple[0]
829257d1
ZJS
3698 endif
3699endforeach
3700
3701status += [
9d39c1bf 3702 '',
829257d1 3703 'enabled features: @0@'.format(', '.join(found)),
9d39c1bf
ZJS
3704 '',
3705 'disabled features: @0@'.format(', '.join(missing)),
3706 '']
829257d1 3707message('\n '.join(status))
9a8e64b0
ZJS
3708
3709if rootprefixdir != rootprefix_default
8ea9fad7
YW
3710 warning('\n' +
3711 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3712 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3713 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
9a8e64b0 3714endif