]> git.ipfire.org Git - thirdparty/systemd.git/blame - meson.build
meson: move declarations of several generators
[thirdparty/systemd.git] / meson.build
CommitLineData
db9ecf05 1# SPDX-License-Identifier: LGPL-2.1-or-later
3a726fcd 2
5c23128d 3project('systemd', 'c',
eed3d044 4 version : '254',
5c23128d
ZJS
5 license : 'LGPLv2+',
6 default_options: [
2b2dbcbb 7 'c_std=gnu11',
37efbbd8
ZJS
8 'prefix=/usr',
9 'sysconfdir=/etc',
10 'localstatedir=/var',
827ca909 11 'warning_level=2',
5c23128d 12 ],
35c035a1 13 meson_version : '>= 0.60.0',
5c23128d
ZJS
14 )
15
eed3d044
LB
16libsystemd_version = '0.37.0'
17libudev_version = '1.7.7'
56d50ab1 18
5c23128d 19conf = configuration_data()
a8c03388 20conf.set_quoted('PROJECT_URL', 'https://systemd.io/')
d1b0d841 21conf.set('PROJECT_VERSION', meson.project_version(),
6ffeca8c 22 description : 'Numerical project version (used where a simple number is expected)')
5c23128d 23
1485aacb
DC
24# This is to be used instead of meson.source_root(), as the latter will return
25# the wrong result when systemd is being built as a meson subproject
26project_source_root = meson.current_source_dir()
81e06775 27project_build_root = meson.current_build_dir()
a0b15b41 28relative_source_path = run_command('realpath',
81e06775 29 '--relative-to=@0@'.format(project_build_root),
e92777d2
ZJS
30 project_source_root,
31 check : true).stdout().strip()
a0b15b41 32conf.set_quoted('RELATIVE_SOURCE_PATH', relative_source_path)
1485aacb 33
47350c5f
ZJS
34conf.set10('BUILD_MODE_DEVELOPER', get_option('mode') == 'developer',
35 description : 'tailor build to development or release builds')
011a03a3
ZJS
36verification = get_option('log-message-verification')
37if verification == 'auto'
38 verification = conf.get('BUILD_MODE_DEVELOPER') == 1
39else
40 verification = verification == 'true'
41endif
42conf.set10('LOG_MESSAGE_VERIFICATION', verification)
839bdf25 43
c09edc79
ZJS
44want_ossfuzz = get_option('oss-fuzz')
45want_libfuzzer = get_option('llvm-fuzz')
c29537f3 46if want_ossfuzz and want_libfuzzer
6b8d32ea 47 error('only one of oss-fuzz or llvm-fuzz can be specified')
c09edc79 48endif
87ac55a1 49
678ba020 50skip_deps = want_ossfuzz or get_option('skip-deps')
6b8d32ea 51fuzzer_build = want_ossfuzz or want_libfuzzer
c09edc79 52
c4f883b7
ZJS
53# If we're building *not* for actual fuzzing, allow input samples of any size
54# (for testing and for reproduction of issues discovered with previously-higher
55# limits).
56conf.set10('FUZZ_USE_SIZE_LIMIT', fuzzer_build)
57
493cd503
ZJS
58# We'll set this to '1' for EFI builds in a different place.
59conf.set10('SD_BOOT', false)
60
3f871f12
ZJS
61# Create a title-less summary section early, so it ends up first in the output.
62# More items are added later after they have been detected.
63summary({'build mode' : get_option('mode')})
64
5c23128d
ZJS
65#####################################################################
66
003c8879 67# Try to install the git pre-commit hook
e2d612a8
ZJS
68add_git_hook_sh = find_program('tools/add-git-hook.sh', required : false)
69if add_git_hook_sh.found()
e92777d2 70 git_hook = run_command(add_git_hook_sh, check : false)
e2d612a8
ZJS
71 if git_hook.returncode() == 0
72 message(git_hook.stdout().strip())
73 endif
003c8879
ZJS
74endif
75
76#####################################################################
77
4cf8a609 78fs = import('fs')
157baa87 79if get_option('split-bin') == 'auto'
4cf8a609 80 split_bin = not fs.is_symlink('/usr/sbin')
157baa87
ZJS
81else
82 split_bin = get_option('split-bin') == 'true'
83endif
671f0f8d
ZJS
84conf.set10('HAVE_SPLIT_BIN', split_bin,
85 description : 'bin and sbin directories are separate')
157baa87 86
8ef8f3d5
FB
87have_standalone_binaries = get_option('standalone-binaries')
88
5c23128d
ZJS
89sysvinit_path = get_option('sysvinit-path')
90sysvrcnd_path = get_option('sysvrcnd-path')
348b4437 91conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
349cc4a5 92 description : 'SysV init scripts and rcN.d links are supported')
6fe23ff3 93conf.set10('CREATE_LOG_DIRS', get_option('create-log-dirs'))
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
fce9abb2
ZJS
103# Meson ignores the preceding arguments when joining paths if an absolute
104# component is encountered, so this should canonicalize various paths when they
105# are absolute or relative.
5c23128d
ZJS
106prefixdir = get_option('prefix')
107if not prefixdir.startswith('/')
37efbbd8 108 error('Prefix is not absolute: "@0@"'.format(prefixdir))
5c23128d 109endif
d895e10a 110
b0d3095f 111prefixdir_noslash = '/' + prefixdir.strip('/')
fce9abb2 112bindir = prefixdir / get_option('bindir')
b0d3095f 113sbindir = prefixdir / (split_bin ? 'sbin' : 'bin')
fce9abb2
ZJS
114libdir = prefixdir / get_option('libdir')
115sysconfdir = prefixdir / get_option('sysconfdir')
116includedir = prefixdir / get_option('includedir')
117datadir = prefixdir / get_option('datadir')
118localstatedir = '/' / get_option('localstatedir')
5c23128d 119
b0d3095f
LB
120libexecdir = prefixdir / 'lib/systemd'
121pkglibdir = libdir / 'systemd'
5c23128d 122
225d08b8
JT
123install_sysconfdir = get_option('install-sysconfdir') != 'false'
124install_sysconfdir_samples = get_option('install-sysconfdir') == 'true'
5c23128d 125# Dirs of external packages
fce9abb2
ZJS
126pkgconfigdatadir = get_option('pkgconfigdatadir') != '' ? get_option('pkgconfigdatadir') : datadir / 'pkgconfig'
127pkgconfiglibdir = get_option('pkgconfiglibdir') != '' ? get_option('pkgconfiglibdir') : libdir / 'pkgconfig'
128polkitpolicydir = datadir / 'polkit-1/actions'
129polkitrulesdir = datadir / 'polkit-1/rules.d'
130polkitpkladir = localstatedir / 'lib/polkit-1/localauthority/10-vendor.d'
131xinitrcdir = get_option('xinitrcdir') != '' ? get_option('xinitrcdir') : sysconfdir / 'X11/xinit/xinitrc.d'
8a38aac3
YW
132rpmmacrosdir = get_option('rpmmacrosdir')
133if rpmmacrosdir != 'no'
fce9abb2 134 rpmmacrosdir = prefixdir / rpmmacrosdir
8a38aac3 135endif
b0d3095f 136modprobedir = prefixdir / 'lib/modprobe.d'
5c23128d
ZJS
137
138# Our own paths
fce9abb2
ZJS
139pkgdatadir = datadir / 'systemd'
140environmentdir = prefixdir / 'lib/environment.d'
141pkgsysconfdir = sysconfdir / 'systemd'
142userunitdir = prefixdir / 'lib/systemd/user'
143userpresetdir = prefixdir / 'lib/systemd/user-preset'
144tmpfilesdir = prefixdir / 'lib/tmpfiles.d'
107795a7 145usertmpfilesdir = prefixdir / 'share/user-tmpfiles.d'
fce9abb2
ZJS
146sysusersdir = prefixdir / 'lib/sysusers.d'
147sysctldir = prefixdir / 'lib/sysctl.d'
148binfmtdir = prefixdir / 'lib/binfmt.d'
149modulesloaddir = prefixdir / 'lib/modules-load.d'
b0d3095f
LB
150networkdir = prefixdir / 'lib/systemd/network'
151systemgeneratordir = libexecdir / 'system-generators'
fce9abb2
ZJS
152usergeneratordir = prefixdir / 'lib/systemd/user-generators'
153systemenvgeneratordir = prefixdir / 'lib/systemd/system-environment-generators'
154userenvgeneratordir = prefixdir / 'lib/systemd/user-environment-generators'
b0d3095f
LB
155systemshutdowndir = libexecdir / 'system-shutdown'
156systemsleepdir = libexecdir / 'system-sleep'
157systemunitdir = prefixdir / 'lib/systemd/system'
158systempresetdir = prefixdir / 'lib/systemd/system-preset'
159udevlibexecdir = prefixdir / 'lib/udev'
fce9abb2
ZJS
160udevrulesdir = udevlibexecdir / 'rules.d'
161udevhwdbdir = udevlibexecdir / 'hwdb.d'
162catalogdir = prefixdir / 'lib/systemd/catalog'
641e2124 163kerneldir = prefixdir / 'lib/kernel'
164kernelinstalldir = kerneldir / 'install.d'
fce9abb2
ZJS
165factorydir = datadir / 'factory'
166bootlibdir = prefixdir / 'lib/systemd/boot/efi'
167testsdir = prefixdir / 'lib/systemd/tests'
26c2b302 168unittestsdir = testsdir / 'unit-tests'
539ee7ab 169testdata_dir = testsdir / 'testdata'
fce9abb2
ZJS
170systemdstatedir = localstatedir / 'lib/systemd'
171catalogstatedir = systemdstatedir / 'catalog'
172randomseeddir = localstatedir / 'lib/systemd'
b0d3095f
LB
173profiledir = libexecdir / 'portable' / 'profile'
174ntpservicelistdir = prefixdir / 'lib/systemd/ntp-units.d'
24039e12 175credstoredir = prefixdir / 'lib/credstore'
5c23128d 176
75aaade1
TB
177docdir = get_option('docdir')
178if docdir == ''
fce9abb2 179 docdir = datadir / 'doc/systemd'
75aaade1
TB
180endif
181
5c23128d
ZJS
182pamlibdir = get_option('pamlibdir')
183if pamlibdir == ''
b0d3095f 184 pamlibdir = libdir / 'security'
5c23128d
ZJS
185endif
186
187pamconfdir = get_option('pamconfdir')
188if pamconfdir == ''
fce9abb2 189 pamconfdir = prefixdir / 'lib/pam.d'
5c23128d
ZJS
190endif
191
d1ae38d8
OK
192libcryptsetup_plugins_dir = get_option('libcryptsetup-plugins-dir')
193if libcryptsetup_plugins_dir == ''
b0d3095f 194 libcryptsetup_plugins_dir = libdir / 'cryptsetup'
d1ae38d8
OK
195endif
196
444d5863 197memory_accounting_default = get_option('memory-accounting-default')
36cf4507 198status_unit_format_default = get_option('status-unit-format-default')
819c0dcb
ZJS
199if status_unit_format_default == 'auto'
200 status_unit_format_default = conf.get('BUILD_MODE_DEVELOPER') == 1 ? 'name' : 'description'
201endif
444d5863 202
b0d3095f 203conf.set_quoted('BINDIR', bindir)
491bf10c
ZJS
204conf.set_quoted('BINFMT_DIR', binfmtdir)
205conf.set_quoted('BOOTLIBDIR', bootlibdir)
fce9abb2 206conf.set_quoted('CATALOG_DATABASE', catalogstatedir / 'database')
491bf10c 207conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
6fe23ff3 208conf.set_quoted('DOC_DIR', docdir)
fce9abb2 209conf.set_quoted('DOCUMENT_ROOT', pkgdatadir / 'gatewayd')
491bf10c
ZJS
210conf.set_quoted('ENVIRONMENT_DIR', environmentdir)
211conf.set_quoted('INCLUDE_DIR', includedir)
212conf.set_quoted('LIBDIR', libdir)
b0d3095f 213conf.set_quoted('LIBEXECDIR', libexecdir)
491bf10c
ZJS
214conf.set_quoted('MODPROBE_DIR', modprobedir)
215conf.set_quoted('MODULESLOAD_DIR', modulesloaddir)
5c23128d 216conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
fce9abb2 217conf.set_quoted('POLKIT_AGENT_BINARY_PATH', bindir / 'pkttyagent')
491bf10c 218conf.set_quoted('PREFIX', prefixdir)
b0d3095f 219conf.set_quoted('PREFIX_NOSLASH', prefixdir_noslash)
fce9abb2 220conf.set_quoted('RANDOM_SEED', randomseeddir / 'random-seed')
491bf10c 221conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
452d2dfd 222conf.set_quoted('RC_LOCAL_PATH', get_option('rc-local'))
491bf10c
ZJS
223conf.set_quoted('SYSCONF_DIR', sysconfdir)
224conf.set_quoted('SYSCTL_DIR', sysctldir)
b0d3095f
LB
225conf.set_quoted('SYSTEMCTL_BINARY_PATH', bindir / 'systemctl')
226conf.set_quoted('SYSTEMD_BINARY_PATH', libexecdir / 'systemd')
491bf10c 227conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
b0d3095f
LB
228conf.set_quoted('SYSTEMD_CGROUPS_AGENT_PATH', libexecdir / 'systemd-cgroups-agent')
229conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', libexecdir / 'systemd-cryptsetup')
230conf.set_quoted('SYSTEMD_EXPORT_PATH', libexecdir / 'systemd-export')
231conf.set_quoted('SYSTEMD_FSCK_PATH', libexecdir / 'systemd-fsck')
232conf.set_quoted('SYSTEMD_GROWFS_PATH', libexecdir / 'systemd-growfs')
233conf.set_quoted('SYSTEMD_HOMEWORK_PATH', libexecdir / 'systemd-homework')
234conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', libexecdir / 'systemd-import-fs')
235conf.set_quoted('SYSTEMD_IMPORT_PATH', libexecdir / 'systemd-import')
236conf.set_quoted('SYSTEMD_INTEGRITYSETUP_PATH', libexecdir / 'systemd-integritysetup')
fce9abb2
ZJS
237conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', pkgdatadir / 'kbd-model-map')
238conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', pkgdatadir / 'language-fallback-map')
b0d3095f
LB
239conf.set_quoted('SYSTEMD_MAKEFS_PATH', libexecdir / 'systemd-makefs')
240conf.set_quoted('SYSTEMD_PULL_PATH', libexecdir / 'systemd-pull')
241conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', libexecdir / 'systemd-shutdown')
539ee7ab 242conf.set_quoted('SYSTEMD_TEST_DATA', testdata_dir)
b0d3095f
LB
243conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', bindir / 'systemd-tty-ask-password-agent')
244conf.set_quoted('SYSTEMD_UPDATE_HELPER_PATH', libexecdir / 'systemd-update-helper')
245conf.set_quoted('SYSTEMD_USERWORK_PATH', libexecdir / 'systemd-userwork')
246conf.set_quoted('SYSTEMD_VERITYSETUP_PATH', libexecdir / 'systemd-veritysetup')
fce9abb2 247conf.set_quoted('SYSTEM_CONFIG_UNIT_DIR', pkgsysconfdir / 'system')
491bf10c 248conf.set_quoted('SYSTEM_DATA_UNIT_DIR', systemunitdir)
96d33e4a 249conf.set_quoted('SYSTEM_ENV_GENERATOR_DIR', systemenvgeneratordir)
491bf10c
ZJS
250conf.set_quoted('SYSTEM_GENERATOR_DIR', systemgeneratordir)
251conf.set_quoted('SYSTEM_PRESET_DIR', systempresetdir)
5c23128d
ZJS
252conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
253conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
491bf10c
ZJS
254conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
255conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
835cf75a
ZJS
256conf.set_quoted('SYSUSERS_DIR', sysusersdir)
257conf.set_quoted('TMPFILES_DIR', tmpfilesdir)
107795a7 258conf.set_quoted('USER_TMPFILES_DIR', usertmpfilesdir)
5c23128d 259conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
491bf10c
ZJS
260conf.set_quoted('UDEV_HWDB_DIR', udevhwdbdir)
261conf.set_quoted('UDEV_RULES_DIR', udevrulesdir)
fce9abb2 262conf.set_quoted('USER_CONFIG_UNIT_DIR', pkgsysconfdir / 'user')
491bf10c
ZJS
263conf.set_quoted('USER_DATA_UNIT_DIR', userunitdir)
264conf.set_quoted('USER_ENV_GENERATOR_DIR', userenvgeneratordir)
265conf.set_quoted('USER_GENERATOR_DIR', usergeneratordir)
fce9abb2 266conf.set_quoted('USER_KEYRING_PATH', pkgsysconfdir / 'import-pubring.gpg')
491bf10c 267conf.set_quoted('USER_PRESET_DIR', userpresetdir)
b0d3095f 268conf.set_quoted('VENDOR_KEYRING_PATH', libexecdir / 'import-pubring.gpg')
491bf10c
ZJS
269
270conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
e5d86ebe 271conf.set10('ENABLE_URLIFY', get_option('urlify'))
491bf10c 272conf.set10('ENABLE_FEXECVE', get_option('fexecve'))
30538ff1 273conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
36cf4507 274conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
e11a25ca 275conf.set_quoted('STATUS_UNIT_FORMAT_DEFAULT_STR', status_unit_format_default)
5c23128d 276
e4c7b5f5
ZJS
277conf.set('DEFAULT_TIMEOUT_SEC', get_option('default-timeout-sec'))
278conf.set('DEFAULT_USER_TIMEOUT_SEC', get_option('default-user-timeout-sec'))
279conf.set('UPDATE_HELPER_USER_TIMEOUT_SEC', get_option('update-helper-user-timeout-sec'))
280
93651582
JL
281conf.set10('FIRST_BOOT_FULL_PRESET', get_option('first-boot-full-preset'))
282
5c23128d
ZJS
283#####################################################################
284
285cc = meson.get_compiler('c')
92148283
JJ
286userspace_c_args = []
287userspace_c_ld_args = []
b68dfb9e 288meson_build_sh = find_program('tools/meson-build.sh')
5c23128d 289
d3da291e
ZJS
290want_tests = get_option('tests')
291slow_tests = want_tests != 'false' and get_option('slow-tests')
c56463fd 292fuzz_tests = want_tests != 'false' and get_option('fuzz-tests')
d3da291e
ZJS
293install_tests = get_option('install-tests')
294
daf4e78e 295if add_languages('cpp', native : false, required : fuzzer_build)
3b2bdd62 296 # Used only for tests
e9f4f566
ZJS
297 cxx = meson.get_compiler('cpp')
298 cxx_cmd = ' '.join(cxx.cmd_array())
1b2acaa7 299else
9b0ca019 300 cxx_cmd = ''
94e2523b
ZJS
301endif
302
31e57a35 303if want_libfuzzer
9c5c4677
EV
304 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
305 if fuzzing_engine.found()
92148283 306 userspace_c_args += '-fsanitize-coverage=trace-pc-guard,trace-cmp'
9c5c4677 307 elif cc.has_argument('-fsanitize=fuzzer-no-link')
92148283 308 userspace_c_args += '-fsanitize=fuzzer-no-link'
9c5c4677
EV
309 else
310 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
311 endif
c09edc79 312elif want_ossfuzz
7db7d5b7
JR
313 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
314endif
315
e9f4f566
ZJS
316# Those generate many false positives, and we do not want to change the code to
317# avoid them.
318basic_disabled_warnings = [
e9f4f566 319 '-Wno-missing-field-initializers',
505ab9dd 320 '-Wno-unused-parameter',
e9f4f566 321]
e9f4f566 322
65267363 323possible_common_cc_flags = [
fc568837
ZJS
324 '-Warray-bounds', # clang
325 '-Warray-bounds=2',
505ab9dd
YW
326 '-Wdate-time',
327 '-Wendif-labels',
328 '-Werror=format=2',
a4ea5d19 329 '-Werror=format-signedness',
505ab9dd 330 '-Werror=implicit-function-declaration',
a0d613ec 331 '-Werror=implicit-int',
505ab9dd 332 '-Werror=incompatible-pointer-types',
ebbb1e36 333 '-Werror=int-conversion',
0b482b37
JJ
334 '-Werror=missing-declarations',
335 '-Werror=missing-prototypes',
505ab9dd 336 '-Werror=overflow',
48c67fdf 337 '-Werror=override-init',
505ab9dd
YW
338 '-Werror=return-type',
339 '-Werror=shift-count-overflow',
340 '-Werror=shift-overflow=2',
6405afda 341 '-Werror=strict-flex-arrays',
30a4ddff 342 '-Werror=undef',
505ab9dd 343 '-Wfloat-equal',
c0f5d58c
JJ
344 # gperf prevents us from enabling this because it does not emit fallthrough
345 # attribute with clang.
346 #'-Wimplicit-fallthrough',
505ab9dd
YW
347 '-Wimplicit-fallthrough=5',
348 '-Winit-self',
30a4ddff
YW
349 '-Wlogical-op',
350 '-Wmissing-include-dirs',
505ab9dd
YW
351 '-Wmissing-noreturn',
352 '-Wnested-externs',
30a4ddff
YW
353 '-Wold-style-definition',
354 '-Wpointer-arith',
30a4ddff 355 '-Wredundant-decls',
30a4ddff 356 '-Wshadow',
30a4ddff 357 '-Wstrict-aliasing=2',
505ab9dd
YW
358 '-Wstrict-prototypes',
359 '-Wsuggest-attribute=noreturn',
054ed430 360 '-Wunused-function',
30a4ddff 361 '-Wwrite-strings',
31560245 362 '-Wzero-length-bounds',
bf7efeb1
FB
363
364 # negative arguments are correctly detected starting with meson 0.46.
eed33623
ZJS
365 '-Wno-error=#warnings', # clang
366 '-Wno-string-plus-int', # clang
fc568837 367
0b482b37
JJ
368 '-fdiagnostics-show-option',
369 '-fno-common',
48e1b2c2
JJ
370 '-fstack-protector',
371 '-fstack-protector-strong',
fc568837 372 '-fstrict-flex-arrays',
48e1b2c2
JJ
373 '--param=ssp-buffer-size=4',
374]
375
376possible_common_link_flags = [
377 '-fstack-protector',
30a4ddff
YW
378]
379
b528a628
ZJS
380c_args = get_option('c_args')
381
60f97fee 382# Our json library does not support -ffinite-math-only, which is enabled by -Ofast or -ffast-math.
53403091 383if (('-Ofast' in c_args or '-ffast-math' in c_args or '-ffinite-math-only' in c_args) and '-fno-finite-math-only' not in c_args)
60f97fee
YW
384 error('-Ofast, -ffast-math, or -ffinite-math-only is specified in c_args.')
385endif
386
a17e5478 387# Disable -Wmaybe-uninitialized when compiling with -Os/-O1/-O3/etc. There are
68c98a41
ZJS
388# too many false positives with gcc >= 8. Effectively, we only test with -O0
389# and -O2; this should be enough to catch most important cases without too much
390# busywork. See https://github.com/systemd/systemd/pull/19226.
391if cc.get_id() == 'gcc' and (not '02'.contains(get_option('optimization')) or
b528a628
ZJS
392 cc.version().version_compare('<10') or
393 '-Os' in c_args or
394 '-O1' in c_args or
395 '-O3' in c_args or
396 '-Og' in c_args)
65267363 397 possible_common_cc_flags += '-Wno-maybe-uninitialized'
68c98a41
ZJS
398endif
399
bc2a4af2
ZJS
400# Disable -Wno-unused-result with gcc, see
401# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66425.
402if cc.get_id() == 'gcc'
403 possible_common_cc_flags += '-Wno-unused-result'
404endif
405
30a4ddff 406# --as-needed and --no-undefined are provided by meson by default,
9247df5a 407# run 'meson configure' to see what is enabled
30a4ddff 408possible_link_flags = [
42e3bb35 409 '-Wl,--fatal-warnings',
30a4ddff 410 '-Wl,-z,now',
42e3bb35 411 '-Wl,-z,relro',
30a4ddff 412]
5c23128d 413
42e3bb35
JJ
414if get_option('b_sanitize') == 'none'
415 possible_link_flags += '-Wl,--warn-common'
416endif
417
30a4ddff 418if cc.get_id() == 'clang'
65267363 419 possible_common_cc_flags += [
30a4ddff
YW
420 '-Wno-typedef-redefinition',
421 '-Wno-gnu-variable-sized-type-not-at-end',
422 ]
423endif
424
1a4e3927
JJ
425if get_option('mode') == 'release'
426 # We could enable 'pattern' for developer mode, but that can interfere with
427 # valgrind and sanitizer builds. Also, clang does not zero-initialize unions,
428 # breaking some of our code (https://reviews.llvm.org/D68115).
429 possible_common_cc_flags += '-ftrivial-auto-var-init=zero'
430endif
431
92148283 432possible_cc_flags = [
16e09d51 433 '-fno-strict-aliasing',
afd8e1d9 434 '-fstrict-flex-arrays=1',
16e09d51 435 '-fvisibility=hidden',
16e09d51
YW
436]
437
30a4ddff 438if get_option('buildtype') != 'debug'
16e09d51 439 possible_cc_flags += [
30a4ddff
YW
440 '-ffunction-sections',
441 '-fdata-sections',
442 ]
443
444 possible_link_flags += '-Wl,--gc-sections'
445endif
446
82390022
DDM
447if get_option('mode') == 'developer'
448 possible_cc_flags += '-fno-omit-frame-pointer'
449endif
450
92148283
JJ
451add_project_arguments(
452 cc.get_supported_arguments(
453 basic_disabled_warnings,
454 possible_common_cc_flags
455 ),
456 language : 'c')
457
48e1b2c2
JJ
458add_project_link_arguments(
459 cc.get_supported_link_arguments(possible_common_link_flags),
460 language : 'c')
461
92148283
JJ
462userspace_c_args += cc.get_supported_arguments(possible_cc_flags)
463userspace_c_ld_args += cc.get_supported_link_arguments(possible_link_flags)
30a4ddff 464
94c0c5b7
ZJS
465have = cc.has_argument('-Wzero-length-bounds')
466conf.set10('HAVE_ZERO_LENGTH_BOUNDS', have)
467
9e70f2f8 468if cc.compiles('''
5c23128d
ZJS
469 #include <time.h>
470 #include <inttypes.h>
471 typedef uint64_t usec_t;
472 usec_t now(clockid_t clock);
473 int main(void) {
474 struct timespec now;
475 return 0;
476 }
38c1c96d 477''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
37efbbd8 478 add_project_arguments('-Werror=shadow', language : 'c')
5c23128d
ZJS
479endif
480
e9f4f566
ZJS
481if cxx_cmd != ''
482 add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp')
483endif
484
0e3cc902 485cpp = ' '.join(cc.cmd_array()) + ' -E'
9cc0e6e9 486
6695c200
ZJS
487has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
488
5c23128d
ZJS
489#####################################################################
490# compilation result tests
491
78103450 492conf.set('_GNU_SOURCE', 1)
2c201c21 493conf.set('__SANE_USERSPACE_TYPES__', true)
6695c200 494conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
5c23128d 495
5c23128d
ZJS
496conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
497conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
5c23128d 498conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
84d953e8 499conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
3112d756 500conf.set('SIZEOF_TIMEX_MEMBER', cc.sizeof('typeof(((struct timex *)0)->freq)', prefix : '#include <sys/timex.h>'))
5c23128d 501
2736a0c6 502long_max = cc.compute_int(
503 'LONG_MAX',
504 prefix : '#include <limits.h>',
505 guess : 0x7FFFFFFFFFFFFFFF,
506 high : 0x7FFFFFFFFFFFFFFF)
a5fac1df
ZJS
507assert(long_max > 100000)
508conf.set_quoted('LONG_MAX_STR', '@0@'.format(long_max))
509
5c23128d 510decl_headers = '''
eb292969 511#include <dirent.h>
5c23128d 512#include <uchar.h>
84e8edec 513#include <sys/mount.h>
4c2e1b39 514#include <sys/stat.h>
5c23128d 515'''
5c23128d
ZJS
516
517foreach decl : ['char16_t',
518 'char32_t',
84e8edec 519 'struct mount_attr',
4c2e1b39 520 'struct statx',
eb292969 521 'struct dirent64',
5c23128d 522 ]
2c201c21
ZJS
523
524 # We get -1 if the size cannot be determined
9c869d08
ZJS
525 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
526
3657d3a0
RH
527 if decl == 'struct mount_attr'
528 if have
529 want_linux_fs_h = false
530 else
531 have = cc.sizeof(decl,
532 prefix : decl_headers + '#include <linux/fs.h>',
533 args : '-D_GNU_SOURCE') > 0
534 want_linux_fs_h = have
535 endif
536 endif
537
9c869d08
ZJS
538 if decl == 'struct statx'
539 if have
540 want_linux_stat_h = false
541 else
542 have = cc.sizeof(decl,
543 prefix : decl_headers + '#include <linux/stat.h>',
544 args : '-D_GNU_SOURCE') > 0
545 want_linux_stat_h = have
546 endif
547 endif
548
349cc4a5 549 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
5c23128d
ZJS
550endforeach
551
9c869d08 552conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
3657d3a0 553conf.set10('WANT_LINUX_FS_H', want_linux_fs_h)
75720bff 554
5c23128d 555foreach ident : ['secure_getenv', '__secure_getenv']
349cc4a5 556 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
5c23128d
ZJS
557endforeach
558
559foreach ident : [
85db59b7 560 ['memfd_create', '''#include <sys/mman.h>'''],
7b961e40
LP
561 ['gettid', '''#include <sys/types.h>
562 #include <unistd.h>'''],
3c042add
LP
563 ['pivot_root', '''#include <stdlib.h>
564 #include <unistd.h>'''], # no known header declares pivot_root
51fe206f
ZJS
565 ['ioprio_get', '''#include <sched.h>'''], # no known header declares ioprio_get
566 ['ioprio_set', '''#include <sched.h>'''], # no known header declares ioprio_set
85db59b7 567 ['name_to_handle_at', '''#include <sys/types.h>
37efbbd8
ZJS
568 #include <sys/stat.h>
569 #include <fcntl.h>'''],
85db59b7 570 ['setns', '''#include <sched.h>'''],
2acfd0ff
LP
571 ['renameat2', '''#include <stdio.h>
572 #include <fcntl.h>'''],
37efbbd8
ZJS
573 ['kcmp', '''#include <linux/kcmp.h>'''],
574 ['keyctl', '''#include <sys/types.h>
575 #include <keyutils.h>'''],
85db59b7 576 ['copy_file_range', '''#include <sys/syscall.h>
37efbbd8 577 #include <unistd.h>'''],
71e5200f
DM
578 ['bpf', '''#include <sys/syscall.h>
579 #include <unistd.h>'''],
4c2e1b39
LP
580 ['statx', '''#include <sys/types.h>
581 #include <sys/stat.h>
582 #include <unistd.h>'''],
aa484f35 583 ['explicit_bzero' , '''#include <string.h>'''],
5bb20fd3 584 ['reallocarray', '''#include <stdlib.h>'''],
b070c7c0
MS
585 ['set_mempolicy', '''#include <stdlib.h>
586 #include <unistd.h>'''],
587 ['get_mempolicy', '''#include <stdlib.h>
588 #include <unistd.h>'''],
5f152f43
LP
589 ['pidfd_send_signal', '''#include <stdlib.h>
590 #include <unistd.h>
591 #include <signal.h>
592 #include <sys/wait.h>'''],
593 ['pidfd_open', '''#include <stdlib.h>
594 #include <unistd.h>
595 #include <signal.h>
596 #include <sys/wait.h>'''],
5ead4e85
LP
597 ['rt_sigqueueinfo', '''#include <stdlib.h>
598 #include <unistd.h>
599 #include <signal.h>
600 #include <sys/wait.h>'''],
a5421953
DDM
601 ['rt_tgsigqueueinfo', '''#include <stdlib.h>
602 #include <unistd.h>
603 #include <signal.h>
604 #include <sys/wait.h>'''],
4b6f74f5 605 ['mallinfo', '''#include <malloc.h>'''],
1885169c 606 ['mallinfo2', '''#include <malloc.h>'''],
8939eeae 607 ['execveat', '''#include <unistd.h>'''],
441e0fdb 608 ['close_range', '''#include <unistd.h>'''],
420297c9 609 ['epoll_pwait2', '''#include <sys/epoll.h>'''],
84e8edec
LP
610 ['mount_setattr', '''#include <sys/mount.h>'''],
611 ['move_mount', '''#include <sys/mount.h>'''],
612 ['open_tree', '''#include <sys/mount.h>'''],
1c265fcd
DDM
613 ['fsopen', '''#include <sys/mount.h>'''],
614 ['fsconfig', '''#include <sys/mount.h>'''],
34a9da0d 615 ['fsmount', '''#include <sys/mount.h>'''],
aab35b1e 616 ['getdents64', '''#include <dirent.h>'''],
37efbbd8
ZJS
617]
618
85db59b7 619 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
4b9545f1 620 conf.set10('HAVE_' + ident[0].to_upper(), have)
5c23128d
ZJS
621endforeach
622
85db59b7 623if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
349cc4a5 624 conf.set10('USE_SYS_RANDOM_H', true)
4b9545f1 625 conf.set10('HAVE_GETRANDOM', true)
4984c8be
ZJS
626else
627 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
349cc4a5 628 conf.set10('USE_SYS_RANDOM_H', false)
4b9545f1 629 conf.set10('HAVE_GETRANDOM', have)
4984c8be
ZJS
630endif
631
5c23128d
ZJS
632#####################################################################
633
0f4c4f38
ZJS
634sh = find_program('sh')
635echo = find_program('echo')
5c23128d 636sed = find_program('sed')
5c23128d 637awk = find_program('awk')
5c23128d 638stat = find_program('stat')
0f4c4f38 639ln = find_program('ln')
d68b342b 640git = find_program('git', required : false)
b68dfb9e 641env = find_program('env')
0f4c4f38 642rsync = find_program('rsync', required : false)
4d56d084 643diff = find_program('diff')
d9081eb0 644find = find_program('find')
7c22f07c 645meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
5c23128d 646
94e75a54 647mkdir_p = 'mkdir -p $DESTDIR/@0@'
24039e12 648mkdir_p_mode = 'mkdir -p $DESTDIR/@0@ -m @1@'
94e75a54 649
9247df5a 650# If -Dxxx-path option is found, use that. Otherwise, check in $PATH,
5c23128d 651# /usr/sbin, /sbin, and fall back to the default from middle column.
2fa645f1 652progs = [['quotaon', '/usr/sbin/quotaon' ],
5c23128d 653 ['quotacheck', '/usr/sbin/quotacheck' ],
5c23128d
ZJS
654 ['kmod', '/usr/bin/kmod' ],
655 ['kexec', '/usr/sbin/kexec' ],
656 ['sulogin', '/usr/sbin/sulogin' ],
657 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
658 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
659 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
660 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
6db90462 661 ['nologin', '/usr/sbin/nologin', ],
5c23128d
ZJS
662 ]
663foreach prog : progs
37efbbd8
ZJS
664 path = get_option(prog[0] + '-path')
665 if path != ''
666 message('Using @1@ for @0@'.format(prog[0], path))
667 else
668 exe = find_program(prog[0],
669 '/usr/sbin/' + prog[0],
670 '/sbin/' + prog[0],
671 required: false)
573c0dc1 672 path = exe.found() ? exe.full_path() : prog[1]
37efbbd8
ZJS
673 endif
674 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
675 conf.set_quoted(name, path)
5c23128d
ZJS
676endforeach
677
2fa645f1
MG
678conf.set_quoted('TELINIT', get_option('telinit-path'))
679
e92777d2 680if run_command(ln, '--relative', '--help', check : false).returncode() != 0
cd001016 681 error('ln does not support --relative (added in coreutils 8.16)')
1276a9f6 682endif
5c23128d
ZJS
683
684############################################################
685
686gperf = find_program('gperf')
687
688gperf_test_format = '''
689#include <string.h>
690const char * in_word_set(const char *, @0@);
691@1@
692'''
ac3eda34 693gperf_snippet = run_command(sh, '-c', 'echo foo,bar | "$1" -L ANSI-C', '_', gperf,
e92777d2 694 check : true)
5c23128d
ZJS
695gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
696if cc.compiles(gperf_test)
37efbbd8 697 gperf_len_type = 'size_t'
5c23128d 698else
37efbbd8
ZJS
699 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
700 if cc.compiles(gperf_test)
701 gperf_len_type = 'unsigned'
702 else
703 error('unable to determine gperf len type')
704 endif
5c23128d
ZJS
705endif
706message('gperf len type is @0@'.format(gperf_len_type))
37efbbd8
ZJS
707conf.set('GPERF_LEN_TYPE', gperf_len_type,
708 description : 'The type of gperf "len" parameter')
5c23128d
ZJS
709
710############################################################
711
712if not cc.has_header('sys/capability.h')
37efbbd8 713 error('POSIX caps headers not found')
5c23128d 714endif
9f555bba 715foreach header : ['crypt.h',
5c23128d
ZJS
716 'linux/memfd.h',
717 'linux/vm_sockets.h',
af8786b1 718 'sys/auxv.h',
5545f336 719 'threads.h',
5c23128d
ZJS
720 'valgrind/memcheck.h',
721 'valgrind/valgrind.h',
420297c9 722 'linux/time_types.h',
b428efa5 723 'sys/sdt.h',
5c23128d 724 ]
2c201c21 725
349cc4a5
ZJS
726 conf.set10('HAVE_' + header.underscorify().to_upper(),
727 cc.has_header(header))
5c23128d
ZJS
728endforeach
729
730############################################################
731
eef4b800
ZJS
732fallback_hostname = get_option('fallback-hostname')
733if fallback_hostname == '' or fallback_hostname[0] == '.' or fallback_hostname[0] == '-'
734 error('Invalid fallback-hostname configuration')
735 # A more extensive test is done in test-hostname-util. Let's catch
736 # the most obvious errors here so we don't fail with an assert later.
737endif
738conf.set_quoted('FALLBACK_HOSTNAME', fallback_hostname)
739
5c23128d
ZJS
740default_hierarchy = get_option('default-hierarchy')
741conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
742 description : 'default cgroup hierarchy as string')
743if default_hierarchy == 'legacy'
37efbbd8 744 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
5c23128d 745elif default_hierarchy == 'hybrid'
37efbbd8 746 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
5c23128d 747else
37efbbd8 748 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
5c23128d
ZJS
749endif
750
681cb84a
ZJS
751extra_net_naming_schemes = []
752extra_net_naming_map = []
753foreach scheme: get_option('extra-net-naming-schemes').split(',')
754 if scheme != ''
755 name = scheme.split('=')[0]
756 value = scheme.split('=')[1]
757 NAME = name.underscorify().to_upper()
758 VALUE = []
759 foreach field: value.split('+')
760 VALUE += 'NAMING_' + field.underscorify().to_upper()
761 endforeach
762 extra_net_naming_schemes += 'NAMING_@0@ = @1@,'.format(NAME, '|'.join(VALUE))
763 extra_net_naming_map += '{ "@0@", NAMING_@1@ },'.format(name, NAME)
764 endif
765endforeach
766conf.set('EXTRA_NET_NAMING_SCHEMES', ' '.join(extra_net_naming_schemes))
767conf.set('EXTRA_NET_NAMING_MAP', ' '.join(extra_net_naming_map))
768
06da5c63
ZJS
769default_net_naming_scheme = get_option('default-net-naming-scheme')
770conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
77faadfd
ZJS
771if default_net_naming_scheme != 'latest'
772 conf.set('_DEFAULT_NET_NAMING_SCHEME_TEST',
773 'NAMING_' + default_net_naming_scheme.underscorify().to_upper())
774endif
06da5c63 775
5c23128d 776time_epoch = get_option('time-epoch')
a36be3e5 777if time_epoch <= 0
e92777d2 778 time_epoch = run_command(sh, '-c', 'echo "$SOURCE_DATE_EPOCH"', check : true).stdout().strip()
edd84b8e 779 if time_epoch == '' and git.found() and fs.is_dir('.git')
bd190899 780 # If we're in a git repository, use the creation time of the latest git tag.
e92777d2
ZJS
781 latest_tag = run_command(git, 'describe', '--abbrev=0', '--tags',
782 check : false)
783 if latest_tag.returncode() == 0
784 time_epoch = run_command(
785 git, 'log', '--no-show-signature', '-1', '--format=%at',
786 latest_tag.stdout().strip(),
787 check : false).stdout()
788 endif
0390b094
ZJS
789 endif
790 if time_epoch == ''
6dbf352c 791 NEWS = files('NEWS')
e92777d2
ZJS
792 time_epoch = run_command(stat, '-c', '%Y', NEWS,
793 check : true).stdout()
6dbf352c 794 endif
89cdbe1f 795 time_epoch = time_epoch.strip().to_int()
5c23128d 796endif
5c23128d
ZJS
797conf.set('TIME_EPOCH', time_epoch)
798
b10abe4b
EI
799conf.set('CLOCK_VALID_RANGE_USEC_MAX', get_option('clock-valid-range-usec-max'))
800
53350c7b 801default_user_shell = get_option('default-user-shell')
802conf.set_quoted('DEFAULT_USER_SHELL', default_user_shell)
803conf.set_quoted('DEFAULT_USER_SHELL_NAME', fs.name(default_user_shell))
804
fc1a5d1a
ZJS
805foreach tuple : [['system-alloc-uid-min', 'SYS_UID_MIN', 1], # Also see login.defs(5).
806 ['system-uid-max', 'SYS_UID_MAX', 999],
807 ['system-alloc-gid-min', 'SYS_GID_MIN', 1],
808 ['system-gid-max', 'SYS_GID_MAX', 999]]
809 v = get_option(tuple[0])
a36be3e5 810 if v <= 0
fc1a5d1a
ZJS
811 v = run_command(
812 awk,
813 '/^\s*@0@\s+/ { uid=$2 } END { print uid }'.format(tuple[1]),
e92777d2
ZJS
814 '/etc/login.defs',
815 check : false).stdout().strip()
fc1a5d1a
ZJS
816 if v == ''
817 v = tuple[2]
818 else
819 v = v.to_int()
820 endif
2f62cf35 821 endif
fc1a5d1a 822 conf.set(tuple[0].underscorify().to_upper(), v)
fc1a5d1a
ZJS
823endforeach
824if conf.get('SYSTEM_ALLOC_UID_MIN') >= conf.get('SYSTEM_UID_MAX')
825 error('Invalid uid allocation range')
5c23128d 826endif
fc1a5d1a
ZJS
827if conf.get('SYSTEM_ALLOC_GID_MIN') >= conf.get('SYSTEM_GID_MAX')
828 error('Invalid gid allocation range')
5c23128d 829endif
5c23128d 830
ac09340e
YW
831dynamic_uid_min = get_option('dynamic-uid-min')
832dynamic_uid_max = get_option('dynamic-uid-max')
87d5e4f2
LP
833conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
834conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
87d5e4f2 835
ac09340e
YW
836container_uid_base_min = get_option('container-uid-base-min')
837container_uid_base_max = get_option('container-uid-base-max')
87d5e4f2
LP
838conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
839conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
87d5e4f2 840
afde4574
LP
841nobody_user = get_option('nobody-user')
842nobody_group = get_option('nobody-group')
843
2484bff3 844if not meson.is_cross_build()
e92777d2 845 getent_result = run_command('getent', 'passwd', '65534', check : false)
2484bff3
CQ
846 if getent_result.returncode() == 0
847 name = getent_result.stdout().split(':')[0]
848 if name != nobody_user
849 warning('\n' +
850 '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) +
851 'Your build will result in an user table setup that is incompatible with the local system.')
852 endif
afde4574 853 endif
e92777d2 854 id_result = run_command('id', '-u', nobody_user, check : false)
2484bff3 855 if id_result.returncode() == 0
89cdbe1f 856 id = id_result.stdout().strip().to_int()
2484bff3
CQ
857 if id != 65534
858 warning('\n' +
859 '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) +
860 'Your build will result in an user table setup that is incompatible with the local system.')
861 endif
afde4574 862 endif
afde4574 863
e92777d2 864 getent_result = run_command('getent', 'group', '65534', check : false)
2484bff3
CQ
865 if getent_result.returncode() == 0
866 name = getent_result.stdout().split(':')[0]
867 if name != nobody_group
868 warning('\n' +
869 '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) +
870 'Your build will result in an group table setup that is incompatible with the local system.')
871 endif
afde4574 872 endif
e92777d2 873 id_result = run_command('id', '-g', nobody_group, check : false)
2484bff3 874 if id_result.returncode() == 0
89cdbe1f 875 id = id_result.stdout().strip().to_int()
2484bff3
CQ
876 if id != 65534
877 warning('\n' +
d5b3e510 878 'The local group with the configured group name "@0@" of the nobody group does not have GID 65534 (it has @1@).\n'.format(nobody_group, id) +
2484bff3
CQ
879 'Your build will result in an group table setup that is incompatible with the local system.')
880 endif
afde4574
LP
881 endif
882endif
8374cc62 883if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
8ea9fad7
YW
884 warning('\n' +
885 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
886 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
8374cc62 887endif
afde4574
LP
888
889conf.set_quoted('NOBODY_USER_NAME', nobody_user)
890conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
87d5e4f2 891
9a797ddc
ZJS
892static_ugids = []
893foreach option : ['adm-gid',
894 'audio-gid',
895 'cdrom-gid',
896 'dialout-gid',
897 'disk-gid',
898 'input-gid',
899 'kmem-gid',
900 'kvm-gid',
901 'lp-gid',
902 'render-gid',
903 'sgx-gid',
904 'tape-gid',
905 'tty-gid',
906 'users-gid',
907 'utmp-gid',
908 'video-gid',
909 'wheel-gid',
910 'systemd-journal-gid',
911 'systemd-network-uid',
912 'systemd-resolve-uid',
913 'systemd-timesync-uid']
914 name = option.underscorify().to_upper()
915 val = get_option(option)
916
917 # Ensure provided GID argument is numeric, otherwise fall back to default assignment
a36be3e5
YW
918 conf.set(name, val > 0 ? val : '-')
919 if val > 0
9a797ddc
ZJS
920 static_ugids += '@0@:@1@'.format(option, val)
921 endif
922endforeach
84786b8e 923
348b4437
YW
924conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
925conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
5c23128d 926
ace5e311 927dev_kvm_mode = get_option('dev-kvm-mode')
d924a938 928conf.set_quoted('DEV_KVM_MODE', dev_kvm_mode) # FIXME: convert to 0o… notation
ace5e311 929conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
055a083a 930group_render_mode = get_option('group-render-mode')
8feaea5e 931conf.set_quoted('GROUP_RENDER_MODE', group_render_mode)
055a083a 932conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
5c23128d 933
2a4c156d
ZJS
934kill_user_processes = get_option('default-kill-user-processes')
935conf.set10('KILL_USER_PROCESSES', kill_user_processes)
5c23128d 936
829257d1
ZJS
937dns_servers = get_option('dns-servers')
938conf.set_quoted('DNS_SERVERS', dns_servers)
5c23128d 939
829257d1
ZJS
940ntp_servers = get_option('ntp-servers')
941conf.set_quoted('NTP_SERVERS', ntp_servers)
5c23128d 942
8ca9e92c
DR
943default_locale = get_option('default-locale')
944conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
945
a22f5186
DDM
946nspawn_locale = get_option('nspawn-locale')
947conf.set_quoted('SYSTEMD_NSPAWN_LOCALE', nspawn_locale)
948
f129d0e7
MY
949default_keymap = get_option('default-keymap')
950conf.set_quoted('SYSTEMD_DEFAULT_KEYMAP', default_keymap)
951
8f20232f 952localegen_path = get_option('localegen-path')
8f20232f
MK
953if localegen_path != ''
954 conf.set_quoted('LOCALEGEN_PATH', localegen_path)
8f20232f 955endif
71ae5ce5 956conf.set10('HAVE_LOCALEGEN', localegen_path != '')
8f20232f 957
5c23128d
ZJS
958conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
959
21d0dd5a 960service_watchdog = get_option('service-watchdog')
7bc9ea51 961watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
059cc610 962conf.set_quoted('SERVICE_WATCHDOG', watchdog_value)
21d0dd5a 963
059cc610 964conf.set_quoted('SUSHELL', get_option('debug-shell'))
93912e87 965conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
3131bfe3 966
349cc4a5
ZJS
967enable_debug_hashmap = false
968enable_debug_mmap_cache = false
d6601495 969enable_debug_siphash = false
8f6b442a 970foreach name : get_option('debug-extra')
ad7aa760
YW
971 if name == 'hashmap'
972 enable_debug_hashmap = true
973 elif name == 'mmap-cache'
974 enable_debug_mmap_cache = true
d6601495
YW
975 elif name == 'siphash'
976 enable_debug_siphash = true
ad7aa760
YW
977 else
978 message('unknown debug option "@0@", ignoring'.format(name))
979 endif
980endforeach
349cc4a5
ZJS
981conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
982conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
d6601495 983conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
fd5dec9a 984conf.set10('LOG_TRACE', get_option('log-trace'))
d18cb393 985
3602ca6f
ZJS
986default_user_path = get_option('user-path')
987if default_user_path != ''
988 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
989endif
990
5c23128d
ZJS
991#####################################################################
992
993threads = dependency('threads')
994librt = cc.find_library('rt')
995libm = cc.find_library('m')
996libdl = cc.find_library('dl')
55573787
YW
997libcrypt = dependency('libcrypt', 'libxcrypt', required : false)
998if not libcrypt.found()
999 # fallback to use find_library() if libcrypt is provided by glibc, e.g. for LibreELEC.
1000 libcrypt = cc.find_library('crypt')
1001endif
d625f717 1002libcap = dependency('libcap')
5c23128d 1003
96f8c636
ZJS
1004# On some architectures, libatomic is required. But on some installations,
1005# it is found, but actual linking fails. So let's try to use it opportunistically.
1006# If it is installed, but not needed, it will be dropped because of --as-needed.
1007if cc.links('''int main(int argc, char **argv) { return 0; }''',
1008 args : '-latomic',
1009 name : 'libatomic')
1010 libatomic = declare_dependency(link_args : '-latomic')
1011else
1012 libatomic = []
1013endif
1014
06ca077b 1015crypt_header = conf.get('HAVE_CRYPT_H') == 1 ? '''#include <crypt.h>''' : '''#include <unistd.h>'''
e8644a41 1016foreach ident : [
feee7f62
LB
1017 ['crypt_ra', crypt_header],
1018 ['crypt_preferred_method', crypt_header],
1019 ['crypt_gensalt_ra', crypt_header]]
e8644a41
ZJS
1020
1021 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE',
1022 dependencies : libcrypt)
1023 conf.set10('HAVE_' + ident[0].to_upper(), have)
1024endforeach
1025
7d861e12 1026want_bpf_framework = get_option('bpf-framework')
b88323e4 1027bpf_compiler = get_option('bpf-compiler')
7d861e12
JK
1028bpf_framework_required = want_bpf_framework == 'true'
1029
87e462f7 1030libbpf_version_requirement = '>= 0.1.0'
b88323e4
JH
1031if bpf_compiler == 'gcc'
1032 libbpf_version_requirement = '>= 1.0.0'
1033endif
1034libbpf = dependency('libbpf', required : bpf_framework_required, version : libbpf_version_requirement)
7d861e12
JK
1035conf.set10('HAVE_LIBBPF', libbpf.found())
1036
b88323e4
JH
1037bpftool_strip_version_requirement = '>= 5.13.0'
1038if bpf_compiler == 'gcc'
1039 bpftool_strip_version_requirement = '>= 7.0.0'
1040endif
1041
3d954ef1 1042if want_bpf_framework == 'false' or not libbpf.found() or skip_deps
cf2dc690 1043 conf.set10('BPF_FRAMEWORK', false)
7d861e12 1044else
76abad4d
JH
1045 clang_found = false
1046 clang_supports_bpf = false
1047 bpf_gcc_found = false
b88323e4 1048 bpftool_strip = false
76abad4d
JH
1049 deps_found = false
1050
1051 if bpf_compiler == 'clang'
1052 # Support 'versioned' clang/llvm-strip binaries, as seen on Debian/Ubuntu
1053 # (like clang-10/llvm-strip-10)
1054 if meson.is_cross_build() or cc.get_id() != 'clang' or cc.cmd_array()[0].contains('afl-clang') or cc.cmd_array()[0].contains('hfuzz-clang')
1055 r = find_program('clang', required : bpf_framework_required, version : '>= 10.0.0')
1056 clang_found = r.found()
1057 if clang_found
573c0dc1 1058 clang = r.full_path()
76abad4d 1059 endif
76abad4d
JH
1060 else
1061 clang_found = true
1062 clang = cc.cmd_array()
dc7e9c1b 1063 endif
a6ac8b5a 1064
76abad4d
JH
1065 if clang_found
1066 # Check if 'clang -target bpf' is supported.
1067 clang_supports_bpf = run_command(clang, '-target', 'bpf', '--print-supported-cpus', check : false).returncode() == 0
1068 endif
1069 elif bpf_compiler == 'gcc'
76abad4d 1070 bpf_gcc = find_program('bpf-gcc',
e4086f7d 1071 'bpf-none-gcc',
76abad4d 1072 required : true,
4a7a13b5 1073 version : '>= 13.1.0')
76abad4d 1074 bpf_gcc_found = bpf_gcc.found()
a6ac8b5a
YW
1075 endif
1076
76abad4d
JH
1077 if clang_supports_bpf or bpf_gcc_found
1078 # Debian installs this in /usr/sbin/ which is not in $PATH.
1079 # We check for 'bpftool' first, honouring $PATH, and in /usr/sbin/ for Debian.
1080 # We use 'bpftool gen object' subcommand for bpftool strip, it was added by d80b2fcbe0a023619e0fc73112f2a02c2662f6ab (v5.13).
b88323e4 1081 bpftool_strip_required = bpf_framework_required and bpf_compiler == 'gcc'
e3759ac4
JH
1082 bpftool = find_program('bpftool',
1083 '/usr/sbin/bpftool',
b88323e4
JH
1084 required : bpftool_strip_required,
1085 version : bpftool_strip_version_requirement)
e3759ac4 1086
76abad4d
JH
1087 if bpftool.found()
1088 bpftool_strip = true
1089 deps_found = true
b88323e4 1090 elif bpf_compiler == 'clang'
76abad4d
JH
1091 # We require the 'bpftool gen skeleton' subcommand, it was added by 985ead416df39d6fe8e89580cc1db6aa273e0175 (v5.6).
1092 bpftool = find_program('bpftool',
1093 '/usr/sbin/bpftool',
1094 required : bpf_framework_required,
1095 version : '>= 5.6.0')
e3759ac4 1096 endif
68e101da 1097
76abad4d
JH
1098 # We use `llvm-strip` as a fallback if `bpftool gen object` strip support is not available.
1099 if not bpftool_strip and bpftool.found() and clang_supports_bpf
1100 if not meson.is_cross_build()
1101 llvm_strip_bin = run_command(clang, '--print-prog-name', 'llvm-strip',
1102 check : true).stdout().strip()
1103 else
1104 llvm_strip_bin = 'llvm-strip'
1105 endif
1106 llvm_strip = find_program(llvm_strip_bin, required : bpf_framework_required, version : '>= 10.0.0')
1107 deps_found = llvm_strip.found()
1108 endif
1109 endif
68e101da 1110
7d861e12 1111 # Can build BPF program from source code in restricted C
d40ce018 1112 conf.set10('BPF_FRAMEWORK', deps_found)
7d861e12
JK
1113endif
1114
5c23128d 1115libmount = dependency('mount',
c0b4b0f8 1116 version : fuzzer_build ? '>= 0' : '>= 2.30')
5c23128d 1117
e594a3b1
LP
1118want_libfdisk = get_option('fdisk')
1119if want_libfdisk != 'false' and not skip_deps
1120 libfdisk = dependency('fdisk',
baec7d78 1121 version : '>= 2.32',
e594a3b1
LP
1122 required : want_libfdisk == 'true')
1123 have = libfdisk.found()
1124else
1125 have = false
1126 libfdisk = []
1127endif
1128conf.set10('HAVE_LIBFDISK', have)
1129
1d8aae43 1130want_passwdqc = get_option('passwdqc')
70a5db58 1131want_pwquality = get_option('pwquality')
1d8aae43
EI
1132if want_passwdqc == 'true' and want_pwquality == 'true'
1133 error('passwdqc and pwquality cannot be requested simultaneously')
1134endif
1135
1136if want_pwquality != 'false' and want_passwdqc != 'true' and not skip_deps
51c425dc
DL
1137 libpwquality = dependency('pwquality',
1138 version : '>= 1.4.1',
1139 required : want_pwquality == 'true')
70a5db58
LP
1140 have = libpwquality.found()
1141else
1142 have = false
1143 libpwquality = []
1144endif
1145conf.set10('HAVE_PWQUALITY', have)
1146
1d8aae43
EI
1147if not have and want_passwdqc != 'false' and not skip_deps
1148 libpasswdqc = dependency('passwdqc',
1149 required : want_passwdqc == 'true')
1150 have = libpasswdqc.found()
1151else
1152 have = false
1153 libpasswdqc = []
1154endif
1155conf.set10('HAVE_PASSWDQC', have)
1156
5c23128d 1157want_seccomp = get_option('seccomp')
87ac55a1 1158if want_seccomp != 'false' and not skip_deps
37efbbd8 1159 libseccomp = dependency('libseccomp',
9f0e9c01 1160 version : '>= 2.3.1',
37efbbd8 1161 required : want_seccomp == 'true')
349cc4a5 1162 have = libseccomp.found()
5c23128d 1163else
349cc4a5 1164 have = false
37efbbd8 1165 libseccomp = []
5c23128d 1166endif
349cc4a5 1167conf.set10('HAVE_SECCOMP', have)
5c23128d
ZJS
1168
1169want_selinux = get_option('selinux')
87ac55a1 1170if want_selinux != 'false' and not skip_deps
37efbbd8
ZJS
1171 libselinux = dependency('libselinux',
1172 version : '>= 2.1.9',
1173 required : want_selinux == 'true')
349cc4a5 1174 have = libselinux.found()
5c23128d 1175else
349cc4a5 1176 have = false
37efbbd8 1177 libselinux = []
5c23128d 1178endif
349cc4a5 1179conf.set10('HAVE_SELINUX', have)
5c23128d
ZJS
1180
1181want_apparmor = get_option('apparmor')
87ac55a1 1182if want_apparmor != 'false' and not skip_deps
37efbbd8 1183 libapparmor = dependency('libapparmor',
2ffadd3c 1184 version : '>= 2.13',
37efbbd8 1185 required : want_apparmor == 'true')
349cc4a5 1186 have = libapparmor.found()
5c23128d 1187else
349cc4a5 1188 have = false
37efbbd8 1189 libapparmor = []
5c23128d 1190endif
349cc4a5 1191conf.set10('HAVE_APPARMOR', have)
5c23128d 1192
07b382cc
ZJS
1193have = get_option('smack') and get_option('smack-run-label') != ''
1194conf.set10('HAVE_SMACK_RUN_LABEL', have)
1195if have
1196 conf.set_quoted('SMACK_RUN_LABEL', get_option('smack-run-label'))
1197endif
5c23128d 1198
aa5ae971
ŁS
1199have = get_option('smack') and get_option('smack-default-process-label') != ''
1200if have
1201 conf.set_quoted('SMACK_DEFAULT_PROCESS_LABEL', get_option('smack-default-process-label'))
1202endif
1203
3ca0cb73
ZJS
1204want_polkit = get_option('polkit')
1205install_polkit = false
1206install_polkit_pkla = false
87ac55a1 1207if want_polkit != 'false' and not skip_deps
37efbbd8 1208 install_polkit = true
3ca0cb73 1209
37efbbd8
ZJS
1210 libpolkit = dependency('polkit-gobject-1',
1211 required : false)
1212 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
1213 message('Old polkit detected, will install pkla files')
1214 install_polkit_pkla = true
1215 endif
3ca0cb73 1216endif
349cc4a5 1217conf.set10('ENABLE_POLKIT', install_polkit)
3ca0cb73 1218
36f0387e 1219want_acl = get_option('acl')
87ac55a1 1220if want_acl != 'false' and not skip_deps
d625f717 1221 libacl = dependency('libacl', required : want_acl == 'true')
349cc4a5 1222 have = libacl.found()
36f0387e 1223else
349cc4a5 1224 have = false
36f0387e
ZJS
1225 libacl = []
1226endif
349cc4a5 1227conf.set10('HAVE_ACL', have)
36f0387e 1228
5c23128d 1229want_audit = get_option('audit')
87ac55a1 1230if want_audit != 'false' and not skip_deps
37efbbd8 1231 libaudit = dependency('audit', required : want_audit == 'true')
349cc4a5 1232 have = libaudit.found()
5c23128d 1233else
349cc4a5 1234 have = false
37efbbd8 1235 libaudit = []
5c23128d 1236endif
349cc4a5 1237conf.set10('HAVE_AUDIT', have)
5c23128d
ZJS
1238
1239want_blkid = get_option('blkid')
87ac55a1 1240if want_blkid != 'false' and not skip_deps
37efbbd8 1241 libblkid = dependency('blkid', required : want_blkid == 'true')
349cc4a5 1242 have = libblkid.found()
4fcc033b
KZ
1243
1244 conf.set10('HAVE_BLKID_PROBE_SET_HINT',
1245 have and cc.has_function('blkid_probe_set_hint', dependencies : libblkid))
5c23128d 1246else
349cc4a5 1247 have = false
37efbbd8 1248 libblkid = []
5c23128d 1249endif
349cc4a5 1250conf.set10('HAVE_BLKID', have)
5c23128d
ZJS
1251
1252want_kmod = get_option('kmod')
87ac55a1 1253if want_kmod != 'false' and not skip_deps
37efbbd8
ZJS
1254 libkmod = dependency('libkmod',
1255 version : '>= 15',
1256 required : want_kmod == 'true')
349cc4a5 1257 have = libkmod.found()
5c23128d 1258else
349cc4a5 1259 have = false
37efbbd8 1260 libkmod = []
5c23128d 1261endif
349cc4a5 1262conf.set10('HAVE_KMOD', have)
5c23128d 1263
ede5a78f
ST
1264want_xenctrl = get_option('xenctrl')
1265if want_xenctrl != 'false' and not skip_deps
1266 libxenctrl = dependency('xencontrol',
1267 version : '>= 4.9',
1268 required : want_xenctrl == 'true')
1269 have = libxenctrl.found()
1270else
1271 have = false
1272 libxenctrl = []
1273endif
1274conf.set10('HAVE_XENCTRL', have)
1275
5c23128d 1276want_pam = get_option('pam')
87ac55a1 1277if want_pam != 'false' and not skip_deps
d625f717
YW
1278 libpam = dependency('pam', required : false)
1279 if not libpam.found()
1280 # Debian older than bookworm and Ubuntu older than 22.10 do not provide the .pc file.
1281 libpam = cc.find_library('pam', required : want_pam == 'true')
1282 endif
1283 libpam_misc = dependency('pam_misc', required : false)
1284 if not libpam_misc.found()
1285 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
1286 endif
349cc4a5 1287 have = libpam.found() and libpam_misc.found()
5c23128d 1288else
349cc4a5 1289 have = false
37efbbd8
ZJS
1290 libpam = []
1291 libpam_misc = []
5c23128d 1292endif
349cc4a5 1293conf.set10('HAVE_PAM', have)
5c23128d
ZJS
1294
1295want_microhttpd = get_option('microhttpd')
87ac55a1 1296if want_microhttpd != 'false' and not skip_deps
37efbbd8
ZJS
1297 libmicrohttpd = dependency('libmicrohttpd',
1298 version : '>= 0.9.33',
1299 required : want_microhttpd == 'true')
349cc4a5 1300 have = libmicrohttpd.found()
5c23128d 1301else
349cc4a5 1302 have = false
37efbbd8 1303 libmicrohttpd = []
5c23128d 1304endif
349cc4a5 1305conf.set10('HAVE_MICROHTTPD', have)
5c23128d
ZJS
1306
1307want_libcryptsetup = get_option('libcryptsetup')
d1ae38d8
OK
1308want_libcryptsetup_plugins = get_option('libcryptsetup-plugins')
1309
1310if want_libcryptsetup_plugins == 'true' and want_libcryptsetup == 'false'
1311 error('libcryptsetup-plugins can not be requested without libcryptsetup')
1312endif
1313
87ac55a1 1314if want_libcryptsetup != 'false' and not skip_deps
37efbbd8 1315 libcryptsetup = dependency('libcryptsetup',
d1ae38d8
OK
1316 version : want_libcryptsetup_plugins == 'true' ? '>= 2.4.0' : '>= 2.0.1',
1317 required : want_libcryptsetup == 'true' or want_libcryptsetup_plugins == 'true')
349cc4a5 1318 have = libcryptsetup.found()
70a5db58 1319
aac80717
ZJS
1320 foreach ident : ['crypt_set_metadata_size',
1321 'crypt_activate_by_signed_key',
48a09a8f
DDM
1322 'crypt_token_max',
1323 'crypt_reencrypt_init_by_passphrase',
1324 'crypt_reencrypt',
1325 'crypt_set_data_offset']
aac80717
ZJS
1326 have_ident = have and cc.has_function(
1327 ident,
1328 prefix : '#include <libcryptsetup.h>',
1329 dependencies : libcryptsetup)
1330 conf.set10('HAVE_' + ident.to_upper(), have_ident)
1331 endforeach
5c23128d 1332else
349cc4a5 1333 have = false
37efbbd8 1334 libcryptsetup = []
5c23128d 1335endif
349cc4a5 1336conf.set10('HAVE_LIBCRYPTSETUP', have)
5c23128d 1337
d1ae38d8 1338if want_libcryptsetup_plugins != 'false' and not skip_deps
aac80717
ZJS
1339 have = (cc.has_function(
1340 'crypt_activate_by_token_pin',
1341 prefix : '#include <libcryptsetup.h>',
1342 dependencies : libcryptsetup) and
1343 cc.has_function(
1344 'crypt_token_external_path',
1345 prefix : '#include <libcryptsetup.h>',
1346 dependencies : libcryptsetup))
d1ae38d8
OK
1347else
1348 have = false
1349endif
1350conf.set10('HAVE_LIBCRYPTSETUP_PLUGINS', have)
1351
5c23128d 1352want_libcurl = get_option('libcurl')
87ac55a1 1353if want_libcurl != 'false' and not skip_deps
37efbbd8
ZJS
1354 libcurl = dependency('libcurl',
1355 version : '>= 7.32.0',
1356 required : want_libcurl == 'true')
349cc4a5 1357 have = libcurl.found()
5c23128d 1358else
349cc4a5 1359 have = false
37efbbd8 1360 libcurl = []
5c23128d 1361endif
349cc4a5 1362conf.set10('HAVE_LIBCURL', have)
47350c5f 1363conf.set10('CURL_NO_OLDIES', conf.get('BUILD_MODE_DEVELOPER') == 1)
5c23128d
ZJS
1364
1365want_libidn = get_option('libidn')
87057e24
ZJS
1366want_libidn2 = get_option('libidn2')
1367if want_libidn == 'true' and want_libidn2 == 'true'
1368 error('libidn and libidn2 cannot be requested simultaneously')
1369endif
1370
1b931399
YW
1371if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1372 libidn = dependency('libidn2',
1373 required : want_libidn2 == 'true')
349cc4a5 1374 have = libidn.found()
87057e24 1375else
349cc4a5 1376 have = false
87057e24
ZJS
1377 libidn = []
1378endif
1b931399
YW
1379conf.set10('HAVE_LIBIDN2', have)
1380if not have and want_libidn != 'false' and not skip_deps
7f7ab228 1381 # libidn is used for both libidn and libidn2 objects
1b931399
YW
1382 libidn = dependency('libidn',
1383 required : want_libidn == 'true')
349cc4a5
ZJS
1384 have = libidn.found()
1385else
1386 have = false
5c23128d 1387endif
1b931399 1388conf.set10('HAVE_LIBIDN', have)
5c23128d
ZJS
1389
1390want_libiptc = get_option('libiptc')
87ac55a1 1391if want_libiptc != 'false' and not skip_deps
37efbbd8
ZJS
1392 libiptc = dependency('libiptc',
1393 required : want_libiptc == 'true')
349cc4a5 1394 have = libiptc.found()
5c23128d 1395else
349cc4a5 1396 have = false
37efbbd8 1397 libiptc = []
5c23128d 1398endif
349cc4a5 1399conf.set10('HAVE_LIBIPTC', have)
5c23128d
ZJS
1400
1401want_qrencode = get_option('qrencode')
87ac55a1 1402if want_qrencode != 'false' and not skip_deps
37efbbd8 1403 libqrencode = dependency('libqrencode',
3f5225d7 1404 version : '>= 3',
37efbbd8 1405 required : want_qrencode == 'true')
349cc4a5 1406 have = libqrencode.found()
5c23128d 1407else
349cc4a5 1408 have = false
37efbbd8 1409 libqrencode = []
5c23128d 1410endif
349cc4a5 1411conf.set10('HAVE_QRENCODE', have)
5c23128d 1412
a44fb601 1413want_gcrypt = get_option('gcrypt')
87ac55a1 1414if want_gcrypt != 'false' and not skip_deps
d625f717
YW
1415 libgcrypt = dependency('libgcrypt', required : want_gcrypt == 'true')
1416 libgpg_error = dependency('gpg-error', required : false)
1417 if not libgpg_error.found()
1418 # CentOS 8 does not provide the .pc file.
1419 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1420 endif
349cc4a5 1421 have = libgcrypt.found() and libgpg_error.found()
a44fb601 1422else
349cc4a5
ZJS
1423 have = false
1424endif
1425if not have
1426 # link to neither of the libs if one is not found
a44fb601
ZJS
1427 libgcrypt = []
1428 libgpg_error = []
1429endif
349cc4a5 1430conf.set10('HAVE_GCRYPT', have)
a44fb601 1431
5c23128d 1432want_gnutls = get_option('gnutls')
87ac55a1 1433if want_gnutls != 'false' and not skip_deps
37efbbd8
ZJS
1434 libgnutls = dependency('gnutls',
1435 version : '>= 3.1.4',
1436 required : want_gnutls == 'true')
349cc4a5 1437 have = libgnutls.found()
5c23128d 1438else
349cc4a5 1439 have = false
37efbbd8 1440 libgnutls = []
5c23128d 1441endif
349cc4a5 1442conf.set10('HAVE_GNUTLS', have)
5c23128d 1443
096cbdce 1444want_openssl = get_option('openssl')
87ac55a1 1445if want_openssl != 'false' and not skip_deps
096cbdce
IT
1446 libopenssl = dependency('openssl',
1447 version : '>= 1.1.0',
1448 required : want_openssl == 'true')
1449 have = libopenssl.found()
1450else
1451 have = false
1452 libopenssl = []
1453endif
1454conf.set10('HAVE_OPENSSL', have)
1455
839fddbe
LP
1456want_p11kit = get_option('p11kit')
1457if want_p11kit != 'false' and not skip_deps
1458 libp11kit = dependency('p11-kit-1',
6164ec4c
ZJS
1459 version : '>= 0.23.3',
1460 required : want_p11kit == 'true')
839fddbe 1461 have = libp11kit.found()
da035a3a 1462 libp11kit_cflags = libp11kit.partial_dependency(includes: true, compile_args: true)
839fddbe
LP
1463else
1464 have = false
da035a3a 1465 libp11kit_cflags = []
839fddbe
LP
1466 libp11kit = []
1467endif
1468conf.set10('HAVE_P11KIT', have)
1469
af4fbd46
LP
1470want_libfido2 = get_option('libfido2')
1471if want_libfido2 != 'false' and not skip_deps
e0f435f9
YW
1472 if conf.get('HAVE_OPENSSL') == 1
1473 libfido2 = dependency('libfido2',
1474 required : want_libfido2 == 'true')
1475 have = libfido2.found()
1476 elif want_libfido2 == 'true'
1477 error('libfido2=true requires openssl')
1478 else
1479 have = false
1480 libfido2 = []
1481 endif
af4fbd46
LP
1482else
1483 have = false
1484 libfido2 = []
1485endif
1486conf.set10('HAVE_LIBFIDO2', have)
1487
5e521624
LP
1488want_tpm2 = get_option('tpm2')
1489if want_tpm2 != 'false' and not skip_deps
d7a57308 1490 tpm2 = dependency('tss2-esys tss2-rc tss2-mu tss2-tcti-device',
ba081955 1491 required : want_tpm2 == 'true')
5e521624 1492 have = tpm2.found()
155c5129 1493 have_esys3 = tpm2.version().version_compare('>= 3.0.0')
5e521624
LP
1494else
1495 have = false
155c5129 1496 have_esys3 = false
5e521624
LP
1497 tpm2 = []
1498endif
1499conf.set10('HAVE_TPM2', have)
155c5129 1500conf.set10('HAVE_TSS2_ESYS3', have_esys3)
5e521624 1501
5c23128d 1502want_elfutils = get_option('elfutils')
87ac55a1 1503if want_elfutils != 'false' and not skip_deps
37efbbd8
ZJS
1504 libdw = dependency('libdw',
1505 required : want_elfutils == 'true')
349cc4a5 1506 have = libdw.found()
d48c2721
LB
1507
1508 # New in elfutils 0.177
1509 conf.set10('HAVE_DWELF_ELF_E_MACHINE_STRING',
1510 have and cc.has_function('dwelf_elf_e_machine_string', dependencies : libdw))
5c23128d 1511else
349cc4a5 1512 have = false
37efbbd8 1513 libdw = []
5c23128d 1514endif
349cc4a5 1515conf.set10('HAVE_ELFUTILS', have)
5c23128d
ZJS
1516
1517want_zlib = get_option('zlib')
87ac55a1 1518if want_zlib != 'false' and not skip_deps
37efbbd8
ZJS
1519 libz = dependency('zlib',
1520 required : want_zlib == 'true')
349cc4a5 1521 have = libz.found()
5c23128d 1522else
349cc4a5 1523 have = false
37efbbd8 1524 libz = []
5c23128d 1525endif
349cc4a5 1526conf.set10('HAVE_ZLIB', have)
5c23128d
ZJS
1527
1528want_bzip2 = get_option('bzip2')
87ac55a1 1529if want_bzip2 != 'false' and not skip_deps
d625f717
YW
1530 libbzip2 = dependency('bzip2', required : false)
1531 if not libbzip2.found()
1532 # Debian and Ubuntu do not provide the .pc file.
1533 libbzip2 = cc.find_library('bz2', required : want_bzip2 == 'true')
1534 endif
349cc4a5 1535 have = libbzip2.found()
5c23128d 1536else
349cc4a5 1537 have = false
37efbbd8 1538 libbzip2 = []
5c23128d 1539endif
349cc4a5 1540conf.set10('HAVE_BZIP2', have)
5c23128d
ZJS
1541
1542want_xz = get_option('xz')
87ac55a1 1543if want_xz != 'false' and not skip_deps
37efbbd8
ZJS
1544 libxz = dependency('liblzma',
1545 required : want_xz == 'true')
d80b051c 1546 have_xz = libxz.found()
5c23128d 1547else
d80b051c 1548 have_xz = false
37efbbd8 1549 libxz = []
5c23128d 1550endif
d80b051c 1551conf.set10('HAVE_XZ', have_xz)
5c23128d
ZJS
1552
1553want_lz4 = get_option('lz4')
87ac55a1 1554if want_lz4 != 'false' and not skip_deps
37efbbd8 1555 liblz4 = dependency('liblz4',
e0a1d4b0 1556 version : '>= 1.3.0',
37efbbd8 1557 required : want_lz4 == 'true')
d80b051c 1558 have_lz4 = liblz4.found()
5c23128d 1559else
d80b051c 1560 have_lz4 = false
37efbbd8 1561 liblz4 = []
5c23128d 1562endif
d80b051c 1563conf.set10('HAVE_LZ4', have_lz4)
5c23128d 1564
ef5924aa
NL
1565want_zstd = get_option('zstd')
1566if want_zstd != 'false' and not skip_deps
1567 libzstd = dependency('libzstd',
1568 required : want_zstd == 'true',
1569 version : '>= 1.4.0')
d80b051c 1570 have_zstd = libzstd.found()
ef5924aa 1571else
d80b051c 1572 have_zstd = false
ef5924aa
NL
1573 libzstd = []
1574endif
d80b051c
LP
1575conf.set10('HAVE_ZSTD', have_zstd)
1576
1577conf.set10('HAVE_COMPRESSION', have_xz or have_lz4 or have_zstd)
ef5924aa 1578
cd3c6322
LB
1579compression = get_option('default-compression')
1580if compression == 'auto'
1581 if have_zstd
1582 compression = 'zstd'
1583 elif have_lz4
1584 compression = 'lz4'
1585 elif have_xz
1586 compression = 'xz'
1587 else
1588 compression = 'none'
1589 endif
1590elif compression == 'zstd' and not have_zstd
1591 error('default-compression=zstd requires zstd')
1592elif compression == 'lz4' and not have_lz4
1593 error('default-compression=lz4 requires lz4')
1594elif compression == 'xz' and not have_xz
1595 error('default-compression=xz requires xz')
1596endif
1788c6f3 1597conf.set('DEFAULT_COMPRESSION', 'COMPRESSION_@0@'.format(compression.to_upper()))
cd3c6322 1598
a44fb601 1599want_xkbcommon = get_option('xkbcommon')
87ac55a1 1600if want_xkbcommon != 'false' and not skip_deps
a44fb601
ZJS
1601 libxkbcommon = dependency('xkbcommon',
1602 version : '>= 0.3.0',
1603 required : want_xkbcommon == 'true')
349cc4a5 1604 have = libxkbcommon.found()
a44fb601 1605else
349cc4a5 1606 have = false
a44fb601
ZJS
1607 libxkbcommon = []
1608endif
349cc4a5 1609conf.set10('HAVE_XKBCOMMON', have)
a44fb601 1610
c4c978a0 1611want_pcre2 = get_option('pcre2')
8739f309 1612if want_pcre2 != 'false' and not skip_deps
c4c978a0
ZJS
1613 libpcre2 = dependency('libpcre2-8',
1614 required : want_pcre2 == 'true')
1615 have = libpcre2.found()
1616else
1617 have = false
1618 libpcre2 = []
1619endif
1620conf.set10('HAVE_PCRE2', have)
1621
69e96427 1622want_glib = get_option('glib')
87ac55a1 1623if want_glib != 'false' and not skip_deps
37efbbd8
ZJS
1624 libglib = dependency('glib-2.0',
1625 version : '>= 2.22.0',
1626 required : want_glib == 'true')
1627 libgobject = dependency('gobject-2.0',
1628 version : '>= 2.22.0',
1629 required : want_glib == 'true')
1630 libgio = dependency('gio-2.0',
1631 required : want_glib == 'true')
2c201c21 1632 have = libglib.found() and libgobject.found() and libgio.found()
69e96427 1633else
349cc4a5 1634 have = false
37efbbd8
ZJS
1635 libglib = []
1636 libgobject = []
1637 libgio = []
69e96427 1638endif
349cc4a5 1639conf.set10('HAVE_GLIB', have)
69e96427
ZJS
1640
1641want_dbus = get_option('dbus')
87ac55a1 1642if want_dbus != 'false' and not skip_deps
37efbbd8
ZJS
1643 libdbus = dependency('dbus-1',
1644 version : '>= 1.3.2',
1645 required : want_dbus == 'true')
349cc4a5 1646 have = libdbus.found()
69e96427 1647else
349cc4a5 1648 have = false
37efbbd8 1649 libdbus = []
69e96427 1650endif
349cc4a5 1651conf.set10('HAVE_DBUS', have)
69e96427 1652
1bd0cc45
YW
1653dbusdatadir = datadir / 'dbus-1'
1654if conf.get('HAVE_DBUS') == 1
1655 dbusdatadir = libdbus.get_variable(pkgconfig: 'datadir', default_value: datadir) / 'dbus-1'
1656endif
1657
1658dbuspolicydir = get_option('dbuspolicydir')
1659if dbuspolicydir == ''
1660 dbuspolicydir = dbusdatadir / 'system.d'
1661endif
1662
1663dbussessionservicedir = get_option('dbussessionservicedir')
1664if dbussessionservicedir == ''
1665 dbussessionservicedir = dbusdatadir / 'services'
1666 if conf.get('HAVE_DBUS') == 1
1667 dbussessionservicedir = libdbus.get_variable(pkgconfig: 'session_bus_services_dir', default_value: dbussessionservicedir)
1668 endif
1669endif
1670
1671dbussystemservicedir = get_option('dbussystemservicedir')
1672if dbussystemservicedir == ''
1673 dbussystemservicedir = dbusdatadir / 'system-services'
1674 if conf.get('HAVE_DBUS') == 1
1675 dbussystemservicedir = libdbus.get_variable(pkgconfig: 'system_bus_services_dir', default_value: dbussystemservicedir)
1676 endif
1677endif
1678
1679dbus_interfaces_dir = get_option('dbus-interfaces-dir')
1680if dbus_interfaces_dir == '' or dbus_interfaces_dir == 'yes'
1681 if meson.is_cross_build() and dbus_interfaces_dir != 'yes'
1682 dbus_interfaces_dir = 'no'
1683 warning('Exporting D-Bus interface XML files is disabled during cross build. Pass path or "yes" to force enable.')
1684 else
1685 dbus_interfaces_dir = dbusdatadir / 'interfaces'
1686 if conf.get('HAVE_DBUS') == 1
1687 dbus_interfaces_dir = libdbus.get_variable(pkgconfig: 'interfaces_dir', default_value: dbus_interfaces_dir)
1688 endif
1689 endif
1690endif
1bd0cc45 1691
e37ad765
ZJS
1692# We support one or the other. If gcrypt is available, we assume it's there to
1693# be used, and use it in preference.
1694opt = get_option('cryptolib')
1695if opt == 'openssl' and conf.get('HAVE_OPENSSL') == 0
1696 error('openssl requested as the default cryptolib, but not available')
1697endif
1698conf.set10('PREFER_OPENSSL',
1699 opt == 'openssl' or (opt == 'auto' and conf.get('HAVE_OPENSSL') == 1 and conf.get('HAVE_GCRYPT') == 0))
1700conf.set10('HAVE_OPENSSL_OR_GCRYPT',
1701 conf.get('HAVE_OPENSSL') == 1 or conf.get('HAVE_GCRYPT') == 1)
9bcf483b 1702lib_openssl_or_gcrypt = conf.get('PREFER_OPENSSL') == 1 ? [libopenssl] : [libgcrypt, libgpg_error]
42303dcb 1703
56ddbf10
YW
1704dns_over_tls = get_option('dns-over-tls')
1705if dns_over_tls != 'false'
e37ad765
ZJS
1706 if dns_over_tls == 'gnutls' and conf.get('PREFER_OPENSSL') == 1
1707 error('Sorry, -Ddns-over-tls=gnutls is not supported when openssl is used as the cryptolib')
1708 endif
1709
1f9aa3d2
LB
1710 if dns_over_tls == 'gnutls'
1711 have_openssl = false
096cbdce 1712 else
1f9aa3d2
LB
1713 have_openssl = conf.get('HAVE_OPENSSL') == 1
1714 if dns_over_tls == 'openssl' and not have_openssl
1715 error('DNS-over-TLS support was requested with openssl, but dependencies are not available')
096cbdce 1716 endif
56ddbf10 1717 endif
1f9aa3d2
LB
1718 if dns_over_tls == 'openssl' or have_openssl
1719 have_gnutls = false
096cbdce 1720 else
1f9aa3d2
LB
1721 have_gnutls = conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0')
1722 if dns_over_tls != 'auto' and not have_gnutls
1723 str = dns_over_tls == 'gnutls' ? ' with gnutls' : ''
b349bc59 1724 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
096cbdce
IT
1725 endif
1726 endif
1727 have = have_gnutls or have_openssl
56ddbf10 1728else
be5536a6
MO
1729 have = false
1730 have_gnutls = false
1731 have_openssl = false
56ddbf10
YW
1732endif
1733conf.set10('ENABLE_DNS_OVER_TLS', have)
096cbdce
IT
1734conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1735conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
56ddbf10 1736
c9299be2 1737default_dns_over_tls = get_option('default-dns-over-tls')
87ac55a1 1738if skip_deps
c9299be2 1739 default_dns_over_tls = 'no'
5d67a7ae 1740endif
56ddbf10 1741if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
4310bfc2 1742 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 1743 default_dns_over_tls = 'no'
5d67a7ae 1744endif
c9299be2
IT
1745conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1746 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
411d1f4c 1747conf.set_quoted('DEFAULT_DNS_OVER_TLS_MODE_STR', default_dns_over_tls)
5d67a7ae 1748
3614df05
ZJS
1749default_mdns = get_option('default-mdns')
1750conf.set('DEFAULT_MDNS_MODE',
1751 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
411d1f4c 1752conf.set_quoted('DEFAULT_MDNS_MODE_STR', default_mdns)
3614df05
ZJS
1753
1754default_llmnr = get_option('default-llmnr')
1755conf.set('DEFAULT_LLMNR_MODE',
1756 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
411d1f4c 1757conf.set_quoted('DEFAULT_LLMNR_MODE_STR', default_llmnr)
3614df05 1758
e594a3b1
LP
1759want_repart = get_option('repart')
1760if want_repart != 'false'
6b12086e 1761 have = conf.get('HAVE_LIBFDISK') == 1
e594a3b1
LP
1762 if want_repart == 'true' and not have
1763 error('repart support was requested, but dependencies are not available')
1764 endif
1765else
1766 have = false
1767endif
1768conf.set10('ENABLE_REPART', have)
1769
7e8facb3
ZJS
1770default_dnssec = get_option('default-dnssec')
1771if skip_deps
1772 default_dnssec = 'no'
1773endif
1774if default_dnssec != 'no' and conf.get('HAVE_OPENSSL_OR_GCRYPT') == 0
1775 message('default-dnssec cannot be set to yes or allow-downgrade openssl and gcrypt are disabled. Setting default-dnssec to no.')
1776 default_dnssec = 'no'
1777endif
1778conf.set('DEFAULT_DNSSEC_MODE',
1779 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1780conf.set_quoted('DEFAULT_DNSSEC_MODE_STR', default_dnssec)
1781
43cc7a3e
LP
1782want_sysupdate = get_option('sysupdate')
1783if want_sysupdate != 'false'
1784 have = (conf.get('HAVE_OPENSSL') == 1 and
1785 conf.get('HAVE_LIBFDISK') == 1)
1786 if want_sysupdate == 'true' and not have
1787 error('sysupdate support was requested, but dependencies are not available')
1788 endif
1789else
1790 have = false
1791endif
1792conf.set10('ENABLE_SYSUPDATE', have)
1793
5c23128d 1794want_importd = get_option('importd')
4390be30 1795if want_importd != 'false'
349cc4a5 1796 have = (conf.get('HAVE_LIBCURL') == 1 and
6214d42b 1797 conf.get('HAVE_OPENSSL_OR_GCRYPT') == 1 and
349cc4a5 1798 conf.get('HAVE_ZLIB') == 1 and
6214d42b 1799 conf.get('HAVE_XZ') == 1)
349cc4a5 1800 if want_importd == 'true' and not have
37efbbd8
ZJS
1801 error('importd support was requested, but dependencies are not available')
1802 endif
349cc4a5
ZJS
1803else
1804 have = false
5c23128d 1805endif
349cc4a5 1806conf.set10('ENABLE_IMPORTD', have)
5c23128d 1807
70a5db58
LP
1808want_homed = get_option('homed')
1809if want_homed != 'false'
1810 have = (conf.get('HAVE_OPENSSL') == 1 and
1811 conf.get('HAVE_LIBFDISK') == 1 and
1812 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1813 if want_homed == 'true' and not have
1814 error('homed support was requested, but dependencies are not available')
1815 endif
1816else
1817 have = false
1818endif
1819conf.set10('ENABLE_HOMED', have)
1820
af06ddf5
YW
1821have = have and conf.get('HAVE_PAM') == 1
1822conf.set10('ENABLE_PAM_HOME', have)
1823
5c23128d 1824want_remote = get_option('remote')
4390be30 1825if want_remote != 'false'
349cc4a5
ZJS
1826 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1827 conf.get('HAVE_LIBCURL') == 1]
37efbbd8
ZJS
1828 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1829 # it's possible to build one without the other. Complain only if
5238e957 1830 # support was explicitly requested. The auxiliary files like sysusers
37efbbd8
ZJS
1831 # config should be installed when any of the programs are built.
1832 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1833 error('remote support was requested, but dependencies are not available')
1834 endif
349cc4a5
ZJS
1835 have = have_deps[0] or have_deps[1]
1836else
1837 have = false
5c23128d 1838endif
349cc4a5 1839conf.set10('ENABLE_REMOTE', have)
5c23128d 1840
b3259a6e
ZJS
1841foreach term : ['analyze',
1842 'backlight',
a9149d87 1843 'binfmt',
dfca5587 1844 'compat-mutable-uid-boundaries',
a9149d87 1845 'coredump',
b3259a6e
ZJS
1846 'efi',
1847 'environment-d',
1848 'firstboot',
1849 'gshadow',
1850 'hibernate',
a9149d87 1851 'hostnamed',
b3259a6e
ZJS
1852 'hwdb',
1853 'idn',
1854 'ima',
1855 'initrd',
1782534b 1856 'kernel-install',
b3259a6e 1857 'ldconfig',
a9149d87 1858 'localed',
b3259a6e 1859 'logind',
a9149d87
ZJS
1860 'machined',
1861 'networkd',
dfca5587 1862 'nscd',
b3259a6e
ZJS
1863 'nss-myhostname',
1864 'nss-systemd',
1782534b 1865 'oomd',
b3259a6e
ZJS
1866 'portabled',
1867 'pstore',
a9149d87 1868 'quotacheck',
b3259a6e
ZJS
1869 'randomseed',
1870 'resolve',
1871 'rfkill',
1872 'smack',
dfca5587 1873 'sysext',
a9149d87 1874 'sysusers',
b3259a6e
ZJS
1875 'timedated',
1876 'timesyncd',
a9149d87 1877 'tmpfiles',
a9149d87 1878 'tpm',
b3259a6e
ZJS
1879 'userdb',
1880 'utmp',
1881 'vconsole',
1882 'xdg-autostart']
a9149d87
ZJS
1883 have = get_option(term)
1884 name = 'ENABLE_' + term.underscorify().to_upper()
1885 conf.set10(name, have)
5c23128d
ZJS
1886endforeach
1887
bd7e6aa7
ZJS
1888enable_sysusers = conf.get('ENABLE_SYSUSERS') == 1
1889
08540a95
YW
1890foreach tuple : [['nss-mymachines', 'machined'],
1891 ['nss-resolve', 'resolve']]
1892 want = get_option(tuple[0])
1893 if want != 'false'
1894 have = get_option(tuple[1])
1895 if want == 'true' and not have
1896 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1897 endif
1898 else
1899 have = false
1900 endif
1901 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1902 conf.set10(name, have)
1903endforeach
1904
1905enable_nss = false
1906foreach term : ['ENABLE_NSS_MYHOSTNAME',
1907 'ENABLE_NSS_MYMACHINES',
1908 'ENABLE_NSS_RESOLVE',
1909 'ENABLE_NSS_SYSTEMD']
1910 if conf.get(term) == 1
1911 enable_nss = true
1912 endif
1913endforeach
1914conf.set10('ENABLE_NSS', enable_nss)
1915
348b4437 1916conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
6129ec85 1917
b68dfb9e 1918conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
00d82c81 1919
db7f5ab6
JJ
1920############################################################
1921
9c45bfb2
FS
1922pymod = import('python')
1923python = pymod.find_installation('python3', required : true, modules : ['jinja2'])
1924python_39 = python.language_version().version_compare('>=3.9')
1925
4d3ef2d1
LP
1926############################################################
1927
1928if conf.get('BPF_FRAMEWORK') == 1
1929 bpf_clang_flags = [
1930 '-std=gnu11',
1931 '-Wno-compare-distinct-pointer-types',
1932 '-fno-stack-protector',
1933 '-O2',
1934 '-target',
1935 'bpf',
1936 '-g',
1937 '-c',
1938 ]
1939
1940 bpf_gcc_flags = [
1941 '-std=gnu11',
1942 '-fno-stack-protector',
1943 '-O2',
1944 '-mkernel=5.2',
1945 '-mcpu=v3',
1946 '-mco-re',
1947 '-gbtf',
1948 '-c',
1949 ]
1950
1951 # Generate defines that are appropriate to tell the compiler what architecture
1952 # we're compiling for. By default we just map meson's cpu_family to __<cpu_family>__.
1953 # This dictionary contains the exceptions where this doesn't work.
1954 #
1955 # C.f. https://mesonbuild.com/Reference-tables.html#cpu-families
1956 # and src/basic/missing_syscall_def.h.
1957 cpu_arch_defines = {
1958 'ppc' : ['-D__powerpc__'],
1959 'ppc64' : ['-D__powerpc64__', '-D_CALL_ELF=2'],
1960 'riscv32' : ['-D__riscv', '-D__riscv_xlen=32'],
1961 'riscv64' : ['-D__riscv', '-D__riscv_xlen=64'],
1962 'x86' : ['-D__i386__'],
1963
1964 # For arm, assume hardware fp is available.
1965 'arm' : ['-D__arm__', '-D__ARM_PCS_VFP'],
1966 }
1967
1968 bpf_arch_flags = cpu_arch_defines.get(host_machine.cpu_family(),
1969 ['-D__@0@__'.format(host_machine.cpu_family())])
1970 if bpf_compiler == 'gcc'
1971 bpf_arch_flags += ['-m' + host_machine.endian() + '-endian']
1972 endif
1973
1974 libbpf_include_dir = libbpf.get_variable(pkgconfig : 'includedir')
1975
1976 bpf_o_unstripped_cmd = []
1977 if bpf_compiler == 'clang'
1978 bpf_o_unstripped_cmd += [
1979 clang,
1980 bpf_clang_flags,
1981 bpf_arch_flags,
1982 ]
1983 elif bpf_compiler == 'gcc'
1984 bpf_o_unstripped_cmd += [
1985 bpf_gcc,
1986 bpf_gcc_flags,
1987 bpf_arch_flags,
1988 ]
1989 endif
1990
1991 bpf_o_unstripped_cmd += ['-I.']
1992
1993 if not meson.is_cross_build() and bpf_compiler == 'clang'
1994 target_triplet_cmd = run_command('gcc', '-dumpmachine', check: false)
1995 if target_triplet_cmd.returncode() == 0
1996 target_triplet = target_triplet_cmd.stdout().strip()
1997 bpf_o_unstripped_cmd += [
1998 '-isystem',
1999 '/usr/include/@0@'.format(target_triplet)
2000 ]
2001 endif
2002 endif
2003
2004 bpf_o_unstripped_cmd += [
2005 '-idirafter',
2006 libbpf_include_dir,
2007 '@INPUT@',
2008 '-o',
2009 '@OUTPUT@'
2010 ]
2011
2012 if bpftool_strip
2013 bpf_o_cmd = [
2014 bpftool,
2015 'gen',
2016 'object',
2017 '@OUTPUT@',
2018 '@INPUT@'
2019 ]
2020 elif bpf_compiler == 'clang'
2021 bpf_o_cmd = [
2022 llvm_strip,
2023 '-g',
2024 '@INPUT@',
2025 '-o',
2026 '@OUTPUT@'
2027 ]
2028 endif
2029
2030 skel_h_cmd = [
2031 bpftool,
2032 'gen',
2033 'skeleton',
2034 '@INPUT@'
2035 ]
2036endif
2037
dfca5587
JJ
2038#####################################################################
2039
2040efi_arch = {
31ffb6b1
JJ
2041 'aarch64' : 'aa64',
2042 'arm' : 'arm',
2043 'loongarch32' : 'loongarch32',
2044 'loongarch64' : 'loongarch64',
2045 'riscv32' : 'riscv32',
2046 'riscv64' : 'riscv64',
2047 'x86_64' : 'x64',
2048 'x86' : 'ia32',
dfca5587
JJ
2049}.get(host_machine.cpu_family(), '')
2050
2051if get_option('bootloader') != 'false' and efi_arch != ''
2052 conf.set_quoted('EFI_MACHINE_TYPE_NAME', efi_arch)
4729e84e
LB
2053elif get_option('bootloader') == 'false' and efi_arch != ''
2054 # Ensure that if the option is explicitly set to false, then no EFI code is built, including tests
2055 efi_arch = ''
dfca5587
JJ
2056elif get_option('bootloader') == 'true' and efi_arch == ''
2057 error('EFI not supported for this arch.')
2058endif
2afeaf16
JJ
2059
2060efi_arch_alt = ''
7ea44f17 2061efi_cpu_family_alt = ''
2afeaf16
JJ
2062if efi_arch == 'x64' and cc.links('''
2063 #include <limits.h>
2064 int main(int argc, char *argv[]) {
2065 return __builtin_popcount(argc - CHAR_MAX);
2066 }''', args : ['-m32', '-march=i686'], name : '32bit build possible')
2067 efi_arch_alt = 'ia32'
7ea44f17 2068 efi_cpu_family_alt = 'x86'
2afeaf16
JJ
2069endif
2070
2071have_pyelftools = pymod.find_installation('python3', required : false, modules : ['elftools']).found()
09444a2e
DDM
2072if get_option('bootloader') == 'true' and not have_pyelftools
2073 error('EFI bootloader support requires pyelftools.')
2afeaf16
JJ
2074endif
2075
dfca5587
JJ
2076conf.set10(
2077 'ENABLE_BOOTLOADER',
2078 get_option('efi') and
2079 get_option('bootloader') in ['auto', 'true'] and
2afeaf16 2080 efi_arch != '' and
2afeaf16 2081 have_pyelftools,
dfca5587
JJ
2082)
2083
9c45bfb2 2084if get_option('ukify') == 'auto'
dfca5587
JJ
2085 want_ukify = python_39 and conf.get('ENABLE_BOOTLOADER') == 1
2086elif get_option('ukify') == 'true' and (not python_39 or conf.get('ENABLE_BOOTLOADER') != 1)
2087 error('ukify requires Python >= 3.9 and -Dbootloader=true')
9c45bfb2
FS
2088else
2089 want_ukify = get_option('ukify') == 'true'
2090endif
2091conf.set10('ENABLE_UKIFY', want_ukify)
2092
2093############################################################
b0bd2ae8 2094
2afeaf16
JJ
2095elf2efi_lds = project_source_root / 'tools/elf2efi.lds'
2096elf2efi_py = find_program('tools/elf2efi.py')
2097export_dbus_interfaces_py = find_program('tools/dbus_exporter.py')
d3821a33 2098generate_gperfs = find_program('tools/generate-gperfs.py')
f6fe732f
YW
2099make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
2100make_directive_index_py = find_program('tools/make-directive-index.py')
2101make_man_index_py = find_program('tools/make-man-index.py')
6b1aac3c 2102meson_render_jinja2 = find_program('tools/meson-render-jinja2.py')
d3821a33 2103update_dbus_docs_py = find_program('tools/update-dbus-docs.py')
d3821a33 2104update_hwdb_autosuspend_sh = find_program('tools/update-hwdb-autosuspend.sh')
2afeaf16
JJ
2105update_hwdb_sh = find_program('tools/update-hwdb.sh')
2106update_man_rules_py = find_program('tools/update-man-rules.py')
d3821a33
ZJS
2107update_syscall_tables_sh = find_program('tools/update-syscall-tables.sh')
2108xml_helper_py = find_program('tools/xml_helper.py')
f6fe732f 2109
db7f5ab6 2110############################################################
5c23128d 2111
e95acdfe
YW
2112version_tag = get_option('version-tag')
2113if version_tag == ''
2114 # Check that we have either .git/ (a normal clone) or a .git file (a work-tree) and that we don't
2115 # get confused if a tarball is extracted in a higher-level git repository.
2116 if git.found() and fs.exists(project_source_root / '.git')
2117 # Apparently git describe has a bug where it always considers the work-tree dirty when
2118 # invoked with --git-dir (even though 'git status' is happy). Work around this issue by
2119 # cd-ing to the source directory.
2120 version_tag = run_command(
2121 sh, '-c',
2122 'cd "$MESON_SOURCE_ROOT"; git describe --abbrev=7 --dirty=^ 2>/dev/null | sed "s/^v//; s/-rc/~rc/"',
2123 check : true,
2124 ).stdout().strip()
2125 else
2126 version_tag = meson.project_version()
2127 endif
2128endif
2129
2130vcs_data = configuration_data()
2131vcs_data.set('VCS_TAG', version_tag)
2132version_h = configure_file(configuration : vcs_data,
2133 input : 'src/version/version.h.in',
2134 output : 'version.h')
2135
2136versiondep = declare_dependency(
2137 sources : version_h,
2138 include_directories : include_directories('.'),
2139)
2140
2141shared_lib_tag = get_option('shared-lib-tag')
2142if shared_lib_tag == ''
2143 shared_lib_tag = meson.project_version()
2144endif
2145
2146############################################################
2147
7e43be7d 2148if get_option('b_coverage')
92148283 2149 userspace_c_args += ['-include', 'src/basic/coverage.h']
7e43be7d
FS
2150endif
2151
2152############################################################
2153
5c23128d 2154config_h = configure_file(
37efbbd8
ZJS
2155 output : 'config.h',
2156 configuration : conf)
5c23128d 2157
92148283 2158userspace_c_args += ['-include', 'config.h']
f6fe732f 2159
8f04a1ca
ZJS
2160jinja2_cmdline = [meson_render_jinja2, config_h, version_h]
2161
92148283
JJ
2162userspace = declare_dependency(
2163 compile_args : userspace_c_args,
2164 link_args : userspace_c_ld_args,
40c7d3c7 2165 dependencies : versiondep,
92148283
JJ
2166)
2167
c18dde32
ZJS
2168man_page_depends = []
2169
f6fe732f 2170############################################################
348b4437 2171
1d21a7bd
YW
2172tests = []
2173simple_tests = []
2174fuzzers = []
2175simple_fuzzers = []
2176catalogs = []
c335921e
YW
2177modules = [] # nss, pam, and other plugins
2178executables = []
2179executables_by_name = {}
1d21a7bd 2180
b61016f2
YW
2181# binaries that have --help and are intended for use by humans,
2182# usually, but not always, installed in /bin.
2183public_programs = []
2184
e3c68924 2185# D-Bus introspection XML export
2186dbus_programs = []
e3c68924 2187
3f80c139
ZJS
2188# A list of boot stubs. Required for testing of ukify.
2189boot_stubs = []
2190
8d40961c
YW
2191basic_includes = include_directories(
2192 'src/basic',
e5bc5f1f 2193 'src/fundamental',
8d40961c
YW
2194 'src/systemd',
2195 '.')
2196
2197libsystemd_includes = [basic_includes, include_directories(
2198 'src/libsystemd/sd-bus',
2199 'src/libsystemd/sd-device',
2200 'src/libsystemd/sd-event',
2201 'src/libsystemd/sd-hwdb',
2202 'src/libsystemd/sd-id128',
2203 'src/libsystemd/sd-journal',
2204 'src/libsystemd/sd-netlink',
2205 'src/libsystemd/sd-network',
2206 'src/libsystemd/sd-resolve')]
2207
2208includes = [libsystemd_includes, include_directories('src/shared')]
5c23128d 2209
5c23128d
ZJS
2210subdir('po')
2211subdir('catalog')
dfca5587 2212subdir('src/fundamental')
5c23128d
ZJS
2213subdir('src/basic')
2214subdir('src/libsystemd')
3976f372
YW
2215subdir('src/shared')
2216subdir('src/udev')
2217subdir('src/libudev')
5c23128d 2218
5c23128d 2219libsystemd = shared_library(
37efbbd8 2220 'systemd',
56d50ab1 2221 version : libsystemd_version,
8d40961c 2222 include_directories : libsystemd_includes,
37efbbd8
ZJS
2223 link_args : ['-shared',
2224 '-Wl,--version-script=' + libsystemd_sym_path],
34e221a5 2225 link_with : [libbasic,
acc50c92
LP
2226 libbasic_gcrypt,
2227 libbasic_compress],
99b9f8fd 2228 link_whole : [libsystemd_static],
92148283
JJ
2229 dependencies : [librt,
2230 threads,
2231 userspace],
37efbbd8
ZJS
2232 link_depends : libsystemd_sym,
2233 install : true,
0a5e638c 2234 install_tag: 'libsystemd',
b0d3095f 2235 install_dir : libdir)
5c23128d 2236
039f1673
LB
2237alias_target('libsystemd', libsystemd)
2238
70848ecf
DC
2239install_libsystemd_static = static_library(
2240 'systemd',
2241 libsystemd_sources,
975464e0
ZJS
2242 basic_sources,
2243 basic_gcrypt_sources,
acc50c92 2244 basic_compress_sources,
e5bc5f1f 2245 fundamental_sources,
8d40961c 2246 include_directories : libsystemd_includes,
70848ecf
DC
2247 build_by_default : static_libsystemd != 'false',
2248 install : static_libsystemd != 'false',
0a5e638c 2249 install_tag: 'libsystemd',
b0d3095f 2250 install_dir : libdir,
40dbce36 2251 pic : static_libsystemd_pic,
92148283 2252 dependencies : [libblkid,
975464e0 2253 libcap,
92148283 2254 libdl,
011d129c 2255 libgcrypt,
92148283
JJ
2256 liblz4,
2257 libmount,
c47511da 2258 libopenssl,
92148283
JJ
2259 librt,
2260 libxz,
2261 libzstd,
2262 threads,
40c7d3c7 2263 userspace],
70848ecf
DC
2264 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
2265
3976f372
YW
2266libudev = shared_library(
2267 'udev',
3976f372
YW
2268 version : libudev_version,
2269 include_directories : includes,
2270 link_args : ['-shared',
2271 '-Wl,--version-script=' + libudev_sym_path],
2272 link_with : [libsystemd_static, libshared_static],
2273 link_whole : libudev_basic,
92148283
JJ
2274 dependencies : [threads,
2275 userspace],
3976f372
YW
2276 link_depends : libudev_sym,
2277 install : true,
0a5e638c 2278 install_tag: 'libudev',
b0d3095f 2279 install_dir : libdir)
3976f372 2280
039f1673
LB
2281alias_target('libudev', libudev)
2282
3976f372
YW
2283install_libudev_static = static_library(
2284 'udev',
2285 basic_sources,
e5bc5f1f 2286 fundamental_sources,
3976f372
YW
2287 shared_sources,
2288 libsystemd_sources,
2289 libudev_sources,
3976f372
YW
2290 include_directories : includes,
2291 build_by_default : static_libudev != 'false',
2292 install : static_libudev != 'false',
0a5e638c 2293 install_tag: 'libudev',
b0d3095f 2294 install_dir : libdir,
3976f372 2295 link_depends : libudev_sym,
92148283
JJ
2296 dependencies : [libmount,
2297 libshared_deps,
40c7d3c7 2298 userspace],
3976f372
YW
2299 c_args : static_libudev_pic ? [] : ['-fno-PIC'],
2300 pic : static_libudev_pic)
2301
47354b44
ZJS
2302############################################################
2303
c335921e
YW
2304executable_template = {
2305 'include_directories' : includes,
2306 'link_with' : libshared,
2307 'install_rpath' : pkglibdir,
2308 'install' : true,
2309}
2310
2311generator_template = executable_template + {
2312 'install_dir' : systemgeneratordir,
2313}
2314
2315libexec_template = executable_template + {
2316 'install_dir' : libexecdir,
2317}
2318
2319executable_additional_kwargs = {
2320 'dependencies' : userspace,
2321}
2322
2323nss_template = {
2324 'version' : '2',
2325 'include_directories' : includes,
2326 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
2327 'link_args' : ['-z', 'nodelete'],
2328 'link_with' : [
2329 libsystemd_static,
2330 libshared_static,
2331 libbasic,
2332 ],
2333 'dependencies' : [
2334 librt,
2335 threads,
2336 ],
2337 'install' : true,
2338 'install_tag' : 'nss',
2339 'install_dir' : libdir,
2340}
2341
2342pam_template = {
2343 'name_prefix' : '',
2344 'include_directories' : includes,
2345 'link_with' : [
2346 libsystemd_static,
2347 libshared_static,
2348 ],
2349 'dependencies' : [
2350 libpam_misc,
2351 libpam,
2352 threads,
2353 ],
2354 'install' : true,
2355 'install_tag' : 'pam',
2356 'install_dir' : pamlibdir,
2357}
2358
2359module_additional_kwargs = {
2360 'link_args' : ['-shared'],
2361 'dependencies' : userspace,
2362}
2363
2364############################################################
2365
b61016f2 2366# systemd-analyze requires 'libcore'
83b6af36 2367subdir('src/core')
b61016f2
YW
2368# systemd-journal-remote requires 'libjournal_core'
2369subdir('src/journal')
2370# systemd-networkd requires 'libsystemd_network'
2371subdir('src/libsystemd-network')
83b6af36
ZJS
2372
2373subdir('src/analyze')
cd4300f3 2374subdir('src/boot')
dfca5587 2375subdir('src/boot/efi')
f98df767 2376subdir('src/busctl')
b61016f2 2377subdir('src/coredump')
2ad279cf 2378subdir('src/cryptenroll')
b4d1892a 2379subdir('src/cryptsetup')
2a456620
YW
2380subdir('src/debug-generator')
2381subdir('src/environment-d-generator')
2382subdir('src/fstab-generator')
2383subdir('src/getty-generator')
b61016f2 2384subdir('src/home')
83b6af36
ZJS
2385subdir('src/hostname')
2386subdir('src/import')
b61016f2 2387subdir('src/journal-remote')
83b6af36
ZJS
2388subdir('src/kernel-install')
2389subdir('src/locale')
b61016f2 2390subdir('src/login')
83b6af36 2391subdir('src/machine')
b61016f2 2392subdir('src/network')
83b6af36 2393subdir('src/nspawn')
2080c097
YW
2394subdir('src/nss-myhostname')
2395subdir('src/nss-mymachines')
2396subdir('src/nss-resolve')
2397subdir('src/nss-systemd')
b61016f2
YW
2398subdir('src/oom')
2399subdir('src/partition')
2400subdir('src/portable')
2401subdir('src/pstore')
83b6af36 2402subdir('src/resolve')
2a9b4bbe 2403subdir('src/rpm')
2a456620 2404subdir('src/run-generator')
b61016f2 2405subdir('src/shutdown')
9bca4ae4 2406subdir('src/sysext')
c3512573 2407subdir('src/systemctl')
43cc7a3e 2408subdir('src/sysupdate')
83b6af36
ZJS
2409subdir('src/timedate')
2410subdir('src/timesync')
db64ba81 2411subdir('src/tmpfiles')
b61016f2 2412subdir('src/userdb')
0275e918 2413subdir('src/xdg-autostart-generator')
83b6af36 2414
3976f372
YW
2415subdir('src/systemd')
2416
83b6af36 2417subdir('src/test')
7db7d5b7 2418subdir('src/fuzz')
ef2ad30a 2419subdir('rules.d')
83b6af36 2420subdir('test')
a1d6dbb1 2421subdir('src/ukify/test') # needs to be last for test_env variable
83b6af36 2422
d30d9bf0
LB
2423alias_target('devel', libsystemd_pc, libudev_pc, systemd_pc, udev_pc)
2424
83b6af36
ZJS
2425############################################################
2426
c335921e
YW
2427foreach dict : executables
2428 name = dict.get('name')
2429
2430 build = true
2431 foreach cond : dict.get('conditions', [])
2432 if conf.get(cond) != 1
2433 build = false
2434 break
2435 endif
2436 endforeach
2437 if not build
2438 continue
2439 endif
2440
2441 kwargs = {}
2442 foreach key, val : dict
2443 if key in ['name', 'dbus', 'public', 'conditions']
2444 continue
2445 endif
2446 kwargs += { key : val }
2447 endforeach
2448
2449 foreach key, val : executable_additional_kwargs
2450 kwargs += { key : [ kwargs.get(key, []), val ]}
2451 endforeach
2452
2453 exe = executable(
2454 name,
2455 kwargs : kwargs,
2456 )
2457
2458 executables_by_name += { name : exe }
2459
2460 if dict.get('build_by_default', true)
2461 if dict.get('dbus', false)
2462 dbus_programs += exe
2463 endif
2464 if dict.get('public', false)
2465 public_programs += exe
2466 endif
2467 endif
2468endforeach
2469
2470############################################################
2471
83b6af36
ZJS
2472# only static linking apart from libdl, to make sure that the
2473# module is linked to all libraries that it uses.
2474test_dlopen = executable(
37efbbd8
ZJS
2475 'test-dlopen',
2476 test_dlopen_c,
2477 include_directories : includes,
2478 link_with : [libbasic],
92148283
JJ
2479 dependencies : [libdl,
2480 userspace],
fd1939fb 2481 build_by_default : want_tests != 'false')
83b6af36 2482
c335921e
YW
2483foreach dict : modules
2484 name = dict.get('name')
2485 is_nss = name.startswith('nss_')
2486 is_pam = name.startswith('pam_')
2487
2488 build = true
2489 foreach cond : dict.get('conditions', [])
2490 if conf.get(cond) != 1
2491 build = false
2492 break
2493 endif
2494 endforeach
2495 if not build
2496 continue
2497 endif
2498
2499 kwargs = {}
2500 foreach key, val : dict
2501 if key in ['name', 'conditions']
2502 continue
2503 endif
2504 kwargs += { key : val }
2505 endforeach
2506
2507 sym = meson.current_source_dir() / '@0@'.format(dict.get('link_depends')[0])
2508 kwargs += {
2509 'link_args' : [
2510 kwargs.get('link_args', []),
2511 '-Wl,--version-script=' + sym,
2512 ],
2513 }
2514 foreach key, val : module_additional_kwargs
2515 kwargs += { key : [ kwargs.get(key, []), val ]}
2516 endforeach
2517
2518 lib = shared_library(
2519 name,
2520 kwargs : kwargs,
2521 )
2522
2523 if is_nss
2524 # We cannot use shared_module because it does not support version suffix.
2525 # Unfortunately shared_library insists on creating the symlink…
2526 meson.add_install_script('sh', '-c', 'rm $DESTDIR@0@/lib@1@.so'.format(libdir, name),
2527 install_tag : 'nss')
2528 endif
2529
2530 if want_tests != 'false' and (is_nss or is_pam)
2531 test('dlopen-' + name,
2532 test_dlopen,
2533 # path to dlopen must include a slash
2534 args : lib.full_path(),
2535 depends : lib)
2536 endif
2537endforeach
2538
5c23128d
ZJS
2539############################################################
2540
4e8295f4 2541if want_tests != 'false'
f727f3b9 2542 exe = executables_by_name.get('systemd-analyze')
4e8295f4
ZJS
2543 test('test-compare-versions',
2544 test_compare_versions_sh,
2545 args : exe.full_path())
2546endif
35a1ff4c 2547
8cc8a073 2548if want_tests != 'false'
2a456620 2549 exe = executables_by_name.get('systemd-fstab-generator')
8cc8a073
YW
2550 test('test-fstab-generator',
2551 test_fstab_generator_sh,
2552 # https://github.com/mesonbuild/meson/issues/2681
e93ada98 2553 args : exe.full_path(),
e290bdb7 2554 env : test_env,
e93ada98 2555 depends : exe)
8cc8a073
YW
2556endif
2557
349cc4a5 2558if conf.get('ENABLE_HIBERNATE') == 1
6164ec4c
ZJS
2559 executable(
2560 'systemd-hibernate-resume-generator',
2561 'src/hibernate-resume/hibernate-resume-generator.c',
2562 include_directories : includes,
2563 link_with : [libshared],
92148283 2564 dependencies : userspace,
b0d3095f 2565 install_rpath : pkglibdir,
6164ec4c
ZJS
2566 install : true,
2567 install_dir : systemgeneratordir)
2568
2569 executable(
2570 'systemd-hibernate-resume',
2571 'src/hibernate-resume/hibernate-resume.c',
2572 include_directories : includes,
2573 link_with : [libshared],
92148283 2574 dependencies : userspace,
b0d3095f 2575 install_rpath : pkglibdir,
6164ec4c 2576 install : true,
b0d3095f 2577 install_dir : libexecdir)
37efbbd8
ZJS
2578endif
2579
349cc4a5 2580if conf.get('HAVE_BLKID') == 1
6164ec4c
ZJS
2581 executable(
2582 'systemd-gpt-auto-generator',
2583 'src/gpt-auto-generator/gpt-auto-generator.c',
6164ec4c
ZJS
2584 include_directories : includes,
2585 link_with : [libshared],
92148283
JJ
2586 dependencies : [libblkid,
2587 userspace],
b0d3095f 2588 install_rpath : pkglibdir,
6164ec4c
ZJS
2589 install : true,
2590 install_dir : systemgeneratordir)
2591
2592 public_programs += executable(
2593 'systemd-dissect',
2594 'src/dissect/dissect.c',
2595 include_directories : includes,
2596 link_with : [libshared],
40c7d3c7 2597 dependencies : [userspace],
b0d3095f 2598 install_rpath : pkglibdir,
5a151082 2599 install : true)
a164d9d5
LP
2600
2601 meson.add_install_script(meson_make_symlink,
2602 bindir / 'systemd-dissect',
b0d3095f 2603 sbindir / 'mount.ddi')
5c23128d
ZJS
2604endif
2605
1ec57f33 2606if conf.get('ENABLE_RESOLVE') == 1
e3c68924 2607 dbus_programs += executable(
6164ec4c
ZJS
2608 'systemd-resolved',
2609 systemd_resolved_sources,
8d40961c 2610 include_directories : resolve_includes,
6164ec4c
ZJS
2611 link_with : [libshared,
2612 libbasic_gcrypt,
2613 libsystemd_resolve_core],
92148283
JJ
2614 dependencies : [systemd_resolved_dependencies,
2615 userspace],
b0d3095f 2616 install_rpath : pkglibdir,
6164ec4c 2617 install : true,
b0d3095f 2618 install_dir : libexecdir)
6164ec4c
ZJS
2619
2620 public_programs += executable(
2621 'resolvectl',
2622 resolvectl_sources,
2623 include_directories : includes,
2624 link_with : [libshared,
2625 libbasic_gcrypt,
2626 libsystemd_resolve_core],
92148283 2627 dependencies : [lib_openssl_or_gcrypt,
c47511da 2628 libidn,
92148283
JJ
2629 libm,
2630 threads,
40c7d3c7 2631 userspace],
b0d3095f 2632 install_rpath : pkglibdir,
6164ec4c 2633 install : true)
088c1363
LP
2634
2635 meson.add_install_script(meson_make_symlink,
fce9abb2 2636 bindir / 'resolvectl',
b0d3095f 2637 sbindir / 'resolvconf')
c2e84cab
YW
2638
2639 meson.add_install_script(meson_make_symlink,
fce9abb2
ZJS
2640 bindir / 'resolvectl',
2641 bindir / 'systemd-resolve')
5c23128d
ZJS
2642endif
2643
349cc4a5 2644if conf.get('ENABLE_LOGIND') == 1
e3c68924 2645 dbus_programs += executable(
6164ec4c
ZJS
2646 'systemd-logind',
2647 systemd_logind_sources,
2648 include_directories : includes,
2649 link_with : [liblogind_core,
2650 libshared],
92148283
JJ
2651 dependencies : [libacl,
2652 threads,
40c7d3c7 2653 userspace],
b0d3095f 2654 install_rpath : pkglibdir,
6164ec4c 2655 install : true,
b0d3095f 2656 install_dir : libexecdir)
6164ec4c
ZJS
2657
2658 public_programs += executable(
2659 'loginctl',
2660 loginctl_sources,
2661 include_directories : includes,
2662 link_with : [libshared],
92148283 2663 dependencies : [liblz4,
ef5924aa 2664 libxz,
c47511da 2665 libzstd,
92148283 2666 threads,
40c7d3c7 2667 userspace],
b0d3095f
LB
2668 install_rpath : pkglibdir,
2669 install : true)
6164ec4c
ZJS
2670
2671 public_programs += executable(
2672 'systemd-inhibit',
2673 'src/login/inhibit.c',
2674 include_directories : includes,
2675 link_with : [libshared],
40c7d3c7 2676 dependencies : [userspace],
b0d3095f
LB
2677 install_rpath : pkglibdir,
2678 install : true)
37efbbd8 2679
349cc4a5 2680 if conf.get('HAVE_PAM') == 1
fce9abb2 2681 version_script_arg = project_source_root / pam_systemd_sym
37efbbd8
ZJS
2682 pam_systemd = shared_library(
2683 'pam_systemd',
2684 pam_systemd_c,
2685 name_prefix : '',
2686 include_directories : includes,
2687 link_args : ['-shared',
2688 '-Wl,--version-script=' + version_script_arg],
37e4d7a8 2689 link_with : [libsystemd_static,
37efbbd8 2690 libshared_static],
92148283 2691 dependencies : [libpam_misc,
37efbbd8 2692 libpam,
92148283 2693 threads,
40c7d3c7 2694 userspace],
37efbbd8
ZJS
2695 link_depends : pam_systemd_sym,
2696 install : true,
48139c7c 2697 install_tag : 'pam',
37efbbd8
ZJS
2698 install_dir : pamlibdir)
2699
938be089
ZJS
2700 if want_tests != 'false'
2701 test('dlopen-pam_systemd',
2702 test_dlopen,
2703 # path to dlopen must include a slash
e93ada98
DDM
2704 args : pam_systemd.full_path(),
2705 depends : pam_systemd)
938be089 2706 endif
37efbbd8 2707 endif
005a29f2 2708
6164ec4c
ZJS
2709 executable(
2710 'systemd-user-runtime-dir',
2711 user_runtime_dir_sources,
2712 include_directories : includes,
2713 link_with : [libshared],
92148283 2714 dependencies : userspace,
b0d3095f 2715 install_rpath : pkglibdir,
6164ec4c 2716 install : true,
b0d3095f 2717 install_dir : libexecdir)
07ee5adb 2718endif
a9f0f5e5 2719
349cc4a5 2720if conf.get('HAVE_PAM') == 1
6164ec4c
ZJS
2721 executable(
2722 'systemd-user-sessions',
2723 'src/user-sessions/user-sessions.c',
2724 include_directories : includes,
2725 link_with : [libshared],
92148283 2726 dependencies : userspace,
b0d3095f 2727 install_rpath : pkglibdir,
6164ec4c 2728 install : true,
b0d3095f 2729 install_dir : libexecdir)
5c23128d
ZJS
2730endif
2731
dfca5587 2732if conf.get('HAVE_BLKID') == 1 and conf.get('ENABLE_BOOTLOADER') == 1
79647020
RS
2733 if get_option('link-boot-shared')
2734 boot_link_with = [libshared]
2735 else
2736 boot_link_with = [libsystemd_static, libshared_static]
2737 endif
2738
50f2c32c 2739 exe = executable(
6164ec4c 2740 'bootctl',
cd4300f3 2741 bootctl_sources,
6164ec4c 2742 include_directories : includes,
79647020 2743 link_with : [boot_link_with],
c47511da 2744 dependencies : [libblkid,
40c7d3c7 2745 userspace],
b0d3095f 2746 install_rpath : pkglibdir,
6164ec4c 2747 install : true)
50f2c32c
ZJS
2748 public_programs += exe
2749
2750 if want_tests != 'false'
2751 test('test-bootctl-json',
2752 test_bootctl_json_sh,
2753 args : exe.full_path(),
2754 depends : exe)
2755 endif
6164ec4c
ZJS
2756
2757 public_programs += executable(
2758 'systemd-bless-boot',
2759 'src/boot/bless-boot.c',
2760 include_directories : includes,
79647020 2761 link_with : [boot_link_with],
c47511da 2762 dependencies : [libblkid,
40c7d3c7 2763 userspace],
b0d3095f 2764 install_rpath : pkglibdir,
6164ec4c 2765 install : true,
b0d3095f 2766 install_dir : libexecdir)
6164ec4c
ZJS
2767
2768 executable(
2769 'systemd-bless-boot-generator',
2770 'src/boot/bless-boot-generator.c',
2771 include_directories : includes,
79647020 2772 link_with : [boot_link_with],
92148283 2773 dependencies : userspace,
b0d3095f 2774 install_rpath : pkglibdir,
6164ec4c
ZJS
2775 install : true,
2776 install_dir : systemgeneratordir)
ca1092dc 2777
3286770d 2778 if conf.get('HAVE_OPENSSL') == 1 and conf.get('HAVE_TPM2') == 1
ca1092dc
LP
2779 executable(
2780 'systemd-measure',
2781 'src/boot/measure.c',
2782 include_directories : includes,
2783 link_with : [libshared],
c47511da 2784 dependencies : [libopenssl,
40c7d3c7 2785 userspace],
b0d3095f 2786 install_rpath : pkglibdir,
ca1092dc 2787 install : true,
b0d3095f 2788 install_dir : libexecdir)
708d7524
LP
2789 executable(
2790 'systemd-pcrphase',
2791 'src/boot/pcrphase.c',
2792 include_directories : includes,
2793 link_with : [libshared],
92148283
JJ
2794 dependencies : [libblkid,
2795 libopenssl,
c47511da 2796 tpm2,
40c7d3c7 2797 userspace],
b0d3095f 2798 install_rpath : pkglibdir,
708d7524 2799 install : true,
b0d3095f 2800 install_dir : libexecdir)
ca1092dc 2801 endif
6164ec4c
ZJS
2802endif
2803
2804executable(
2805 'systemd-boot-check-no-failures',
2806 'src/boot/boot-check-no-failures.c',
2807 include_directories : includes,
2808 link_with : [libshared],
c47511da 2809 dependencies : [libblkid,
40c7d3c7 2810 userspace],
b0d3095f 2811 install_rpath : pkglibdir,
6164ec4c 2812 install : true,
b0d3095f 2813 install_dir : libexecdir)
005a29f2 2814
6164ec4c
ZJS
2815public_programs += executable(
2816 'systemd-socket-activate',
7f4544c9 2817 'src/socket-activate/socket-activate.c',
6164ec4c
ZJS
2818 include_directories : includes,
2819 link_with : [libshared],
c47511da 2820 dependencies : [threads,
40c7d3c7 2821 userspace],
b0d3095f 2822 install_rpath : pkglibdir,
6164ec4c 2823 install : true)
f3794366 2824
2a2d002f 2825systemctl = executable(
6164ec4c 2826 'systemctl',
c3512573 2827 systemctl_sources,
6164ec4c
ZJS
2828 include_directories : includes,
2829 link_with : systemctl_link_with,
92148283
JJ
2830 dependencies : [libcap,
2831 liblz4,
6164ec4c
ZJS
2832 libselinux,
2833 libxz,
c47511da 2834 libzstd,
92148283 2835 threads,
40c7d3c7 2836 userspace],
b0d3095f
LB
2837 install_rpath : pkglibdir,
2838 install : true)
2a2d002f 2839public_programs += systemctl
5c23128d 2840
61d0578b 2841if conf.get('ENABLE_PORTABLED') == 1
c06d2e44
RS
2842 if get_option('link-portabled-shared')
2843 portabled_link_with = [libshared]
2844 else
2845 portabled_link_with = [libsystemd_static,
2846 libshared_static]
2847 endif
2848
e3c68924 2849 dbus_programs += executable(
6164ec4c
ZJS
2850 'systemd-portabled',
2851 systemd_portabled_sources,
2852 include_directories : includes,
c06d2e44 2853 link_with : [portabled_link_with],
92148283
JJ
2854 dependencies : [libselinux,
2855 threads,
40c7d3c7 2856 userspace],
b0d3095f 2857 install_rpath : pkglibdir,
6164ec4c 2858 install : true,
b0d3095f 2859 install_dir : libexecdir)
6164ec4c
ZJS
2860
2861 public_programs += executable(
2862 'portablectl',
2863 'src/portable/portablectl.c',
2864 include_directories : includes,
c06d2e44 2865 link_with : [portabled_link_with],
c47511da 2866 dependencies : [threads,
40c7d3c7 2867 userspace],
b0d3095f
LB
2868 install_rpath : pkglibdir,
2869 install : true)
61d0578b
LP
2870endif
2871
9bca4ae4
LP
2872if conf.get('ENABLE_SYSEXT') == 1
2873 public_programs += executable(
2874 'systemd-sysext',
2875 systemd_sysext_sources,
2876 include_directories : includes,
2877 link_with : [libshared],
40c7d3c7 2878 dependencies : [userspace],
b0d3095f
LB
2879 install_rpath : pkglibdir,
2880 install : true)
9bca4ae4
LP
2881endif
2882
d093b62c 2883if conf.get('ENABLE_USERDB') == 1
6164ec4c
ZJS
2884 executable(
2885 'systemd-userwork',
2886 systemd_userwork_sources,
2887 include_directories : includes,
2888 link_with : [libshared],
c47511da 2889 dependencies : [threads,
40c7d3c7 2890 userspace],
b0d3095f 2891 install_rpath : pkglibdir,
6164ec4c 2892 install : true,
b0d3095f 2893 install_dir : libexecdir)
6164ec4c
ZJS
2894
2895 executable(
2896 'systemd-userdbd',
2897 systemd_userdbd_sources,
2898 include_directories : includes,
2899 link_with : [libshared],
c47511da 2900 dependencies : [threads,
40c7d3c7 2901 userspace],
b0d3095f 2902 install_rpath : pkglibdir,
6164ec4c 2903 install : true,
b0d3095f 2904 install_dir : libexecdir)
6164ec4c 2905
460e5af0 2906 public_programs += executable(
6164ec4c
ZJS
2907 'userdbctl',
2908 userdbctl_sources,
2909 include_directories : includes,
2910 link_with : [libshared],
c47511da 2911 dependencies : [threads,
40c7d3c7 2912 userspace],
b0d3095f 2913 install_rpath : pkglibdir,
003a6761 2914 install : true)
d093b62c
LP
2915endif
2916
70a5db58 2917if conf.get('ENABLE_HOMED') == 1
6164ec4c
ZJS
2918 executable(
2919 'systemd-homework',
2920 systemd_homework_sources,
2921 include_directories : includes,
f8cf3d19
LP
2922 link_with : [libshared,
2923 libshared_fdisk],
92148283 2924 dependencies : [libblkid,
6164ec4c 2925 libcrypt,
6164ec4c 2926 libfdisk,
92148283 2927 libopenssl,
c47511da 2928 libp11kit,
92148283 2929 threads,
40c7d3c7 2930 userspace],
b0d3095f 2931 install_rpath : pkglibdir,
6164ec4c 2932 install : true,
b0d3095f 2933 install_dir : libexecdir)
6164ec4c 2934
e3c68924 2935 dbus_programs += executable(
6164ec4c
ZJS
2936 'systemd-homed',
2937 systemd_homed_sources,
8d40961c 2938 include_directories : home_includes,
6164ec4c 2939 link_with : [libshared],
92148283 2940 dependencies : [libcrypt,
c47511da 2941 libm,
92148283
JJ
2942 libopenssl,
2943 threads,
40c7d3c7 2944 userspace],
b0d3095f 2945 install_rpath : pkglibdir,
6164ec4c 2946 install : true,
b0d3095f 2947 install_dir : libexecdir)
6164ec4c 2948
460e5af0 2949 public_programs += executable(
6164ec4c
ZJS
2950 'homectl',
2951 homectl_sources,
2952 include_directories : includes,
2953 link_with : [libshared],
92148283
JJ
2954 dependencies : [libcrypt,
2955 libdl,
6164ec4c
ZJS
2956 libopenssl,
2957 libp11kit,
92148283 2958 threads,
40c7d3c7 2959 userspace],
b0d3095f 2960 install_rpath : pkglibdir,
003a6761 2961 install : true)
26cf9fb7
LP
2962
2963 if conf.get('HAVE_PAM') == 1
fce9abb2 2964 version_script_arg = project_source_root / pam_systemd_home_sym
a7127884 2965 pam_systemd_home = shared_library(
26cf9fb7
LP
2966 'pam_systemd_home',
2967 pam_systemd_home_c,
2968 name_prefix : '',
2969 include_directories : includes,
2970 link_args : ['-shared',
2971 '-Wl,--version-script=' + version_script_arg],
2972 link_with : [libsystemd_static,
2973 libshared_static],
92148283 2974 dependencies : [libcrypt,
26cf9fb7 2975 libpam_misc,
92148283
JJ
2976 libpam,
2977 threads,
40c7d3c7 2978 userspace],
26cf9fb7
LP
2979 link_depends : pam_systemd_home_sym,
2980 install : true,
48139c7c 2981 install_tag : 'pam',
26cf9fb7 2982 install_dir : pamlibdir)
a7127884
YW
2983
2984 if want_tests != 'false'
2985 test('dlopen-pam_systemd_home',
2986 test_dlopen,
2987 # path to dlopen must include a slash
2988 args : pam_systemd_home.full_path(),
2989 depends : pam_systemd_home)
2990 endif
26cf9fb7 2991 endif
70a5db58
LP
2992endif
2993
6589a569 2994foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
ba081955 2995 (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
ba7f4ae6 2996 meson.add_install_script(meson_make_symlink,
b0d3095f
LB
2997 bindir / 'systemctl',
2998 sbindir / alias)
ba7f4ae6
ZJS
2999endforeach
3000
63e2d171 3001meson.add_install_script(meson_make_symlink,
b0d3095f
LB
3002 bindir / 'udevadm',
3003 libexecdir / 'systemd-udevd')
63e2d171 3004
349cc4a5 3005if conf.get('ENABLE_BACKLIGHT') == 1
6164ec4c
ZJS
3006 executable(
3007 'systemd-backlight',
3008 'src/backlight/backlight.c',
3009 include_directories : includes,
3010 link_with : [libshared],
92148283 3011 dependencies : userspace,
b0d3095f 3012 install_rpath : pkglibdir,
6164ec4c 3013 install : true,
b0d3095f 3014 install_dir : libexecdir)
5c23128d
ZJS
3015endif
3016
349cc4a5 3017if conf.get('ENABLE_RFKILL') == 1
6164ec4c
ZJS
3018 executable(
3019 'systemd-rfkill',
3020 'src/rfkill/rfkill.c',
3021 include_directories : includes,
3022 link_with : [libshared],
92148283 3023 dependencies : userspace,
b0d3095f 3024 install_rpath : pkglibdir,
6164ec4c 3025 install : true,
b0d3095f 3026 install_dir : libexecdir)
6164ec4c
ZJS
3027endif
3028
3029executable(
3030 'systemd-system-update-generator',
3031 'src/system-update-generator/system-update-generator.c',
3032 include_directories : includes,
3033 link_with : [libshared],
92148283 3034 dependencies : userspace,
b0d3095f 3035 install_rpath : pkglibdir,
6164ec4c
ZJS
3036 install : true,
3037 install_dir : systemgeneratordir)
5c23128d 3038
349cc4a5 3039if conf.get('HAVE_LIBCRYPTSETUP') == 1
6164ec4c
ZJS
3040 executable(
3041 'systemd-cryptsetup',
3042 systemd_cryptsetup_sources,
3043 include_directories : includes,
3044 link_with : [libshared],
3045 dependencies : [libcryptsetup,
92148283 3046 libopenssl,
c47511da 3047 libp11kit,
40c7d3c7 3048 userspace],
b0d3095f 3049 install_rpath : pkglibdir,
6164ec4c 3050 install : true,
b0d3095f 3051 install_dir : libexecdir)
6164ec4c
ZJS
3052
3053 executable(
3054 'systemd-cryptsetup-generator',
3055 'src/cryptsetup/cryptsetup-generator.c',
3056 include_directories : includes,
3057 link_with : [libshared],
92148283 3058 dependencies : userspace,
b0d3095f 3059 install_rpath : pkglibdir,
6164ec4c
ZJS
3060 install : true,
3061 install_dir : systemgeneratordir)
3062
3063 executable(
3064 'systemd-veritysetup',
3065 'src/veritysetup/veritysetup.c',
3066 include_directories : includes,
3067 link_with : [libshared],
c47511da 3068 dependencies : [libcryptsetup,
40c7d3c7 3069 userspace],
b0d3095f 3070 install_rpath : pkglibdir,
6164ec4c 3071 install : true,
b0d3095f 3072 install_dir : libexecdir)
6164ec4c
ZJS
3073
3074 executable(
3075 'systemd-veritysetup-generator',
3076 'src/veritysetup/veritysetup-generator.c',
3077 include_directories : includes,
3078 link_with : [libshared],
40c7d3c7 3079 dependencies : [userspace],
b0d3095f 3080 install_rpath : pkglibdir,
6164ec4c
ZJS
3081 install : true,
3082 install_dir : systemgeneratordir)
8710a681 3083
3761002e 3084 public_programs += executable(
8710a681
LP
3085 'systemd-cryptenroll',
3086 systemd_cryptenroll_sources,
3087 include_directories : includes,
3088 link_with : [libshared],
3089 dependencies : [libcryptsetup,
5e521624 3090 libdl,
8710a681 3091 libopenssl,
c47511da 3092 libp11kit,
40c7d3c7 3093 userspace],
b0d3095f 3094 install_rpath : pkglibdir,
a1fd722b 3095 install : true)
1f1a2243
TA
3096
3097 executable(
3098 'systemd-integritysetup',
3099 ['src/integritysetup/integritysetup.c', 'src/integritysetup/integrity-util.c'],
3100 include_directories : includes,
3101 link_with : [libshared],
c47511da 3102 dependencies : [libcryptsetup,
40c7d3c7 3103 userspace],
b0d3095f 3104 install_rpath : pkglibdir,
1f1a2243 3105 install : true,
b0d3095f 3106 install_dir : libexecdir)
1f1a2243
TA
3107
3108 executable(
3109 'systemd-integritysetup-generator',
3110 ['src/integritysetup/integritysetup-generator.c', 'src/integritysetup/integrity-util.c'],
3111 include_directories : includes,
3112 link_with : [libshared],
92148283 3113 dependencies : userspace,
b0d3095f 3114 install_rpath : pkglibdir,
1f1a2243
TA
3115 install : true,
3116 install_dir : systemgeneratordir)
5c23128d
ZJS
3117endif
3118
349cc4a5 3119if conf.get('HAVE_SYSV_COMPAT') == 1
e93ada98 3120 exe = executable(
6164ec4c
ZJS
3121 'systemd-sysv-generator',
3122 'src/sysv-generator/sysv-generator.c',
3123 include_directories : includes,
3124 link_with : [libshared],
92148283 3125 dependencies : userspace,
b0d3095f 3126 install_rpath : pkglibdir,
6164ec4c
ZJS
3127 install : true,
3128 install_dir : systemgeneratordir)
3129
e93ada98
DDM
3130 sysv_generator_test_py = find_program('test/sysv-generator-test.py')
3131 if want_tests != 'false'
3132 test('sysv-generator-test',
3133 sysv_generator_test_py,
3134 depends : exe)
3135 endif
3136
6164ec4c
ZJS
3137 executable(
3138 'systemd-rc-local-generator',
3139 'src/rc-local-generator/rc-local-generator.c',
3140 include_directories : includes,
3141 link_with : [libshared],
92148283 3142 dependencies : userspace,
b0d3095f 3143 install_rpath : pkglibdir,
6164ec4c
ZJS
3144 install : true,
3145 install_dir : systemgeneratordir)
5c23128d
ZJS
3146endif
3147
8feca247
BB
3148if conf.get('ENABLE_XDG_AUTOSTART') == 1
3149 executable(
3150 'systemd-xdg-autostart-generator',
0275e918 3151 systemd_xdg_autostart_generator_sources,
8feca247
BB
3152 include_directories : includes,
3153 link_with : [libshared],
92148283 3154 dependencies : userspace,
b0d3095f 3155 install_rpath : pkglibdir,
8feca247
BB
3156 install : true,
3157 install_dir : usergeneratordir)
3158
3159 executable(
3160 'systemd-xdg-autostart-condition',
3161 'src/xdg-autostart-generator/xdg-autostart-condition.c',
3162 include_directories : includes,
3163 link_with : [libshared],
92148283 3164 dependencies : userspace,
b0d3095f 3165 install_rpath : pkglibdir,
8feca247 3166 install : true,
b0d3095f 3167 install_dir : libexecdir)
8feca247
BB
3168endif
3169
349cc4a5 3170if conf.get('ENABLE_HOSTNAMED') == 1
e3c68924 3171 dbus_programs += executable(
6164ec4c
ZJS
3172 'systemd-hostnamed',
3173 'src/hostname/hostnamed.c',
3174 include_directories : includes,
3175 link_with : [libshared],
92148283 3176 dependencies : userspace,
b0d3095f 3177 install_rpath : pkglibdir,
6164ec4c 3178 install : true,
b0d3095f 3179 install_dir : libexecdir)
6164ec4c
ZJS
3180
3181 public_programs += executable(
3182 'hostnamectl',
3183 'src/hostname/hostnamectl.c',
3184 include_directories : includes,
3185 link_with : [libshared],
40c7d3c7 3186 dependencies : [userspace],
b0d3095f 3187 install_rpath : pkglibdir,
6164ec4c 3188 install : true)
5c23128d
ZJS
3189endif
3190
349cc4a5 3191if conf.get('ENABLE_LOCALED') == 1
e3c68924 3192 dbus_programs += executable(
6164ec4c
ZJS
3193 'systemd-localed',
3194 systemd_localed_sources,
bfa0ade9 3195 include_directories : includes,
6164ec4c 3196 link_with : [libshared],
d45cbc07 3197 dependencies : libxkbcommon_deps +
40c7d3c7 3198 [userspace],
b0d3095f 3199 install_rpath : pkglibdir,
6164ec4c 3200 install : true,
b0d3095f 3201 install_dir : libexecdir)
6164ec4c
ZJS
3202
3203 public_programs += executable(
3204 'localectl',
3205 localectl_sources,
3206 include_directories : includes,
3207 link_with : [libshared],
40c7d3c7 3208 dependencies : [userspace],
b0d3095f 3209 install_rpath : pkglibdir,
6164ec4c 3210 install : true)
5c23128d
ZJS
3211endif
3212
349cc4a5 3213if conf.get('ENABLE_TIMEDATED') == 1
e3c68924 3214 dbus_programs += executable(
6164ec4c
ZJS
3215 'systemd-timedated',
3216 'src/timedate/timedated.c',
3217 include_directories : includes,
3218 link_with : [libshared],
92148283 3219 dependencies : userspace,
b0d3095f 3220 install_rpath : pkglibdir,
6164ec4c 3221 install : true,
b0d3095f 3222 install_dir : libexecdir)
6129ec85 3223endif
5c23128d 3224
6129ec85 3225if conf.get('ENABLE_TIMEDATECTL') == 1
6164ec4c
ZJS
3226 public_programs += executable(
3227 'timedatectl',
3228 'src/timedate/timedatectl.c',
3229 include_directories : includes,
b0d3095f 3230 install_rpath : pkglibdir,
6164ec4c 3231 link_with : [libshared],
c47511da 3232 dependencies : [libm,
40c7d3c7 3233 userspace],
6164ec4c 3234 install : true)
5c23128d
ZJS
3235endif
3236
349cc4a5 3237if conf.get('ENABLE_TIMESYNCD') == 1
6164ec4c
ZJS
3238 executable(
3239 'systemd-timesyncd',
3240 systemd_timesyncd_sources,
3241 include_directories : includes,
f5a5284e 3242 link_with : [libtimesyncd_core],
92148283
JJ
3243 dependencies : [libm,
3244 threads,
40c7d3c7 3245 userspace],
b0d3095f 3246 install_rpath : pkglibdir,
6164ec4c 3247 install : true,
b0d3095f 3248 install_dir : libexecdir)
6164ec4c
ZJS
3249
3250 executable(
3251 'systemd-time-wait-sync',
cf242350 3252 'src/timesync/wait-sync.c',
6164ec4c 3253 include_directories : includes,
f5a5284e 3254 link_with : [libtimesyncd_core],
92148283 3255 dependencies : userspace,
b0d3095f 3256 install_rpath : pkglibdir,
6164ec4c 3257 install : true,
b0d3095f 3258 install_dir : libexecdir)
5c23128d
ZJS
3259endif
3260
349cc4a5 3261if conf.get('ENABLE_MACHINED') == 1
e3c68924 3262 dbus_programs += executable(
6164ec4c
ZJS
3263 'systemd-machined',
3264 systemd_machined_sources,
3265 include_directories : includes,
3266 link_with : [libmachine_core,
3267 libshared],
92148283 3268 dependencies : userspace,
b0d3095f 3269 install_rpath : pkglibdir,
6164ec4c 3270 install : true,
b0d3095f 3271 install_dir : libexecdir)
6164ec4c
ZJS
3272
3273 public_programs += executable(
3274 'machinectl',
3275 'src/machine/machinectl.c',
3276 include_directories : includes,
3277 link_with : [libshared],
92148283 3278 dependencies : [liblz4,
6164ec4c 3279 libxz,
c47511da 3280 libzstd,
92148283 3281 threads,
40c7d3c7 3282 userspace],
b0d3095f
LB
3283 install_rpath : pkglibdir,
3284 install : true)
5c23128d
ZJS
3285endif
3286
349cc4a5 3287if conf.get('ENABLE_IMPORTD') == 1
e3c68924 3288 dbus_programs += executable(
6164ec4c
ZJS
3289 'systemd-importd',
3290 systemd_importd_sources,
3291 include_directories : includes,
3292 link_with : [libshared],
c47511da 3293 dependencies : [threads,
40c7d3c7 3294 userspace],
b0d3095f 3295 install_rpath : pkglibdir,
6164ec4c 3296 install : true,
b0d3095f 3297 install_dir : libexecdir)
6164ec4c
ZJS
3298
3299 systemd_pull = executable(
3300 'systemd-pull',
3301 systemd_pull_sources,
3302 include_directories : includes,
b93f018f
ZJS
3303 link_with : [libshared,
3304 lib_import_common],
92148283 3305 dependencies : [lib_openssl_or_gcrypt,
6164ec4c 3306 libbzip2,
92148283 3307 libcurl,
c47511da 3308 libxz,
92148283 3309 libz,
40c7d3c7 3310 userspace],
b0d3095f 3311 install_rpath : pkglibdir,
6164ec4c 3312 install : true,
b0d3095f 3313 install_dir : libexecdir)
6164ec4c
ZJS
3314
3315 systemd_import = executable(
3316 'systemd-import',
3317 systemd_import_sources,
3318 include_directories : includes,
b93f018f
ZJS
3319 link_with : [libshared,
3320 lib_import_common],
92148283
JJ
3321 dependencies : [libbzip2,
3322 libcurl,
c47511da 3323 libxz,
92148283 3324 libz,
40c7d3c7 3325 userspace],
b0d3095f 3326 install_rpath : pkglibdir,
6164ec4c 3327 install : true,
b0d3095f 3328 install_dir : libexecdir)
6164ec4c
ZJS
3329
3330 systemd_import_fs = executable(
3331 'systemd-import-fs',
3332 systemd_import_fs_sources,
3333 include_directories : includes,
b93f018f
ZJS
3334 link_with : [libshared,
3335 lib_import_common],
40c7d3c7 3336 dependencies : [userspace],
b0d3095f 3337 install_rpath : pkglibdir,
6164ec4c 3338 install : true,
b0d3095f 3339 install_dir : libexecdir)
6164ec4c
ZJS
3340
3341 systemd_export = executable(
3342 'systemd-export',
3343 systemd_export_sources,
3344 include_directories : includes,
b93f018f
ZJS
3345 link_with : [libshared,
3346 lib_import_common],
92148283
JJ
3347 dependencies : [libbzip2,
3348 libcurl,
c47511da 3349 libxz,
92148283 3350 libz,
40c7d3c7 3351 userspace],
b0d3095f 3352 install_rpath : pkglibdir,
6164ec4c 3353 install : true,
b0d3095f 3354 install_dir : libexecdir)
1d7579c4
LP
3355
3356 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
37efbbd8
ZJS
3357endif
3358
349cc4a5 3359if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
6164ec4c
ZJS
3360 public_programs += executable(
3361 'systemd-journal-upload',
3362 systemd_journal_upload_sources,
3363 include_directories : includes,
3364 link_with : [libshared],
92148283 3365 dependencies : [libcurl,
6164ec4c 3366 libgnutls,
ef5924aa 3367 liblz4,
92148283 3368 libxz,
c47511da 3369 libzstd,
92148283 3370 threads,
40c7d3c7 3371 userspace],
b0d3095f 3372 install_rpath : pkglibdir,
6164ec4c 3373 install : true,
b0d3095f 3374 install_dir : libexecdir)
5c23128d
ZJS
3375endif
3376
349cc4a5 3377if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
6164ec4c
ZJS
3378 public_programs += executable(
3379 'systemd-journal-remote',
3380 systemd_journal_remote_sources,
035b0f8f 3381 include_directories : journal_includes,
6164ec4c
ZJS
3382 link_with : [libshared,
3383 libsystemd_journal_remote],
92148283
JJ
3384 dependencies : [libgnutls,
3385 liblz4,
6164ec4c 3386 libmicrohttpd,
6164ec4c 3387 libxz,
c47511da 3388 libzstd,
92148283 3389 threads,
40c7d3c7 3390 userspace],
b0d3095f 3391 install_rpath : pkglibdir,
6164ec4c 3392 install : true,
b0d3095f 3393 install_dir : libexecdir)
6164ec4c
ZJS
3394
3395 public_programs += executable(
3396 'systemd-journal-gatewayd',
3397 systemd_journal_gatewayd_sources,
035b0f8f 3398 include_directories : journal_includes,
6164ec4c 3399 link_with : [libshared],
92148283
JJ
3400 dependencies : [libgnutls,
3401 liblz4,
6164ec4c 3402 libmicrohttpd,
6164ec4c 3403 libxz,
c47511da 3404 libzstd,
92148283 3405 threads,
40c7d3c7 3406 userspace],
b0d3095f 3407 install_rpath : pkglibdir,
6164ec4c 3408 install : true,
b0d3095f 3409 install_dir : libexecdir)
5c23128d
ZJS
3410endif
3411
349cc4a5 3412if conf.get('ENABLE_COREDUMP') == 1
6164ec4c
ZJS
3413 executable(
3414 'systemd-coredump',
3415 systemd_coredump_sources,
3416 include_directories : includes,
acc50c92
LP
3417 link_with : [libshared,
3418 libbasic_compress],
92148283 3419 dependencies : [libacl,
ef5924aa 3420 liblz4,
92148283 3421 libxz,
c47511da 3422 libzstd,
92148283 3423 threads,
40c7d3c7 3424 userspace],
b0d3095f 3425 install_rpath : pkglibdir,
6164ec4c 3426 install : true,
b0d3095f 3427 install_dir : libexecdir)
6164ec4c
ZJS
3428
3429 public_programs += executable(
3430 'coredumpctl',
3431 coredumpctl_sources,
3432 include_directories : includes,
acc50c92
LP
3433 link_with : [libshared,
3434 libbasic_compress],
92148283 3435 dependencies : [liblz4,
6164ec4c 3436 libxz,
c47511da 3437 libzstd,
92148283 3438 threads,
40c7d3c7 3439 userspace],
b0d3095f 3440 install_rpath : pkglibdir,
6164ec4c 3441 install : true)
5c23128d
ZJS
3442endif
3443
9b4abc69 3444if conf.get('ENABLE_PSTORE') == 1
6164ec4c
ZJS
3445 executable(
3446 'systemd-pstore',
3447 systemd_pstore_sources,
3448 include_directories : includes,
3449 link_with : [libshared],
92148283 3450 dependencies : [libacl,
ef5924aa 3451 liblz4,
92148283 3452 libxz,
c47511da 3453 libzstd,
92148283 3454 threads,
40c7d3c7 3455 userspace],
b0d3095f 3456 install_rpath : pkglibdir,
6164ec4c 3457 install : true,
b0d3095f 3458 install_dir : libexecdir)
9b4abc69
ED
3459endif
3460
9de5e321 3461if conf.get('ENABLE_OOMD') == 1
e3c68924 3462 dbus_programs += executable('systemd-oomd',
9de5e321
AZ
3463 systemd_oomd_sources,
3464 include_directories : includes,
3465 link_with : [libshared],
c47511da 3466 dependencies : [libatomic,
40c7d3c7 3467 userspace],
b0d3095f 3468 install_rpath : pkglibdir,
9de5e321 3469 install : true,
b0d3095f 3470 install_dir : libexecdir)
5c616ecf
AZ
3471
3472 public_programs += executable(
ba081955
ZJS
3473 'oomctl',
3474 oomctl_sources,
3475 include_directories : includes,
3476 link_with : [libshared],
40c7d3c7 3477 dependencies : [userspace],
b0d3095f 3478 install_rpath : pkglibdir,
cfd4c84a 3479 install : true)
9de5e321
AZ
3480endif
3481
349cc4a5 3482if conf.get('ENABLE_BINFMT') == 1
6164ec4c
ZJS
3483 public_programs += executable(
3484 'systemd-binfmt',
3485 'src/binfmt/binfmt.c',
3486 include_directories : includes,
3487 link_with : [libshared],
40c7d3c7 3488 dependencies : [userspace],
b0d3095f 3489 install_rpath : pkglibdir,
6164ec4c 3490 install : true,
b0d3095f 3491 install_dir : libexecdir)
37efbbd8 3492
7c22f07c
ZJS
3493 meson.add_install_script('sh', '-c',
3494 mkdir_p.format(binfmtdir))
d7aa78c3 3495 if install_sysconfdir
7c22f07c 3496 meson.add_install_script('sh', '-c',
fce9abb2 3497 mkdir_p.format(sysconfdir / 'binfmt.d'))
d7aa78c3 3498 endif
37efbbd8
ZJS
3499endif
3500
43cc7a3e
LP
3501if conf.get('ENABLE_SYSUPDATE') == 1
3502 exe = executable(
3503 'systemd-sysupdate',
3504 systemd_sysupdate_sources,
3505 include_directories : includes,
f8cf3d19
LP
3506 link_with : [libshared,
3507 libshared_fdisk],
92148283 3508 dependencies : [libblkid,
43cc7a3e 3509 libfdisk,
c47511da 3510 libopenssl,
92148283 3511 threads,
40c7d3c7 3512 userspace],
b0d3095f 3513 install_rpath : pkglibdir,
43cc7a3e 3514 install : true,
b0d3095f 3515 install_dir : libexecdir)
43cc7a3e
LP
3516 public_programs += exe
3517endif
3518
349cc4a5 3519if conf.get('ENABLE_VCONSOLE') == 1
6164ec4c
ZJS
3520 executable(
3521 'systemd-vconsole-setup',
3522 'src/vconsole/vconsole-setup.c',
3523 include_directories : includes,
3524 link_with : [libshared],
92148283 3525 dependencies : userspace,
b0d3095f 3526 install_rpath : pkglibdir,
6164ec4c 3527 install : true,
b0d3095f 3528 install_dir : libexecdir)
5c23128d
ZJS
3529endif
3530
349cc4a5 3531if conf.get('ENABLE_RANDOMSEED') == 1
6164ec4c
ZJS
3532 executable(
3533 'systemd-random-seed',
3534 'src/random-seed/random-seed.c',
3535 include_directories : includes,
3536 link_with : [libshared],
40c7d3c7 3537 dependencies : [userspace],
b0d3095f 3538 install_rpath : pkglibdir,
6164ec4c 3539 install : true,
b0d3095f 3540 install_dir : libexecdir)
5c23128d
ZJS
3541endif
3542
349cc4a5 3543if conf.get('ENABLE_FIRSTBOOT') == 1
3761002e 3544 public_programs += executable(
6164ec4c
ZJS
3545 'systemd-firstboot',
3546 'src/firstboot/firstboot.c',
3547 include_directories : includes,
3548 link_with : [libshared],
c47511da 3549 dependencies : [libcrypt,
40c7d3c7 3550 userspace],
b0d3095f
LB
3551 install_rpath : pkglibdir,
3552 install : true)
6164ec4c
ZJS
3553endif
3554
3555executable(
3556 'systemd-remount-fs',
3557 'src/remount-fs/remount-fs.c',
3558 include_directories : includes,
bac11cd6 3559 link_with : [libshared],
40c7d3c7 3560 dependencies : [userspace],
b0d3095f 3561 install_rpath : pkglibdir,
6164ec4c 3562 install : true,
b0d3095f 3563 install_dir : libexecdir)
5c23128d 3564
6164ec4c
ZJS
3565executable(
3566 'systemd-machine-id-setup',
3567 'src/machine-id-setup/machine-id-setup-main.c',
3568 include_directories : includes,
bac11cd6 3569 link_with : [libshared],
40c7d3c7 3570 dependencies : [userspace],
b0d3095f
LB
3571 install_rpath : pkglibdir,
3572 install : true)
5c23128d 3573
6164ec4c
ZJS
3574executable(
3575 'systemd-fsck',
3576 'src/fsck/fsck.c',
3577 include_directories : includes,
3578 link_with : [libshared],
40c7d3c7 3579 dependencies : [userspace],
b0d3095f 3580 install_rpath : pkglibdir,
6164ec4c 3581 install : true,
b0d3095f 3582 install_dir : libexecdir)
5c23128d 3583
c47511da
ZJS
3584executable(
3585 'systemd-growfs',
3586 'src/partition/growfs.c',
3587 include_directories : includes,
3588 link_with : [libshared],
40c7d3c7 3589 dependencies : [userspace],
b0d3095f 3590 install_rpath : pkglibdir,
c47511da 3591 install : true,
b0d3095f 3592 install_dir : libexecdir)
80750adb 3593
6164ec4c
ZJS
3594executable(
3595 'systemd-makefs',
3596 'src/partition/makefs.c',
3597 include_directories : includes,
3598 link_with : [libshared],
40c7d3c7 3599 dependencies : [userspace],
b0d3095f 3600 install_rpath : pkglibdir,
6164ec4c 3601 install : true,
b0d3095f 3602 install_dir : libexecdir)
b7f28ac5 3603
6164ec4c
ZJS
3604executable(
3605 'systemd-sleep',
3606 'src/sleep/sleep.c',
3607 include_directories : includes,
3608 link_with : [libshared],
40c7d3c7 3609 dependencies : [userspace],
b0d3095f 3610 install_rpath : pkglibdir,
6164ec4c 3611 install : true,
b0d3095f 3612 install_dir : libexecdir)
5c23128d 3613
225d08b8 3614if install_sysconfdir_samples
d7aa78c3
JT
3615 install_data('src/sleep/sleep.conf',
3616 install_dir : pkgsysconfdir)
3617endif
d25e127d 3618
6164ec4c
ZJS
3619public_programs += executable(
3620 'systemd-sysctl',
3621 'src/sysctl/sysctl.c',
3622 include_directories : includes,
3623 link_with : [libshared],
40c7d3c7 3624 dependencies : [userspace],
b0d3095f 3625 install_rpath : pkglibdir,
6164ec4c 3626 install : true,
b0d3095f 3627 install_dir : libexecdir)
5c23128d 3628
251dc2f1 3629public_programs += executable(
6164ec4c
ZJS
3630 'systemd-ac-power',
3631 'src/ac-power/ac-power.c',
3632 include_directories : includes,
3633 link_with : [libshared],
40c7d3c7 3634 dependencies : [userspace],
b0d3095f 3635 install_rpath : pkglibdir,
251dc2f1 3636 install : true)
5c23128d 3637
6164ec4c
ZJS
3638public_programs += executable(
3639 'systemd-detect-virt',
3640 'src/detect-virt/detect-virt.c',
3641 include_directories : includes,
3642 link_with : [libshared],
40c7d3c7 3643 dependencies : [userspace],
b0d3095f 3644 install_rpath : pkglibdir,
6164ec4c 3645 install : true)
5c23128d 3646
6164ec4c
ZJS
3647public_programs += executable(
3648 'systemd-delta',
3649 'src/delta/delta.c',
3650 include_directories : includes,
3651 link_with : [libshared],
40c7d3c7 3652 dependencies : [userspace],
b0d3095f 3653 install_rpath : pkglibdir,
6164ec4c 3654 install : true)
5c23128d 3655
6164ec4c
ZJS
3656public_programs += executable(
3657 'systemd-escape',
3658 'src/escape/escape.c',
3659 include_directories : includes,
3660 link_with : [libshared],
40c7d3c7 3661 dependencies : [userspace],
b0d3095f
LB
3662 install_rpath : pkglibdir,
3663 install : true)
6164ec4c
ZJS
3664
3665public_programs += executable(
3666 'systemd-notify',
3667 'src/notify/notify.c',
3668 include_directories : includes,
3669 link_with : [libshared],
40c7d3c7 3670 dependencies : [userspace],
b0d3095f
LB
3671 install_rpath : pkglibdir,
3672 install : true)
6164ec4c 3673
5945640e
LP
3674public_programs += executable(
3675 'systemd-creds',
3676 'src/creds/creds.c',
3677 include_directories : includes,
3678 link_with : [libshared],
3679 dependencies : [threads,
c47511da 3680 libopenssl,
40c7d3c7 3681 userspace],
b0d3095f
LB
3682 install_rpath : pkglibdir,
3683 install : true)
5945640e 3684
e3d4148d
OJ
3685public_programs += executable(
3686 'systemd-battery-check',
3687 'src/battery-check/battery-check.c',
3688 include_directories : includes,
3689 link_with : [libshared],
40c7d3c7 3690 dependencies : [userspace],
b0d3095f
LB
3691 install_rpath : pkglibdir,
3692 install_dir : libexecdir,
e3d4148d
OJ
3693 install : true)
3694
24039e12
DDM
3695# Protecting files from the distro in /usr doesn't make sense since they can be trivially accessed otherwise,
3696# so don't restrict the access mode in /usr. That doesn't apply to /etc, so we do restrict the access mode
3697# there.
3698meson.add_install_script('sh', '-c', mkdir_p.format(credstoredir))
3699if install_sysconfdir
40fb9eeb 3700 # Keep in sync with tmpfiles.d/credstore.conf
24039e12 3701 meson.add_install_script('sh', '-c', mkdir_p_mode.format(sysconfdir / 'credstore', '0700'))
40fb9eeb 3702 meson.add_install_script('sh', '-c', mkdir_p_mode.format(sysconfdir / 'credstore.encrypted', '0700'))
24039e12
DDM
3703endif
3704
6164ec4c
ZJS
3705executable(
3706 'systemd-volatile-root',
3707 'src/volatile-root/volatile-root.c',
3708 include_directories : includes,
3709 link_with : [libshared],
92148283 3710 dependencies : userspace,
b0d3095f 3711 install_rpath : pkglibdir,
cdf7ad38 3712 install : conf.get('ENABLE_INITRD') == 1,
b0d3095f 3713 install_dir : libexecdir)
6164ec4c
ZJS
3714
3715executable(
3716 'systemd-cgroups-agent',
3717 'src/cgroups-agent/cgroups-agent.c',
3718 include_directories : includes,
3719 link_with : [libshared],
92148283 3720 dependencies : userspace,
b0d3095f 3721 install_rpath : pkglibdir,
6164ec4c 3722 install : true,
b0d3095f 3723 install_dir : libexecdir)
6164ec4c 3724
2a2d002f 3725systemd_id128 = executable(
6164ec4c
ZJS
3726 'systemd-id128',
3727 'src/id128/id128.c',
3728 include_directories : includes,
3729 link_with : [libshared],
40c7d3c7 3730 dependencies : [userspace],
b0d3095f 3731 install_rpath : pkglibdir,
6164ec4c 3732 install : true)
2a2d002f
ZJS
3733public_programs += systemd_id128
3734
3735if want_tests != 'false'
3736 test('test-systemctl-enable',
3737 test_systemctl_enable_sh,
3738 # https://github.com/mesonbuild/meson/issues/2681
3739 args : [systemctl.full_path(),
3740 systemd_id128.full_path()])
3741endif
6164ec4c
ZJS
3742
3743public_programs += executable(
3744 'systemd-path',
3745 'src/path/path.c',
3746 include_directories : includes,
3747 link_with : [libshared],
40c7d3c7 3748 dependencies : [userspace],
b0d3095f 3749 install_rpath : pkglibdir,
6164ec4c
ZJS
3750 install : true)
3751
3752public_programs += executable(
3753 'systemd-ask-password',
3754 'src/ask-password/ask-password.c',
3755 include_directories : includes,
3756 link_with : [libshared],
40c7d3c7 3757 dependencies : [userspace],
b0d3095f
LB
3758 install_rpath : pkglibdir,
3759 install : true)
6164ec4c
ZJS
3760
3761executable(
3762 'systemd-reply-password',
3763 'src/reply-password/reply-password.c',
3764 include_directories : includes,
3765 link_with : [libshared],
92148283 3766 dependencies : userspace,
b0d3095f 3767 install_rpath : pkglibdir,
6164ec4c 3768 install : true,
b0d3095f 3769 install_dir : libexecdir)
6164ec4c
ZJS
3770
3771public_programs += executable(
3772 'systemd-tty-ask-password-agent',
3773 'src/tty-ask-password-agent/tty-ask-password-agent.c',
3774 include_directories : includes,
3775 link_with : [libshared],
40c7d3c7 3776 dependencies : [userspace],
b0d3095f
LB
3777 install_rpath : pkglibdir,
3778 install : true)
6164ec4c
ZJS
3779
3780public_programs += executable(
3781 'systemd-cgls',
3782 'src/cgls/cgls.c',
3783 include_directories : includes,
3784 link_with : [libshared],
40c7d3c7 3785 dependencies : [userspace],
b0d3095f 3786 install_rpath : pkglibdir,
6164ec4c
ZJS
3787 install : true)
3788
3789public_programs += executable(
3790 'systemd-cgtop',
3791 'src/cgtop/cgtop.c',
3792 include_directories : includes,
3793 link_with : [libshared],
40c7d3c7 3794 dependencies : [userspace],
b0d3095f 3795 install_rpath : pkglibdir,
6164ec4c
ZJS
3796 install : true)
3797
3798executable(
3799 'systemd-initctl',
3800 'src/initctl/initctl.c',
3801 include_directories : includes,
3802 link_with : [libshared],
92148283 3803 dependencies : userspace,
b0d3095f 3804 install_rpath : pkglibdir,
6589a569 3805 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
b0d3095f 3806 install_dir : libexecdir)
5c23128d 3807
6164ec4c
ZJS
3808public_programs += executable(
3809 'systemd-mount',
3810 'src/mount/mount-tool.c',
3811 include_directories : includes,
3812 link_with : [libshared],
c47511da 3813 dependencies: [libmount,
40c7d3c7 3814 userspace],
b0d3095f 3815 install_rpath : pkglibdir,
6164ec4c 3816 install : true)
5c23128d 3817
7b76fce1 3818meson.add_install_script(meson_make_symlink,
fce9abb2 3819 'systemd-mount', bindir / 'systemd-umount')
7b76fce1 3820
6164ec4c
ZJS
3821public_programs += executable(
3822 'systemd-run',
3823 'src/run/run.c',
3824 include_directories : includes,
3825 link_with : [libshared],
40c7d3c7 3826 dependencies : [userspace],
b0d3095f 3827 install_rpath : pkglibdir,
6164ec4c
ZJS
3828 install : true)
3829
3830public_programs += executable(
3831 'systemd-stdio-bridge',
3832 'src/stdio-bridge/stdio-bridge.c',
3833 include_directories : includes,
3834 link_with : [libshared],
40c7d3c7 3835 dependencies : [userspace],
b0d3095f 3836 install_rpath : pkglibdir,
6164ec4c
ZJS
3837 install : true)
3838
3839public_programs += executable(
3840 'busctl',
f98df767 3841 busctl_sources,
6164ec4c
ZJS
3842 include_directories : includes,
3843 link_with : [libshared],
40c7d3c7 3844 dependencies : [userspace],
b0d3095f 3845 install_rpath : pkglibdir,
6164ec4c 3846 install : true)
5c23128d 3847
bd7e6aa7
ZJS
3848if enable_sysusers
3849 exe = executable(
6164ec4c
ZJS
3850 'systemd-sysusers',
3851 'src/sysusers/sysusers.c',
3852 include_directories : includes,
3853 link_with : [libshared],
40c7d3c7 3854 dependencies : [userspace],
b0d3095f
LB
3855 install_rpath : pkglibdir,
3856 install : true)
bd7e6aa7
ZJS
3857 public_programs += exe
3858
3859 if want_tests != 'false'
3860 test('test-sysusers',
3861 test_sysusers_sh,
3862 # https://github.com/mesonbuild/meson/issues/2681
3863 args : exe.full_path())
3864 endif
8ef8f3d5 3865
b62ee354
ZJS
3866 exe = executable(
3867 'systemd-sysusers.standalone',
3868 'src/sysusers/sysusers.c',
3869 include_directories : includes,
3870 c_args : '-DSTANDALONE',
3871 link_with : [libshared_static,
3872 libbasic,
3873 libbasic_gcrypt,
3874 libsystemd_static],
40c7d3c7 3875 dependencies : [userspace],
b62ee354 3876 build_by_default: have_standalone_binaries,
b0d3095f 3877 install : have_standalone_binaries)
8ef8f3d5 3878 if have_standalone_binaries
bd7e6aa7
ZJS
3879 public_programs += exe
3880
3881 if want_tests != 'false'
3882 test('test-sysusers.standalone',
3883 test_sysusers_sh,
3884 # https://github.com/mesonbuild/meson/issues/2681
3885 args : exe.full_path())
3886 endif
8ef8f3d5 3887 endif
5c23128d
ZJS
3888endif
3889
349cc4a5 3890if conf.get('ENABLE_TMPFILES') == 1
6164ec4c
ZJS
3891 exe = executable(
3892 'systemd-tmpfiles',
db64ba81 3893 systemd_tmpfiles_sources,
6164ec4c
ZJS
3894 include_directories : includes,
3895 link_with : [libshared],
c47511da 3896 dependencies : [libacl,
40c7d3c7 3897 userspace],
b0d3095f
LB
3898 install_rpath : pkglibdir,
3899 install : true)
5a8b1640 3900 public_programs += exe
d9daae55 3901
938be089
ZJS
3902 if want_tests != 'false'
3903 test('test-systemd-tmpfiles',
3904 test_systemd_tmpfiles_py,
3905 # https://github.com/mesonbuild/meson/issues/2681
3906 args : exe.full_path())
3907 endif
db64ba81 3908
b62ee354
ZJS
3909 exe = executable(
3910 'systemd-tmpfiles.standalone',
3911 systemd_tmpfiles_sources,
3912 include_directories : includes,
3913 c_args : '-DSTANDALONE',
3914 link_with : [libshared_static,
3915 libbasic,
3916 libbasic_gcrypt,
3917 libsystemd_static],
3918 dependencies : [libacl,
40c7d3c7 3919 userspace],
b62ee354 3920 build_by_default: have_standalone_binaries,
b0d3095f 3921 install : have_standalone_binaries)
db64ba81 3922 if have_standalone_binaries
bf93f24a
MG
3923 public_programs += exe
3924
3925 if want_tests != 'false'
3926 test('test-systemd-tmpfiles.standalone',
3927 test_systemd_tmpfiles_py,
3928 # https://github.com/mesonbuild/meson/issues/2681
3929 args : exe.full_path())
3930 endif
db64ba81 3931 endif
5c23128d
ZJS
3932endif
3933
349cc4a5 3934if conf.get('ENABLE_HWDB') == 1
ecd1bfdd 3935 systemd_hwdb = executable(
6164ec4c
ZJS
3936 'systemd-hwdb',
3937 'src/hwdb/hwdb.c',
6164ec4c 3938 include_directories : includes,
e4b127e2 3939 link_with : udev_link_with,
40c7d3c7 3940 dependencies : [userspace],
6164ec4c 3941 install_rpath : udev_rpath,
b0d3095f 3942 install : true)
ecd1bfdd
ZJS
3943 public_programs += systemd_hwdb
3944
3945 if want_tests != 'false'
3946 test('hwdb-test',
3947 hwdb_test_sh,
02e0f430 3948 suite : 'dist',
ecd1bfdd
ZJS
3949 args : [systemd_hwdb.full_path()],
3950 timeout : 90)
3951 endif
37efbbd8
ZJS
3952endif
3953
349cc4a5 3954if conf.get('ENABLE_QUOTACHECK') == 1
6164ec4c
ZJS
3955 executable(
3956 'systemd-quotacheck',
3957 'src/quotacheck/quotacheck.c',
3958 include_directories : includes,
3959 link_with : [libshared],
92148283 3960 dependencies : userspace,
b0d3095f 3961 install_rpath : pkglibdir,
6164ec4c 3962 install : true,
b0d3095f 3963 install_dir : libexecdir)
6164ec4c
ZJS
3964endif
3965
3966public_programs += executable(
3967 'systemd-socket-proxyd',
3968 'src/socket-proxy/socket-proxyd.c',
3969 include_directories : includes,
3970 link_with : [libshared],
c47511da 3971 dependencies : [threads,
40c7d3c7 3972 userspace],
b0d3095f 3973 install_rpath : pkglibdir,
6164ec4c 3974 install : true,
b0d3095f 3975 install_dir : libexecdir)
5c23128d 3976
9b264c1d 3977udevadm = executable(
6164ec4c
ZJS
3978 'udevadm',
3979 udevadm_sources,
6164ec4c 3980 include_directories : includes,
e4b127e2 3981 link_with : [libudevd_core],
92148283 3982 dependencies : [libacl,
c47511da 3983 libblkid,
92148283
JJ
3984 libidn,
3985 libkmod,
3986 threads,
40c7d3c7 3987 userspace],
6164ec4c 3988 install_rpath : udev_rpath,
b0d3095f 3989 install : true)
9b264c1d
FS
3990public_programs += udevadm
3991
9382642c
DL
3992if want_tests != 'false'
3993 test('udev-rules-check',
3994 udevadm,
02e0f430 3995 suite : 'dist',
9382642c
DL
3996 args : ['verify', '--resolve-names=never', all_rules])
3997endif
3998
9b264c1d
FS
3999if conf.get('ENABLE_REPART') == 1
4000 exe = executable(
4001 'systemd-repart',
4002 systemd_repart_sources,
4003 include_directories : includes,
f8cf3d19
LP
4004 link_with : [libshared,
4005 libshared_fdisk],
92148283 4006 dependencies : [libblkid,
b456191d 4007 libfdisk,
c47511da 4008 libopenssl,
92148283 4009 threads,
40c7d3c7 4010 userspace],
b0d3095f
LB
4011 install_rpath : pkglibdir,
4012 install : true)
9b264c1d 4013 public_programs += exe
3c3e14a7 4014
b62ee354
ZJS
4015 exe = executable(
4016 'systemd-repart.standalone',
4017 systemd_repart_sources,
4018 include_directories : includes,
4019 c_args : '-DSTANDALONE',
4020 link_with : [libshared_static,
4021 libbasic,
4022 libbasic_gcrypt,
4023 libsystemd_static,
4024 libshared_fdisk],
4025 dependencies : [libblkid,
4026 libfdisk,
4027 libopenssl,
4028 threads,
40c7d3c7 4029 userspace],
b62ee354 4030 build_by_default: have_standalone_binaries,
b0d3095f
LB
4031 install_rpath : pkglibdir,
4032 install : have_standalone_binaries)
3c3e14a7 4033 if have_standalone_binaries
9702d824 4034 public_programs += exe
3c3e14a7 4035 endif
9b264c1d 4036endif
6164ec4c
ZJS
4037
4038executable(
4039 'systemd-shutdown',
4040 systemd_shutdown_sources,
4041 include_directories : includes,
bac11cd6 4042 link_with : [libshared],
c47511da 4043 dependencies : [libmount,
40c7d3c7 4044 userspace],
b0d3095f 4045 install_rpath : pkglibdir,
6164ec4c 4046 install : true,
b0d3095f 4047 install_dir : libexecdir)
6164ec4c 4048
b62ee354
ZJS
4049executable(
4050 'systemd-shutdown.standalone',
4051 systemd_shutdown_sources,
4052 include_directories : includes,
4053 c_args : '-DSTANDALONE',
4054 link_with : [libshared_static,
4055 libbasic,
4056 libsystemd_static],
4057 dependencies : [libmount,
40c7d3c7 4058 userspace],
b62ee354 4059 build_by_default: have_standalone_binaries,
b0d3095f 4060 install_rpath : pkglibdir,
b62ee354 4061 install : have_standalone_binaries,
b0d3095f 4062 install_dir : libexecdir)
6ed3aca5 4063
6164ec4c
ZJS
4064executable(
4065 'systemd-update-done',
4066 'src/update-done/update-done.c',
4067 include_directories : includes,
4068 link_with : [libshared],
40c7d3c7 4069 dependencies : [userspace],
b0d3095f 4070 install_rpath : pkglibdir,
6164ec4c 4071 install : true,
b0d3095f 4072 install_dir : libexecdir)
6164ec4c
ZJS
4073
4074executable(
4075 'systemd-update-utmp',
4076 'src/update-utmp/update-utmp.c',
4077 include_directories : includes,
4078 link_with : [libshared],
c47511da 4079 dependencies : [libaudit,
40c7d3c7 4080 userspace],
b0d3095f 4081 install_rpath : pkglibdir,
55678b9e 4082 install : (conf.get('ENABLE_UTMP') == 1),
b0d3095f 4083 install_dir : libexecdir)
5c23128d 4084
349cc4a5 4085if conf.get('HAVE_KMOD') == 1
6164ec4c
ZJS
4086 executable(
4087 'systemd-modules-load',
4088 'src/modules-load/modules-load.c',
4089 include_directories : includes,
4090 link_with : [libshared],
c47511da 4091 dependencies : [libkmod,
40c7d3c7 4092 userspace],
b0d3095f 4093 install_rpath : pkglibdir,
6164ec4c 4094 install : true,
b0d3095f 4095 install_dir : libexecdir)
94e75a54 4096
7c22f07c
ZJS
4097 meson.add_install_script('sh', '-c',
4098 mkdir_p.format(modulesloaddir))
d7aa78c3 4099 if install_sysconfdir
7c22f07c 4100 meson.add_install_script('sh', '-c',
fce9abb2 4101 mkdir_p.format(sysconfdir / 'modules-load.d'))
d7aa78c3 4102 endif
5c23128d
ZJS
4103endif
4104
6164ec4c
ZJS
4105public_programs += executable(
4106 'systemd-nspawn',
4107 systemd_nspawn_sources,
4108 include_directories : includes,
bac11cd6 4109 link_with : [libnspawn_core,
6164ec4c
ZJS
4110 libshared],
4111 dependencies : [libblkid,
c47511da 4112 libseccomp,
40c7d3c7 4113 userspace],
b0d3095f 4114 install_rpath : pkglibdir,
6164ec4c 4115 install : true)
5c23128d 4116
349cc4a5 4117if conf.get('ENABLE_NETWORKD') == 1
9ff2b35f 4118 dbus_programs += executable(
6164ec4c
ZJS
4119 'systemd-networkd',
4120 systemd_networkd_sources,
8d40961c 4121 include_directories : network_includes,
6164ec4c
ZJS
4122 link_with : [libnetworkd_core,
4123 libsystemd_network,
6164ec4c 4124 networkd_link_with],
c47511da 4125 dependencies : [threads,
40c7d3c7 4126 userspace],
b0d3095f 4127 install_rpath : pkglibdir,
6164ec4c 4128 install : true,
b0d3095f 4129 install_dir : libexecdir)
6164ec4c 4130
3761002e 4131 public_programs += executable(
6164ec4c
ZJS
4132 'systemd-networkd-wait-online',
4133 systemd_networkd_wait_online_sources,
4134 include_directories : includes,
8d40961c 4135 link_with : [networkd_link_with],
40c7d3c7 4136 dependencies : [userspace],
b0d3095f 4137 install_rpath : pkglibdir,
6164ec4c 4138 install : true,
b0d3095f 4139 install_dir : libexecdir)
6164ec4c
ZJS
4140
4141 public_programs += executable(
4142 'networkctl',
4143 networkctl_sources,
8d40961c 4144 include_directories : libsystemd_network_includes,
6164ec4c
ZJS
4145 link_with : [libsystemd_network,
4146 networkd_link_with],
40c7d3c7 4147 dependencies : [userspace],
b0d3095f
LB
4148 install_rpath : pkglibdir,
4149 install : true)
987dd89c 4150endif
6164ec4c 4151
987dd89c
YW
4152exe = executable(
4153 'systemd-network-generator',
4154 network_generator_sources,
4155 include_directories : includes,
4156 link_with : [networkd_link_with],
40c7d3c7 4157 dependencies : [userspace],
b0d3095f 4158 install_rpath : pkglibdir,
987dd89c 4159 install : true,
b0d3095f 4160 install_dir : libexecdir)
fbaa1137 4161
987dd89c
YW
4162if want_tests != 'false'
4163 test('test-network-generator-conversion',
4164 test_network_generator_conversion_sh,
4165 # https://github.com/mesonbuild/meson/issues/2681
e93ada98
DDM
4166 args : exe.full_path(),
4167 depends : exe)
dcfe072a 4168endif
e821f6a9 4169
6164ec4c
ZJS
4170executable(
4171 'systemd-sulogin-shell',
73e994f2 4172 'src/sulogin-shell/sulogin-shell.c',
6164ec4c
ZJS
4173 include_directories : includes,
4174 link_with : [libshared],
40c7d3c7 4175 dependencies : [userspace],
b0d3095f 4176 install_rpath : pkglibdir,
6164ec4c 4177 install : true,
b0d3095f 4178 install_dir : libexecdir)
e821f6a9 4179
42551ea7 4180kernel_install = executable(
99d8cbce 4181 'kernel-install',
42551ea7
YW
4182 'src/kernel-install/kernel-install.c',
4183 include_directories : includes,
4184 link_with : [libshared],
40c7d3c7 4185 dependencies : [userspace],
b0d3095f
LB
4186 install_rpath : pkglibdir,
4187 install : want_kernel_install)
42551ea7 4188public_programs += kernel_install
f875e6bc 4189
f9a6cb0e 4190ukify = custom_target(
30ec2eae
ZJS
4191 'ukify',
4192 input : 'src/ukify/ukify.py',
4193 output : 'ukify',
4194 command : [jinja2_cmdline, '@INPUT@', '@OUTPUT@'],
9a01fe39 4195 install : want_ukify,
30ec2eae 4196 install_mode : 'rwxr-xr-x',
b0d3095f 4197 install_dir : libexecdir)
9a01fe39 4198if want_ukify
42551ea7 4199 public_programs += ukify
f9a6cb0e
ZJS
4200endif
4201
4202if want_tests != 'false' and want_kernel_install
42551ea7
YW
4203 args = [kernel_install.full_path(), loaderentry_install.full_path(), uki_copy_install]
4204 deps = [kernel_install, loaderentry_install]
3f80c139 4205 if want_ukify and boot_stubs.length() > 0
42551ea7
YW
4206 args += [ukify.full_path(), ukify_install.full_path(), boot_stubs[0]]
4207 deps += [ukify, ukify_install, boot_stubs[0]]
f9a6cb0e
ZJS
4208 endif
4209
4210 test('test-kernel-install',
4211 test_kernel_install_sh,
4212 env : test_env,
42551ea7
YW
4213 args : args,
4214 depends: deps)
30ec2eae
ZJS
4215endif
4216
69e96427
ZJS
4217############################################################
4218
e93ada98 4219runtest_env = custom_target(
e2d41370
FB
4220 'systemd-runtest.env',
4221 output : 'systemd-runtest.env',
0f4c4f38
ZJS
4222 command : [sh, '-c',
4223 '{ echo SYSTEMD_TEST_DATA=@0@; echo SYSTEMD_CATALOG_DIR=@1@; } >@OUTPUT@'.format(
fce9abb2
ZJS
4224 project_source_root / 'test',
4225 project_build_root / 'catalog')],
e93ada98 4226 depends : catalogs,
e2d41370
FB
4227 build_by_default : true)
4228
a626cb15
ZJS
4229test_cflags = ['-DTEST_CODE=1']
4230# We intentionally do not do inline initializations with definitions for a
4231# bunch of _cleanup_ variables in tests, to ensure valgrind is triggered if we
4232# use the variable unexpectedly. This triggers a lot of maybe-uninitialized
4233# false positives when the combination of -O2 and -flto is used. Suppress them.
b528a628 4234if '-O2' in c_args and '-flto=auto' in c_args
a626cb15
ZJS
4235 test_cflags += cc.first_supported_argument('-Wno-maybe-uninitialized')
4236endif
4237
c12e10d7 4238foreach test : simple_tests
822cd3ff 4239 tests += { 'sources' : [test] }
c12e10d7
JJ
4240endforeach
4241
0454cf05 4242TESTS = {}
822cd3ff
JJ
4243foreach test : tests
4244 sources = test.get('sources')
4245 condition = test.get('condition', '')
4246 type = test.get('type', '')
4247 base = test.get('base', {})
92148283
JJ
4248 deps = [
4249 base.get('dependencies', []),
4250 test.get('dependencies', []),
92148283 4251 ]
37efbbd8 4252
c20d2914 4253 name = fs.name(sources[0])
40c7d3c7
YW
4254 if name.endswith('.cc')
4255 deps += [versiondep]
4256 else
92148283
JJ
4257 deps += [userspace]
4258 endif
c20d2914 4259 name = fs.stem(name)
3b2bdd62 4260
ff5becf5 4261 suite = fs.name(fs.parent(sources[0])).replace('sd-', '')
c3191c6d 4262
822cd3ff 4263 if condition != '' and conf.get(condition) == 0
37efbbd8 4264 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
822cd3ff
JJ
4265 continue
4266 endif
4267
4268 exe = executable(
4269 name,
4270 sources,
4271 include_directories : [base.get('includes', []), test.get('includes', includes)],
4272 link_with : [base.get('link_with', []), test.get('link_with', libshared)],
92148283 4273 dependencies : deps,
822cd3ff
JJ
4274 c_args : [test_cflags, test.get('c_args', [])],
4275 build_by_default : want_tests != 'false',
b0d3095f 4276 install_rpath : pkglibdir,
822cd3ff 4277 install : install_tests,
26c2b302 4278 install_dir : unittestsdir / type,
822cd3ff
JJ
4279 link_depends : runtest_env)
4280
4281 if type == 'manual'
4282 message('@0@ is a manual test'.format(name))
4283 elif type == 'unsafe' and want_tests != 'unsafe'
4284 message('@0@ is an unsafe test'.format(name))
4285 elif want_tests != 'false'
4286 test(name, exe,
b0bd2ae8
ZJS
4287 env : test_env,
4288 timeout : test.get('timeout', 30),
4289 suite : suite,
4290 is_parallel : test.get('parallel', true))
37efbbd8 4291 endif
0454cf05
ZJS
4292
4293 TESTS += { name : exe }
69e96427
ZJS
4294endforeach
4295
0632b4cd 4296exe = executable(
37efbbd8
ZJS
4297 'test-libsystemd-sym',
4298 test_libsystemd_sym_c,
4299 include_directories : includes,
4300 link_with : [libsystemd],
92148283 4301 dependencies : userspace,
fd1939fb 4302 build_by_default : want_tests != 'false',
37efbbd8 4303 install : install_tests,
26c2b302 4304 install_dir : unittestsdir)
938be089
ZJS
4305if want_tests != 'false'
4306 test('test-libsystemd-sym', exe)
4307endif
37ab1a25 4308
0632b4cd
ZJS
4309exe = executable(
4310 'test-libsystemd-static-sym',
4311 test_libsystemd_sym_c,
4312 include_directories : includes,
0632b4cd 4313 link_with : [install_libsystemd_static],
92148283
JJ
4314 dependencies : [
4315 # threads is already included in dependencies on the library,
4316 # but does not seem to get propagated. Add here as a work-around.
4317 threads,
4318 userspace,
4319 ],
d37dee74
YW
4320 build_by_default : want_tests != 'false' and static_libsystemd != 'false',
4321 install : install_tests and static_libsystemd != 'false',
26c2b302 4322 install_dir : unittestsdir)
d37dee74 4323if want_tests != 'false' and static_libsystemd != 'false'
0632b4cd
ZJS
4324 test('test-libsystemd-static-sym', exe)
4325endif
37ab1a25 4326
0632b4cd 4327exe = executable(
37efbbd8
ZJS
4328 'test-libudev-sym',
4329 test_libudev_sym_c,
e4b127e2 4330 include_directories : libudev_includes,
a626cb15 4331 c_args : ['-Wno-deprecated-declarations'] + test_cflags,
37efbbd8 4332 link_with : [libudev],
92148283 4333 dependencies : userspace,
fd1939fb 4334 build_by_default : want_tests != 'false',
37efbbd8 4335 install : install_tests,
26c2b302 4336 install_dir : unittestsdir)
938be089
ZJS
4337if want_tests != 'false'
4338 test('test-libudev-sym', exe)
4339endif
0632b4cd
ZJS
4340
4341exe = executable(
4342 'test-libudev-static-sym',
4343 test_libudev_sym_c,
e4b127e2 4344 include_directories : libudev_includes,
a626cb15 4345 c_args : ['-Wno-deprecated-declarations'] + test_cflags,
0632b4cd 4346 link_with : [install_libudev_static],
92148283 4347 dependencies : userspace,
d37dee74
YW
4348 build_by_default : want_tests != 'false' and static_libudev != 'false',
4349 install : install_tests and static_libudev != 'false',
26c2b302 4350 install_dir : unittestsdir)
d37dee74 4351if want_tests != 'false' and static_libudev != 'false'
0632b4cd
ZJS
4352 test('test-libudev-static-sym', exe)
4353endif
e0bec52f 4354
0454cf05 4355if want_tests != 'false'
67b1c943 4356 exe = TESTS.get('udev-rule-runner')
0454cf05
ZJS
4357 test('test-udev',
4358 test_udev_py,
4359 args : ['-v'],
67b1c943
YW
4360 env : ['UDEV_RULE_RUNNER=' + exe.full_path()],
4361 depends : exe,
0454cf05
ZJS
4362 timeout : 180)
4363endif
4364
69e96427 4365############################################################
5c23128d 4366
a9a7153c 4367foreach fuzzer : simple_fuzzers
2ed35b2f 4368 fuzzers += { 'sources' : [fuzzer] }
a9a7153c
JJ
4369endforeach
4370
7db7d5b7
JR
4371fuzzer_exes = []
4372
2ed35b2f
JJ
4373foreach fuzzer : fuzzers
4374 sources = fuzzer.get('sources')
4375 base = fuzzer.get('base', {})
4376 dependencies = [base.get('dependencies', []), fuzzer.get('dependencies', [])]
7e299ffe
ZJS
4377 link_args = []
4378
4379 if want_ossfuzz
4380 dependencies += fuzzing_engine
4381 elif want_libfuzzer
4382 if fuzzing_engine.found()
9c5c4677
EV
4383 dependencies += fuzzing_engine
4384 else
7e299ffe 4385 link_args += ['-fsanitize=fuzzer']
9c5c4677 4386 endif
7e299ffe 4387 else
2ed35b2f 4388 sources += files('src/fuzz/fuzz-main.c')
7e299ffe 4389 endif
7e343b53 4390 sources += fuzz_generated_directives
7db7d5b7 4391
ff5becf5 4392 name = fs.stem(sources[0])
7db7d5b7 4393
f78ad5f0 4394 exe = executable(
7e299ffe
ZJS
4395 name,
4396 sources,
2ed35b2f
JJ
4397 include_directories : [
4398 base.get('includes', []),
4399 fuzzer.get('includes', includes),
4400 include_directories('src/fuzz'),
4401 ],
4402 link_with : [base.get('link_with', []), fuzzer.get('link_with', libshared)],
92148283
JJ
4403 dependencies : [
4404 dependencies,
4405 userspace,
92148283 4406 ],
2ed35b2f 4407 c_args : [test_cflags, fuzzer.get('c_args', [])],
7e299ffe
ZJS
4408 link_args: link_args,
4409 install : false,
f78ad5f0
ZJS
4410 build_by_default : fuzzer_build)
4411 fuzzer_exes += exe
4412
7db5761d 4413 if want_tests != 'false' and name in fuzz_regression_tests
f78ad5f0
ZJS
4414 # Run the fuzz regression tests without any sanitizers enabled.
4415 # Additional invocations with sanitizers may be added below.
7e343b53
MK
4416 foreach tuple : fuzz_regression_tests[name]
4417 fuzz_dir = tuple[0]
4418 fuzz_in = tuple[1]
7db5761d
MK
4419 test('@0@_@1@'.format(name, fuzz_in),
4420 exe,
ec2c6ac0 4421 suite : 'fuzz',
7e343b53
MK
4422 args : [fuzz_dir != '' ? project_source_root / fuzz_dir / name / fuzz_in
4423 : fuzz_generated_in_dir / '@0@_@1@'.format(name, fuzz_in)])
f78ad5f0
ZJS
4424 endforeach
4425 endif
7e299ffe 4426endforeach
7db7d5b7 4427
6839ce33 4428alias_target('fuzzers', fuzzer_exes)
7db7d5b7
JR
4429
4430############################################################
4431
10783aef
ZJS
4432subdir('docs/sysvinit')
4433subdir('docs/var-log')
4434subdir('hwdb.d')
4435subdir('man')
378e9d2b 4436subdir('modprobe.d')
10783aef
ZJS
4437subdir('network')
4438subdir('presets')
4439subdir('shell-completion/bash')
4440subdir('shell-completion/zsh')
5c23128d
ZJS
4441subdir('sysctl.d')
4442subdir('sysusers.d')
4443subdir('tmpfiles.d')
4f10b807 4444subdir('units')
5c23128d 4445
5c23128d
ZJS
4446install_subdir('factory/etc',
4447 install_dir : factorydir)
623370e6 4448subdir('factory/templates')
5c23128d 4449
d7aa78c3
JT
4450if install_sysconfdir
4451 install_data('xorg/50-systemd-user.sh',
4452 install_dir : xinitrcdir)
4453endif
f09eb768 4454install_data('LICENSE.GPL2',
5c23128d 4455 'LICENSE.LGPL2.1',
f09eb768
LP
4456 'NEWS',
4457 'README',
eea98402 4458 'docs/CODING_STYLE.md',
1d1cb168 4459 'docs/DISTRO_PORTING.md',
9e825ebf 4460 'docs/ENVIRONMENT.md',
5425f8a5 4461 'docs/HACKING.md',
9e825ebf 4462 'docs/TRANSIENT-SETTINGS.md',
b6dc0d7d 4463 'docs/TRANSLATORS.md',
9e825ebf 4464 'docs/UIDS-GIDS.md',
5c23128d 4465 install_dir : docdir)
d68b342b 4466
9c6e32a2
LB
4467install_subdir('LICENSES',
4468 install_dir : docdir)
4469
7c22f07c
ZJS
4470meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
4471meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
94e75a54 4472
d68b342b
ZJS
4473############################################################
4474
2d4efd1d
LB
4475# Ensure that changes to the docs/ directory do not break the
4476# basic Github pages build. But only run it in developer mode,
4477# as it might be fragile due to changes in the tooling, and it is
4478# not generally useful for users.
4479jekyll = find_program('jekyll', required : false)
4480if get_option('mode') == 'developer' and want_tests != 'false' and jekyll.found()
4481 test('github-pages',
4482 jekyll,
02e0f430 4483 suite : 'dist',
2d4efd1d 4484 args : ['build',
fce9abb2
ZJS
4485 '--source', project_source_root / 'docs',
4486 '--destination', project_build_root / '_site'])
2d4efd1d
LB
4487endif
4488
4489############################################################
4490
dd1e33c8 4491check_help = find_program('tools/check-help.sh')
ffb7406b 4492check_version = find_program('tools/check-version.sh')
005a29f2
ZJS
4493
4494foreach exec : public_programs
739a62bb 4495 name = fs.name(exec.full_path())
938be089
ZJS
4496 if want_tests != 'false'
4497 test('check-help-' + name,
dd1e33c8 4498 check_help,
02e0f430 4499 suite : 'dist',
e93ada98
DDM
4500 args : exec.full_path(),
4501 depends: exec)
ffb7406b
ZJS
4502
4503 test('check-version-' + name,
4504 check_version,
02e0f430 4505 suite : 'dist',
ffb7406b
ZJS
4506 args : [exec.full_path(),
4507 meson.project_version()],
4508 depends: exec)
938be089 4509 endif
005a29f2
ZJS
4510endforeach
4511
52d4d1d3 4512# Enable tests for all supported sanitizers
7db5761d 4513foreach tuple : fuzz_sanitizers
52d4d1d3
ZJS
4514 sanitizer = tuple[0]
4515 build = tuple[1]
b68dfb9e 4516
7a6397d2 4517 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
7db5761d
MK
4518 foreach fuzzer, fuzz_ins : fuzz_regression_tests
4519 name = '@0@:@1@'.format(fuzzer, sanitizer)
4520 if want_tests == 'false'
4521 message('Not compiling @0@ because tests is set to false'.format(name))
4522 continue
52d4d1d3 4523 endif
7db5761d
MK
4524 if not fuzz_tests
4525 message('Not compiling @0@ because fuzz-tests is set to false'.format(name))
4526 continue
4527 endif
4528 exe = custom_target(
4529 name,
4530 output : name,
7e343b53 4531 depends : [build] + fuzz_generated_directives,
7db5761d
MK
4532 command : [ln, '-fs',
4533 build.full_path() / fuzzer,
4534 '@OUTPUT@'],
4535 build_by_default : true)
4536
7e343b53
MK
4537 foreach tuple : fuzz_ins
4538 fuzz_dir = tuple[0]
4539 fuzz_in = tuple[1]
4540
7db5761d 4541 test('@0@_@1@_@2@'.format(fuzzer, fuzz_in, sanitizer),
52d4d1d3 4542 env,
14056a52 4543 suite : 'fuzz+san',
89767158
EV
4544 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
4545 timeout : 60,
52d4d1d3 4546 args : [exe.full_path(),
7e343b53
MK
4547 fuzz_dir != '' ? project_source_root / fuzz_dir / fuzzer / fuzz_in
4548 : fuzz_generated_in_dir / '@0@_@1@'.format(fuzzer, fuzz_in)])
7db5761d 4549 endforeach
52d4d1d3 4550 endforeach
b68dfb9e
ZJS
4551 endif
4552endforeach
4553
4554############################################################
4555
0700e8ba 4556if git.found()
37efbbd8 4557 all_files = run_command(
0f4c4f38
ZJS
4558 env, '-u', 'GIT_WORK_TREE',
4559 git, '--git-dir=@0@/.git'.format(project_source_root),
ba9ca60a 4560 'ls-files', ':/*.[ch]', ':/*.cc',
e92777d2
ZJS
4561 check : false)
4562 if all_files.returncode() == 0
4563 all_files = files(all_files.stdout().split())
4564
4565 custom_target(
4566 'tags',
4567 output : 'tags',
4568 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
4569 run_target(
4570 'ctags',
691db9a7 4571 command : [env, 'ctags', '--tag-relative=never', '-o', '@0@/tags'.format(project_source_root)] + all_files)
60892358
ZJS
4572
4573 ############################################
4574
4575 if want_tests != 'false' and conf.get('BUILD_MODE_DEVELOPER') == 1
4576 test('check-includes',
4577 files('tools/check-includes.py'),
4578 args: all_files,
4579 env : ['PROJECT_SOURCE_ROOT=@0@'.format(project_source_root)])
4580 endif
e92777d2 4581 endif
177929c2 4582
60892358
ZJS
4583 ####################################################
4584
dd1e33c8 4585 git_contrib_sh = find_program('tools/git-contrib.sh')
a923e085 4586 run_target(
37efbbd8 4587 'git-contrib',
dd1e33c8 4588 command : [git_contrib_sh])
dd6ab3df 4589
60892358
ZJS
4590 ####################################################
4591
dd6ab3df 4592 git_head = run_command(
e92777d2
ZJS
4593 git, '--git-dir=@0@/.git'.format(project_source_root),
4594 'rev-parse', 'HEAD',
4595 check : false).stdout().strip()
dd6ab3df 4596 git_head_short = run_command(
e92777d2
ZJS
4597 git, '--git-dir=@0@/.git'.format(project_source_root),
4598 'rev-parse', '--short=7', 'HEAD',
4599 check : false).stdout().strip()
dd6ab3df
ZJS
4600
4601 run_target(
4602 'git-snapshot',
0f4c4f38 4603 command : [git, 'archive',
1485aacb 4604 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
dd6ab3df
ZJS
4605 git_head_short),
4606 '--prefix', 'systemd-@0@/'.format(git_head),
4607 'HEAD'])
4608endif
829257d1
ZJS
4609
4610############################################################
4611
dd1e33c8 4612check_api_docs_sh = find_program('tools/check-api-docs.sh')
51b13863
LP
4613run_target(
4614 'check-api-docs',
4615 depends : [man, libsystemd, libudev],
dd1e33c8 4616 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
51b13863 4617
f12c5d36
ZJS
4618alias_target('update-dbus-docs', update_dbus_docs)
4619alias_target('update-man-rules', update_man_rules)
e3c368f6 4620
0628d48e
LB
4621if not meson.is_cross_build()
4622 custom_target(
4623 'export-dbus-interfaces',
4645074e 4624 output : fs.name(dbus_interfaces_dir),
0628d48e 4625 install : dbus_interfaces_dir != 'no',
4645074e 4626 install_dir : fs.parent(dbus_interfaces_dir),
0628d48e
LB
4627 command : [export_dbus_interfaces_py, '@OUTPUT@', dbus_programs])
4628endif
e3c68924 4629
51b13863 4630############################################################
829257d1 4631
e92777d2
ZJS
4632alt_time_epoch = run_command('date', '-Is', '-u', '-d', '@@0@'.format(time_epoch),
4633 check : true).stdout().strip()
12085ebb
ZJS
4634
4635summary({
12085ebb
ZJS
4636 'split bin-sbin' : split_bin,
4637 'prefix directory' : prefixdir,
12085ebb
ZJS
4638 'sysconf directory' : sysconfdir,
4639 'include directory' : includedir,
4640 'lib directory' : libdir,
12085ebb
ZJS
4641 'SysV init scripts' : sysvinit_path,
4642 'SysV rc?.d directories' : sysvrcnd_path,
4643 'PAM modules directory' : pamlibdir,
4644 'PAM configuration directory' : pamconfdir,
4645 'libcryptsetup plugins directory' : libcryptsetup_plugins_dir,
4646 'RPM macros directory' : rpmmacrosdir,
4647 'modprobe.d directory' : modprobedir,
4648 'D-Bus policy directory' : dbuspolicydir,
4649 'D-Bus session directory' : dbussessionservicedir,
4650 'D-Bus system directory' : dbussystemservicedir,
7e560e79 4651 'D-Bus interfaces directory' : dbus_interfaces_dir,
12085ebb
ZJS
4652 'bash completions directory' : bashcompletiondir,
4653 'zsh completions directory' : zshcompletiondir,
a2b0cd3f 4654 'private shared lib version tag' : shared_lib_tag,
12085ebb
ZJS
4655 'extra start script' : get_option('rc-local'),
4656 'debug shell' : '@0@ @ @1@'.format(get_option('debug-shell'),
4657 get_option('debug-tty')),
4658 'system UIDs' : '<=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_UID_MAX'),
4659 conf.get('SYSTEM_ALLOC_UID_MIN')),
4660 'system GIDs' : '<=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_GID_MAX'),
4661 conf.get('SYSTEM_ALLOC_GID_MIN')),
4662 'dynamic UIDs' : '@0@…@1@'.format(dynamic_uid_min, dynamic_uid_max),
4663 'container UID bases' : '@0@…@1@'.format(container_uid_base_min, container_uid_base_max),
4664 'static UID/GID allocations' : ' '.join(static_ugids),
4665 '/dev/kvm access mode' : get_option('dev-kvm-mode'),
4666 'render group access mode' : get_option('group-render-mode'),
4667 'certificate root directory' : get_option('certificate-root'),
4668 'support URL' : support_url,
4669 'nobody user name' : nobody_user,
4670 'nobody group name' : nobody_group,
4671 'fallback hostname' : get_option('fallback-hostname'),
9798deaf 4672 'default compression method' : compression,
12085ebb
ZJS
4673 'default DNSSEC mode' : default_dnssec,
4674 'default DNS-over-TLS mode' : default_dns_over_tls,
4675 'default mDNS mode' : default_mdns,
4676 'default LLMNR mode' : default_llmnr,
4677 'default DNS servers' : dns_servers.split(' '),
4678 'default NTP servers' : ntp_servers.split(' '),
4679 'default cgroup hierarchy' : default_hierarchy,
4680 'default net.naming-scheme value' : default_net_naming_scheme,
4681 'default KillUserProcesses value' : kill_user_processes,
4682 'default locale' : default_locale,
88b6f0de 4683 'default nspawn locale' : nspawn_locale,
79dec86a 4684 'default status unit format' : status_unit_format_default,
12085ebb
ZJS
4685 'default user $PATH' :
4686 default_user_path != '' ? default_user_path : '(same as system services)',
4687 'systemd service watchdog' : service_watchdog == '' ? 'disabled' : service_watchdog,
4688 'time epoch' : '@0@ (@1@)'.format(time_epoch, alt_time_epoch)})
829257d1
ZJS
4689
4690# TODO:
4691# CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
4692# CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
4693# LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
4694
829257d1
ZJS
4695found = []
4696missing = []
4697
4698foreach tuple : [
56d68e71
ZJS
4699 # dependencies
4700 ['ACL'],
829257d1 4701 ['AUDIT'],
829257d1 4702 ['AppArmor'],
56d68e71
ZJS
4703 ['IMA'],
4704 ['PAM'],
829257d1 4705 ['SECCOMP'],
56d68e71 4706 ['SELinux'],
829257d1 4707 ['SMACK'],
56d68e71
ZJS
4708 ['blkid'],
4709 ['elfutils'],
829257d1 4710 ['gcrypt'],
829257d1 4711 ['gnutls'],
7d861e12 4712 ['libbpf'],
56d68e71 4713 ['libcryptsetup'],
d1ae38d8 4714 ['libcryptsetup-plugins'],
829257d1 4715 ['libcurl'],
56d68e71
ZJS
4716 ['libfdisk'],
4717 ['libfido2'],
829257d1 4718 ['libidn'],
56d68e71 4719 ['libidn2'],
829257d1 4720 ['libiptc'],
56d68e71
ZJS
4721 ['microhttpd'],
4722 ['openssl'],
4723 ['p11kit'],
1d8aae43 4724 ['passwdqc'],
56d68e71
ZJS
4725 ['pcre2'],
4726 ['pwquality'],
4727 ['qrencode'],
4728 ['tpm2'],
4729 ['xkbcommon'],
4730
4731 # compression libs
4732 ['zstd'],
4733 ['lz4'],
4734 ['xz'],
4735 ['zlib'],
4736 ['bzip2'],
4737
4738 # components
4739 ['backlight'],
829257d1 4740 ['binfmt'],
dfca5587 4741 ['bootloader'],
0a0d4899 4742 ['bpf-framework', conf.get('BPF_FRAMEWORK') == 1],
56d68e71 4743 ['coredump'],
56d68e71 4744 ['efi'],
dfca5587 4745 ['environment.d'],
829257d1 4746 ['firstboot'],
56d68e71
ZJS
4747 ['hibernate'],
4748 ['homed'],
4749 ['hostnamed'],
4750 ['hwdb'],
4751 ['importd'],
4752 ['initrd'],
f887eab1 4753 ['kernel-install'],
56d68e71 4754 ['localed'],
829257d1
ZJS
4755 ['logind'],
4756 ['machined'],
56d68e71
ZJS
4757 ['networkd'],
4758 ['nss-myhostname'],
4759 ['nss-mymachines'],
4760 ['nss-resolve'],
4761 ['nss-systemd'],
4762 ['oomd'],
61d0578b 4763 ['portabled'],
56d68e71
ZJS
4764 ['pstore'],
4765 ['quotacheck'],
4766 ['randomseed'],
4767 ['repart'],
4768 ['resolve'],
4769 ['rfkill'],
9bca4ae4 4770 ['sysext'],
0a0d4899 4771 ['systemd-analyze', conf.get('ENABLE_ANALYZE') == 1],
43cc7a3e 4772 ['sysupdate'],
56d68e71 4773 ['sysusers'],
829257d1
ZJS
4774 ['timedated'],
4775 ['timesyncd'],
56d68e71
ZJS
4776 ['tmpfiles'],
4777 ['userdb'],
4778 ['vconsole'],
4779 ['xdg-autostart'],
4780
4781 # optional features
56d68e71 4782 ['idn'],
829257d1 4783 ['polkit'],
56d68e71 4784 ['nscd'],
0a0d4899 4785 ['legacy-pkla', install_polkit_pkla],
829257d1 4786 ['kmod'],
ede5a78f 4787 ['xenctrl'],
829257d1
ZJS
4788 ['dbus'],
4789 ['glib'],
829257d1 4790 ['tpm'],
0a0d4899
JH
4791 ['man pages', want_man],
4792 ['html pages', want_html],
4793 ['man page indices', want_man and have_lxml],
829257d1 4794 ['SysV compat'],
56d68e71 4795 ['compat-mutable-uid-boundaries'],
829257d1
ZJS
4796 ['utmp'],
4797 ['ldconfig'],
0a0d4899
JH
4798 ['adm group', get_option('adm-group')],
4799 ['wheel group', get_option('wheel-group')],
b14e1b43 4800 ['gshadow'],
829257d1
ZJS
4801 ['debug hashmap'],
4802 ['debug mmap cache'],
d6601495 4803 ['debug siphash'],
0a0d4899 4804 ['trace logging', conf.get('LOG_TRACE') == 1],
69525346
YW
4805 ['slow tests', slow_tests],
4806 ['fuzz tests', fuzz_tests],
0a0d4899
JH
4807 ['install tests', install_tests],
4808 ['link-udev-shared', get_option('link-udev-shared')],
4809 ['link-systemctl-shared', get_option('link-systemctl-shared')],
4810 ['link-networkd-shared', get_option('link-networkd-shared')],
4811 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
4812 ['link-journalctl-shared', get_option('link-journalctl-shared')],
4813 ['link-boot-shared', get_option('link-boot-shared')],
c06d2e44 4814 ['link-portabled-shared', get_option('link-portabled-shared')],
93651582 4815 ['first-boot-full-preset'],
ceedbf81 4816 ['fexecve'],
0a0d4899
JH
4817 ['standalone-binaries', get_option('standalone-binaries')],
4818 ['coverage', get_option('b_coverage')],
829257d1
ZJS
4819]
4820
af4d7860
ZJS
4821 if tuple.length() >= 2
4822 cond = tuple[1]
4823 else
829257d1
ZJS
4824 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
4825 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
349cc4a5 4826 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
829257d1
ZJS
4827 endif
4828 if cond
5a8b1640 4829 found += tuple[0]
829257d1 4830 else
5a8b1640 4831 missing += tuple[0]
829257d1
ZJS
4832 endif
4833endforeach
4834
c716c253
ZJS
4835if static_libsystemd == 'false'
4836 missing += 'static-libsystemd'
4837else
4838 found += 'static-libsystemd(@0@)'.format(static_libsystemd)
4839endif
4840
4841if static_libudev == 'false'
4842 missing += 'static-libudev'
4843else
4844 found += 'static-libudev(@0@)'.format(static_libudev)
4845endif
4846
57633d23
ZJS
4847if conf.get('HAVE_OPENSSL_OR_GCRYPT') == 1 and conf.get('PREFER_OPENSSL') == 1
4848 found += 'cryptolib(openssl)'
4849elif conf.get('HAVE_OPENSSL_OR_GCRYPT') == 1
4850 found += 'cryptolib(gcrypt)'
4851else
4852 missing += 'cryptolib'
4853endif
4854
237f2da9
ZJS
4855if conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1
4856 found += 'DNS-over-TLS(gnutls)'
4857elif conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1
4858 found += 'DNS-over-TLS(openssl)'
4859else
4860 missing += 'DNS-over-TLS'
4861endif
4862
12085ebb
ZJS
4863summary({
4864 'enabled' : ', '.join(found),
4865 'disabled' : ', '.join(missing)},
4866 section : 'Features')