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