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