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