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