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