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