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