]> git.ipfire.org Git - thirdparty/systemd.git/blame - meson.build
network: radv - Allow to send hop limit
[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')
9289e093 114sbin_to_bin = split_bin ? '../bin/' : ''
fce9abb2
ZJS
115libdir = prefixdir / get_option('libdir')
116sysconfdir = prefixdir / get_option('sysconfdir')
117includedir = prefixdir / get_option('includedir')
118datadir = prefixdir / get_option('datadir')
119localstatedir = '/' / get_option('localstatedir')
5c23128d 120
b0d3095f
LB
121libexecdir = prefixdir / 'lib/systemd'
122pkglibdir = libdir / 'systemd'
5c23128d 123
225d08b8
JT
124install_sysconfdir = get_option('install-sysconfdir') != 'false'
125install_sysconfdir_samples = get_option('install-sysconfdir') == 'true'
5c23128d 126# Dirs of external packages
fce9abb2
ZJS
127pkgconfigdatadir = get_option('pkgconfigdatadir') != '' ? get_option('pkgconfigdatadir') : datadir / 'pkgconfig'
128pkgconfiglibdir = get_option('pkgconfiglibdir') != '' ? get_option('pkgconfiglibdir') : libdir / 'pkgconfig'
129polkitpolicydir = datadir / 'polkit-1/actions'
130polkitrulesdir = datadir / 'polkit-1/rules.d'
131polkitpkladir = localstatedir / 'lib/polkit-1/localauthority/10-vendor.d'
132xinitrcdir = get_option('xinitrcdir') != '' ? get_option('xinitrcdir') : sysconfdir / 'X11/xinit/xinitrc.d'
8a38aac3
YW
133rpmmacrosdir = get_option('rpmmacrosdir')
134if rpmmacrosdir != 'no'
fce9abb2 135 rpmmacrosdir = prefixdir / rpmmacrosdir
8a38aac3 136endif
b0d3095f 137modprobedir = prefixdir / 'lib/modprobe.d'
5c23128d
ZJS
138
139# Our own paths
fce9abb2
ZJS
140pkgdatadir = datadir / 'systemd'
141environmentdir = prefixdir / 'lib/environment.d'
142pkgsysconfdir = sysconfdir / 'systemd'
143userunitdir = prefixdir / 'lib/systemd/user'
144userpresetdir = prefixdir / 'lib/systemd/user-preset'
145tmpfilesdir = prefixdir / 'lib/tmpfiles.d'
107795a7 146usertmpfilesdir = prefixdir / 'share/user-tmpfiles.d'
fce9abb2
ZJS
147sysusersdir = prefixdir / 'lib/sysusers.d'
148sysctldir = prefixdir / 'lib/sysctl.d'
149binfmtdir = prefixdir / 'lib/binfmt.d'
150modulesloaddir = prefixdir / 'lib/modules-load.d'
b0d3095f
LB
151networkdir = prefixdir / 'lib/systemd/network'
152systemgeneratordir = libexecdir / 'system-generators'
fce9abb2
ZJS
153usergeneratordir = prefixdir / 'lib/systemd/user-generators'
154systemenvgeneratordir = prefixdir / 'lib/systemd/system-environment-generators'
155userenvgeneratordir = prefixdir / 'lib/systemd/user-environment-generators'
b0d3095f
LB
156systemshutdowndir = libexecdir / 'system-shutdown'
157systemsleepdir = libexecdir / 'system-sleep'
158systemunitdir = prefixdir / 'lib/systemd/system'
159systempresetdir = prefixdir / 'lib/systemd/system-preset'
160udevlibexecdir = prefixdir / 'lib/udev'
fce9abb2
ZJS
161udevrulesdir = udevlibexecdir / 'rules.d'
162udevhwdbdir = udevlibexecdir / 'hwdb.d'
163catalogdir = prefixdir / 'lib/systemd/catalog'
641e2124 164kerneldir = prefixdir / 'lib/kernel'
165kernelinstalldir = kerneldir / 'install.d'
fce9abb2
ZJS
166factorydir = datadir / 'factory'
167bootlibdir = prefixdir / 'lib/systemd/boot/efi'
168testsdir = prefixdir / 'lib/systemd/tests'
26c2b302 169unittestsdir = testsdir / 'unit-tests'
539ee7ab 170testdata_dir = testsdir / 'testdata'
fce9abb2
ZJS
171systemdstatedir = localstatedir / 'lib/systemd'
172catalogstatedir = systemdstatedir / 'catalog'
173randomseeddir = localstatedir / 'lib/systemd'
b0d3095f
LB
174profiledir = libexecdir / 'portable' / 'profile'
175ntpservicelistdir = prefixdir / 'lib/systemd/ntp-units.d'
24039e12 176credstoredir = prefixdir / 'lib/credstore'
5c23128d 177
75aaade1
TB
178docdir = get_option('docdir')
179if docdir == ''
fce9abb2 180 docdir = datadir / 'doc/systemd'
75aaade1
TB
181endif
182
5c23128d
ZJS
183pamlibdir = get_option('pamlibdir')
184if pamlibdir == ''
b0d3095f 185 pamlibdir = libdir / 'security'
5c23128d
ZJS
186endif
187
188pamconfdir = get_option('pamconfdir')
189if pamconfdir == ''
fce9abb2 190 pamconfdir = prefixdir / 'lib/pam.d'
5c23128d
ZJS
191endif
192
d1ae38d8
OK
193libcryptsetup_plugins_dir = get_option('libcryptsetup-plugins-dir')
194if libcryptsetup_plugins_dir == ''
b0d3095f 195 libcryptsetup_plugins_dir = libdir / 'cryptsetup'
d1ae38d8
OK
196endif
197
444d5863 198memory_accounting_default = get_option('memory-accounting-default')
36cf4507 199status_unit_format_default = get_option('status-unit-format-default')
819c0dcb
ZJS
200if status_unit_format_default == 'auto'
201 status_unit_format_default = conf.get('BUILD_MODE_DEVELOPER') == 1 ? 'name' : 'description'
202endif
444d5863 203
b0d3095f 204conf.set_quoted('BINDIR', bindir)
491bf10c
ZJS
205conf.set_quoted('BINFMT_DIR', binfmtdir)
206conf.set_quoted('BOOTLIBDIR', bootlibdir)
fce9abb2 207conf.set_quoted('CATALOG_DATABASE', catalogstatedir / 'database')
491bf10c 208conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
6fe23ff3 209conf.set_quoted('DOC_DIR', docdir)
fce9abb2 210conf.set_quoted('DOCUMENT_ROOT', pkgdatadir / 'gatewayd')
491bf10c
ZJS
211conf.set_quoted('ENVIRONMENT_DIR', environmentdir)
212conf.set_quoted('INCLUDE_DIR', includedir)
213conf.set_quoted('LIBDIR', libdir)
b0d3095f 214conf.set_quoted('LIBEXECDIR', libexecdir)
491bf10c
ZJS
215conf.set_quoted('MODPROBE_DIR', modprobedir)
216conf.set_quoted('MODULESLOAD_DIR', modulesloaddir)
5c23128d 217conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
fce9abb2 218conf.set_quoted('POLKIT_AGENT_BINARY_PATH', bindir / 'pkttyagent')
491bf10c 219conf.set_quoted('PREFIX', prefixdir)
b0d3095f 220conf.set_quoted('PREFIX_NOSLASH', prefixdir_noslash)
fce9abb2 221conf.set_quoted('RANDOM_SEED', randomseeddir / 'random-seed')
491bf10c 222conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
452d2dfd 223conf.set_quoted('RC_LOCAL_PATH', get_option('rc-local'))
491bf10c
ZJS
224conf.set_quoted('SYSCONF_DIR', sysconfdir)
225conf.set_quoted('SYSCTL_DIR', sysctldir)
b0d3095f
LB
226conf.set_quoted('SYSTEMCTL_BINARY_PATH', bindir / 'systemctl')
227conf.set_quoted('SYSTEMD_BINARY_PATH', libexecdir / 'systemd')
491bf10c 228conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
b0d3095f
LB
229conf.set_quoted('SYSTEMD_CGROUPS_AGENT_PATH', libexecdir / 'systemd-cgroups-agent')
230conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', libexecdir / 'systemd-cryptsetup')
231conf.set_quoted('SYSTEMD_EXPORT_PATH', libexecdir / 'systemd-export')
232conf.set_quoted('SYSTEMD_FSCK_PATH', libexecdir / 'systemd-fsck')
233conf.set_quoted('SYSTEMD_GROWFS_PATH', libexecdir / 'systemd-growfs')
234conf.set_quoted('SYSTEMD_HOMEWORK_PATH', libexecdir / 'systemd-homework')
235conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', libexecdir / 'systemd-import-fs')
236conf.set_quoted('SYSTEMD_IMPORT_PATH', libexecdir / 'systemd-import')
237conf.set_quoted('SYSTEMD_INTEGRITYSETUP_PATH', libexecdir / 'systemd-integritysetup')
fce9abb2
ZJS
238conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', pkgdatadir / 'kbd-model-map')
239conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', pkgdatadir / 'language-fallback-map')
b0d3095f
LB
240conf.set_quoted('SYSTEMD_MAKEFS_PATH', libexecdir / 'systemd-makefs')
241conf.set_quoted('SYSTEMD_PULL_PATH', libexecdir / 'systemd-pull')
242conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', libexecdir / 'systemd-shutdown')
539ee7ab 243conf.set_quoted('SYSTEMD_TEST_DATA', testdata_dir)
b0d3095f
LB
244conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', bindir / 'systemd-tty-ask-password-agent')
245conf.set_quoted('SYSTEMD_UPDATE_HELPER_PATH', libexecdir / 'systemd-update-helper')
246conf.set_quoted('SYSTEMD_USERWORK_PATH', libexecdir / 'systemd-userwork')
247conf.set_quoted('SYSTEMD_VERITYSETUP_PATH', libexecdir / 'systemd-veritysetup')
fce9abb2 248conf.set_quoted('SYSTEM_CONFIG_UNIT_DIR', pkgsysconfdir / 'system')
491bf10c 249conf.set_quoted('SYSTEM_DATA_UNIT_DIR', systemunitdir)
96d33e4a 250conf.set_quoted('SYSTEM_ENV_GENERATOR_DIR', systemenvgeneratordir)
491bf10c
ZJS
251conf.set_quoted('SYSTEM_GENERATOR_DIR', systemgeneratordir)
252conf.set_quoted('SYSTEM_PRESET_DIR', systempresetdir)
5c23128d
ZJS
253conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
254conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
491bf10c
ZJS
255conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
256conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
835cf75a
ZJS
257conf.set_quoted('SYSUSERS_DIR', sysusersdir)
258conf.set_quoted('TMPFILES_DIR', tmpfilesdir)
107795a7 259conf.set_quoted('USER_TMPFILES_DIR', usertmpfilesdir)
5c23128d 260conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
491bf10c
ZJS
261conf.set_quoted('UDEV_HWDB_DIR', udevhwdbdir)
262conf.set_quoted('UDEV_RULES_DIR', udevrulesdir)
fce9abb2 263conf.set_quoted('USER_CONFIG_UNIT_DIR', pkgsysconfdir / 'user')
491bf10c
ZJS
264conf.set_quoted('USER_DATA_UNIT_DIR', userunitdir)
265conf.set_quoted('USER_ENV_GENERATOR_DIR', userenvgeneratordir)
266conf.set_quoted('USER_GENERATOR_DIR', usergeneratordir)
fce9abb2 267conf.set_quoted('USER_KEYRING_PATH', pkgsysconfdir / 'import-pubring.gpg')
491bf10c 268conf.set_quoted('USER_PRESET_DIR', userpresetdir)
b0d3095f 269conf.set_quoted('VENDOR_KEYRING_PATH', libexecdir / 'import-pubring.gpg')
491bf10c
ZJS
270
271conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
e5d86ebe 272conf.set10('ENABLE_URLIFY', get_option('urlify'))
491bf10c 273conf.set10('ENABLE_FEXECVE', get_option('fexecve'))
30538ff1 274conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
36cf4507 275conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
e11a25ca 276conf.set_quoted('STATUS_UNIT_FORMAT_DEFAULT_STR', status_unit_format_default)
5c23128d 277
e4c7b5f5
ZJS
278conf.set('DEFAULT_TIMEOUT_SEC', get_option('default-timeout-sec'))
279conf.set('DEFAULT_USER_TIMEOUT_SEC', get_option('default-user-timeout-sec'))
280conf.set('UPDATE_HELPER_USER_TIMEOUT_SEC', get_option('update-helper-user-timeout-sec'))
281
93651582
JL
282conf.set10('FIRST_BOOT_FULL_PRESET', get_option('first-boot-full-preset'))
283
5c23128d
ZJS
284#####################################################################
285
286cc = meson.get_compiler('c')
92148283
JJ
287userspace_c_args = []
288userspace_c_ld_args = []
b68dfb9e 289meson_build_sh = find_program('tools/meson-build.sh')
5c23128d 290
d3da291e
ZJS
291want_tests = get_option('tests')
292slow_tests = want_tests != 'false' and get_option('slow-tests')
c56463fd 293fuzz_tests = want_tests != 'false' and get_option('fuzz-tests')
d3da291e
ZJS
294install_tests = get_option('install-tests')
295
daf4e78e 296if add_languages('cpp', native : false, required : fuzzer_build)
3b2bdd62 297 # Used only for tests
e9f4f566
ZJS
298 cxx = meson.get_compiler('cpp')
299 cxx_cmd = ' '.join(cxx.cmd_array())
1b2acaa7 300else
9b0ca019 301 cxx_cmd = ''
94e2523b
ZJS
302endif
303
31e57a35 304if want_libfuzzer
9c5c4677
EV
305 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
306 if fuzzing_engine.found()
92148283 307 userspace_c_args += '-fsanitize-coverage=trace-pc-guard,trace-cmp'
9c5c4677 308 elif cc.has_argument('-fsanitize=fuzzer-no-link')
92148283 309 userspace_c_args += '-fsanitize=fuzzer-no-link'
9c5c4677
EV
310 else
311 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
312 endif
c09edc79 313elif want_ossfuzz
7db7d5b7
JR
314 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
315endif
316
e9f4f566
ZJS
317# Those generate many false positives, and we do not want to change the code to
318# avoid them.
319basic_disabled_warnings = [
e9f4f566 320 '-Wno-missing-field-initializers',
505ab9dd 321 '-Wno-unused-parameter',
e9f4f566 322]
e9f4f566 323
65267363 324possible_common_cc_flags = [
fc568837
ZJS
325 '-Warray-bounds', # clang
326 '-Warray-bounds=2',
505ab9dd
YW
327 '-Wdate-time',
328 '-Wendif-labels',
329 '-Werror=format=2',
a4ea5d19 330 '-Werror=format-signedness',
505ab9dd 331 '-Werror=implicit-function-declaration',
a0d613ec 332 '-Werror=implicit-int',
505ab9dd 333 '-Werror=incompatible-pointer-types',
ebbb1e36 334 '-Werror=int-conversion',
0b482b37
JJ
335 '-Werror=missing-declarations',
336 '-Werror=missing-prototypes',
505ab9dd 337 '-Werror=overflow',
48c67fdf 338 '-Werror=override-init',
505ab9dd
YW
339 '-Werror=return-type',
340 '-Werror=shift-count-overflow',
341 '-Werror=shift-overflow=2',
6405afda 342 '-Werror=strict-flex-arrays',
30a4ddff 343 '-Werror=undef',
505ab9dd 344 '-Wfloat-equal',
c0f5d58c
JJ
345 # gperf prevents us from enabling this because it does not emit fallthrough
346 # attribute with clang.
347 #'-Wimplicit-fallthrough',
505ab9dd
YW
348 '-Wimplicit-fallthrough=5',
349 '-Winit-self',
30a4ddff
YW
350 '-Wlogical-op',
351 '-Wmissing-include-dirs',
505ab9dd
YW
352 '-Wmissing-noreturn',
353 '-Wnested-externs',
30a4ddff
YW
354 '-Wold-style-definition',
355 '-Wpointer-arith',
30a4ddff 356 '-Wredundant-decls',
30a4ddff 357 '-Wshadow',
30a4ddff 358 '-Wstrict-aliasing=2',
505ab9dd
YW
359 '-Wstrict-prototypes',
360 '-Wsuggest-attribute=noreturn',
054ed430 361 '-Wunused-function',
30a4ddff 362 '-Wwrite-strings',
31560245 363 '-Wzero-length-bounds',
bf7efeb1
FB
364
365 # negative arguments are correctly detected starting with meson 0.46.
eed33623
ZJS
366 '-Wno-error=#warnings', # clang
367 '-Wno-string-plus-int', # clang
fc568837 368
0b482b37
JJ
369 '-fdiagnostics-show-option',
370 '-fno-common',
48e1b2c2
JJ
371 '-fstack-protector',
372 '-fstack-protector-strong',
fc568837 373 '-fstrict-flex-arrays',
48e1b2c2
JJ
374 '--param=ssp-buffer-size=4',
375]
376
377possible_common_link_flags = [
378 '-fstack-protector',
30a4ddff
YW
379]
380
b528a628
ZJS
381c_args = get_option('c_args')
382
60f97fee 383# Our json library does not support -ffinite-math-only, which is enabled by -Ofast or -ffast-math.
53403091 384if (('-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
385 error('-Ofast, -ffast-math, or -ffinite-math-only is specified in c_args.')
386endif
387
a17e5478 388# Disable -Wmaybe-uninitialized when compiling with -Os/-O1/-O3/etc. There are
68c98a41
ZJS
389# too many false positives with gcc >= 8. Effectively, we only test with -O0
390# and -O2; this should be enough to catch most important cases without too much
391# busywork. See https://github.com/systemd/systemd/pull/19226.
392if cc.get_id() == 'gcc' and (not '02'.contains(get_option('optimization')) or
b528a628
ZJS
393 cc.version().version_compare('<10') or
394 '-Os' in c_args or
395 '-O1' in c_args or
396 '-O3' in c_args or
397 '-Og' in c_args)
65267363 398 possible_common_cc_flags += '-Wno-maybe-uninitialized'
68c98a41
ZJS
399endif
400
bc2a4af2
ZJS
401# Disable -Wno-unused-result with gcc, see
402# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66425.
403if cc.get_id() == 'gcc'
404 possible_common_cc_flags += '-Wno-unused-result'
405endif
406
30a4ddff 407# --as-needed and --no-undefined are provided by meson by default,
9247df5a 408# run 'meson configure' to see what is enabled
30a4ddff 409possible_link_flags = [
42e3bb35 410 '-Wl,--fatal-warnings',
30a4ddff 411 '-Wl,-z,now',
42e3bb35 412 '-Wl,-z,relro',
30a4ddff 413]
5c23128d 414
42e3bb35
JJ
415if get_option('b_sanitize') == 'none'
416 possible_link_flags += '-Wl,--warn-common'
417endif
418
30a4ddff 419if cc.get_id() == 'clang'
65267363 420 possible_common_cc_flags += [
30a4ddff
YW
421 '-Wno-typedef-redefinition',
422 '-Wno-gnu-variable-sized-type-not-at-end',
423 ]
424endif
425
1a4e3927
JJ
426if get_option('mode') == 'release'
427 # We could enable 'pattern' for developer mode, but that can interfere with
428 # valgrind and sanitizer builds. Also, clang does not zero-initialize unions,
429 # breaking some of our code (https://reviews.llvm.org/D68115).
430 possible_common_cc_flags += '-ftrivial-auto-var-init=zero'
431endif
432
92148283 433possible_cc_flags = [
16e09d51 434 '-fno-strict-aliasing',
afd8e1d9 435 '-fstrict-flex-arrays=1',
16e09d51 436 '-fvisibility=hidden',
16e09d51
YW
437]
438
30a4ddff 439if get_option('buildtype') != 'debug'
16e09d51 440 possible_cc_flags += [
30a4ddff
YW
441 '-ffunction-sections',
442 '-fdata-sections',
443 ]
444
445 possible_link_flags += '-Wl,--gc-sections'
446endif
447
82390022
DDM
448if get_option('mode') == 'developer'
449 possible_cc_flags += '-fno-omit-frame-pointer'
450endif
451
92148283
JJ
452add_project_arguments(
453 cc.get_supported_arguments(
454 basic_disabled_warnings,
455 possible_common_cc_flags
456 ),
457 language : 'c')
458
48e1b2c2
JJ
459add_project_link_arguments(
460 cc.get_supported_link_arguments(possible_common_link_flags),
461 language : 'c')
462
92148283
JJ
463userspace_c_args += cc.get_supported_arguments(possible_cc_flags)
464userspace_c_ld_args += cc.get_supported_link_arguments(possible_link_flags)
30a4ddff 465
94c0c5b7
ZJS
466have = cc.has_argument('-Wzero-length-bounds')
467conf.set10('HAVE_ZERO_LENGTH_BOUNDS', have)
468
9e70f2f8 469if cc.compiles('''
5c23128d
ZJS
470 #include <time.h>
471 #include <inttypes.h>
472 typedef uint64_t usec_t;
473 usec_t now(clockid_t clock);
474 int main(void) {
475 struct timespec now;
476 return 0;
477 }
38c1c96d 478''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
37efbbd8 479 add_project_arguments('-Werror=shadow', language : 'c')
5c23128d
ZJS
480endif
481
e9f4f566
ZJS
482if cxx_cmd != ''
483 add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp')
484endif
485
0e3cc902 486cpp = ' '.join(cc.cmd_array()) + ' -E'
9cc0e6e9 487
6695c200
ZJS
488has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
489
5c23128d
ZJS
490#####################################################################
491# compilation result tests
492
78103450 493conf.set('_GNU_SOURCE', 1)
2c201c21 494conf.set('__SANE_USERSPACE_TYPES__', true)
6695c200 495conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
5c23128d 496
5c23128d
ZJS
497conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
498conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
5c23128d 499conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
84d953e8 500conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
3112d756 501conf.set('SIZEOF_TIMEX_MEMBER', cc.sizeof('typeof(((struct timex *)0)->freq)', prefix : '#include <sys/timex.h>'))
5c23128d 502
2736a0c6 503long_max = cc.compute_int(
504 'LONG_MAX',
505 prefix : '#include <limits.h>',
506 guess : 0x7FFFFFFFFFFFFFFF,
507 high : 0x7FFFFFFFFFFFFFFF)
a5fac1df
ZJS
508assert(long_max > 100000)
509conf.set_quoted('LONG_MAX_STR', '@0@'.format(long_max))
510
5c23128d 511decl_headers = '''
eb292969 512#include <dirent.h>
5c23128d 513#include <uchar.h>
84e8edec 514#include <sys/mount.h>
4c2e1b39 515#include <sys/stat.h>
5c23128d 516'''
5c23128d
ZJS
517
518foreach decl : ['char16_t',
519 'char32_t',
84e8edec 520 'struct mount_attr',
4c2e1b39 521 'struct statx',
eb292969 522 'struct dirent64',
5c23128d 523 ]
2c201c21
ZJS
524
525 # We get -1 if the size cannot be determined
9c869d08
ZJS
526 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
527
3657d3a0
RH
528 if decl == 'struct mount_attr'
529 if have
530 want_linux_fs_h = false
531 else
532 have = cc.sizeof(decl,
533 prefix : decl_headers + '#include <linux/fs.h>',
534 args : '-D_GNU_SOURCE') > 0
535 want_linux_fs_h = have
536 endif
537 endif
538
9c869d08
ZJS
539 if decl == 'struct statx'
540 if have
541 want_linux_stat_h = false
542 else
543 have = cc.sizeof(decl,
544 prefix : decl_headers + '#include <linux/stat.h>',
545 args : '-D_GNU_SOURCE') > 0
546 want_linux_stat_h = have
547 endif
548 endif
549
349cc4a5 550 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
5c23128d
ZJS
551endforeach
552
9c869d08 553conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
3657d3a0 554conf.set10('WANT_LINUX_FS_H', want_linux_fs_h)
75720bff 555
5c23128d 556foreach ident : ['secure_getenv', '__secure_getenv']
349cc4a5 557 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
5c23128d
ZJS
558endforeach
559
560foreach ident : [
85db59b7 561 ['memfd_create', '''#include <sys/mman.h>'''],
7b961e40
LP
562 ['gettid', '''#include <sys/types.h>
563 #include <unistd.h>'''],
3c042add
LP
564 ['pivot_root', '''#include <stdlib.h>
565 #include <unistd.h>'''], # no known header declares pivot_root
51fe206f
ZJS
566 ['ioprio_get', '''#include <sched.h>'''], # no known header declares ioprio_get
567 ['ioprio_set', '''#include <sched.h>'''], # no known header declares ioprio_set
85db59b7 568 ['name_to_handle_at', '''#include <sys/types.h>
37efbbd8
ZJS
569 #include <sys/stat.h>
570 #include <fcntl.h>'''],
85db59b7 571 ['setns', '''#include <sched.h>'''],
2acfd0ff
LP
572 ['renameat2', '''#include <stdio.h>
573 #include <fcntl.h>'''],
37efbbd8
ZJS
574 ['kcmp', '''#include <linux/kcmp.h>'''],
575 ['keyctl', '''#include <sys/types.h>
576 #include <keyutils.h>'''],
85db59b7 577 ['copy_file_range', '''#include <sys/syscall.h>
37efbbd8 578 #include <unistd.h>'''],
71e5200f
DM
579 ['bpf', '''#include <sys/syscall.h>
580 #include <unistd.h>'''],
4c2e1b39
LP
581 ['statx', '''#include <sys/types.h>
582 #include <sys/stat.h>
583 #include <unistd.h>'''],
aa484f35 584 ['explicit_bzero' , '''#include <string.h>'''],
5bb20fd3 585 ['reallocarray', '''#include <stdlib.h>'''],
b070c7c0
MS
586 ['set_mempolicy', '''#include <stdlib.h>
587 #include <unistd.h>'''],
588 ['get_mempolicy', '''#include <stdlib.h>
589 #include <unistd.h>'''],
5f152f43
LP
590 ['pidfd_send_signal', '''#include <stdlib.h>
591 #include <unistd.h>
592 #include <signal.h>
593 #include <sys/wait.h>'''],
594 ['pidfd_open', '''#include <stdlib.h>
595 #include <unistd.h>
596 #include <signal.h>
597 #include <sys/wait.h>'''],
5ead4e85
LP
598 ['rt_sigqueueinfo', '''#include <stdlib.h>
599 #include <unistd.h>
600 #include <signal.h>
601 #include <sys/wait.h>'''],
a5421953
DDM
602 ['rt_tgsigqueueinfo', '''#include <stdlib.h>
603 #include <unistd.h>
604 #include <signal.h>
605 #include <sys/wait.h>'''],
4b6f74f5 606 ['mallinfo', '''#include <malloc.h>'''],
1885169c 607 ['mallinfo2', '''#include <malloc.h>'''],
8939eeae 608 ['execveat', '''#include <unistd.h>'''],
441e0fdb 609 ['close_range', '''#include <unistd.h>'''],
420297c9 610 ['epoll_pwait2', '''#include <sys/epoll.h>'''],
84e8edec
LP
611 ['mount_setattr', '''#include <sys/mount.h>'''],
612 ['move_mount', '''#include <sys/mount.h>'''],
613 ['open_tree', '''#include <sys/mount.h>'''],
1c265fcd
DDM
614 ['fsopen', '''#include <sys/mount.h>'''],
615 ['fsconfig', '''#include <sys/mount.h>'''],
34a9da0d 616 ['fsmount', '''#include <sys/mount.h>'''],
aab35b1e 617 ['getdents64', '''#include <dirent.h>'''],
37efbbd8
ZJS
618]
619
85db59b7 620 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
4b9545f1 621 conf.set10('HAVE_' + ident[0].to_upper(), have)
5c23128d
ZJS
622endforeach
623
85db59b7 624if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
349cc4a5 625 conf.set10('USE_SYS_RANDOM_H', true)
4b9545f1 626 conf.set10('HAVE_GETRANDOM', true)
4984c8be
ZJS
627else
628 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
349cc4a5 629 conf.set10('USE_SYS_RANDOM_H', false)
4b9545f1 630 conf.set10('HAVE_GETRANDOM', have)
4984c8be
ZJS
631endif
632
5c23128d
ZJS
633#####################################################################
634
0f4c4f38
ZJS
635sh = find_program('sh')
636echo = find_program('echo')
5c23128d 637sed = find_program('sed')
5c23128d 638awk = find_program('awk')
5c23128d 639stat = find_program('stat')
0f4c4f38 640ln = find_program('ln')
d68b342b 641git = find_program('git', required : false)
b68dfb9e 642env = find_program('env')
0f4c4f38 643rsync = find_program('rsync', required : false)
4d56d084 644diff = find_program('diff')
d9081eb0 645find = find_program('find')
5c23128d 646
9289e093 647ln_s = ln.full_path() + ' -frsT -- "${DESTDIR:-}@0@" "${DESTDIR:-}@1@"'
94e75a54 648
9247df5a 649# If -Dxxx-path option is found, use that. Otherwise, check in $PATH,
5c23128d 650# /usr/sbin, /sbin, and fall back to the default from middle column.
2fa645f1 651progs = [['quotaon', '/usr/sbin/quotaon' ],
5c23128d 652 ['quotacheck', '/usr/sbin/quotacheck' ],
5c23128d
ZJS
653 ['kmod', '/usr/bin/kmod' ],
654 ['kexec', '/usr/sbin/kexec' ],
655 ['sulogin', '/usr/sbin/sulogin' ],
656 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
657 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
658 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
659 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
6db90462 660 ['nologin', '/usr/sbin/nologin', ],
5c23128d
ZJS
661 ]
662foreach prog : progs
37efbbd8
ZJS
663 path = get_option(prog[0] + '-path')
664 if path != ''
665 message('Using @1@ for @0@'.format(prog[0], path))
666 else
667 exe = find_program(prog[0],
668 '/usr/sbin/' + prog[0],
669 '/sbin/' + prog[0],
670 required: false)
573c0dc1 671 path = exe.found() ? exe.full_path() : prog[1]
37efbbd8
ZJS
672 endif
673 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
674 conf.set_quoted(name, path)
5c23128d
ZJS
675endforeach
676
2fa645f1
MG
677conf.set_quoted('TELINIT', get_option('telinit-path'))
678
e92777d2 679if run_command(ln, '--relative', '--help', check : false).returncode() != 0
cd001016 680 error('ln does not support --relative (added in coreutils 8.16)')
1276a9f6 681endif
5c23128d
ZJS
682
683############################################################
684
685gperf = find_program('gperf')
686
687gperf_test_format = '''
688#include <string.h>
689const char * in_word_set(const char *, @0@);
690@1@
691'''
ac3eda34 692gperf_snippet = run_command(sh, '-c', 'echo foo,bar | "$1" -L ANSI-C', '_', gperf,
e92777d2 693 check : true)
5c23128d
ZJS
694gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
695if cc.compiles(gperf_test)
37efbbd8 696 gperf_len_type = 'size_t'
5c23128d 697else
37efbbd8
ZJS
698 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
699 if cc.compiles(gperf_test)
700 gperf_len_type = 'unsigned'
701 else
702 error('unable to determine gperf len type')
703 endif
5c23128d
ZJS
704endif
705message('gperf len type is @0@'.format(gperf_len_type))
37efbbd8
ZJS
706conf.set('GPERF_LEN_TYPE', gperf_len_type,
707 description : 'The type of gperf "len" parameter')
5c23128d
ZJS
708
709############################################################
710
711if not cc.has_header('sys/capability.h')
37efbbd8 712 error('POSIX caps headers not found')
5c23128d 713endif
9f555bba 714foreach header : ['crypt.h',
5c23128d
ZJS
715 'linux/memfd.h',
716 'linux/vm_sockets.h',
af8786b1 717 'sys/auxv.h',
5545f336 718 'threads.h',
5c23128d
ZJS
719 'valgrind/memcheck.h',
720 'valgrind/valgrind.h',
420297c9 721 'linux/time_types.h',
b428efa5 722 'sys/sdt.h',
5c23128d 723 ]
2c201c21 724
349cc4a5
ZJS
725 conf.set10('HAVE_' + header.underscorify().to_upper(),
726 cc.has_header(header))
5c23128d
ZJS
727endforeach
728
729############################################################
730
eef4b800
ZJS
731fallback_hostname = get_option('fallback-hostname')
732if fallback_hostname == '' or fallback_hostname[0] == '.' or fallback_hostname[0] == '-'
733 error('Invalid fallback-hostname configuration')
734 # A more extensive test is done in test-hostname-util. Let's catch
735 # the most obvious errors here so we don't fail with an assert later.
736endif
737conf.set_quoted('FALLBACK_HOSTNAME', fallback_hostname)
738
5c23128d
ZJS
739default_hierarchy = get_option('default-hierarchy')
740conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
741 description : 'default cgroup hierarchy as string')
742if default_hierarchy == 'legacy'
37efbbd8 743 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
5c23128d 744elif default_hierarchy == 'hybrid'
37efbbd8 745 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
5c23128d 746else
37efbbd8 747 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
5c23128d
ZJS
748endif
749
681cb84a
ZJS
750extra_net_naming_schemes = []
751extra_net_naming_map = []
752foreach scheme: get_option('extra-net-naming-schemes').split(',')
753 if scheme != ''
754 name = scheme.split('=')[0]
755 value = scheme.split('=')[1]
756 NAME = name.underscorify().to_upper()
757 VALUE = []
758 foreach field: value.split('+')
759 VALUE += 'NAMING_' + field.underscorify().to_upper()
760 endforeach
761 extra_net_naming_schemes += 'NAMING_@0@ = @1@,'.format(NAME, '|'.join(VALUE))
762 extra_net_naming_map += '{ "@0@", NAMING_@1@ },'.format(name, NAME)
763 endif
764endforeach
765conf.set('EXTRA_NET_NAMING_SCHEMES', ' '.join(extra_net_naming_schemes))
766conf.set('EXTRA_NET_NAMING_MAP', ' '.join(extra_net_naming_map))
767
06da5c63
ZJS
768default_net_naming_scheme = get_option('default-net-naming-scheme')
769conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
77faadfd
ZJS
770if default_net_naming_scheme != 'latest'
771 conf.set('_DEFAULT_NET_NAMING_SCHEME_TEST',
772 'NAMING_' + default_net_naming_scheme.underscorify().to_upper())
773endif
06da5c63 774
5c23128d 775time_epoch = get_option('time-epoch')
a36be3e5 776if time_epoch <= 0
e92777d2 777 time_epoch = run_command(sh, '-c', 'echo "$SOURCE_DATE_EPOCH"', check : true).stdout().strip()
edd84b8e 778 if time_epoch == '' and git.found() and fs.is_dir('.git')
bd190899 779 # If we're in a git repository, use the creation time of the latest git tag.
e92777d2
ZJS
780 latest_tag = run_command(git, 'describe', '--abbrev=0', '--tags',
781 check : false)
782 if latest_tag.returncode() == 0
783 time_epoch = run_command(
784 git, 'log', '--no-show-signature', '-1', '--format=%at',
785 latest_tag.stdout().strip(),
786 check : false).stdout()
787 endif
0390b094
ZJS
788 endif
789 if time_epoch == ''
6dbf352c 790 NEWS = files('NEWS')
e92777d2
ZJS
791 time_epoch = run_command(stat, '-c', '%Y', NEWS,
792 check : true).stdout()
6dbf352c 793 endif
89cdbe1f 794 time_epoch = time_epoch.strip().to_int()
5c23128d 795endif
5c23128d
ZJS
796conf.set('TIME_EPOCH', time_epoch)
797
b10abe4b
EI
798conf.set('CLOCK_VALID_RANGE_USEC_MAX', get_option('clock-valid-range-usec-max'))
799
53350c7b 800default_user_shell = get_option('default-user-shell')
801conf.set_quoted('DEFAULT_USER_SHELL', default_user_shell)
802conf.set_quoted('DEFAULT_USER_SHELL_NAME', fs.name(default_user_shell))
803
fc1a5d1a
ZJS
804foreach tuple : [['system-alloc-uid-min', 'SYS_UID_MIN', 1], # Also see login.defs(5).
805 ['system-uid-max', 'SYS_UID_MAX', 999],
806 ['system-alloc-gid-min', 'SYS_GID_MIN', 1],
807 ['system-gid-max', 'SYS_GID_MAX', 999]]
808 v = get_option(tuple[0])
a36be3e5 809 if v <= 0
fc1a5d1a
ZJS
810 v = run_command(
811 awk,
812 '/^\s*@0@\s+/ { uid=$2 } END { print uid }'.format(tuple[1]),
e92777d2
ZJS
813 '/etc/login.defs',
814 check : false).stdout().strip()
fc1a5d1a
ZJS
815 if v == ''
816 v = tuple[2]
817 else
818 v = v.to_int()
819 endif
2f62cf35 820 endif
fc1a5d1a 821 conf.set(tuple[0].underscorify().to_upper(), v)
fc1a5d1a
ZJS
822endforeach
823if conf.get('SYSTEM_ALLOC_UID_MIN') >= conf.get('SYSTEM_UID_MAX')
824 error('Invalid uid allocation range')
5c23128d 825endif
fc1a5d1a
ZJS
826if conf.get('SYSTEM_ALLOC_GID_MIN') >= conf.get('SYSTEM_GID_MAX')
827 error('Invalid gid allocation range')
5c23128d 828endif
5c23128d 829
ac09340e
YW
830dynamic_uid_min = get_option('dynamic-uid-min')
831dynamic_uid_max = get_option('dynamic-uid-max')
87d5e4f2
LP
832conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
833conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
87d5e4f2 834
ac09340e
YW
835container_uid_base_min = get_option('container-uid-base-min')
836container_uid_base_max = get_option('container-uid-base-max')
87d5e4f2
LP
837conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
838conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
87d5e4f2 839
afde4574
LP
840nobody_user = get_option('nobody-user')
841nobody_group = get_option('nobody-group')
842
2484bff3 843if not meson.is_cross_build()
e92777d2 844 getent_result = run_command('getent', 'passwd', '65534', check : false)
2484bff3
CQ
845 if getent_result.returncode() == 0
846 name = getent_result.stdout().split(':')[0]
847 if name != nobody_user
848 warning('\n' +
849 '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) +
850 'Your build will result in an user table setup that is incompatible with the local system.')
851 endif
afde4574 852 endif
e92777d2 853 id_result = run_command('id', '-u', nobody_user, check : false)
2484bff3 854 if id_result.returncode() == 0
89cdbe1f 855 id = id_result.stdout().strip().to_int()
2484bff3
CQ
856 if id != 65534
857 warning('\n' +
858 '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) +
859 'Your build will result in an user table setup that is incompatible with the local system.')
860 endif
afde4574 861 endif
afde4574 862
e92777d2 863 getent_result = run_command('getent', 'group', '65534', check : false)
2484bff3
CQ
864 if getent_result.returncode() == 0
865 name = getent_result.stdout().split(':')[0]
866 if name != nobody_group
867 warning('\n' +
868 '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) +
869 'Your build will result in an group table setup that is incompatible with the local system.')
870 endif
afde4574 871 endif
e92777d2 872 id_result = run_command('id', '-g', nobody_group, check : false)
2484bff3 873 if id_result.returncode() == 0
89cdbe1f 874 id = id_result.stdout().strip().to_int()
2484bff3
CQ
875 if id != 65534
876 warning('\n' +
d5b3e510 877 '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
878 'Your build will result in an group table setup that is incompatible with the local system.')
879 endif
afde4574
LP
880 endif
881endif
8374cc62 882if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
8ea9fad7
YW
883 warning('\n' +
884 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
885 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
8374cc62 886endif
afde4574
LP
887
888conf.set_quoted('NOBODY_USER_NAME', nobody_user)
889conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
87d5e4f2 890
9a797ddc
ZJS
891static_ugids = []
892foreach option : ['adm-gid',
893 'audio-gid',
894 'cdrom-gid',
895 'dialout-gid',
896 'disk-gid',
897 'input-gid',
898 'kmem-gid',
899 'kvm-gid',
900 'lp-gid',
901 'render-gid',
902 'sgx-gid',
903 'tape-gid',
904 'tty-gid',
905 'users-gid',
906 'utmp-gid',
907 'video-gid',
908 'wheel-gid',
909 'systemd-journal-gid',
910 'systemd-network-uid',
911 'systemd-resolve-uid',
912 'systemd-timesync-uid']
913 name = option.underscorify().to_upper()
914 val = get_option(option)
915
916 # Ensure provided GID argument is numeric, otherwise fall back to default assignment
a36be3e5
YW
917 conf.set(name, val > 0 ? val : '-')
918 if val > 0
9a797ddc
ZJS
919 static_ugids += '@0@:@1@'.format(option, val)
920 endif
921endforeach
84786b8e 922
348b4437
YW
923conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
924conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
5c23128d 925
ace5e311 926dev_kvm_mode = get_option('dev-kvm-mode')
d924a938 927conf.set_quoted('DEV_KVM_MODE', dev_kvm_mode) # FIXME: convert to 0o… notation
ace5e311 928conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
055a083a 929group_render_mode = get_option('group-render-mode')
8feaea5e 930conf.set_quoted('GROUP_RENDER_MODE', group_render_mode)
055a083a 931conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
5c23128d 932
2a4c156d
ZJS
933kill_user_processes = get_option('default-kill-user-processes')
934conf.set10('KILL_USER_PROCESSES', kill_user_processes)
5c23128d 935
829257d1
ZJS
936dns_servers = get_option('dns-servers')
937conf.set_quoted('DNS_SERVERS', dns_servers)
5c23128d 938
829257d1
ZJS
939ntp_servers = get_option('ntp-servers')
940conf.set_quoted('NTP_SERVERS', ntp_servers)
5c23128d 941
8ca9e92c
DR
942default_locale = get_option('default-locale')
943conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
944
a22f5186
DDM
945nspawn_locale = get_option('nspawn-locale')
946conf.set_quoted('SYSTEMD_NSPAWN_LOCALE', nspawn_locale)
947
f129d0e7 948default_keymap = get_option('default-keymap')
ef7f5baa 949if default_keymap == ''
bf77d597 950 # We canonicalize empty keymap to '@kernel', as it makes the default value
ef7f5baa 951 # in the factory provided /etc/vconsole.conf more obvious.
bf77d597 952 default_keymap = '@kernel'
ef7f5baa 953endif
f129d0e7
MY
954conf.set_quoted('SYSTEMD_DEFAULT_KEYMAP', default_keymap)
955
8f20232f 956localegen_path = get_option('localegen-path')
8f20232f
MK
957if localegen_path != ''
958 conf.set_quoted('LOCALEGEN_PATH', localegen_path)
8f20232f 959endif
71ae5ce5 960conf.set10('HAVE_LOCALEGEN', localegen_path != '')
8f20232f 961
5c23128d
ZJS
962conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
963
21d0dd5a 964service_watchdog = get_option('service-watchdog')
7bc9ea51 965watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
059cc610 966conf.set_quoted('SERVICE_WATCHDOG', watchdog_value)
21d0dd5a 967
059cc610 968conf.set_quoted('SUSHELL', get_option('debug-shell'))
93912e87 969conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
3131bfe3 970
349cc4a5
ZJS
971enable_debug_hashmap = false
972enable_debug_mmap_cache = false
d6601495 973enable_debug_siphash = false
8f6b442a 974foreach name : get_option('debug-extra')
ad7aa760
YW
975 if name == 'hashmap'
976 enable_debug_hashmap = true
977 elif name == 'mmap-cache'
978 enable_debug_mmap_cache = true
d6601495
YW
979 elif name == 'siphash'
980 enable_debug_siphash = true
ad7aa760
YW
981 else
982 message('unknown debug option "@0@", ignoring'.format(name))
983 endif
984endforeach
349cc4a5
ZJS
985conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
986conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
d6601495 987conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
fd5dec9a 988conf.set10('LOG_TRACE', get_option('log-trace'))
d18cb393 989
3602ca6f
ZJS
990default_user_path = get_option('user-path')
991if default_user_path != ''
992 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
993endif
994
5c23128d
ZJS
995#####################################################################
996
997threads = dependency('threads')
998librt = cc.find_library('rt')
999libm = cc.find_library('m')
1000libdl = cc.find_library('dl')
55573787
YW
1001libcrypt = dependency('libcrypt', 'libxcrypt', required : false)
1002if not libcrypt.found()
1003 # fallback to use find_library() if libcrypt is provided by glibc, e.g. for LibreELEC.
1004 libcrypt = cc.find_library('crypt')
1005endif
d625f717 1006libcap = dependency('libcap')
5c23128d 1007
96f8c636
ZJS
1008# On some architectures, libatomic is required. But on some installations,
1009# it is found, but actual linking fails. So let's try to use it opportunistically.
1010# If it is installed, but not needed, it will be dropped because of --as-needed.
1011if cc.links('''int main(int argc, char **argv) { return 0; }''',
1012 args : '-latomic',
1013 name : 'libatomic')
1014 libatomic = declare_dependency(link_args : '-latomic')
1015else
1016 libatomic = []
1017endif
1018
06ca077b 1019crypt_header = conf.get('HAVE_CRYPT_H') == 1 ? '''#include <crypt.h>''' : '''#include <unistd.h>'''
e8644a41 1020foreach ident : [
feee7f62
LB
1021 ['crypt_ra', crypt_header],
1022 ['crypt_preferred_method', crypt_header],
1023 ['crypt_gensalt_ra', crypt_header]]
e8644a41
ZJS
1024
1025 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE',
1026 dependencies : libcrypt)
1027 conf.set10('HAVE_' + ident[0].to_upper(), have)
1028endforeach
1029
7d861e12 1030want_bpf_framework = get_option('bpf-framework')
b88323e4 1031bpf_compiler = get_option('bpf-compiler')
7d861e12
JK
1032bpf_framework_required = want_bpf_framework == 'true'
1033
87e462f7 1034libbpf_version_requirement = '>= 0.1.0'
b88323e4
JH
1035if bpf_compiler == 'gcc'
1036 libbpf_version_requirement = '>= 1.0.0'
1037endif
1038libbpf = dependency('libbpf', required : bpf_framework_required, version : libbpf_version_requirement)
7d861e12
JK
1039conf.set10('HAVE_LIBBPF', libbpf.found())
1040
b88323e4
JH
1041bpftool_strip_version_requirement = '>= 5.13.0'
1042if bpf_compiler == 'gcc'
1043 bpftool_strip_version_requirement = '>= 7.0.0'
1044endif
1045
3d954ef1 1046if want_bpf_framework == 'false' or not libbpf.found() or skip_deps
cf2dc690 1047 conf.set10('BPF_FRAMEWORK', false)
7d861e12 1048else
76abad4d
JH
1049 clang_found = false
1050 clang_supports_bpf = false
1051 bpf_gcc_found = false
b88323e4 1052 bpftool_strip = false
76abad4d
JH
1053 deps_found = false
1054
1055 if bpf_compiler == 'clang'
1056 # Support 'versioned' clang/llvm-strip binaries, as seen on Debian/Ubuntu
1057 # (like clang-10/llvm-strip-10)
1058 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')
1059 r = find_program('clang', required : bpf_framework_required, version : '>= 10.0.0')
1060 clang_found = r.found()
1061 if clang_found
573c0dc1 1062 clang = r.full_path()
76abad4d 1063 endif
76abad4d
JH
1064 else
1065 clang_found = true
1066 clang = cc.cmd_array()
dc7e9c1b 1067 endif
a6ac8b5a 1068
76abad4d
JH
1069 if clang_found
1070 # Check if 'clang -target bpf' is supported.
1071 clang_supports_bpf = run_command(clang, '-target', 'bpf', '--print-supported-cpus', check : false).returncode() == 0
1072 endif
1073 elif bpf_compiler == 'gcc'
76abad4d 1074 bpf_gcc = find_program('bpf-gcc',
e4086f7d 1075 'bpf-none-gcc',
76abad4d 1076 required : true,
4a7a13b5 1077 version : '>= 13.1.0')
76abad4d 1078 bpf_gcc_found = bpf_gcc.found()
a6ac8b5a
YW
1079 endif
1080
76abad4d
JH
1081 if clang_supports_bpf or bpf_gcc_found
1082 # Debian installs this in /usr/sbin/ which is not in $PATH.
1083 # We check for 'bpftool' first, honouring $PATH, and in /usr/sbin/ for Debian.
1084 # We use 'bpftool gen object' subcommand for bpftool strip, it was added by d80b2fcbe0a023619e0fc73112f2a02c2662f6ab (v5.13).
b88323e4 1085 bpftool_strip_required = bpf_framework_required and bpf_compiler == 'gcc'
e3759ac4
JH
1086 bpftool = find_program('bpftool',
1087 '/usr/sbin/bpftool',
b88323e4
JH
1088 required : bpftool_strip_required,
1089 version : bpftool_strip_version_requirement)
e3759ac4 1090
76abad4d
JH
1091 if bpftool.found()
1092 bpftool_strip = true
1093 deps_found = true
b88323e4 1094 elif bpf_compiler == 'clang'
76abad4d
JH
1095 # We require the 'bpftool gen skeleton' subcommand, it was added by 985ead416df39d6fe8e89580cc1db6aa273e0175 (v5.6).
1096 bpftool = find_program('bpftool',
1097 '/usr/sbin/bpftool',
1098 required : bpf_framework_required,
1099 version : '>= 5.6.0')
e3759ac4 1100 endif
68e101da 1101
76abad4d
JH
1102 # We use `llvm-strip` as a fallback if `bpftool gen object` strip support is not available.
1103 if not bpftool_strip and bpftool.found() and clang_supports_bpf
1104 if not meson.is_cross_build()
1105 llvm_strip_bin = run_command(clang, '--print-prog-name', 'llvm-strip',
1106 check : true).stdout().strip()
1107 else
1108 llvm_strip_bin = 'llvm-strip'
1109 endif
1110 llvm_strip = find_program(llvm_strip_bin, required : bpf_framework_required, version : '>= 10.0.0')
1111 deps_found = llvm_strip.found()
1112 endif
1113 endif
68e101da 1114
7d861e12 1115 # Can build BPF program from source code in restricted C
d40ce018 1116 conf.set10('BPF_FRAMEWORK', deps_found)
7d861e12
JK
1117endif
1118
5c23128d 1119libmount = dependency('mount',
c0b4b0f8 1120 version : fuzzer_build ? '>= 0' : '>= 2.30')
5c23128d 1121
e594a3b1
LP
1122want_libfdisk = get_option('fdisk')
1123if want_libfdisk != 'false' and not skip_deps
1124 libfdisk = dependency('fdisk',
baec7d78 1125 version : '>= 2.32',
e594a3b1
LP
1126 required : want_libfdisk == 'true')
1127 have = libfdisk.found()
1128else
1129 have = false
1130 libfdisk = []
1131endif
1132conf.set10('HAVE_LIBFDISK', have)
1133
1d8aae43 1134want_passwdqc = get_option('passwdqc')
70a5db58 1135want_pwquality = get_option('pwquality')
1d8aae43
EI
1136if want_passwdqc == 'true' and want_pwquality == 'true'
1137 error('passwdqc and pwquality cannot be requested simultaneously')
1138endif
1139
1140if want_pwquality != 'false' and want_passwdqc != 'true' and not skip_deps
51c425dc
DL
1141 libpwquality = dependency('pwquality',
1142 version : '>= 1.4.1',
1143 required : want_pwquality == 'true')
70a5db58
LP
1144 have = libpwquality.found()
1145else
1146 have = false
1147 libpwquality = []
1148endif
1149conf.set10('HAVE_PWQUALITY', have)
1150
1d8aae43
EI
1151if not have and want_passwdqc != 'false' and not skip_deps
1152 libpasswdqc = dependency('passwdqc',
1153 required : want_passwdqc == 'true')
1154 have = libpasswdqc.found()
1155else
1156 have = false
1157 libpasswdqc = []
1158endif
1159conf.set10('HAVE_PASSWDQC', have)
1160
5c23128d 1161want_seccomp = get_option('seccomp')
87ac55a1 1162if want_seccomp != 'false' and not skip_deps
37efbbd8 1163 libseccomp = dependency('libseccomp',
9f0e9c01 1164 version : '>= 2.3.1',
37efbbd8 1165 required : want_seccomp == 'true')
349cc4a5 1166 have = libseccomp.found()
5c23128d 1167else
349cc4a5 1168 have = false
37efbbd8 1169 libseccomp = []
5c23128d 1170endif
349cc4a5 1171conf.set10('HAVE_SECCOMP', have)
5c23128d
ZJS
1172
1173want_selinux = get_option('selinux')
87ac55a1 1174if want_selinux != 'false' and not skip_deps
37efbbd8
ZJS
1175 libselinux = dependency('libselinux',
1176 version : '>= 2.1.9',
1177 required : want_selinux == 'true')
349cc4a5 1178 have = libselinux.found()
5c23128d 1179else
349cc4a5 1180 have = false
37efbbd8 1181 libselinux = []
5c23128d 1182endif
349cc4a5 1183conf.set10('HAVE_SELINUX', have)
5c23128d
ZJS
1184
1185want_apparmor = get_option('apparmor')
87ac55a1 1186if want_apparmor != 'false' and not skip_deps
37efbbd8 1187 libapparmor = dependency('libapparmor',
2ffadd3c 1188 version : '>= 2.13',
37efbbd8 1189 required : want_apparmor == 'true')
349cc4a5 1190 have = libapparmor.found()
5c23128d 1191else
349cc4a5 1192 have = false
37efbbd8 1193 libapparmor = []
5c23128d 1194endif
349cc4a5 1195conf.set10('HAVE_APPARMOR', have)
5c23128d 1196
07b382cc
ZJS
1197have = get_option('smack') and get_option('smack-run-label') != ''
1198conf.set10('HAVE_SMACK_RUN_LABEL', have)
1199if have
1200 conf.set_quoted('SMACK_RUN_LABEL', get_option('smack-run-label'))
1201endif
5c23128d 1202
aa5ae971
ŁS
1203have = get_option('smack') and get_option('smack-default-process-label') != ''
1204if have
1205 conf.set_quoted('SMACK_DEFAULT_PROCESS_LABEL', get_option('smack-default-process-label'))
1206endif
1207
3ca0cb73
ZJS
1208want_polkit = get_option('polkit')
1209install_polkit = false
1210install_polkit_pkla = false
87ac55a1 1211if want_polkit != 'false' and not skip_deps
37efbbd8 1212 install_polkit = true
3ca0cb73 1213
37efbbd8
ZJS
1214 libpolkit = dependency('polkit-gobject-1',
1215 required : false)
1216 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
1217 message('Old polkit detected, will install pkla files')
1218 install_polkit_pkla = true
1219 endif
3ca0cb73 1220endif
349cc4a5 1221conf.set10('ENABLE_POLKIT', install_polkit)
3ca0cb73 1222
36f0387e 1223want_acl = get_option('acl')
87ac55a1 1224if want_acl != 'false' and not skip_deps
d625f717 1225 libacl = dependency('libacl', required : want_acl == 'true')
349cc4a5 1226 have = libacl.found()
36f0387e 1227else
349cc4a5 1228 have = false
36f0387e
ZJS
1229 libacl = []
1230endif
349cc4a5 1231conf.set10('HAVE_ACL', have)
36f0387e 1232
5c23128d 1233want_audit = get_option('audit')
87ac55a1 1234if want_audit != 'false' and not skip_deps
37efbbd8 1235 libaudit = dependency('audit', required : want_audit == 'true')
349cc4a5 1236 have = libaudit.found()
5c23128d 1237else
349cc4a5 1238 have = false
37efbbd8 1239 libaudit = []
5c23128d 1240endif
349cc4a5 1241conf.set10('HAVE_AUDIT', have)
5c23128d
ZJS
1242
1243want_blkid = get_option('blkid')
87ac55a1 1244if want_blkid != 'false' and not skip_deps
37efbbd8 1245 libblkid = dependency('blkid', required : want_blkid == 'true')
349cc4a5 1246 have = libblkid.found()
4fcc033b
KZ
1247
1248 conf.set10('HAVE_BLKID_PROBE_SET_HINT',
1249 have and cc.has_function('blkid_probe_set_hint', dependencies : libblkid))
5c23128d 1250else
349cc4a5 1251 have = false
37efbbd8 1252 libblkid = []
5c23128d 1253endif
349cc4a5 1254conf.set10('HAVE_BLKID', have)
5c23128d
ZJS
1255
1256want_kmod = get_option('kmod')
87ac55a1 1257if want_kmod != 'false' and not skip_deps
37efbbd8
ZJS
1258 libkmod = dependency('libkmod',
1259 version : '>= 15',
1260 required : want_kmod == 'true')
349cc4a5 1261 have = libkmod.found()
5c23128d 1262else
349cc4a5 1263 have = false
37efbbd8 1264 libkmod = []
5c23128d 1265endif
349cc4a5 1266conf.set10('HAVE_KMOD', have)
5c23128d 1267
ede5a78f
ST
1268want_xenctrl = get_option('xenctrl')
1269if want_xenctrl != 'false' and not skip_deps
1270 libxenctrl = dependency('xencontrol',
1271 version : '>= 4.9',
1272 required : want_xenctrl == 'true')
1273 have = libxenctrl.found()
1274else
1275 have = false
1276 libxenctrl = []
1277endif
1278conf.set10('HAVE_XENCTRL', have)
1279
5c23128d 1280want_pam = get_option('pam')
87ac55a1 1281if want_pam != 'false' and not skip_deps
d625f717
YW
1282 libpam = dependency('pam', required : false)
1283 if not libpam.found()
1284 # Debian older than bookworm and Ubuntu older than 22.10 do not provide the .pc file.
1285 libpam = cc.find_library('pam', required : want_pam == 'true')
1286 endif
1287 libpam_misc = dependency('pam_misc', required : false)
1288 if not libpam_misc.found()
1289 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
1290 endif
349cc4a5 1291 have = libpam.found() and libpam_misc.found()
5c23128d 1292else
349cc4a5 1293 have = false
37efbbd8
ZJS
1294 libpam = []
1295 libpam_misc = []
5c23128d 1296endif
349cc4a5 1297conf.set10('HAVE_PAM', have)
5c23128d
ZJS
1298
1299want_microhttpd = get_option('microhttpd')
87ac55a1 1300if want_microhttpd != 'false' and not skip_deps
37efbbd8
ZJS
1301 libmicrohttpd = dependency('libmicrohttpd',
1302 version : '>= 0.9.33',
1303 required : want_microhttpd == 'true')
349cc4a5 1304 have = libmicrohttpd.found()
5c23128d 1305else
349cc4a5 1306 have = false
37efbbd8 1307 libmicrohttpd = []
5c23128d 1308endif
349cc4a5 1309conf.set10('HAVE_MICROHTTPD', have)
5c23128d
ZJS
1310
1311want_libcryptsetup = get_option('libcryptsetup')
d1ae38d8
OK
1312want_libcryptsetup_plugins = get_option('libcryptsetup-plugins')
1313
1314if want_libcryptsetup_plugins == 'true' and want_libcryptsetup == 'false'
1315 error('libcryptsetup-plugins can not be requested without libcryptsetup')
1316endif
1317
87ac55a1 1318if want_libcryptsetup != 'false' and not skip_deps
37efbbd8 1319 libcryptsetup = dependency('libcryptsetup',
d1ae38d8
OK
1320 version : want_libcryptsetup_plugins == 'true' ? '>= 2.4.0' : '>= 2.0.1',
1321 required : want_libcryptsetup == 'true' or want_libcryptsetup_plugins == 'true')
349cc4a5 1322 have = libcryptsetup.found()
70a5db58 1323
aac80717
ZJS
1324 foreach ident : ['crypt_set_metadata_size',
1325 'crypt_activate_by_signed_key',
48a09a8f
DDM
1326 'crypt_token_max',
1327 'crypt_reencrypt_init_by_passphrase',
1328 'crypt_reencrypt',
1329 'crypt_set_data_offset']
aac80717
ZJS
1330 have_ident = have and cc.has_function(
1331 ident,
1332 prefix : '#include <libcryptsetup.h>',
1333 dependencies : libcryptsetup)
1334 conf.set10('HAVE_' + ident.to_upper(), have_ident)
1335 endforeach
5c23128d 1336else
349cc4a5 1337 have = false
37efbbd8 1338 libcryptsetup = []
5c23128d 1339endif
349cc4a5 1340conf.set10('HAVE_LIBCRYPTSETUP', have)
5c23128d 1341
d1ae38d8 1342if want_libcryptsetup_plugins != 'false' and not skip_deps
aac80717
ZJS
1343 have = (cc.has_function(
1344 'crypt_activate_by_token_pin',
1345 prefix : '#include <libcryptsetup.h>',
1346 dependencies : libcryptsetup) and
1347 cc.has_function(
1348 'crypt_token_external_path',
1349 prefix : '#include <libcryptsetup.h>',
1350 dependencies : libcryptsetup))
d1ae38d8
OK
1351else
1352 have = false
1353endif
1354conf.set10('HAVE_LIBCRYPTSETUP_PLUGINS', have)
1355
5c23128d 1356want_libcurl = get_option('libcurl')
87ac55a1 1357if want_libcurl != 'false' and not skip_deps
37efbbd8
ZJS
1358 libcurl = dependency('libcurl',
1359 version : '>= 7.32.0',
1360 required : want_libcurl == 'true')
349cc4a5 1361 have = libcurl.found()
5c23128d 1362else
349cc4a5 1363 have = false
37efbbd8 1364 libcurl = []
5c23128d 1365endif
349cc4a5 1366conf.set10('HAVE_LIBCURL', have)
47350c5f 1367conf.set10('CURL_NO_OLDIES', conf.get('BUILD_MODE_DEVELOPER') == 1)
5c23128d
ZJS
1368
1369want_libidn = get_option('libidn')
87057e24
ZJS
1370want_libidn2 = get_option('libidn2')
1371if want_libidn == 'true' and want_libidn2 == 'true'
1372 error('libidn and libidn2 cannot be requested simultaneously')
1373endif
1374
1b931399
YW
1375if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1376 libidn = dependency('libidn2',
1377 required : want_libidn2 == 'true')
349cc4a5 1378 have = libidn.found()
87057e24 1379else
349cc4a5 1380 have = false
87057e24
ZJS
1381 libidn = []
1382endif
1b931399
YW
1383conf.set10('HAVE_LIBIDN2', have)
1384if not have and want_libidn != 'false' and not skip_deps
7f7ab228 1385 # libidn is used for both libidn and libidn2 objects
1b931399
YW
1386 libidn = dependency('libidn',
1387 required : want_libidn == 'true')
349cc4a5
ZJS
1388 have = libidn.found()
1389else
1390 have = false
5c23128d 1391endif
1b931399 1392conf.set10('HAVE_LIBIDN', have)
5c23128d
ZJS
1393
1394want_libiptc = get_option('libiptc')
87ac55a1 1395if want_libiptc != 'false' and not skip_deps
37efbbd8
ZJS
1396 libiptc = dependency('libiptc',
1397 required : want_libiptc == 'true')
349cc4a5 1398 have = libiptc.found()
5c23128d 1399else
349cc4a5 1400 have = false
37efbbd8 1401 libiptc = []
5c23128d 1402endif
349cc4a5 1403conf.set10('HAVE_LIBIPTC', have)
5c23128d
ZJS
1404
1405want_qrencode = get_option('qrencode')
87ac55a1 1406if want_qrencode != 'false' and not skip_deps
37efbbd8 1407 libqrencode = dependency('libqrencode',
3f5225d7 1408 version : '>= 3',
37efbbd8 1409 required : want_qrencode == 'true')
349cc4a5 1410 have = libqrencode.found()
5c23128d 1411else
349cc4a5 1412 have = false
37efbbd8 1413 libqrencode = []
5c23128d 1414endif
349cc4a5 1415conf.set10('HAVE_QRENCODE', have)
5c23128d 1416
a44fb601 1417want_gcrypt = get_option('gcrypt')
87ac55a1 1418if want_gcrypt != 'false' and not skip_deps
d625f717
YW
1419 libgcrypt = dependency('libgcrypt', required : want_gcrypt == 'true')
1420 libgpg_error = dependency('gpg-error', required : false)
1421 if not libgpg_error.found()
1422 # CentOS 8 does not provide the .pc file.
1423 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1424 endif
349cc4a5 1425 have = libgcrypt.found() and libgpg_error.found()
a44fb601 1426else
349cc4a5
ZJS
1427 have = false
1428endif
1429if not have
1430 # link to neither of the libs if one is not found
a44fb601
ZJS
1431 libgcrypt = []
1432 libgpg_error = []
1433endif
349cc4a5 1434conf.set10('HAVE_GCRYPT', have)
a44fb601 1435
5c23128d 1436want_gnutls = get_option('gnutls')
87ac55a1 1437if want_gnutls != 'false' and not skip_deps
37efbbd8
ZJS
1438 libgnutls = dependency('gnutls',
1439 version : '>= 3.1.4',
1440 required : want_gnutls == 'true')
349cc4a5 1441 have = libgnutls.found()
5c23128d 1442else
349cc4a5 1443 have = false
37efbbd8 1444 libgnutls = []
5c23128d 1445endif
349cc4a5 1446conf.set10('HAVE_GNUTLS', have)
5c23128d 1447
096cbdce 1448want_openssl = get_option('openssl')
87ac55a1 1449if want_openssl != 'false' and not skip_deps
096cbdce
IT
1450 libopenssl = dependency('openssl',
1451 version : '>= 1.1.0',
1452 required : want_openssl == 'true')
1453 have = libopenssl.found()
1454else
1455 have = false
1456 libopenssl = []
1457endif
1458conf.set10('HAVE_OPENSSL', have)
1459
839fddbe
LP
1460want_p11kit = get_option('p11kit')
1461if want_p11kit != 'false' and not skip_deps
1462 libp11kit = dependency('p11-kit-1',
6164ec4c
ZJS
1463 version : '>= 0.23.3',
1464 required : want_p11kit == 'true')
839fddbe 1465 have = libp11kit.found()
da035a3a 1466 libp11kit_cflags = libp11kit.partial_dependency(includes: true, compile_args: true)
839fddbe
LP
1467else
1468 have = false
da035a3a 1469 libp11kit_cflags = []
839fddbe
LP
1470 libp11kit = []
1471endif
1472conf.set10('HAVE_P11KIT', have)
1473
af4fbd46
LP
1474want_libfido2 = get_option('libfido2')
1475if want_libfido2 != 'false' and not skip_deps
e0f435f9
YW
1476 if conf.get('HAVE_OPENSSL') == 1
1477 libfido2 = dependency('libfido2',
1478 required : want_libfido2 == 'true')
1479 have = libfido2.found()
1480 elif want_libfido2 == 'true'
1481 error('libfido2=true requires openssl')
1482 else
1483 have = false
1484 libfido2 = []
1485 endif
af4fbd46
LP
1486else
1487 have = false
1488 libfido2 = []
1489endif
1490conf.set10('HAVE_LIBFIDO2', have)
1491
5e521624
LP
1492want_tpm2 = get_option('tpm2')
1493if want_tpm2 != 'false' and not skip_deps
d7a57308 1494 tpm2 = dependency('tss2-esys tss2-rc tss2-mu tss2-tcti-device',
ba081955 1495 required : want_tpm2 == 'true')
5e521624 1496 have = tpm2.found()
155c5129 1497 have_esys3 = tpm2.version().version_compare('>= 3.0.0')
5e521624
LP
1498else
1499 have = false
155c5129 1500 have_esys3 = false
5e521624
LP
1501 tpm2 = []
1502endif
1503conf.set10('HAVE_TPM2', have)
155c5129 1504conf.set10('HAVE_TSS2_ESYS3', have_esys3)
5e521624 1505
5c23128d 1506want_elfutils = get_option('elfutils')
87ac55a1 1507if want_elfutils != 'false' and not skip_deps
37efbbd8
ZJS
1508 libdw = dependency('libdw',
1509 required : want_elfutils == 'true')
349cc4a5 1510 have = libdw.found()
d48c2721
LB
1511
1512 # New in elfutils 0.177
1513 conf.set10('HAVE_DWELF_ELF_E_MACHINE_STRING',
1514 have and cc.has_function('dwelf_elf_e_machine_string', dependencies : libdw))
5c23128d 1515else
349cc4a5 1516 have = false
37efbbd8 1517 libdw = []
5c23128d 1518endif
349cc4a5 1519conf.set10('HAVE_ELFUTILS', have)
5c23128d
ZJS
1520
1521want_zlib = get_option('zlib')
87ac55a1 1522if want_zlib != 'false' and not skip_deps
37efbbd8
ZJS
1523 libz = dependency('zlib',
1524 required : want_zlib == 'true')
349cc4a5 1525 have = libz.found()
5c23128d 1526else
349cc4a5 1527 have = false
37efbbd8 1528 libz = []
5c23128d 1529endif
349cc4a5 1530conf.set10('HAVE_ZLIB', have)
5c23128d
ZJS
1531
1532want_bzip2 = get_option('bzip2')
87ac55a1 1533if want_bzip2 != 'false' and not skip_deps
d625f717
YW
1534 libbzip2 = dependency('bzip2', required : false)
1535 if not libbzip2.found()
1536 # Debian and Ubuntu do not provide the .pc file.
1537 libbzip2 = cc.find_library('bz2', required : want_bzip2 == 'true')
1538 endif
349cc4a5 1539 have = libbzip2.found()
5c23128d 1540else
349cc4a5 1541 have = false
37efbbd8 1542 libbzip2 = []
5c23128d 1543endif
349cc4a5 1544conf.set10('HAVE_BZIP2', have)
5c23128d
ZJS
1545
1546want_xz = get_option('xz')
87ac55a1 1547if want_xz != 'false' and not skip_deps
37efbbd8
ZJS
1548 libxz = dependency('liblzma',
1549 required : want_xz == 'true')
d80b051c 1550 have_xz = libxz.found()
5c23128d 1551else
d80b051c 1552 have_xz = false
37efbbd8 1553 libxz = []
5c23128d 1554endif
d80b051c 1555conf.set10('HAVE_XZ', have_xz)
5c23128d
ZJS
1556
1557want_lz4 = get_option('lz4')
87ac55a1 1558if want_lz4 != 'false' and not skip_deps
37efbbd8 1559 liblz4 = dependency('liblz4',
e0a1d4b0 1560 version : '>= 1.3.0',
37efbbd8 1561 required : want_lz4 == 'true')
d80b051c 1562 have_lz4 = liblz4.found()
5c23128d 1563else
d80b051c 1564 have_lz4 = false
37efbbd8 1565 liblz4 = []
5c23128d 1566endif
d80b051c 1567conf.set10('HAVE_LZ4', have_lz4)
5c23128d 1568
ef5924aa
NL
1569want_zstd = get_option('zstd')
1570if want_zstd != 'false' and not skip_deps
1571 libzstd = dependency('libzstd',
1572 required : want_zstd == 'true',
1573 version : '>= 1.4.0')
d80b051c 1574 have_zstd = libzstd.found()
ef5924aa 1575else
d80b051c 1576 have_zstd = false
ef5924aa
NL
1577 libzstd = []
1578endif
d80b051c
LP
1579conf.set10('HAVE_ZSTD', have_zstd)
1580
1581conf.set10('HAVE_COMPRESSION', have_xz or have_lz4 or have_zstd)
ef5924aa 1582
cd3c6322
LB
1583compression = get_option('default-compression')
1584if compression == 'auto'
1585 if have_zstd
1586 compression = 'zstd'
1587 elif have_lz4
1588 compression = 'lz4'
1589 elif have_xz
1590 compression = 'xz'
1591 else
1592 compression = 'none'
1593 endif
1594elif compression == 'zstd' and not have_zstd
1595 error('default-compression=zstd requires zstd')
1596elif compression == 'lz4' and not have_lz4
1597 error('default-compression=lz4 requires lz4')
1598elif compression == 'xz' and not have_xz
1599 error('default-compression=xz requires xz')
1600endif
1788c6f3 1601conf.set('DEFAULT_COMPRESSION', 'COMPRESSION_@0@'.format(compression.to_upper()))
cd3c6322 1602
a44fb601 1603want_xkbcommon = get_option('xkbcommon')
87ac55a1 1604if want_xkbcommon != 'false' and not skip_deps
a44fb601
ZJS
1605 libxkbcommon = dependency('xkbcommon',
1606 version : '>= 0.3.0',
1607 required : want_xkbcommon == 'true')
349cc4a5 1608 have = libxkbcommon.found()
a44fb601 1609else
349cc4a5 1610 have = false
a44fb601
ZJS
1611 libxkbcommon = []
1612endif
349cc4a5 1613conf.set10('HAVE_XKBCOMMON', have)
a44fb601 1614
c4c978a0 1615want_pcre2 = get_option('pcre2')
8739f309 1616if want_pcre2 != 'false' and not skip_deps
c4c978a0
ZJS
1617 libpcre2 = dependency('libpcre2-8',
1618 required : want_pcre2 == 'true')
1619 have = libpcre2.found()
1620else
1621 have = false
1622 libpcre2 = []
1623endif
1624conf.set10('HAVE_PCRE2', have)
1625
69e96427 1626want_glib = get_option('glib')
87ac55a1 1627if want_glib != 'false' and not skip_deps
37efbbd8
ZJS
1628 libglib = dependency('glib-2.0',
1629 version : '>= 2.22.0',
1630 required : want_glib == 'true')
1631 libgobject = dependency('gobject-2.0',
1632 version : '>= 2.22.0',
1633 required : want_glib == 'true')
1634 libgio = dependency('gio-2.0',
1635 required : want_glib == 'true')
2c201c21 1636 have = libglib.found() and libgobject.found() and libgio.found()
69e96427 1637else
349cc4a5 1638 have = false
37efbbd8
ZJS
1639 libglib = []
1640 libgobject = []
1641 libgio = []
69e96427 1642endif
349cc4a5 1643conf.set10('HAVE_GLIB', have)
69e96427
ZJS
1644
1645want_dbus = get_option('dbus')
87ac55a1 1646if want_dbus != 'false' and not skip_deps
37efbbd8
ZJS
1647 libdbus = dependency('dbus-1',
1648 version : '>= 1.3.2',
1649 required : want_dbus == 'true')
349cc4a5 1650 have = libdbus.found()
69e96427 1651else
349cc4a5 1652 have = false
37efbbd8 1653 libdbus = []
69e96427 1654endif
349cc4a5 1655conf.set10('HAVE_DBUS', have)
69e96427 1656
1bd0cc45
YW
1657dbusdatadir = datadir / 'dbus-1'
1658if conf.get('HAVE_DBUS') == 1
1659 dbusdatadir = libdbus.get_variable(pkgconfig: 'datadir', default_value: datadir) / 'dbus-1'
1660endif
1661
1662dbuspolicydir = get_option('dbuspolicydir')
1663if dbuspolicydir == ''
1664 dbuspolicydir = dbusdatadir / 'system.d'
1665endif
1666
1667dbussessionservicedir = get_option('dbussessionservicedir')
1668if dbussessionservicedir == ''
1669 dbussessionservicedir = dbusdatadir / 'services'
1670 if conf.get('HAVE_DBUS') == 1
1671 dbussessionservicedir = libdbus.get_variable(pkgconfig: 'session_bus_services_dir', default_value: dbussessionservicedir)
1672 endif
1673endif
1674
1675dbussystemservicedir = get_option('dbussystemservicedir')
1676if dbussystemservicedir == ''
1677 dbussystemservicedir = dbusdatadir / 'system-services'
1678 if conf.get('HAVE_DBUS') == 1
1679 dbussystemservicedir = libdbus.get_variable(pkgconfig: 'system_bus_services_dir', default_value: dbussystemservicedir)
1680 endif
1681endif
1682
1683dbus_interfaces_dir = get_option('dbus-interfaces-dir')
1684if dbus_interfaces_dir == '' or dbus_interfaces_dir == 'yes'
1685 if meson.is_cross_build() and dbus_interfaces_dir != 'yes'
1686 dbus_interfaces_dir = 'no'
1687 warning('Exporting D-Bus interface XML files is disabled during cross build. Pass path or "yes" to force enable.')
1688 else
1689 dbus_interfaces_dir = dbusdatadir / 'interfaces'
1690 if conf.get('HAVE_DBUS') == 1
1691 dbus_interfaces_dir = libdbus.get_variable(pkgconfig: 'interfaces_dir', default_value: dbus_interfaces_dir)
1692 endif
1693 endif
1694endif
1bd0cc45 1695
12b4cffd
YW
1696dmi_arches = ['x86', 'x86_64', 'aarch64', 'arm', 'ia64', 'loongarch64', 'mips']
1697conf.set10('HAVE_DMI', host_machine.cpu_family() in dmi_arches)
1698
e37ad765
ZJS
1699# We support one or the other. If gcrypt is available, we assume it's there to
1700# be used, and use it in preference.
1701opt = get_option('cryptolib')
1702if opt == 'openssl' and conf.get('HAVE_OPENSSL') == 0
1703 error('openssl requested as the default cryptolib, but not available')
1704endif
1705conf.set10('PREFER_OPENSSL',
1706 opt == 'openssl' or (opt == 'auto' and conf.get('HAVE_OPENSSL') == 1 and conf.get('HAVE_GCRYPT') == 0))
1707conf.set10('HAVE_OPENSSL_OR_GCRYPT',
1708 conf.get('HAVE_OPENSSL') == 1 or conf.get('HAVE_GCRYPT') == 1)
9bcf483b 1709lib_openssl_or_gcrypt = conf.get('PREFER_OPENSSL') == 1 ? [libopenssl] : [libgcrypt, libgpg_error]
42303dcb 1710
56ddbf10
YW
1711dns_over_tls = get_option('dns-over-tls')
1712if dns_over_tls != 'false'
e37ad765
ZJS
1713 if dns_over_tls == 'gnutls' and conf.get('PREFER_OPENSSL') == 1
1714 error('Sorry, -Ddns-over-tls=gnutls is not supported when openssl is used as the cryptolib')
1715 endif
1716
1f9aa3d2
LB
1717 if dns_over_tls == 'gnutls'
1718 have_openssl = false
096cbdce 1719 else
1f9aa3d2
LB
1720 have_openssl = conf.get('HAVE_OPENSSL') == 1
1721 if dns_over_tls == 'openssl' and not have_openssl
1722 error('DNS-over-TLS support was requested with openssl, but dependencies are not available')
096cbdce 1723 endif
56ddbf10 1724 endif
1f9aa3d2
LB
1725 if dns_over_tls == 'openssl' or have_openssl
1726 have_gnutls = false
096cbdce 1727 else
1f9aa3d2
LB
1728 have_gnutls = conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0')
1729 if dns_over_tls != 'auto' and not have_gnutls
1730 str = dns_over_tls == 'gnutls' ? ' with gnutls' : ''
b349bc59 1731 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
096cbdce
IT
1732 endif
1733 endif
1734 have = have_gnutls or have_openssl
56ddbf10 1735else
be5536a6
MO
1736 have = false
1737 have_gnutls = false
1738 have_openssl = false
56ddbf10
YW
1739endif
1740conf.set10('ENABLE_DNS_OVER_TLS', have)
096cbdce
IT
1741conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1742conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
56ddbf10 1743
c9299be2 1744default_dns_over_tls = get_option('default-dns-over-tls')
87ac55a1 1745if skip_deps
c9299be2 1746 default_dns_over_tls = 'no'
5d67a7ae 1747endif
56ddbf10 1748if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
4310bfc2 1749 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 1750 default_dns_over_tls = 'no'
5d67a7ae 1751endif
c9299be2
IT
1752conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1753 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
411d1f4c 1754conf.set_quoted('DEFAULT_DNS_OVER_TLS_MODE_STR', default_dns_over_tls)
5d67a7ae 1755
3614df05
ZJS
1756default_mdns = get_option('default-mdns')
1757conf.set('DEFAULT_MDNS_MODE',
1758 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
411d1f4c 1759conf.set_quoted('DEFAULT_MDNS_MODE_STR', default_mdns)
3614df05
ZJS
1760
1761default_llmnr = get_option('default-llmnr')
1762conf.set('DEFAULT_LLMNR_MODE',
1763 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
411d1f4c 1764conf.set_quoted('DEFAULT_LLMNR_MODE_STR', default_llmnr)
3614df05 1765
e594a3b1
LP
1766want_repart = get_option('repart')
1767if want_repart != 'false'
6b12086e 1768 have = conf.get('HAVE_LIBFDISK') == 1
e594a3b1
LP
1769 if want_repart == 'true' and not have
1770 error('repart support was requested, but dependencies are not available')
1771 endif
1772else
1773 have = false
1774endif
1775conf.set10('ENABLE_REPART', have)
1776
7e8facb3
ZJS
1777default_dnssec = get_option('default-dnssec')
1778if skip_deps
1779 default_dnssec = 'no'
1780endif
1781if default_dnssec != 'no' and conf.get('HAVE_OPENSSL_OR_GCRYPT') == 0
1782 message('default-dnssec cannot be set to yes or allow-downgrade openssl and gcrypt are disabled. Setting default-dnssec to no.')
1783 default_dnssec = 'no'
1784endif
1785conf.set('DEFAULT_DNSSEC_MODE',
1786 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1787conf.set_quoted('DEFAULT_DNSSEC_MODE_STR', default_dnssec)
1788
43cc7a3e
LP
1789want_sysupdate = get_option('sysupdate')
1790if want_sysupdate != 'false'
1791 have = (conf.get('HAVE_OPENSSL') == 1 and
1792 conf.get('HAVE_LIBFDISK') == 1)
1793 if want_sysupdate == 'true' and not have
1794 error('sysupdate support was requested, but dependencies are not available')
1795 endif
1796else
1797 have = false
1798endif
1799conf.set10('ENABLE_SYSUPDATE', have)
1800
5c23128d 1801want_importd = get_option('importd')
4390be30 1802if want_importd != 'false'
349cc4a5 1803 have = (conf.get('HAVE_LIBCURL') == 1 and
6214d42b 1804 conf.get('HAVE_OPENSSL_OR_GCRYPT') == 1 and
349cc4a5 1805 conf.get('HAVE_ZLIB') == 1 and
6214d42b 1806 conf.get('HAVE_XZ') == 1)
349cc4a5 1807 if want_importd == 'true' and not have
37efbbd8
ZJS
1808 error('importd support was requested, but dependencies are not available')
1809 endif
349cc4a5
ZJS
1810else
1811 have = false
5c23128d 1812endif
349cc4a5 1813conf.set10('ENABLE_IMPORTD', have)
5c23128d 1814
70a5db58
LP
1815want_homed = get_option('homed')
1816if want_homed != 'false'
1817 have = (conf.get('HAVE_OPENSSL') == 1 and
1818 conf.get('HAVE_LIBFDISK') == 1 and
1819 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1820 if want_homed == 'true' and not have
1821 error('homed support was requested, but dependencies are not available')
1822 endif
1823else
1824 have = false
1825endif
1826conf.set10('ENABLE_HOMED', have)
1827
af06ddf5
YW
1828have = have and conf.get('HAVE_PAM') == 1
1829conf.set10('ENABLE_PAM_HOME', have)
1830
5c23128d 1831want_remote = get_option('remote')
4390be30 1832if want_remote != 'false'
349cc4a5
ZJS
1833 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1834 conf.get('HAVE_LIBCURL') == 1]
37efbbd8
ZJS
1835 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1836 # it's possible to build one without the other. Complain only if
5238e957 1837 # support was explicitly requested. The auxiliary files like sysusers
37efbbd8
ZJS
1838 # config should be installed when any of the programs are built.
1839 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1840 error('remote support was requested, but dependencies are not available')
1841 endif
349cc4a5
ZJS
1842 have = have_deps[0] or have_deps[1]
1843else
1844 have = false
5c23128d 1845endif
349cc4a5 1846conf.set10('ENABLE_REMOTE', have)
5c23128d 1847
b3259a6e
ZJS
1848foreach term : ['analyze',
1849 'backlight',
a9149d87 1850 'binfmt',
dfca5587 1851 'compat-mutable-uid-boundaries',
a9149d87 1852 'coredump',
b3259a6e
ZJS
1853 'efi',
1854 'environment-d',
1855 'firstboot',
1856 'gshadow',
1857 'hibernate',
a9149d87 1858 'hostnamed',
b3259a6e
ZJS
1859 'hwdb',
1860 'idn',
1861 'ima',
1862 'initrd',
1782534b 1863 'kernel-install',
b3259a6e 1864 'ldconfig',
a9149d87 1865 'localed',
b3259a6e 1866 'logind',
a9149d87
ZJS
1867 'machined',
1868 'networkd',
dfca5587 1869 'nscd',
b3259a6e
ZJS
1870 'nss-myhostname',
1871 'nss-systemd',
1782534b 1872 'oomd',
b3259a6e
ZJS
1873 'portabled',
1874 'pstore',
a9149d87 1875 'quotacheck',
b3259a6e
ZJS
1876 'randomseed',
1877 'resolve',
1878 'rfkill',
1879 'smack',
dfca5587 1880 'sysext',
a9149d87 1881 'sysusers',
b3259a6e
ZJS
1882 'timedated',
1883 'timesyncd',
a9149d87 1884 'tmpfiles',
a9149d87 1885 'tpm',
b3259a6e
ZJS
1886 'userdb',
1887 'utmp',
1888 'vconsole',
1889 'xdg-autostart']
a9149d87
ZJS
1890 have = get_option(term)
1891 name = 'ENABLE_' + term.underscorify().to_upper()
1892 conf.set10(name, have)
5c23128d
ZJS
1893endforeach
1894
bd7e6aa7
ZJS
1895enable_sysusers = conf.get('ENABLE_SYSUSERS') == 1
1896
08540a95
YW
1897foreach tuple : [['nss-mymachines', 'machined'],
1898 ['nss-resolve', 'resolve']]
1899 want = get_option(tuple[0])
1900 if want != 'false'
1901 have = get_option(tuple[1])
1902 if want == 'true' and not have
1903 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1904 endif
1905 else
1906 have = false
1907 endif
1908 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1909 conf.set10(name, have)
1910endforeach
1911
1912enable_nss = false
1913foreach term : ['ENABLE_NSS_MYHOSTNAME',
1914 'ENABLE_NSS_MYMACHINES',
1915 'ENABLE_NSS_RESOLVE',
1916 'ENABLE_NSS_SYSTEMD']
1917 if conf.get(term) == 1
1918 enable_nss = true
1919 endif
1920endforeach
1921conf.set10('ENABLE_NSS', enable_nss)
1922
348b4437 1923conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
6129ec85 1924
b68dfb9e 1925conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
00d82c81 1926
db7f5ab6
JJ
1927############################################################
1928
9c45bfb2
FS
1929pymod = import('python')
1930python = pymod.find_installation('python3', required : true, modules : ['jinja2'])
1931python_39 = python.language_version().version_compare('>=3.9')
1932
4d3ef2d1
LP
1933############################################################
1934
1935if conf.get('BPF_FRAMEWORK') == 1
1936 bpf_clang_flags = [
1937 '-std=gnu11',
1938 '-Wno-compare-distinct-pointer-types',
1939 '-fno-stack-protector',
1940 '-O2',
1941 '-target',
1942 'bpf',
1943 '-g',
1944 '-c',
1945 ]
1946
1947 bpf_gcc_flags = [
1948 '-std=gnu11',
1949 '-fno-stack-protector',
1950 '-O2',
1951 '-mkernel=5.2',
1952 '-mcpu=v3',
1953 '-mco-re',
1954 '-gbtf',
1955 '-c',
1956 ]
1957
1958 # Generate defines that are appropriate to tell the compiler what architecture
1959 # we're compiling for. By default we just map meson's cpu_family to __<cpu_family>__.
1960 # This dictionary contains the exceptions where this doesn't work.
1961 #
1962 # C.f. https://mesonbuild.com/Reference-tables.html#cpu-families
1963 # and src/basic/missing_syscall_def.h.
1964 cpu_arch_defines = {
1965 'ppc' : ['-D__powerpc__'],
1966 'ppc64' : ['-D__powerpc64__', '-D_CALL_ELF=2'],
1967 'riscv32' : ['-D__riscv', '-D__riscv_xlen=32'],
1968 'riscv64' : ['-D__riscv', '-D__riscv_xlen=64'],
1969 'x86' : ['-D__i386__'],
1970
1971 # For arm, assume hardware fp is available.
1972 'arm' : ['-D__arm__', '-D__ARM_PCS_VFP'],
1973 }
1974
1975 bpf_arch_flags = cpu_arch_defines.get(host_machine.cpu_family(),
1976 ['-D__@0@__'.format(host_machine.cpu_family())])
1977 if bpf_compiler == 'gcc'
1978 bpf_arch_flags += ['-m' + host_machine.endian() + '-endian']
1979 endif
1980
1981 libbpf_include_dir = libbpf.get_variable(pkgconfig : 'includedir')
1982
1983 bpf_o_unstripped_cmd = []
1984 if bpf_compiler == 'clang'
1985 bpf_o_unstripped_cmd += [
1986 clang,
1987 bpf_clang_flags,
1988 bpf_arch_flags,
1989 ]
1990 elif bpf_compiler == 'gcc'
1991 bpf_o_unstripped_cmd += [
1992 bpf_gcc,
1993 bpf_gcc_flags,
1994 bpf_arch_flags,
1995 ]
1996 endif
1997
1998 bpf_o_unstripped_cmd += ['-I.']
1999
2000 if not meson.is_cross_build() and bpf_compiler == 'clang'
2001 target_triplet_cmd = run_command('gcc', '-dumpmachine', check: false)
2002 if target_triplet_cmd.returncode() == 0
2003 target_triplet = target_triplet_cmd.stdout().strip()
2004 bpf_o_unstripped_cmd += [
2005 '-isystem',
2006 '/usr/include/@0@'.format(target_triplet)
2007 ]
2008 endif
2009 endif
2010
2011 bpf_o_unstripped_cmd += [
2012 '-idirafter',
2013 libbpf_include_dir,
2014 '@INPUT@',
2015 '-o',
2016 '@OUTPUT@'
2017 ]
2018
2019 if bpftool_strip
2020 bpf_o_cmd = [
2021 bpftool,
2022 'gen',
2023 'object',
2024 '@OUTPUT@',
2025 '@INPUT@'
2026 ]
2027 elif bpf_compiler == 'clang'
2028 bpf_o_cmd = [
2029 llvm_strip,
2030 '-g',
2031 '@INPUT@',
2032 '-o',
2033 '@OUTPUT@'
2034 ]
2035 endif
2036
2037 skel_h_cmd = [
2038 bpftool,
2039 'gen',
2040 'skeleton',
2041 '@INPUT@'
2042 ]
2043endif
2044
dfca5587
JJ
2045#####################################################################
2046
2047efi_arch = {
31ffb6b1
JJ
2048 'aarch64' : 'aa64',
2049 'arm' : 'arm',
2050 'loongarch32' : 'loongarch32',
2051 'loongarch64' : 'loongarch64',
2052 'riscv32' : 'riscv32',
2053 'riscv64' : 'riscv64',
2054 'x86_64' : 'x64',
2055 'x86' : 'ia32',
dfca5587
JJ
2056}.get(host_machine.cpu_family(), '')
2057
2058if get_option('bootloader') != 'false' and efi_arch != ''
2059 conf.set_quoted('EFI_MACHINE_TYPE_NAME', efi_arch)
4729e84e
LB
2060elif get_option('bootloader') == 'false' and efi_arch != ''
2061 # Ensure that if the option is explicitly set to false, then no EFI code is built, including tests
2062 efi_arch = ''
dfca5587
JJ
2063elif get_option('bootloader') == 'true' and efi_arch == ''
2064 error('EFI not supported for this arch.')
2065endif
2afeaf16
JJ
2066
2067efi_arch_alt = ''
7ea44f17 2068efi_cpu_family_alt = ''
2afeaf16
JJ
2069if efi_arch == 'x64' and cc.links('''
2070 #include <limits.h>
2071 int main(int argc, char *argv[]) {
2072 return __builtin_popcount(argc - CHAR_MAX);
2073 }''', args : ['-m32', '-march=i686'], name : '32bit build possible')
2074 efi_arch_alt = 'ia32'
7ea44f17 2075 efi_cpu_family_alt = 'x86'
2afeaf16
JJ
2076endif
2077
2078have_pyelftools = pymod.find_installation('python3', required : false, modules : ['elftools']).found()
09444a2e
DDM
2079if get_option('bootloader') == 'true' and not have_pyelftools
2080 error('EFI bootloader support requires pyelftools.')
2afeaf16
JJ
2081endif
2082
dfca5587
JJ
2083conf.set10(
2084 'ENABLE_BOOTLOADER',
2085 get_option('efi') and
2086 get_option('bootloader') in ['auto', 'true'] and
2afeaf16 2087 efi_arch != '' and
2afeaf16 2088 have_pyelftools,
dfca5587
JJ
2089)
2090
9c45bfb2 2091if get_option('ukify') == 'auto'
dfca5587
JJ
2092 want_ukify = python_39 and conf.get('ENABLE_BOOTLOADER') == 1
2093elif get_option('ukify') == 'true' and (not python_39 or conf.get('ENABLE_BOOTLOADER') != 1)
2094 error('ukify requires Python >= 3.9 and -Dbootloader=true')
9c45bfb2
FS
2095else
2096 want_ukify = get_option('ukify') == 'true'
2097endif
2098conf.set10('ENABLE_UKIFY', want_ukify)
2099
2100############################################################
b0bd2ae8 2101
2afeaf16
JJ
2102elf2efi_lds = project_source_root / 'tools/elf2efi.lds'
2103elf2efi_py = find_program('tools/elf2efi.py')
2104export_dbus_interfaces_py = find_program('tools/dbus_exporter.py')
d3821a33 2105generate_gperfs = find_program('tools/generate-gperfs.py')
f6fe732f
YW
2106make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
2107make_directive_index_py = find_program('tools/make-directive-index.py')
2108make_man_index_py = find_program('tools/make-man-index.py')
6b1aac3c 2109meson_render_jinja2 = find_program('tools/meson-render-jinja2.py')
d3821a33 2110update_dbus_docs_py = find_program('tools/update-dbus-docs.py')
d3821a33 2111update_hwdb_autosuspend_sh = find_program('tools/update-hwdb-autosuspend.sh')
2afeaf16
JJ
2112update_hwdb_sh = find_program('tools/update-hwdb.sh')
2113update_man_rules_py = find_program('tools/update-man-rules.py')
d3821a33
ZJS
2114update_syscall_tables_sh = find_program('tools/update-syscall-tables.sh')
2115xml_helper_py = find_program('tools/xml_helper.py')
f6fe732f 2116
db7f5ab6 2117############################################################
5c23128d 2118
e95acdfe
YW
2119version_tag = get_option('version-tag')
2120if version_tag == ''
2121 # Check that we have either .git/ (a normal clone) or a .git file (a work-tree) and that we don't
2122 # get confused if a tarball is extracted in a higher-level git repository.
2123 if git.found() and fs.exists(project_source_root / '.git')
2124 # Apparently git describe has a bug where it always considers the work-tree dirty when
2125 # invoked with --git-dir (even though 'git status' is happy). Work around this issue by
2126 # cd-ing to the source directory.
2127 version_tag = run_command(
2128 sh, '-c',
2129 'cd "$MESON_SOURCE_ROOT"; git describe --abbrev=7 --dirty=^ 2>/dev/null | sed "s/^v//; s/-rc/~rc/"',
2130 check : true,
2131 ).stdout().strip()
2132 else
2133 version_tag = meson.project_version()
2134 endif
2135endif
2136
2137vcs_data = configuration_data()
2138vcs_data.set('VCS_TAG', version_tag)
2139version_h = configure_file(configuration : vcs_data,
2140 input : 'src/version/version.h.in',
2141 output : 'version.h')
2142
2143versiondep = declare_dependency(
2144 sources : version_h,
2145 include_directories : include_directories('.'),
2146)
2147
2148shared_lib_tag = get_option('shared-lib-tag')
2149if shared_lib_tag == ''
2150 shared_lib_tag = meson.project_version()
2151endif
2152
2153############################################################
2154
7e43be7d 2155if get_option('b_coverage')
92148283 2156 userspace_c_args += ['-include', 'src/basic/coverage.h']
7e43be7d
FS
2157endif
2158
2159############################################################
2160
5c23128d 2161config_h = configure_file(
37efbbd8
ZJS
2162 output : 'config.h',
2163 configuration : conf)
5c23128d 2164
92148283 2165userspace_c_args += ['-include', 'config.h']
f6fe732f 2166
8f04a1ca
ZJS
2167jinja2_cmdline = [meson_render_jinja2, config_h, version_h]
2168
92148283
JJ
2169userspace = declare_dependency(
2170 compile_args : userspace_c_args,
2171 link_args : userspace_c_ld_args,
40c7d3c7 2172 dependencies : versiondep,
92148283
JJ
2173)
2174
c18dde32
ZJS
2175man_page_depends = []
2176
f6fe732f 2177############################################################
348b4437 2178
1d21a7bd 2179simple_tests = []
130c87b1 2180libsystemd_tests = []
1d21a7bd
YW
2181simple_fuzzers = []
2182catalogs = []
c335921e
YW
2183modules = [] # nss, pam, and other plugins
2184executables = []
2185executables_by_name = {}
cbc55c4c 2186fuzzer_exes = []
1d21a7bd 2187
b61016f2
YW
2188# binaries that have --help and are intended for use by humans,
2189# usually, but not always, installed in /bin.
2190public_programs = []
2191
e3c68924 2192# D-Bus introspection XML export
2193dbus_programs = []
e3c68924 2194
3f80c139
ZJS
2195# A list of boot stubs. Required for testing of ukify.
2196boot_stubs = []
2197
8d40961c
YW
2198basic_includes = include_directories(
2199 'src/basic',
e5bc5f1f 2200 'src/fundamental',
8d40961c
YW
2201 'src/systemd',
2202 '.')
2203
2204libsystemd_includes = [basic_includes, include_directories(
2205 'src/libsystemd/sd-bus',
2206 'src/libsystemd/sd-device',
2207 'src/libsystemd/sd-event',
2208 'src/libsystemd/sd-hwdb',
2209 'src/libsystemd/sd-id128',
2210 'src/libsystemd/sd-journal',
2211 'src/libsystemd/sd-netlink',
2212 'src/libsystemd/sd-network',
2213 'src/libsystemd/sd-resolve')]
2214
2215includes = [libsystemd_includes, include_directories('src/shared')]
5c23128d 2216
5c23128d
ZJS
2217subdir('po')
2218subdir('catalog')
dfca5587 2219subdir('src/fundamental')
5c23128d
ZJS
2220subdir('src/basic')
2221subdir('src/libsystemd')
3976f372 2222subdir('src/shared')
3976f372 2223subdir('src/libudev')
5c23128d 2224
5c23128d 2225libsystemd = shared_library(
37efbbd8 2226 'systemd',
56d50ab1 2227 version : libsystemd_version,
8d40961c 2228 include_directories : libsystemd_includes,
37efbbd8
ZJS
2229 link_args : ['-shared',
2230 '-Wl,--version-script=' + libsystemd_sym_path],
34e221a5 2231 link_with : [libbasic,
acc50c92
LP
2232 libbasic_gcrypt,
2233 libbasic_compress],
99b9f8fd 2234 link_whole : [libsystemd_static],
92148283
JJ
2235 dependencies : [librt,
2236 threads,
2237 userspace],
37efbbd8
ZJS
2238 link_depends : libsystemd_sym,
2239 install : true,
0a5e638c 2240 install_tag: 'libsystemd',
b0d3095f 2241 install_dir : libdir)
5c23128d 2242
039f1673
LB
2243alias_target('libsystemd', libsystemd)
2244
70848ecf
DC
2245install_libsystemd_static = static_library(
2246 'systemd',
2247 libsystemd_sources,
975464e0
ZJS
2248 basic_sources,
2249 basic_gcrypt_sources,
acc50c92 2250 basic_compress_sources,
e5bc5f1f 2251 fundamental_sources,
8d40961c 2252 include_directories : libsystemd_includes,
70848ecf
DC
2253 build_by_default : static_libsystemd != 'false',
2254 install : static_libsystemd != 'false',
0a5e638c 2255 install_tag: 'libsystemd',
b0d3095f 2256 install_dir : libdir,
40dbce36 2257 pic : static_libsystemd_pic,
92148283 2258 dependencies : [libblkid,
975464e0 2259 libcap,
92148283 2260 libdl,
011d129c 2261 libgcrypt,
92148283
JJ
2262 liblz4,
2263 libmount,
c47511da 2264 libopenssl,
92148283
JJ
2265 librt,
2266 libxz,
2267 libzstd,
2268 threads,
40c7d3c7 2269 userspace],
70848ecf
DC
2270 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
2271
3976f372
YW
2272libudev = shared_library(
2273 'udev',
3976f372
YW
2274 version : libudev_version,
2275 include_directories : includes,
2276 link_args : ['-shared',
2277 '-Wl,--version-script=' + libudev_sym_path],
2278 link_with : [libsystemd_static, libshared_static],
2279 link_whole : libudev_basic,
92148283
JJ
2280 dependencies : [threads,
2281 userspace],
3976f372
YW
2282 link_depends : libudev_sym,
2283 install : true,
0a5e638c 2284 install_tag: 'libudev',
b0d3095f 2285 install_dir : libdir)
3976f372 2286
039f1673
LB
2287alias_target('libudev', libudev)
2288
3976f372
YW
2289install_libudev_static = static_library(
2290 'udev',
2291 basic_sources,
e5bc5f1f 2292 fundamental_sources,
3976f372
YW
2293 shared_sources,
2294 libsystemd_sources,
2295 libudev_sources,
3976f372
YW
2296 include_directories : includes,
2297 build_by_default : static_libudev != 'false',
2298 install : static_libudev != 'false',
0a5e638c 2299 install_tag: 'libudev',
b0d3095f 2300 install_dir : libdir,
3976f372 2301 link_depends : libudev_sym,
92148283
JJ
2302 dependencies : [libmount,
2303 libshared_deps,
40c7d3c7 2304 userspace],
3976f372
YW
2305 c_args : static_libudev_pic ? [] : ['-fno-PIC'],
2306 pic : static_libudev_pic)
2307
47354b44
ZJS
2308############################################################
2309
130c87b1
YW
2310runtest_env = custom_target(
2311 'systemd-runtest.env',
2312 output : 'systemd-runtest.env',
2313 command : [sh, '-c',
2314 '{ echo SYSTEMD_TEST_DATA=@0@; echo SYSTEMD_CATALOG_DIR=@1@; } >@OUTPUT@'.format(
2315 project_source_root / 'test',
2316 project_build_root / 'catalog')],
2317 depends : catalogs,
2318 build_by_default : true)
2319
2320test_cflags = ['-DTEST_CODE=1']
2321# We intentionally do not do inline initializations with definitions for a
2322# bunch of _cleanup_ variables in tests, to ensure valgrind is triggered if we
2323# use the variable unexpectedly. This triggers a lot of maybe-uninitialized
2324# false positives when the combination of -O2 and -flto is used. Suppress them.
2325if '-O2' in c_args and '-flto=auto' in c_args
2326 test_cflags += cc.first_supported_argument('-Wno-maybe-uninitialized')
2327endif
2328
2329############################################################
2330
c335921e
YW
2331executable_template = {
2332 'include_directories' : includes,
2333 'link_with' : libshared,
2334 'install_rpath' : pkglibdir,
2335 'install' : true,
2336}
2337
2338generator_template = executable_template + {
2339 'install_dir' : systemgeneratordir,
2340}
2341
2342libexec_template = executable_template + {
2343 'install_dir' : libexecdir,
2344}
2345
2346executable_additional_kwargs = {
2347 'dependencies' : userspace,
2348}
2349
130c87b1
YW
2350test_template = executable_template + {
2351 'build_by_default' : want_tests != 'false',
2352 'install' : install_tests,
2353 'install_dir' : unittestsdir,
2354}
2355
2356test_additional_kwargs = {
2357 'c_args' : test_cflags,
2358 'link_depends' : runtest_env,
2359}
2360
cbc55c4c
YW
2361fuzz_template = executable_template + {
2362 'build_by_default' : fuzzer_build,
2363 'install' : false,
2364}
2365
2366if want_ossfuzz or (want_libfuzzer and fuzzing_engine.found())
2367 fuzz_additional_kwargs = {
2368 'dependencies' : fuzzing_engine,
2369 }
2370elif want_libfuzzer and not fuzzing_engine.found()
2371 fuzz_additional_kwargs = {
2372 'link_args' : ['-fsanitize=fuzzer'],
2373 }
2374else
2375 fuzz_additional_kwargs = {
2376 'sources' : files('src/fuzz/fuzz-main.c'),
2377 }
2378endif
2379fuzz_additional_kwargs += {
2380 'include_directories' : include_directories('src/fuzz'),
2381 'c_args' : test_cflags,
2382}
2383
c335921e
YW
2384nss_template = {
2385 'version' : '2',
2386 'include_directories' : includes,
2387 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
2388 'link_args' : ['-z', 'nodelete'],
2389 'link_with' : [
2390 libsystemd_static,
2391 libshared_static,
2392 libbasic,
2393 ],
2394 'dependencies' : [
2395 librt,
2396 threads,
2397 ],
2398 'install' : true,
2399 'install_tag' : 'nss',
2400 'install_dir' : libdir,
2401}
2402
2403pam_template = {
2404 'name_prefix' : '',
2405 'include_directories' : includes,
2406 'link_with' : [
2407 libsystemd_static,
2408 libshared_static,
2409 ],
2410 'dependencies' : [
2411 libpam_misc,
2412 libpam,
2413 threads,
2414 ],
2415 'install' : true,
2416 'install_tag' : 'pam',
2417 'install_dir' : pamlibdir,
2418}
2419
2420module_additional_kwargs = {
2421 'link_args' : ['-shared'],
2422 'dependencies' : userspace,
2423}
2424
2425############################################################
2426
b61016f2 2427# systemd-analyze requires 'libcore'
83b6af36 2428subdir('src/core')
b61016f2
YW
2429# systemd-journal-remote requires 'libjournal_core'
2430subdir('src/journal')
2431# systemd-networkd requires 'libsystemd_network'
2432subdir('src/libsystemd-network')
5371c269
YW
2433# hwdb requires 'udev_link_with' and 'udev_rpath'
2434subdir('src/udev')
83b6af36 2435
16b081d6 2436subdir('src/ac-power')
83b6af36 2437subdir('src/analyze')
cb935625 2438subdir('src/ask-password')
7e6ca26f 2439subdir('src/backlight')
98e39a55 2440subdir('src/battery-check')
2c2c3daa 2441subdir('src/binfmt')
cd4300f3 2442subdir('src/boot')
dfca5587 2443subdir('src/boot/efi')
f98df767 2444subdir('src/busctl')
9f907d30 2445subdir('src/cgls')
e2bdf00a 2446subdir('src/cgroups-agent')
9f907d30 2447subdir('src/cgtop')
b61016f2 2448subdir('src/coredump')
98e39a55 2449subdir('src/creds')
2ad279cf 2450subdir('src/cryptenroll')
b4d1892a 2451subdir('src/cryptsetup')
2a456620 2452subdir('src/debug-generator')
98e39a55 2453subdir('src/delta')
16b081d6 2454subdir('src/detect-virt')
ec57a4ea 2455subdir('src/dissect')
2a456620 2456subdir('src/environment-d-generator')
98e39a55 2457subdir('src/escape')
df490fc7
YW
2458subdir('src/firstboot')
2459subdir('src/fsck')
2a456620
YW
2460subdir('src/fstab-generator')
2461subdir('src/getty-generator')
ec57a4ea 2462subdir('src/gpt-auto-generator')
74093422 2463subdir('src/hibernate-resume')
b61016f2 2464subdir('src/home')
83b6af36 2465subdir('src/hostname')
6fab49e4 2466subdir('src/hwdb')
e2bdf00a 2467subdir('src/id128')
83b6af36 2468subdir('src/import')
9f907d30 2469subdir('src/initctl')
81fe141b 2470subdir('src/integritysetup')
b61016f2 2471subdir('src/journal-remote')
83b6af36
ZJS
2472subdir('src/kernel-install')
2473subdir('src/locale')
b61016f2 2474subdir('src/login')
83b6af36 2475subdir('src/machine')
df490fc7 2476subdir('src/machine-id-setup')
eb51c09d 2477subdir('src/modules-load')
9f907d30 2478subdir('src/mount')
b61016f2 2479subdir('src/network')
98e39a55 2480subdir('src/notify')
83b6af36 2481subdir('src/nspawn')
2080c097
YW
2482subdir('src/nss-myhostname')
2483subdir('src/nss-mymachines')
2484subdir('src/nss-resolve')
2485subdir('src/nss-systemd')
b61016f2
YW
2486subdir('src/oom')
2487subdir('src/partition')
e2bdf00a 2488subdir('src/path')
b61016f2
YW
2489subdir('src/portable')
2490subdir('src/pstore')
5371c269 2491subdir('src/quotacheck')
c8c78771 2492subdir('src/random-seed')
6c713961 2493subdir('src/rc-local-generator')
df490fc7 2494subdir('src/remount-fs')
cb935625 2495subdir('src/reply-password')
83b6af36 2496subdir('src/resolve')
7e6ca26f 2497subdir('src/rfkill')
2a9b4bbe 2498subdir('src/rpm')
5c707c8c 2499subdir('src/run')
2a456620 2500subdir('src/run-generator')
b61016f2 2501subdir('src/shutdown')
16b081d6 2502subdir('src/sleep')
22f37744 2503subdir('src/socket-activate')
5371c269 2504subdir('src/socket-proxy')
5c707c8c 2505subdir('src/stdio-bridge')
87e7979d 2506subdir('src/sulogin-shell')
16b081d6 2507subdir('src/sysctl')
9bca4ae4 2508subdir('src/sysext')
7e6ca26f 2509subdir('src/system-update-generator')
c3512573 2510subdir('src/systemctl')
43cc7a3e 2511subdir('src/sysupdate')
6fab49e4 2512subdir('src/sysusers')
6c713961 2513subdir('src/sysv-generator')
83b6af36
ZJS
2514subdir('src/timedate')
2515subdir('src/timesync')
db64ba81 2516subdir('src/tmpfiles')
cb935625 2517subdir('src/tty-ask-password-agent')
eb51c09d
YW
2518subdir('src/update-done')
2519subdir('src/update-utmp')
dbab4fb9 2520subdir('src/user-sessions')
b61016f2 2521subdir('src/userdb')
c8c78771 2522subdir('src/vconsole')
81fe141b 2523subdir('src/veritysetup')
e2bdf00a 2524subdir('src/volatile-root')
0275e918 2525subdir('src/xdg-autostart-generator')
83b6af36 2526
3976f372
YW
2527subdir('src/systemd')
2528
83b6af36 2529subdir('src/test')
7db7d5b7 2530subdir('src/fuzz')
a1d6dbb1 2531subdir('src/ukify/test') # needs to be last for test_env variable
cbc55c4c 2532subdir('test/fuzz')
83b6af36 2533
d30d9bf0
LB
2534alias_target('devel', libsystemd_pc, libudev_pc, systemd_pc, udev_pc)
2535
83b6af36
ZJS
2536############################################################
2537
130c87b1
YW
2538foreach test : simple_tests
2539 executables += test_template + { 'sources' : [test] }
2540endforeach
2541
2542foreach test : libsystemd_tests
2543 executables += test_template + test
2544endforeach
2545
cbc55c4c
YW
2546foreach fuzzer : simple_fuzzers
2547 executables += fuzz_template + { 'sources' : [fuzzer] }
2548endforeach
2549
c335921e 2550foreach dict : executables
130c87b1
YW
2551 name = dict.get('name', '')
2552 if name == ''
2553 name = fs.stem(dict.get('sources')[0])
cbc55c4c 2554 assert(name.split('-')[0] in ['test', 'fuzz'])
130c87b1
YW
2555 endif
2556
2557 is_test = name.startswith('test-')
cbc55c4c 2558 is_fuzz = name.startswith('fuzz-')
c335921e
YW
2559
2560 build = true
2561 foreach cond : dict.get('conditions', [])
2562 if conf.get(cond) != 1
2563 build = false
2564 break
2565 endif
2566 endforeach
2567 if not build
2568 continue
2569 endif
2570
2571 kwargs = {}
2572 foreach key, val : dict
130c87b1
YW
2573 if key in ['name', 'dbus', 'public', 'conditions',
2574 'type', 'suite', 'timeout', 'parallel']
c335921e
YW
2575 continue
2576 endif
130c87b1 2577
c335921e
YW
2578 kwargs += { key : val }
2579 endforeach
2580
2581 foreach key, val : executable_additional_kwargs
2582 kwargs += { key : [ kwargs.get(key, []), val ]}
2583 endforeach
2584
130c87b1
YW
2585 if is_test
2586 kwargs += { 'install_dir' : kwargs.get('install_dir') / dict.get('type', '') }
2587 foreach key, val : test_additional_kwargs
2588 kwargs += { key : [ kwargs.get(key, []), val ] }
2589 endforeach
2590 endif
2591
cbc55c4c
YW
2592 if is_fuzz
2593 foreach key, val : fuzz_additional_kwargs
2594 kwargs += { key : [ kwargs.get(key, []), val ] }
2595 endforeach
2596 endif
2597
c335921e
YW
2598 exe = executable(
2599 name,
2600 kwargs : kwargs,
2601 )
2602
2603 executables_by_name += { name : exe }
2604
2605 if dict.get('build_by_default', true)
2606 if dict.get('dbus', false)
2607 dbus_programs += exe
2608 endif
2609 if dict.get('public', false)
2610 public_programs += exe
2611 endif
2612 endif
130c87b1
YW
2613
2614 if is_test
2615 type = dict.get('type', '')
2616 suite = dict.get('suite', '')
2617 if suite == ''
2618 suite = fs.name(fs.parent(dict.get('sources')[0]))
2619 if suite.startswith('sd-')
2620 suite = 'libsystemd'
2621 endif
2622 endif
2623
2624 if type == 'manual'
2625 message('@0@/@1@ is a manual test'.format(suite, name))
2626 elif type == 'unsafe' and want_tests != 'unsafe'
2627 message('@0@/@1@ is an unsafe test'.format(suite, name))
2628 elif dict.get('build_by_default')
2629 test(name, exe,
2630 env : test_env,
2631 timeout : dict.get('timeout', 30),
2632 suite : suite,
2633 is_parallel : dict.get('parallel', true))
2634 endif
2635 endif
cbc55c4c
YW
2636
2637 if is_fuzz
2638 fuzzer_exes += exe
2639
2640 if want_tests != 'false'
2641 # Run the fuzz regression tests without any sanitizers enabled.
2642 # Additional invocations with sanitizers may be added below.
2643 fuzz_ins = fuzz_regression_tests.get(name, {})
2644 foreach directive : fuzz_ins.get('directives', [])
2645 test('@0@_@1@'.format(name, fs.name(directive.full_path())),
2646 exe,
2647 suite : 'fuzz',
2648 args : directive.full_path(),
2649 depends : directive)
2650 endforeach
2651 foreach file : fuzz_ins.get('files', [])
2652 test('@0@_@1@'.format(name, fs.name(file)),
2653 exe,
2654 suite : 'fuzz',
2655 args : file)
2656 endforeach
2657 endif
2658 endif
c335921e
YW
2659endforeach
2660
cbc55c4c
YW
2661alias_target('fuzzers', fuzzer_exes)
2662
c335921e
YW
2663############################################################
2664
130c87b1 2665test_dlopen = executables_by_name.get('test-dlopen')
83b6af36 2666
c335921e
YW
2667foreach dict : modules
2668 name = dict.get('name')
2669 is_nss = name.startswith('nss_')
2670 is_pam = name.startswith('pam_')
2671
2672 build = true
2673 foreach cond : dict.get('conditions', [])
2674 if conf.get(cond) != 1
2675 build = false
2676 break
2677 endif
2678 endforeach
2679 if not build
2680 continue
2681 endif
2682
2683 kwargs = {}
2684 foreach key, val : dict
2685 if key in ['name', 'conditions']
2686 continue
2687 endif
2688 kwargs += { key : val }
2689 endforeach
2690
2691 sym = meson.current_source_dir() / '@0@'.format(dict.get('link_depends')[0])
2692 kwargs += {
2693 'link_args' : [
2694 kwargs.get('link_args', []),
2695 '-Wl,--version-script=' + sym,
2696 ],
2697 }
2698 foreach key, val : module_additional_kwargs
2699 kwargs += { key : [ kwargs.get(key, []), val ]}
2700 endforeach
2701
2702 lib = shared_library(
2703 name,
2704 kwargs : kwargs,
2705 )
2706
2707 if is_nss
2708 # We cannot use shared_module because it does not support version suffix.
2709 # Unfortunately shared_library insists on creating the symlink…
2710 meson.add_install_script('sh', '-c', 'rm $DESTDIR@0@/lib@1@.so'.format(libdir, name),
2711 install_tag : 'nss')
2712 endif
2713
2714 if want_tests != 'false' and (is_nss or is_pam)
2715 test('dlopen-' + name,
2716 test_dlopen,
2717 # path to dlopen must include a slash
2718 args : lib.full_path(),
dc4a0055
YW
2719 depends : lib,
2720 suite : is_nss ? 'nss' : 'pam')
c335921e
YW
2721 endif
2722endforeach
2723
5c23128d
ZJS
2724############################################################
2725
f9a6cb0e 2726ukify = custom_target(
30ec2eae
ZJS
2727 'ukify',
2728 input : 'src/ukify/ukify.py',
2729 output : 'ukify',
2730 command : [jinja2_cmdline, '@INPUT@', '@OUTPUT@'],
9a01fe39 2731 install : want_ukify,
30ec2eae 2732 install_mode : 'rwxr-xr-x',
b0d3095f 2733 install_dir : libexecdir)
9a01fe39 2734if want_ukify
42551ea7 2735 public_programs += ukify
f9a6cb0e
ZJS
2736endif
2737
69e96427
ZJS
2738############################################################
2739
e5cc6d10
YW
2740subdir('rules.d')
2741subdir('test')
2742
69e96427 2743############################################################
5c23128d 2744
10783aef
ZJS
2745subdir('docs/sysvinit')
2746subdir('docs/var-log')
2747subdir('hwdb.d')
2748subdir('man')
378e9d2b 2749subdir('modprobe.d')
10783aef
ZJS
2750subdir('network')
2751subdir('presets')
2752subdir('shell-completion/bash')
2753subdir('shell-completion/zsh')
5c23128d
ZJS
2754subdir('sysctl.d')
2755subdir('sysusers.d')
2756subdir('tmpfiles.d')
4f10b807 2757subdir('units')
5c23128d 2758
5c23128d
ZJS
2759install_subdir('factory/etc',
2760 install_dir : factorydir)
623370e6 2761subdir('factory/templates')
5c23128d 2762
d7aa78c3
JT
2763if install_sysconfdir
2764 install_data('xorg/50-systemd-user.sh',
2765 install_dir : xinitrcdir)
2766endif
f09eb768 2767install_data('LICENSE.GPL2',
5c23128d 2768 'LICENSE.LGPL2.1',
f09eb768
LP
2769 'NEWS',
2770 'README',
eea98402 2771 'docs/CODING_STYLE.md',
1d1cb168 2772 'docs/DISTRO_PORTING.md',
9e825ebf 2773 'docs/ENVIRONMENT.md',
5425f8a5 2774 'docs/HACKING.md',
9e825ebf 2775 'docs/TRANSIENT-SETTINGS.md',
b6dc0d7d 2776 'docs/TRANSLATORS.md',
9e825ebf 2777 'docs/UIDS-GIDS.md',
5c23128d 2778 install_dir : docdir)
d68b342b 2779
9c6e32a2
LB
2780install_subdir('LICENSES',
2781 install_dir : docdir)
2782
9289e093 2783install_emptydir(systemdstatedir)
94e75a54 2784
d68b342b
ZJS
2785############################################################
2786
2d4efd1d
LB
2787# Ensure that changes to the docs/ directory do not break the
2788# basic Github pages build. But only run it in developer mode,
2789# as it might be fragile due to changes in the tooling, and it is
2790# not generally useful for users.
2791jekyll = find_program('jekyll', required : false)
2792if get_option('mode') == 'developer' and want_tests != 'false' and jekyll.found()
2793 test('github-pages',
2794 jekyll,
02e0f430 2795 suite : 'dist',
2d4efd1d 2796 args : ['build',
fce9abb2
ZJS
2797 '--source', project_source_root / 'docs',
2798 '--destination', project_build_root / '_site'])
2d4efd1d
LB
2799endif
2800
2801############################################################
2802
dd1e33c8 2803check_help = find_program('tools/check-help.sh')
ffb7406b 2804check_version = find_program('tools/check-version.sh')
005a29f2
ZJS
2805
2806foreach exec : public_programs
739a62bb 2807 name = fs.name(exec.full_path())
938be089
ZJS
2808 if want_tests != 'false'
2809 test('check-help-' + name,
dd1e33c8 2810 check_help,
02e0f430 2811 suite : 'dist',
e93ada98
DDM
2812 args : exec.full_path(),
2813 depends: exec)
ffb7406b
ZJS
2814
2815 test('check-version-' + name,
2816 check_version,
02e0f430 2817 suite : 'dist',
ffb7406b
ZJS
2818 args : [exec.full_path(),
2819 meson.project_version()],
2820 depends: exec)
938be089 2821 endif
005a29f2
ZJS
2822endforeach
2823
52d4d1d3 2824# Enable tests for all supported sanitizers
7db5761d 2825foreach tuple : fuzz_sanitizers
52d4d1d3
ZJS
2826 sanitizer = tuple[0]
2827 build = tuple[1]
b68dfb9e 2828
7a6397d2 2829 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
7db5761d
MK
2830 foreach fuzzer, fuzz_ins : fuzz_regression_tests
2831 name = '@0@:@1@'.format(fuzzer, sanitizer)
2832 if want_tests == 'false'
2833 message('Not compiling @0@ because tests is set to false'.format(name))
2834 continue
52d4d1d3 2835 endif
7db5761d
MK
2836 if not fuzz_tests
2837 message('Not compiling @0@ because fuzz-tests is set to false'.format(name))
2838 continue
2839 endif
2840 exe = custom_target(
2841 name,
2842 output : name,
cbc55c4c 2843 depends : build,
7db5761d
MK
2844 command : [ln, '-fs',
2845 build.full_path() / fuzzer,
2846 '@OUTPUT@'],
2847 build_by_default : true)
2848
cbc55c4c
YW
2849 foreach directive : fuzz_ins.get('directives', [])
2850 test('@0@_@1@_@2@'.format(fuzzer, fs.name(directive.full_path()), sanitizer),
2851 env,
2852 suite : 'fuzz+san',
2853 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
2854 timeout : 60,
2855 args : [exe.full_path(), directive.full_path()],
2856 depends : directive)
2857 endforeach
2858 foreach file : fuzz_ins.get('files', [])
2859 test('@0@_@1@_@2@'.format(fuzzer, fs.name(file), sanitizer),
52d4d1d3 2860 env,
14056a52 2861 suite : 'fuzz+san',
89767158
EV
2862 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
2863 timeout : 60,
cbc55c4c 2864 args : [exe.full_path(), file])
7db5761d 2865 endforeach
52d4d1d3 2866 endforeach
b68dfb9e
ZJS
2867 endif
2868endforeach
2869
2870############################################################
2871
0700e8ba 2872if git.found()
37efbbd8 2873 all_files = run_command(
0f4c4f38
ZJS
2874 env, '-u', 'GIT_WORK_TREE',
2875 git, '--git-dir=@0@/.git'.format(project_source_root),
ba9ca60a 2876 'ls-files', ':/*.[ch]', ':/*.cc',
e92777d2
ZJS
2877 check : false)
2878 if all_files.returncode() == 0
2879 all_files = files(all_files.stdout().split())
2880
2881 custom_target(
2882 'tags',
2883 output : 'tags',
2884 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
2885 run_target(
2886 'ctags',
691db9a7 2887 command : [env, 'ctags', '--tag-relative=never', '-o', '@0@/tags'.format(project_source_root)] + all_files)
60892358
ZJS
2888
2889 ############################################
2890
2891 if want_tests != 'false' and conf.get('BUILD_MODE_DEVELOPER') == 1
2892 test('check-includes',
2893 files('tools/check-includes.py'),
2894 args: all_files,
dc4a0055
YW
2895 env : ['PROJECT_SOURCE_ROOT=@0@'.format(project_source_root)],
2896 suite : 'headers')
60892358 2897 endif
e92777d2 2898 endif
177929c2 2899
60892358
ZJS
2900 ####################################################
2901
dd1e33c8 2902 git_contrib_sh = find_program('tools/git-contrib.sh')
a923e085 2903 run_target(
37efbbd8 2904 'git-contrib',
dd1e33c8 2905 command : [git_contrib_sh])
dd6ab3df 2906
60892358
ZJS
2907 ####################################################
2908
dd6ab3df 2909 git_head = run_command(
e92777d2
ZJS
2910 git, '--git-dir=@0@/.git'.format(project_source_root),
2911 'rev-parse', 'HEAD',
2912 check : false).stdout().strip()
dd6ab3df 2913 git_head_short = run_command(
e92777d2
ZJS
2914 git, '--git-dir=@0@/.git'.format(project_source_root),
2915 'rev-parse', '--short=7', 'HEAD',
2916 check : false).stdout().strip()
dd6ab3df
ZJS
2917
2918 run_target(
2919 'git-snapshot',
0f4c4f38 2920 command : [git, 'archive',
1485aacb 2921 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
dd6ab3df
ZJS
2922 git_head_short),
2923 '--prefix', 'systemd-@0@/'.format(git_head),
2924 'HEAD'])
2925endif
829257d1
ZJS
2926
2927############################################################
2928
dd1e33c8 2929check_api_docs_sh = find_program('tools/check-api-docs.sh')
51b13863
LP
2930run_target(
2931 'check-api-docs',
2932 depends : [man, libsystemd, libudev],
dd1e33c8 2933 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
51b13863 2934
f12c5d36
ZJS
2935alias_target('update-dbus-docs', update_dbus_docs)
2936alias_target('update-man-rules', update_man_rules)
e3c368f6 2937
0628d48e
LB
2938if not meson.is_cross_build()
2939 custom_target(
2940 'export-dbus-interfaces',
4645074e 2941 output : fs.name(dbus_interfaces_dir),
0628d48e 2942 install : dbus_interfaces_dir != 'no',
4645074e 2943 install_dir : fs.parent(dbus_interfaces_dir),
0628d48e
LB
2944 command : [export_dbus_interfaces_py, '@OUTPUT@', dbus_programs])
2945endif
e3c68924 2946
51b13863 2947############################################################
829257d1 2948
e92777d2
ZJS
2949alt_time_epoch = run_command('date', '-Is', '-u', '-d', '@@0@'.format(time_epoch),
2950 check : true).stdout().strip()
12085ebb
ZJS
2951
2952summary({
12085ebb
ZJS
2953 'split bin-sbin' : split_bin,
2954 'prefix directory' : prefixdir,
12085ebb
ZJS
2955 'sysconf directory' : sysconfdir,
2956 'include directory' : includedir,
2957 'lib directory' : libdir,
12085ebb
ZJS
2958 'SysV init scripts' : sysvinit_path,
2959 'SysV rc?.d directories' : sysvrcnd_path,
2960 'PAM modules directory' : pamlibdir,
2961 'PAM configuration directory' : pamconfdir,
2962 'libcryptsetup plugins directory' : libcryptsetup_plugins_dir,
2963 'RPM macros directory' : rpmmacrosdir,
2964 'modprobe.d directory' : modprobedir,
2965 'D-Bus policy directory' : dbuspolicydir,
2966 'D-Bus session directory' : dbussessionservicedir,
2967 'D-Bus system directory' : dbussystemservicedir,
7e560e79 2968 'D-Bus interfaces directory' : dbus_interfaces_dir,
12085ebb
ZJS
2969 'bash completions directory' : bashcompletiondir,
2970 'zsh completions directory' : zshcompletiondir,
a2b0cd3f 2971 'private shared lib version tag' : shared_lib_tag,
12085ebb
ZJS
2972 'extra start script' : get_option('rc-local'),
2973 'debug shell' : '@0@ @ @1@'.format(get_option('debug-shell'),
2974 get_option('debug-tty')),
2975 'system UIDs' : '<=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_UID_MAX'),
2976 conf.get('SYSTEM_ALLOC_UID_MIN')),
2977 'system GIDs' : '<=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_GID_MAX'),
2978 conf.get('SYSTEM_ALLOC_GID_MIN')),
2979 'dynamic UIDs' : '@0@…@1@'.format(dynamic_uid_min, dynamic_uid_max),
2980 'container UID bases' : '@0@…@1@'.format(container_uid_base_min, container_uid_base_max),
2981 'static UID/GID allocations' : ' '.join(static_ugids),
2982 '/dev/kvm access mode' : get_option('dev-kvm-mode'),
2983 'render group access mode' : get_option('group-render-mode'),
2984 'certificate root directory' : get_option('certificate-root'),
2985 'support URL' : support_url,
2986 'nobody user name' : nobody_user,
2987 'nobody group name' : nobody_group,
2988 'fallback hostname' : get_option('fallback-hostname'),
9798deaf 2989 'default compression method' : compression,
12085ebb
ZJS
2990 'default DNSSEC mode' : default_dnssec,
2991 'default DNS-over-TLS mode' : default_dns_over_tls,
2992 'default mDNS mode' : default_mdns,
2993 'default LLMNR mode' : default_llmnr,
2994 'default DNS servers' : dns_servers.split(' '),
2995 'default NTP servers' : ntp_servers.split(' '),
2996 'default cgroup hierarchy' : default_hierarchy,
2997 'default net.naming-scheme value' : default_net_naming_scheme,
2998 'default KillUserProcesses value' : kill_user_processes,
2999 'default locale' : default_locale,
88b6f0de 3000 'default nspawn locale' : nspawn_locale,
79dec86a 3001 'default status unit format' : status_unit_format_default,
12085ebb
ZJS
3002 'default user $PATH' :
3003 default_user_path != '' ? default_user_path : '(same as system services)',
3004 'systemd service watchdog' : service_watchdog == '' ? 'disabled' : service_watchdog,
3005 'time epoch' : '@0@ (@1@)'.format(time_epoch, alt_time_epoch)})
829257d1
ZJS
3006
3007# TODO:
3008# CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3009# CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3010# LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3011
829257d1
ZJS
3012found = []
3013missing = []
3014
3015foreach tuple : [
56d68e71
ZJS
3016 # dependencies
3017 ['ACL'],
829257d1 3018 ['AUDIT'],
829257d1 3019 ['AppArmor'],
56d68e71
ZJS
3020 ['IMA'],
3021 ['PAM'],
829257d1 3022 ['SECCOMP'],
56d68e71 3023 ['SELinux'],
829257d1 3024 ['SMACK'],
56d68e71
ZJS
3025 ['blkid'],
3026 ['elfutils'],
829257d1 3027 ['gcrypt'],
829257d1 3028 ['gnutls'],
7d861e12 3029 ['libbpf'],
56d68e71 3030 ['libcryptsetup'],
d1ae38d8 3031 ['libcryptsetup-plugins'],
829257d1 3032 ['libcurl'],
56d68e71
ZJS
3033 ['libfdisk'],
3034 ['libfido2'],
829257d1 3035 ['libidn'],
56d68e71 3036 ['libidn2'],
829257d1 3037 ['libiptc'],
56d68e71
ZJS
3038 ['microhttpd'],
3039 ['openssl'],
3040 ['p11kit'],
1d8aae43 3041 ['passwdqc'],
56d68e71
ZJS
3042 ['pcre2'],
3043 ['pwquality'],
3044 ['qrencode'],
3045 ['tpm2'],
3046 ['xkbcommon'],
3047
3048 # compression libs
3049 ['zstd'],
3050 ['lz4'],
3051 ['xz'],
3052 ['zlib'],
3053 ['bzip2'],
3054
3055 # components
3056 ['backlight'],
829257d1 3057 ['binfmt'],
dfca5587 3058 ['bootloader'],
0a0d4899 3059 ['bpf-framework', conf.get('BPF_FRAMEWORK') == 1],
56d68e71 3060 ['coredump'],
56d68e71 3061 ['efi'],
dfca5587 3062 ['environment.d'],
829257d1 3063 ['firstboot'],
56d68e71
ZJS
3064 ['hibernate'],
3065 ['homed'],
3066 ['hostnamed'],
3067 ['hwdb'],
3068 ['importd'],
3069 ['initrd'],
f887eab1 3070 ['kernel-install'],
56d68e71 3071 ['localed'],
829257d1
ZJS
3072 ['logind'],
3073 ['machined'],
56d68e71
ZJS
3074 ['networkd'],
3075 ['nss-myhostname'],
3076 ['nss-mymachines'],
3077 ['nss-resolve'],
3078 ['nss-systemd'],
3079 ['oomd'],
61d0578b 3080 ['portabled'],
56d68e71
ZJS
3081 ['pstore'],
3082 ['quotacheck'],
3083 ['randomseed'],
3084 ['repart'],
3085 ['resolve'],
3086 ['rfkill'],
9bca4ae4 3087 ['sysext'],
0a0d4899 3088 ['systemd-analyze', conf.get('ENABLE_ANALYZE') == 1],
43cc7a3e 3089 ['sysupdate'],
56d68e71 3090 ['sysusers'],
829257d1
ZJS
3091 ['timedated'],
3092 ['timesyncd'],
56d68e71
ZJS
3093 ['tmpfiles'],
3094 ['userdb'],
3095 ['vconsole'],
3096 ['xdg-autostart'],
3097
3098 # optional features
12b4cffd 3099 ['dmi'],
56d68e71 3100 ['idn'],
829257d1 3101 ['polkit'],
56d68e71 3102 ['nscd'],
0a0d4899 3103 ['legacy-pkla', install_polkit_pkla],
829257d1 3104 ['kmod'],
ede5a78f 3105 ['xenctrl'],
829257d1
ZJS
3106 ['dbus'],
3107 ['glib'],
829257d1 3108 ['tpm'],
0a0d4899
JH
3109 ['man pages', want_man],
3110 ['html pages', want_html],
3111 ['man page indices', want_man and have_lxml],
829257d1 3112 ['SysV compat'],
56d68e71 3113 ['compat-mutable-uid-boundaries'],
829257d1
ZJS
3114 ['utmp'],
3115 ['ldconfig'],
0a0d4899
JH
3116 ['adm group', get_option('adm-group')],
3117 ['wheel group', get_option('wheel-group')],
b14e1b43 3118 ['gshadow'],
829257d1
ZJS
3119 ['debug hashmap'],
3120 ['debug mmap cache'],
d6601495 3121 ['debug siphash'],
0a0d4899 3122 ['trace logging', conf.get('LOG_TRACE') == 1],
69525346
YW
3123 ['slow tests', slow_tests],
3124 ['fuzz tests', fuzz_tests],
0a0d4899
JH
3125 ['install tests', install_tests],
3126 ['link-udev-shared', get_option('link-udev-shared')],
3127 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3128 ['link-networkd-shared', get_option('link-networkd-shared')],
3129 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3130 ['link-journalctl-shared', get_option('link-journalctl-shared')],
3131 ['link-boot-shared', get_option('link-boot-shared')],
c06d2e44 3132 ['link-portabled-shared', get_option('link-portabled-shared')],
93651582 3133 ['first-boot-full-preset'],
ceedbf81 3134 ['fexecve'],
0a0d4899
JH
3135 ['standalone-binaries', get_option('standalone-binaries')],
3136 ['coverage', get_option('b_coverage')],
829257d1
ZJS
3137]
3138
af4d7860
ZJS
3139 if tuple.length() >= 2
3140 cond = tuple[1]
3141 else
829257d1
ZJS
3142 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3143 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
349cc4a5 3144 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
829257d1
ZJS
3145 endif
3146 if cond
5a8b1640 3147 found += tuple[0]
829257d1 3148 else
5a8b1640 3149 missing += tuple[0]
829257d1
ZJS
3150 endif
3151endforeach
3152
c716c253
ZJS
3153if static_libsystemd == 'false'
3154 missing += 'static-libsystemd'
3155else
3156 found += 'static-libsystemd(@0@)'.format(static_libsystemd)
3157endif
3158
3159if static_libudev == 'false'
3160 missing += 'static-libudev'
3161else
3162 found += 'static-libudev(@0@)'.format(static_libudev)
3163endif
3164
57633d23
ZJS
3165if conf.get('HAVE_OPENSSL_OR_GCRYPT') == 1 and conf.get('PREFER_OPENSSL') == 1
3166 found += 'cryptolib(openssl)'
3167elif conf.get('HAVE_OPENSSL_OR_GCRYPT') == 1
3168 found += 'cryptolib(gcrypt)'
3169else
3170 missing += 'cryptolib'
3171endif
3172
237f2da9
ZJS
3173if conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1
3174 found += 'DNS-over-TLS(gnutls)'
3175elif conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1
3176 found += 'DNS-over-TLS(openssl)'
3177else
3178 missing += 'DNS-over-TLS'
3179endif
3180
12085ebb
ZJS
3181summary({
3182 'enabled' : ', '.join(found),
3183 'disabled' : ', '.join(missing)},
3184 section : 'Features')