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