]> git.ipfire.org Git - thirdparty/systemd.git/blame - meson.build
meson: move declarations of arrays
[thirdparty/systemd.git] / meson.build
CommitLineData
db9ecf05 1# SPDX-License-Identifier: LGPL-2.1-or-later
3a726fcd 2
5c23128d 3project('systemd', 'c',
eed3d044 4 version : '254',
5c23128d
ZJS
5 license : 'LGPLv2+',
6 default_options: [
2b2dbcbb 7 'c_std=gnu11',
37efbbd8
ZJS
8 'prefix=/usr',
9 'sysconfdir=/etc',
10 'localstatedir=/var',
827ca909 11 'warning_level=2',
5c23128d 12 ],
35c035a1 13 meson_version : '>= 0.60.0',
5c23128d
ZJS
14 )
15
eed3d044
LB
16libsystemd_version = '0.37.0'
17libudev_version = '1.7.7'
56d50ab1 18
5c23128d 19conf = configuration_data()
a8c03388 20conf.set_quoted('PROJECT_URL', 'https://systemd.io/')
d1b0d841 21conf.set('PROJECT_VERSION', meson.project_version(),
6ffeca8c 22 description : 'Numerical project version (used where a simple number is expected)')
5c23128d 23
1485aacb
DC
24# This is to be used instead of meson.source_root(), as the latter will return
25# the wrong result when systemd is being built as a meson subproject
26project_source_root = meson.current_source_dir()
81e06775 27project_build_root = meson.current_build_dir()
a0b15b41 28relative_source_path = run_command('realpath',
81e06775 29 '--relative-to=@0@'.format(project_build_root),
e92777d2
ZJS
30 project_source_root,
31 check : true).stdout().strip()
a0b15b41 32conf.set_quoted('RELATIVE_SOURCE_PATH', relative_source_path)
1485aacb 33
47350c5f
ZJS
34conf.set10('BUILD_MODE_DEVELOPER', get_option('mode') == 'developer',
35 description : 'tailor build to development or release builds')
011a03a3
ZJS
36verification = get_option('log-message-verification')
37if verification == 'auto'
38 verification = conf.get('BUILD_MODE_DEVELOPER') == 1
39else
40 verification = verification == 'true'
41endif
42conf.set10('LOG_MESSAGE_VERIFICATION', verification)
839bdf25 43
c09edc79
ZJS
44want_ossfuzz = get_option('oss-fuzz')
45want_libfuzzer = get_option('llvm-fuzz')
c29537f3 46if want_ossfuzz and want_libfuzzer
6b8d32ea 47 error('only one of oss-fuzz or llvm-fuzz can be specified')
c09edc79 48endif
87ac55a1 49
678ba020 50skip_deps = want_ossfuzz or get_option('skip-deps')
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')
fce9abb2
ZJS
114libdir = prefixdir / get_option('libdir')
115sysconfdir = prefixdir / get_option('sysconfdir')
116includedir = prefixdir / get_option('includedir')
117datadir = prefixdir / get_option('datadir')
118localstatedir = '/' / get_option('localstatedir')
5c23128d 119
b0d3095f
LB
120libexecdir = prefixdir / 'lib/systemd'
121pkglibdir = libdir / 'systemd'
5c23128d 122
225d08b8
JT
123install_sysconfdir = get_option('install-sysconfdir') != 'false'
124install_sysconfdir_samples = get_option('install-sysconfdir') == 'true'
5c23128d 125# Dirs of external packages
fce9abb2
ZJS
126pkgconfigdatadir = get_option('pkgconfigdatadir') != '' ? get_option('pkgconfigdatadir') : datadir / 'pkgconfig'
127pkgconfiglibdir = get_option('pkgconfiglibdir') != '' ? get_option('pkgconfiglibdir') : libdir / 'pkgconfig'
128polkitpolicydir = datadir / 'polkit-1/actions'
129polkitrulesdir = datadir / 'polkit-1/rules.d'
130polkitpkladir = localstatedir / 'lib/polkit-1/localauthority/10-vendor.d'
131xinitrcdir = get_option('xinitrcdir') != '' ? get_option('xinitrcdir') : sysconfdir / 'X11/xinit/xinitrc.d'
8a38aac3
YW
132rpmmacrosdir = get_option('rpmmacrosdir')
133if rpmmacrosdir != 'no'
fce9abb2 134 rpmmacrosdir = prefixdir / rpmmacrosdir
8a38aac3 135endif
b0d3095f 136modprobedir = prefixdir / 'lib/modprobe.d'
5c23128d
ZJS
137
138# Our own paths
fce9abb2
ZJS
139pkgdatadir = datadir / 'systemd'
140environmentdir = prefixdir / 'lib/environment.d'
141pkgsysconfdir = sysconfdir / 'systemd'
142userunitdir = prefixdir / 'lib/systemd/user'
143userpresetdir = prefixdir / 'lib/systemd/user-preset'
144tmpfilesdir = prefixdir / 'lib/tmpfiles.d'
107795a7 145usertmpfilesdir = prefixdir / 'share/user-tmpfiles.d'
fce9abb2
ZJS
146sysusersdir = prefixdir / 'lib/sysusers.d'
147sysctldir = prefixdir / 'lib/sysctl.d'
148binfmtdir = prefixdir / 'lib/binfmt.d'
149modulesloaddir = prefixdir / 'lib/modules-load.d'
b0d3095f
LB
150networkdir = prefixdir / 'lib/systemd/network'
151systemgeneratordir = libexecdir / 'system-generators'
fce9abb2
ZJS
152usergeneratordir = prefixdir / 'lib/systemd/user-generators'
153systemenvgeneratordir = prefixdir / 'lib/systemd/system-environment-generators'
154userenvgeneratordir = prefixdir / 'lib/systemd/user-environment-generators'
b0d3095f
LB
155systemshutdowndir = libexecdir / 'system-shutdown'
156systemsleepdir = libexecdir / 'system-sleep'
157systemunitdir = prefixdir / 'lib/systemd/system'
158systempresetdir = prefixdir / 'lib/systemd/system-preset'
159udevlibexecdir = prefixdir / 'lib/udev'
fce9abb2
ZJS
160udevrulesdir = udevlibexecdir / 'rules.d'
161udevhwdbdir = udevlibexecdir / 'hwdb.d'
162catalogdir = prefixdir / 'lib/systemd/catalog'
641e2124 163kerneldir = prefixdir / 'lib/kernel'
164kernelinstalldir = kerneldir / 'install.d'
fce9abb2
ZJS
165factorydir = datadir / 'factory'
166bootlibdir = prefixdir / 'lib/systemd/boot/efi'
167testsdir = prefixdir / 'lib/systemd/tests'
26c2b302 168unittestsdir = testsdir / 'unit-tests'
539ee7ab 169testdata_dir = testsdir / 'testdata'
fce9abb2
ZJS
170systemdstatedir = localstatedir / 'lib/systemd'
171catalogstatedir = systemdstatedir / 'catalog'
172randomseeddir = localstatedir / 'lib/systemd'
b0d3095f
LB
173profiledir = libexecdir / 'portable' / 'profile'
174ntpservicelistdir = prefixdir / 'lib/systemd/ntp-units.d'
24039e12 175credstoredir = prefixdir / 'lib/credstore'
5c23128d 176
75aaade1
TB
177docdir = get_option('docdir')
178if docdir == ''
fce9abb2 179 docdir = datadir / 'doc/systemd'
75aaade1
TB
180endif
181
5c23128d
ZJS
182pamlibdir = get_option('pamlibdir')
183if pamlibdir == ''
b0d3095f 184 pamlibdir = libdir / 'security'
5c23128d
ZJS
185endif
186
187pamconfdir = get_option('pamconfdir')
188if pamconfdir == ''
fce9abb2 189 pamconfdir = prefixdir / 'lib/pam.d'
5c23128d
ZJS
190endif
191
d1ae38d8
OK
192libcryptsetup_plugins_dir = get_option('libcryptsetup-plugins-dir')
193if libcryptsetup_plugins_dir == ''
b0d3095f 194 libcryptsetup_plugins_dir = libdir / 'cryptsetup'
d1ae38d8
OK
195endif
196
444d5863 197memory_accounting_default = get_option('memory-accounting-default')
36cf4507 198status_unit_format_default = get_option('status-unit-format-default')
819c0dcb
ZJS
199if status_unit_format_default == 'auto'
200 status_unit_format_default = conf.get('BUILD_MODE_DEVELOPER') == 1 ? 'name' : 'description'
201endif
444d5863 202
b0d3095f 203conf.set_quoted('BINDIR', bindir)
491bf10c
ZJS
204conf.set_quoted('BINFMT_DIR', binfmtdir)
205conf.set_quoted('BOOTLIBDIR', bootlibdir)
fce9abb2 206conf.set_quoted('CATALOG_DATABASE', catalogstatedir / 'database')
491bf10c 207conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
6fe23ff3 208conf.set_quoted('DOC_DIR', docdir)
fce9abb2 209conf.set_quoted('DOCUMENT_ROOT', pkgdatadir / 'gatewayd')
491bf10c
ZJS
210conf.set_quoted('ENVIRONMENT_DIR', environmentdir)
211conf.set_quoted('INCLUDE_DIR', includedir)
212conf.set_quoted('LIBDIR', libdir)
b0d3095f 213conf.set_quoted('LIBEXECDIR', libexecdir)
491bf10c
ZJS
214conf.set_quoted('MODPROBE_DIR', modprobedir)
215conf.set_quoted('MODULESLOAD_DIR', modulesloaddir)
5c23128d 216conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
fce9abb2 217conf.set_quoted('POLKIT_AGENT_BINARY_PATH', bindir / 'pkttyagent')
491bf10c 218conf.set_quoted('PREFIX', prefixdir)
b0d3095f 219conf.set_quoted('PREFIX_NOSLASH', prefixdir_noslash)
fce9abb2 220conf.set_quoted('RANDOM_SEED', randomseeddir / 'random-seed')
491bf10c 221conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
452d2dfd 222conf.set_quoted('RC_LOCAL_PATH', get_option('rc-local'))
491bf10c
ZJS
223conf.set_quoted('SYSCONF_DIR', sysconfdir)
224conf.set_quoted('SYSCTL_DIR', sysctldir)
b0d3095f
LB
225conf.set_quoted('SYSTEMCTL_BINARY_PATH', bindir / 'systemctl')
226conf.set_quoted('SYSTEMD_BINARY_PATH', libexecdir / 'systemd')
491bf10c 227conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
b0d3095f
LB
228conf.set_quoted('SYSTEMD_CGROUPS_AGENT_PATH', libexecdir / 'systemd-cgroups-agent')
229conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', libexecdir / 'systemd-cryptsetup')
230conf.set_quoted('SYSTEMD_EXPORT_PATH', libexecdir / 'systemd-export')
231conf.set_quoted('SYSTEMD_FSCK_PATH', libexecdir / 'systemd-fsck')
232conf.set_quoted('SYSTEMD_GROWFS_PATH', libexecdir / 'systemd-growfs')
233conf.set_quoted('SYSTEMD_HOMEWORK_PATH', libexecdir / 'systemd-homework')
234conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', libexecdir / 'systemd-import-fs')
235conf.set_quoted('SYSTEMD_IMPORT_PATH', libexecdir / 'systemd-import')
236conf.set_quoted('SYSTEMD_INTEGRITYSETUP_PATH', libexecdir / 'systemd-integritysetup')
fce9abb2
ZJS
237conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', pkgdatadir / 'kbd-model-map')
238conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', pkgdatadir / 'language-fallback-map')
b0d3095f
LB
239conf.set_quoted('SYSTEMD_MAKEFS_PATH', libexecdir / 'systemd-makefs')
240conf.set_quoted('SYSTEMD_PULL_PATH', libexecdir / 'systemd-pull')
241conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', libexecdir / 'systemd-shutdown')
539ee7ab 242conf.set_quoted('SYSTEMD_TEST_DATA', testdata_dir)
b0d3095f
LB
243conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', bindir / 'systemd-tty-ask-password-agent')
244conf.set_quoted('SYSTEMD_UPDATE_HELPER_PATH', libexecdir / 'systemd-update-helper')
245conf.set_quoted('SYSTEMD_USERWORK_PATH', libexecdir / 'systemd-userwork')
246conf.set_quoted('SYSTEMD_VERITYSETUP_PATH', libexecdir / 'systemd-veritysetup')
fce9abb2 247conf.set_quoted('SYSTEM_CONFIG_UNIT_DIR', pkgsysconfdir / 'system')
491bf10c 248conf.set_quoted('SYSTEM_DATA_UNIT_DIR', systemunitdir)
96d33e4a 249conf.set_quoted('SYSTEM_ENV_GENERATOR_DIR', systemenvgeneratordir)
491bf10c
ZJS
250conf.set_quoted('SYSTEM_GENERATOR_DIR', systemgeneratordir)
251conf.set_quoted('SYSTEM_PRESET_DIR', systempresetdir)
5c23128d
ZJS
252conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
253conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
491bf10c
ZJS
254conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
255conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
835cf75a
ZJS
256conf.set_quoted('SYSUSERS_DIR', sysusersdir)
257conf.set_quoted('TMPFILES_DIR', tmpfilesdir)
107795a7 258conf.set_quoted('USER_TMPFILES_DIR', usertmpfilesdir)
5c23128d 259conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
491bf10c
ZJS
260conf.set_quoted('UDEV_HWDB_DIR', udevhwdbdir)
261conf.set_quoted('UDEV_RULES_DIR', udevrulesdir)
fce9abb2 262conf.set_quoted('USER_CONFIG_UNIT_DIR', pkgsysconfdir / 'user')
491bf10c
ZJS
263conf.set_quoted('USER_DATA_UNIT_DIR', userunitdir)
264conf.set_quoted('USER_ENV_GENERATOR_DIR', userenvgeneratordir)
265conf.set_quoted('USER_GENERATOR_DIR', usergeneratordir)
fce9abb2 266conf.set_quoted('USER_KEYRING_PATH', pkgsysconfdir / 'import-pubring.gpg')
491bf10c 267conf.set_quoted('USER_PRESET_DIR', userpresetdir)
b0d3095f 268conf.set_quoted('VENDOR_KEYRING_PATH', libexecdir / 'import-pubring.gpg')
491bf10c
ZJS
269
270conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
e5d86ebe 271conf.set10('ENABLE_URLIFY', get_option('urlify'))
491bf10c 272conf.set10('ENABLE_FEXECVE', get_option('fexecve'))
30538ff1 273conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
36cf4507 274conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
e11a25ca 275conf.set_quoted('STATUS_UNIT_FORMAT_DEFAULT_STR', status_unit_format_default)
5c23128d 276
e4c7b5f5
ZJS
277conf.set('DEFAULT_TIMEOUT_SEC', get_option('default-timeout-sec'))
278conf.set('DEFAULT_USER_TIMEOUT_SEC', get_option('default-user-timeout-sec'))
279conf.set('UPDATE_HELPER_USER_TIMEOUT_SEC', get_option('update-helper-user-timeout-sec'))
280
93651582
JL
281conf.set10('FIRST_BOOT_FULL_PRESET', get_option('first-boot-full-preset'))
282
5c23128d
ZJS
283#####################################################################
284
285cc = meson.get_compiler('c')
92148283
JJ
286userspace_c_args = []
287userspace_c_ld_args = []
b68dfb9e 288meson_build_sh = find_program('tools/meson-build.sh')
5c23128d 289
d3da291e
ZJS
290want_tests = get_option('tests')
291slow_tests = want_tests != 'false' and get_option('slow-tests')
c56463fd 292fuzz_tests = want_tests != 'false' and get_option('fuzz-tests')
d3da291e
ZJS
293install_tests = get_option('install-tests')
294
daf4e78e 295if add_languages('cpp', native : false, required : fuzzer_build)
3b2bdd62 296 # Used only for tests
e9f4f566
ZJS
297 cxx = meson.get_compiler('cpp')
298 cxx_cmd = ' '.join(cxx.cmd_array())
1b2acaa7 299else
9b0ca019 300 cxx_cmd = ''
94e2523b
ZJS
301endif
302
31e57a35 303if want_libfuzzer
9c5c4677
EV
304 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
305 if fuzzing_engine.found()
92148283 306 userspace_c_args += '-fsanitize-coverage=trace-pc-guard,trace-cmp'
9c5c4677 307 elif cc.has_argument('-fsanitize=fuzzer-no-link')
92148283 308 userspace_c_args += '-fsanitize=fuzzer-no-link'
9c5c4677
EV
309 else
310 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
311 endif
c09edc79 312elif want_ossfuzz
7db7d5b7
JR
313 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
314endif
315
e9f4f566
ZJS
316# Those generate many false positives, and we do not want to change the code to
317# avoid them.
318basic_disabled_warnings = [
e9f4f566 319 '-Wno-missing-field-initializers',
505ab9dd 320 '-Wno-unused-parameter',
e9f4f566 321]
e9f4f566 322
65267363 323possible_common_cc_flags = [
fc568837
ZJS
324 '-Warray-bounds', # clang
325 '-Warray-bounds=2',
505ab9dd
YW
326 '-Wdate-time',
327 '-Wendif-labels',
328 '-Werror=format=2',
a4ea5d19 329 '-Werror=format-signedness',
505ab9dd 330 '-Werror=implicit-function-declaration',
a0d613ec 331 '-Werror=implicit-int',
505ab9dd 332 '-Werror=incompatible-pointer-types',
ebbb1e36 333 '-Werror=int-conversion',
0b482b37
JJ
334 '-Werror=missing-declarations',
335 '-Werror=missing-prototypes',
505ab9dd 336 '-Werror=overflow',
48c67fdf 337 '-Werror=override-init',
505ab9dd
YW
338 '-Werror=return-type',
339 '-Werror=shift-count-overflow',
340 '-Werror=shift-overflow=2',
6405afda 341 '-Werror=strict-flex-arrays',
30a4ddff 342 '-Werror=undef',
505ab9dd 343 '-Wfloat-equal',
c0f5d58c
JJ
344 # gperf prevents us from enabling this because it does not emit fallthrough
345 # attribute with clang.
346 #'-Wimplicit-fallthrough',
505ab9dd
YW
347 '-Wimplicit-fallthrough=5',
348 '-Winit-self',
30a4ddff
YW
349 '-Wlogical-op',
350 '-Wmissing-include-dirs',
505ab9dd
YW
351 '-Wmissing-noreturn',
352 '-Wnested-externs',
30a4ddff
YW
353 '-Wold-style-definition',
354 '-Wpointer-arith',
30a4ddff 355 '-Wredundant-decls',
30a4ddff 356 '-Wshadow',
30a4ddff 357 '-Wstrict-aliasing=2',
505ab9dd
YW
358 '-Wstrict-prototypes',
359 '-Wsuggest-attribute=noreturn',
054ed430 360 '-Wunused-function',
30a4ddff 361 '-Wwrite-strings',
31560245 362 '-Wzero-length-bounds',
bf7efeb1
FB
363
364 # negative arguments are correctly detected starting with meson 0.46.
eed33623
ZJS
365 '-Wno-error=#warnings', # clang
366 '-Wno-string-plus-int', # clang
fc568837 367
0b482b37
JJ
368 '-fdiagnostics-show-option',
369 '-fno-common',
48e1b2c2
JJ
370 '-fstack-protector',
371 '-fstack-protector-strong',
fc568837 372 '-fstrict-flex-arrays',
48e1b2c2
JJ
373 '--param=ssp-buffer-size=4',
374]
375
376possible_common_link_flags = [
377 '-fstack-protector',
30a4ddff
YW
378]
379
b528a628
ZJS
380c_args = get_option('c_args')
381
60f97fee 382# Our json library does not support -ffinite-math-only, which is enabled by -Ofast or -ffast-math.
53403091 383if (('-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
384 error('-Ofast, -ffast-math, or -ffinite-math-only is specified in c_args.')
385endif
386
a17e5478 387# Disable -Wmaybe-uninitialized when compiling with -Os/-O1/-O3/etc. There are
68c98a41
ZJS
388# too many false positives with gcc >= 8. Effectively, we only test with -O0
389# and -O2; this should be enough to catch most important cases without too much
390# busywork. See https://github.com/systemd/systemd/pull/19226.
391if cc.get_id() == 'gcc' and (not '02'.contains(get_option('optimization')) or
b528a628
ZJS
392 cc.version().version_compare('<10') or
393 '-Os' in c_args or
394 '-O1' in c_args or
395 '-O3' in c_args or
396 '-Og' in c_args)
65267363 397 possible_common_cc_flags += '-Wno-maybe-uninitialized'
68c98a41
ZJS
398endif
399
bc2a4af2
ZJS
400# Disable -Wno-unused-result with gcc, see
401# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66425.
402if cc.get_id() == 'gcc'
403 possible_common_cc_flags += '-Wno-unused-result'
404endif
405
30a4ddff 406# --as-needed and --no-undefined are provided by meson by default,
9247df5a 407# run 'meson configure' to see what is enabled
30a4ddff 408possible_link_flags = [
42e3bb35 409 '-Wl,--fatal-warnings',
30a4ddff 410 '-Wl,-z,now',
42e3bb35 411 '-Wl,-z,relro',
30a4ddff 412]
5c23128d 413
42e3bb35
JJ
414if get_option('b_sanitize') == 'none'
415 possible_link_flags += '-Wl,--warn-common'
416endif
417
30a4ddff 418if cc.get_id() == 'clang'
65267363 419 possible_common_cc_flags += [
30a4ddff
YW
420 '-Wno-typedef-redefinition',
421 '-Wno-gnu-variable-sized-type-not-at-end',
422 ]
423endif
424
1a4e3927
JJ
425if get_option('mode') == 'release'
426 # We could enable 'pattern' for developer mode, but that can interfere with
427 # valgrind and sanitizer builds. Also, clang does not zero-initialize unions,
428 # breaking some of our code (https://reviews.llvm.org/D68115).
429 possible_common_cc_flags += '-ftrivial-auto-var-init=zero'
430endif
431
92148283 432possible_cc_flags = [
16e09d51 433 '-fno-strict-aliasing',
afd8e1d9 434 '-fstrict-flex-arrays=1',
16e09d51 435 '-fvisibility=hidden',
16e09d51
YW
436]
437
30a4ddff 438if get_option('buildtype') != 'debug'
16e09d51 439 possible_cc_flags += [
30a4ddff
YW
440 '-ffunction-sections',
441 '-fdata-sections',
442 ]
443
444 possible_link_flags += '-Wl,--gc-sections'
445endif
446
82390022
DDM
447if get_option('mode') == 'developer'
448 possible_cc_flags += '-fno-omit-frame-pointer'
449endif
450
92148283
JJ
451add_project_arguments(
452 cc.get_supported_arguments(
453 basic_disabled_warnings,
454 possible_common_cc_flags
455 ),
456 language : 'c')
457
48e1b2c2
JJ
458add_project_link_arguments(
459 cc.get_supported_link_arguments(possible_common_link_flags),
460 language : 'c')
461
92148283
JJ
462userspace_c_args += cc.get_supported_arguments(possible_cc_flags)
463userspace_c_ld_args += cc.get_supported_link_arguments(possible_link_flags)
30a4ddff 464
94c0c5b7
ZJS
465have = cc.has_argument('-Wzero-length-bounds')
466conf.set10('HAVE_ZERO_LENGTH_BOUNDS', have)
467
9e70f2f8 468if cc.compiles('''
5c23128d
ZJS
469 #include <time.h>
470 #include <inttypes.h>
471 typedef uint64_t usec_t;
472 usec_t now(clockid_t clock);
473 int main(void) {
474 struct timespec now;
475 return 0;
476 }
38c1c96d 477''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
37efbbd8 478 add_project_arguments('-Werror=shadow', language : 'c')
5c23128d
ZJS
479endif
480
e9f4f566
ZJS
481if cxx_cmd != ''
482 add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp')
483endif
484
0e3cc902 485cpp = ' '.join(cc.cmd_array()) + ' -E'
9cc0e6e9 486
6695c200
ZJS
487has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
488
5c23128d
ZJS
489#####################################################################
490# compilation result tests
491
78103450 492conf.set('_GNU_SOURCE', 1)
2c201c21 493conf.set('__SANE_USERSPACE_TYPES__', true)
6695c200 494conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
5c23128d 495
5c23128d
ZJS
496conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
497conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
5c23128d 498conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
84d953e8 499conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
3112d756 500conf.set('SIZEOF_TIMEX_MEMBER', cc.sizeof('typeof(((struct timex *)0)->freq)', prefix : '#include <sys/timex.h>'))
5c23128d 501
2736a0c6 502long_max = cc.compute_int(
503 'LONG_MAX',
504 prefix : '#include <limits.h>',
505 guess : 0x7FFFFFFFFFFFFFFF,
506 high : 0x7FFFFFFFFFFFFFFF)
a5fac1df
ZJS
507assert(long_max > 100000)
508conf.set_quoted('LONG_MAX_STR', '@0@'.format(long_max))
509
5c23128d 510decl_headers = '''
eb292969 511#include <dirent.h>
5c23128d 512#include <uchar.h>
84e8edec 513#include <sys/mount.h>
4c2e1b39 514#include <sys/stat.h>
5c23128d 515'''
5c23128d
ZJS
516
517foreach decl : ['char16_t',
518 'char32_t',
84e8edec 519 'struct mount_attr',
4c2e1b39 520 'struct statx',
eb292969 521 'struct dirent64',
5c23128d 522 ]
2c201c21
ZJS
523
524 # We get -1 if the size cannot be determined
9c869d08
ZJS
525 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
526
3657d3a0
RH
527 if decl == 'struct mount_attr'
528 if have
529 want_linux_fs_h = false
530 else
531 have = cc.sizeof(decl,
532 prefix : decl_headers + '#include <linux/fs.h>',
533 args : '-D_GNU_SOURCE') > 0
534 want_linux_fs_h = have
535 endif
536 endif
537
9c869d08
ZJS
538 if decl == 'struct statx'
539 if have
540 want_linux_stat_h = false
541 else
542 have = cc.sizeof(decl,
543 prefix : decl_headers + '#include <linux/stat.h>',
544 args : '-D_GNU_SOURCE') > 0
545 want_linux_stat_h = have
546 endif
547 endif
548
349cc4a5 549 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
5c23128d
ZJS
550endforeach
551
9c869d08 552conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
3657d3a0 553conf.set10('WANT_LINUX_FS_H', want_linux_fs_h)
75720bff 554
5c23128d 555foreach ident : ['secure_getenv', '__secure_getenv']
349cc4a5 556 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
5c23128d
ZJS
557endforeach
558
559foreach ident : [
85db59b7 560 ['memfd_create', '''#include <sys/mman.h>'''],
7b961e40
LP
561 ['gettid', '''#include <sys/types.h>
562 #include <unistd.h>'''],
3c042add
LP
563 ['pivot_root', '''#include <stdlib.h>
564 #include <unistd.h>'''], # no known header declares pivot_root
51fe206f
ZJS
565 ['ioprio_get', '''#include <sched.h>'''], # no known header declares ioprio_get
566 ['ioprio_set', '''#include <sched.h>'''], # no known header declares ioprio_set
85db59b7 567 ['name_to_handle_at', '''#include <sys/types.h>
37efbbd8
ZJS
568 #include <sys/stat.h>
569 #include <fcntl.h>'''],
85db59b7 570 ['setns', '''#include <sched.h>'''],
2acfd0ff
LP
571 ['renameat2', '''#include <stdio.h>
572 #include <fcntl.h>'''],
37efbbd8
ZJS
573 ['kcmp', '''#include <linux/kcmp.h>'''],
574 ['keyctl', '''#include <sys/types.h>
575 #include <keyutils.h>'''],
85db59b7 576 ['copy_file_range', '''#include <sys/syscall.h>
37efbbd8 577 #include <unistd.h>'''],
71e5200f
DM
578 ['bpf', '''#include <sys/syscall.h>
579 #include <unistd.h>'''],
4c2e1b39
LP
580 ['statx', '''#include <sys/types.h>
581 #include <sys/stat.h>
582 #include <unistd.h>'''],
aa484f35 583 ['explicit_bzero' , '''#include <string.h>'''],
5bb20fd3 584 ['reallocarray', '''#include <stdlib.h>'''],
b070c7c0
MS
585 ['set_mempolicy', '''#include <stdlib.h>
586 #include <unistd.h>'''],
587 ['get_mempolicy', '''#include <stdlib.h>
588 #include <unistd.h>'''],
5f152f43
LP
589 ['pidfd_send_signal', '''#include <stdlib.h>
590 #include <unistd.h>
591 #include <signal.h>
592 #include <sys/wait.h>'''],
593 ['pidfd_open', '''#include <stdlib.h>
594 #include <unistd.h>
595 #include <signal.h>
596 #include <sys/wait.h>'''],
5ead4e85
LP
597 ['rt_sigqueueinfo', '''#include <stdlib.h>
598 #include <unistd.h>
599 #include <signal.h>
600 #include <sys/wait.h>'''],
a5421953
DDM
601 ['rt_tgsigqueueinfo', '''#include <stdlib.h>
602 #include <unistd.h>
603 #include <signal.h>
604 #include <sys/wait.h>'''],
4b6f74f5 605 ['mallinfo', '''#include <malloc.h>'''],
1885169c 606 ['mallinfo2', '''#include <malloc.h>'''],
8939eeae 607 ['execveat', '''#include <unistd.h>'''],
441e0fdb 608 ['close_range', '''#include <unistd.h>'''],
420297c9 609 ['epoll_pwait2', '''#include <sys/epoll.h>'''],
84e8edec
LP
610 ['mount_setattr', '''#include <sys/mount.h>'''],
611 ['move_mount', '''#include <sys/mount.h>'''],
612 ['open_tree', '''#include <sys/mount.h>'''],
1c265fcd
DDM
613 ['fsopen', '''#include <sys/mount.h>'''],
614 ['fsconfig', '''#include <sys/mount.h>'''],
34a9da0d 615 ['fsmount', '''#include <sys/mount.h>'''],
aab35b1e 616 ['getdents64', '''#include <dirent.h>'''],
37efbbd8
ZJS
617]
618
85db59b7 619 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
4b9545f1 620 conf.set10('HAVE_' + ident[0].to_upper(), have)
5c23128d
ZJS
621endforeach
622
85db59b7 623if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
349cc4a5 624 conf.set10('USE_SYS_RANDOM_H', true)
4b9545f1 625 conf.set10('HAVE_GETRANDOM', true)
4984c8be
ZJS
626else
627 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
349cc4a5 628 conf.set10('USE_SYS_RANDOM_H', false)
4b9545f1 629 conf.set10('HAVE_GETRANDOM', have)
4984c8be
ZJS
630endif
631
5c23128d
ZJS
632#####################################################################
633
0f4c4f38
ZJS
634sh = find_program('sh')
635echo = find_program('echo')
5c23128d 636sed = find_program('sed')
5c23128d 637awk = find_program('awk')
5c23128d 638stat = find_program('stat')
0f4c4f38 639ln = find_program('ln')
d68b342b 640git = find_program('git', required : false)
b68dfb9e 641env = find_program('env')
0f4c4f38 642rsync = find_program('rsync', required : false)
4d56d084 643diff = find_program('diff')
d9081eb0 644find = find_program('find')
7c22f07c 645meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
5c23128d 646
94e75a54 647mkdir_p = 'mkdir -p $DESTDIR/@0@'
24039e12 648mkdir_p_mode = 'mkdir -p $DESTDIR/@0@ -m @1@'
94e75a54 649
9247df5a 650# If -Dxxx-path option is found, use that. Otherwise, check in $PATH,
5c23128d 651# /usr/sbin, /sbin, and fall back to the default from middle column.
2fa645f1 652progs = [['quotaon', '/usr/sbin/quotaon' ],
5c23128d 653 ['quotacheck', '/usr/sbin/quotacheck' ],
5c23128d
ZJS
654 ['kmod', '/usr/bin/kmod' ],
655 ['kexec', '/usr/sbin/kexec' ],
656 ['sulogin', '/usr/sbin/sulogin' ],
657 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
658 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
659 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
660 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
6db90462 661 ['nologin', '/usr/sbin/nologin', ],
5c23128d
ZJS
662 ]
663foreach prog : progs
37efbbd8
ZJS
664 path = get_option(prog[0] + '-path')
665 if path != ''
666 message('Using @1@ for @0@'.format(prog[0], path))
667 else
668 exe = find_program(prog[0],
669 '/usr/sbin/' + prog[0],
670 '/sbin/' + prog[0],
671 required: false)
573c0dc1 672 path = exe.found() ? exe.full_path() : prog[1]
37efbbd8
ZJS
673 endif
674 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
675 conf.set_quoted(name, path)
5c23128d
ZJS
676endforeach
677
2fa645f1
MG
678conf.set_quoted('TELINIT', get_option('telinit-path'))
679
e92777d2 680if run_command(ln, '--relative', '--help', check : false).returncode() != 0
cd001016 681 error('ln does not support --relative (added in coreutils 8.16)')
1276a9f6 682endif
5c23128d
ZJS
683
684############################################################
685
686gperf = find_program('gperf')
687
688gperf_test_format = '''
689#include <string.h>
690const char * in_word_set(const char *, @0@);
691@1@
692'''
ac3eda34 693gperf_snippet = run_command(sh, '-c', 'echo foo,bar | "$1" -L ANSI-C', '_', gperf,
e92777d2 694 check : true)
5c23128d
ZJS
695gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
696if cc.compiles(gperf_test)
37efbbd8 697 gperf_len_type = 'size_t'
5c23128d 698else
37efbbd8
ZJS
699 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
700 if cc.compiles(gperf_test)
701 gperf_len_type = 'unsigned'
702 else
703 error('unable to determine gperf len type')
704 endif
5c23128d
ZJS
705endif
706message('gperf len type is @0@'.format(gperf_len_type))
37efbbd8
ZJS
707conf.set('GPERF_LEN_TYPE', gperf_len_type,
708 description : 'The type of gperf "len" parameter')
5c23128d
ZJS
709
710############################################################
711
712if not cc.has_header('sys/capability.h')
37efbbd8 713 error('POSIX caps headers not found')
5c23128d 714endif
9f555bba 715foreach header : ['crypt.h',
5c23128d
ZJS
716 'linux/memfd.h',
717 'linux/vm_sockets.h',
af8786b1 718 'sys/auxv.h',
5545f336 719 'threads.h',
5c23128d
ZJS
720 'valgrind/memcheck.h',
721 'valgrind/valgrind.h',
420297c9 722 'linux/time_types.h',
b428efa5 723 'sys/sdt.h',
5c23128d 724 ]
2c201c21 725
349cc4a5
ZJS
726 conf.set10('HAVE_' + header.underscorify().to_upper(),
727 cc.has_header(header))
5c23128d
ZJS
728endforeach
729
730############################################################
731
eef4b800
ZJS
732fallback_hostname = get_option('fallback-hostname')
733if fallback_hostname == '' or fallback_hostname[0] == '.' or fallback_hostname[0] == '-'
734 error('Invalid fallback-hostname configuration')
735 # A more extensive test is done in test-hostname-util. Let's catch
736 # the most obvious errors here so we don't fail with an assert later.
737endif
738conf.set_quoted('FALLBACK_HOSTNAME', fallback_hostname)
739
5c23128d
ZJS
740default_hierarchy = get_option('default-hierarchy')
741conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
742 description : 'default cgroup hierarchy as string')
743if default_hierarchy == 'legacy'
37efbbd8 744 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
5c23128d 745elif default_hierarchy == 'hybrid'
37efbbd8 746 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
5c23128d 747else
37efbbd8 748 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
5c23128d
ZJS
749endif
750
681cb84a
ZJS
751extra_net_naming_schemes = []
752extra_net_naming_map = []
753foreach scheme: get_option('extra-net-naming-schemes').split(',')
754 if scheme != ''
755 name = scheme.split('=')[0]
756 value = scheme.split('=')[1]
757 NAME = name.underscorify().to_upper()
758 VALUE = []
759 foreach field: value.split('+')
760 VALUE += 'NAMING_' + field.underscorify().to_upper()
761 endforeach
762 extra_net_naming_schemes += 'NAMING_@0@ = @1@,'.format(NAME, '|'.join(VALUE))
763 extra_net_naming_map += '{ "@0@", NAMING_@1@ },'.format(name, NAME)
764 endif
765endforeach
766conf.set('EXTRA_NET_NAMING_SCHEMES', ' '.join(extra_net_naming_schemes))
767conf.set('EXTRA_NET_NAMING_MAP', ' '.join(extra_net_naming_map))
768
06da5c63
ZJS
769default_net_naming_scheme = get_option('default-net-naming-scheme')
770conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
77faadfd
ZJS
771if default_net_naming_scheme != 'latest'
772 conf.set('_DEFAULT_NET_NAMING_SCHEME_TEST',
773 'NAMING_' + default_net_naming_scheme.underscorify().to_upper())
774endif
06da5c63 775
5c23128d 776time_epoch = get_option('time-epoch')
a36be3e5 777if time_epoch <= 0
e92777d2 778 time_epoch = run_command(sh, '-c', 'echo "$SOURCE_DATE_EPOCH"', check : true).stdout().strip()
edd84b8e 779 if time_epoch == '' and git.found() and fs.is_dir('.git')
bd190899 780 # If we're in a git repository, use the creation time of the latest git tag.
e92777d2
ZJS
781 latest_tag = run_command(git, 'describe', '--abbrev=0', '--tags',
782 check : false)
783 if latest_tag.returncode() == 0
784 time_epoch = run_command(
785 git, 'log', '--no-show-signature', '-1', '--format=%at',
786 latest_tag.stdout().strip(),
787 check : false).stdout()
788 endif
0390b094
ZJS
789 endif
790 if time_epoch == ''
6dbf352c 791 NEWS = files('NEWS')
e92777d2
ZJS
792 time_epoch = run_command(stat, '-c', '%Y', NEWS,
793 check : true).stdout()
6dbf352c 794 endif
89cdbe1f 795 time_epoch = time_epoch.strip().to_int()
5c23128d 796endif
5c23128d
ZJS
797conf.set('TIME_EPOCH', time_epoch)
798
b10abe4b
EI
799conf.set('CLOCK_VALID_RANGE_USEC_MAX', get_option('clock-valid-range-usec-max'))
800
53350c7b 801default_user_shell = get_option('default-user-shell')
802conf.set_quoted('DEFAULT_USER_SHELL', default_user_shell)
803conf.set_quoted('DEFAULT_USER_SHELL_NAME', fs.name(default_user_shell))
804
fc1a5d1a
ZJS
805foreach tuple : [['system-alloc-uid-min', 'SYS_UID_MIN', 1], # Also see login.defs(5).
806 ['system-uid-max', 'SYS_UID_MAX', 999],
807 ['system-alloc-gid-min', 'SYS_GID_MIN', 1],
808 ['system-gid-max', 'SYS_GID_MAX', 999]]
809 v = get_option(tuple[0])
a36be3e5 810 if v <= 0
fc1a5d1a
ZJS
811 v = run_command(
812 awk,
813 '/^\s*@0@\s+/ { uid=$2 } END { print uid }'.format(tuple[1]),
e92777d2
ZJS
814 '/etc/login.defs',
815 check : false).stdout().strip()
fc1a5d1a
ZJS
816 if v == ''
817 v = tuple[2]
818 else
819 v = v.to_int()
820 endif
2f62cf35 821 endif
fc1a5d1a 822 conf.set(tuple[0].underscorify().to_upper(), v)
fc1a5d1a
ZJS
823endforeach
824if conf.get('SYSTEM_ALLOC_UID_MIN') >= conf.get('SYSTEM_UID_MAX')
825 error('Invalid uid allocation range')
5c23128d 826endif
fc1a5d1a
ZJS
827if conf.get('SYSTEM_ALLOC_GID_MIN') >= conf.get('SYSTEM_GID_MAX')
828 error('Invalid gid allocation range')
5c23128d 829endif
5c23128d 830
ac09340e
YW
831dynamic_uid_min = get_option('dynamic-uid-min')
832dynamic_uid_max = get_option('dynamic-uid-max')
87d5e4f2
LP
833conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
834conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
87d5e4f2 835
ac09340e
YW
836container_uid_base_min = get_option('container-uid-base-min')
837container_uid_base_max = get_option('container-uid-base-max')
87d5e4f2
LP
838conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
839conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
87d5e4f2 840
afde4574
LP
841nobody_user = get_option('nobody-user')
842nobody_group = get_option('nobody-group')
843
2484bff3 844if not meson.is_cross_build()
e92777d2 845 getent_result = run_command('getent', 'passwd', '65534', check : false)
2484bff3
CQ
846 if getent_result.returncode() == 0
847 name = getent_result.stdout().split(':')[0]
848 if name != nobody_user
849 warning('\n' +
850 '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) +
851 'Your build will result in an user table setup that is incompatible with the local system.')
852 endif
afde4574 853 endif
e92777d2 854 id_result = run_command('id', '-u', nobody_user, check : false)
2484bff3 855 if id_result.returncode() == 0
89cdbe1f 856 id = id_result.stdout().strip().to_int()
2484bff3
CQ
857 if id != 65534
858 warning('\n' +
859 '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) +
860 'Your build will result in an user table setup that is incompatible with the local system.')
861 endif
afde4574 862 endif
afde4574 863
e92777d2 864 getent_result = run_command('getent', 'group', '65534', check : false)
2484bff3
CQ
865 if getent_result.returncode() == 0
866 name = getent_result.stdout().split(':')[0]
867 if name != nobody_group
868 warning('\n' +
869 '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) +
870 'Your build will result in an group table setup that is incompatible with the local system.')
871 endif
afde4574 872 endif
e92777d2 873 id_result = run_command('id', '-g', nobody_group, 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' +
d5b3e510 878 '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
879 'Your build will result in an group table setup that is incompatible with the local system.')
880 endif
afde4574
LP
881 endif
882endif
8374cc62 883if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
8ea9fad7
YW
884 warning('\n' +
885 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
886 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
8374cc62 887endif
afde4574
LP
888
889conf.set_quoted('NOBODY_USER_NAME', nobody_user)
890conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
87d5e4f2 891
9a797ddc
ZJS
892static_ugids = []
893foreach option : ['adm-gid',
894 'audio-gid',
895 'cdrom-gid',
896 'dialout-gid',
897 'disk-gid',
898 'input-gid',
899 'kmem-gid',
900 'kvm-gid',
901 'lp-gid',
902 'render-gid',
903 'sgx-gid',
904 'tape-gid',
905 'tty-gid',
906 'users-gid',
907 'utmp-gid',
908 'video-gid',
909 'wheel-gid',
910 'systemd-journal-gid',
911 'systemd-network-uid',
912 'systemd-resolve-uid',
913 'systemd-timesync-uid']
914 name = option.underscorify().to_upper()
915 val = get_option(option)
916
917 # Ensure provided GID argument is numeric, otherwise fall back to default assignment
a36be3e5
YW
918 conf.set(name, val > 0 ? val : '-')
919 if val > 0
9a797ddc
ZJS
920 static_ugids += '@0@:@1@'.format(option, val)
921 endif
922endforeach
84786b8e 923
348b4437
YW
924conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
925conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
5c23128d 926
ace5e311 927dev_kvm_mode = get_option('dev-kvm-mode')
d924a938 928conf.set_quoted('DEV_KVM_MODE', dev_kvm_mode) # FIXME: convert to 0o… notation
ace5e311 929conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
055a083a 930group_render_mode = get_option('group-render-mode')
8feaea5e 931conf.set_quoted('GROUP_RENDER_MODE', group_render_mode)
055a083a 932conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
5c23128d 933
2a4c156d
ZJS
934kill_user_processes = get_option('default-kill-user-processes')
935conf.set10('KILL_USER_PROCESSES', kill_user_processes)
5c23128d 936
829257d1
ZJS
937dns_servers = get_option('dns-servers')
938conf.set_quoted('DNS_SERVERS', dns_servers)
5c23128d 939
829257d1
ZJS
940ntp_servers = get_option('ntp-servers')
941conf.set_quoted('NTP_SERVERS', ntp_servers)
5c23128d 942
8ca9e92c
DR
943default_locale = get_option('default-locale')
944conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
945
a22f5186
DDM
946nspawn_locale = get_option('nspawn-locale')
947conf.set_quoted('SYSTEMD_NSPAWN_LOCALE', nspawn_locale)
948
f129d0e7
MY
949default_keymap = get_option('default-keymap')
950conf.set_quoted('SYSTEMD_DEFAULT_KEYMAP', default_keymap)
951
8f20232f 952localegen_path = get_option('localegen-path')
8f20232f
MK
953if localegen_path != ''
954 conf.set_quoted('LOCALEGEN_PATH', localegen_path)
8f20232f 955endif
71ae5ce5 956conf.set10('HAVE_LOCALEGEN', localegen_path != '')
8f20232f 957
5c23128d
ZJS
958conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
959
21d0dd5a 960service_watchdog = get_option('service-watchdog')
7bc9ea51 961watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
059cc610 962conf.set_quoted('SERVICE_WATCHDOG', watchdog_value)
21d0dd5a 963
059cc610 964conf.set_quoted('SUSHELL', get_option('debug-shell'))
93912e87 965conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
3131bfe3 966
349cc4a5
ZJS
967enable_debug_hashmap = false
968enable_debug_mmap_cache = false
d6601495 969enable_debug_siphash = false
8f6b442a 970foreach name : get_option('debug-extra')
ad7aa760
YW
971 if name == 'hashmap'
972 enable_debug_hashmap = true
973 elif name == 'mmap-cache'
974 enable_debug_mmap_cache = true
d6601495
YW
975 elif name == 'siphash'
976 enable_debug_siphash = true
ad7aa760
YW
977 else
978 message('unknown debug option "@0@", ignoring'.format(name))
979 endif
980endforeach
349cc4a5
ZJS
981conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
982conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
d6601495 983conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
fd5dec9a 984conf.set10('LOG_TRACE', get_option('log-trace'))
d18cb393 985
3602ca6f
ZJS
986default_user_path = get_option('user-path')
987if default_user_path != ''
988 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
989endif
990
5c23128d
ZJS
991#####################################################################
992
993threads = dependency('threads')
994librt = cc.find_library('rt')
995libm = cc.find_library('m')
996libdl = cc.find_library('dl')
55573787
YW
997libcrypt = dependency('libcrypt', 'libxcrypt', required : false)
998if not libcrypt.found()
999 # fallback to use find_library() if libcrypt is provided by glibc, e.g. for LibreELEC.
1000 libcrypt = cc.find_library('crypt')
1001endif
d625f717 1002libcap = dependency('libcap')
5c23128d 1003
96f8c636
ZJS
1004# On some architectures, libatomic is required. But on some installations,
1005# it is found, but actual linking fails. So let's try to use it opportunistically.
1006# If it is installed, but not needed, it will be dropped because of --as-needed.
1007if cc.links('''int main(int argc, char **argv) { return 0; }''',
1008 args : '-latomic',
1009 name : 'libatomic')
1010 libatomic = declare_dependency(link_args : '-latomic')
1011else
1012 libatomic = []
1013endif
1014
06ca077b 1015crypt_header = conf.get('HAVE_CRYPT_H') == 1 ? '''#include <crypt.h>''' : '''#include <unistd.h>'''
e8644a41 1016foreach ident : [
feee7f62
LB
1017 ['crypt_ra', crypt_header],
1018 ['crypt_preferred_method', crypt_header],
1019 ['crypt_gensalt_ra', crypt_header]]
e8644a41
ZJS
1020
1021 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE',
1022 dependencies : libcrypt)
1023 conf.set10('HAVE_' + ident[0].to_upper(), have)
1024endforeach
1025
7d861e12 1026want_bpf_framework = get_option('bpf-framework')
b88323e4 1027bpf_compiler = get_option('bpf-compiler')
7d861e12
JK
1028bpf_framework_required = want_bpf_framework == 'true'
1029
87e462f7 1030libbpf_version_requirement = '>= 0.1.0'
b88323e4
JH
1031if bpf_compiler == 'gcc'
1032 libbpf_version_requirement = '>= 1.0.0'
1033endif
1034libbpf = dependency('libbpf', required : bpf_framework_required, version : libbpf_version_requirement)
7d861e12
JK
1035conf.set10('HAVE_LIBBPF', libbpf.found())
1036
b88323e4
JH
1037bpftool_strip_version_requirement = '>= 5.13.0'
1038if bpf_compiler == 'gcc'
1039 bpftool_strip_version_requirement = '>= 7.0.0'
1040endif
1041
3d954ef1 1042if want_bpf_framework == 'false' or not libbpf.found() or skip_deps
cf2dc690 1043 conf.set10('BPF_FRAMEWORK', false)
7d861e12 1044else
76abad4d
JH
1045 clang_found = false
1046 clang_supports_bpf = false
1047 bpf_gcc_found = false
b88323e4 1048 bpftool_strip = false
76abad4d
JH
1049 deps_found = false
1050
1051 if bpf_compiler == 'clang'
1052 # Support 'versioned' clang/llvm-strip binaries, as seen on Debian/Ubuntu
1053 # (like clang-10/llvm-strip-10)
1054 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')
1055 r = find_program('clang', required : bpf_framework_required, version : '>= 10.0.0')
1056 clang_found = r.found()
1057 if clang_found
573c0dc1 1058 clang = r.full_path()
76abad4d 1059 endif
76abad4d
JH
1060 else
1061 clang_found = true
1062 clang = cc.cmd_array()
dc7e9c1b 1063 endif
a6ac8b5a 1064
76abad4d
JH
1065 if clang_found
1066 # Check if 'clang -target bpf' is supported.
1067 clang_supports_bpf = run_command(clang, '-target', 'bpf', '--print-supported-cpus', check : false).returncode() == 0
1068 endif
1069 elif bpf_compiler == 'gcc'
76abad4d 1070 bpf_gcc = find_program('bpf-gcc',
e4086f7d 1071 'bpf-none-gcc',
76abad4d 1072 required : true,
4a7a13b5 1073 version : '>= 13.1.0')
76abad4d 1074 bpf_gcc_found = bpf_gcc.found()
a6ac8b5a
YW
1075 endif
1076
76abad4d
JH
1077 if clang_supports_bpf or bpf_gcc_found
1078 # Debian installs this in /usr/sbin/ which is not in $PATH.
1079 # We check for 'bpftool' first, honouring $PATH, and in /usr/sbin/ for Debian.
1080 # We use 'bpftool gen object' subcommand for bpftool strip, it was added by d80b2fcbe0a023619e0fc73112f2a02c2662f6ab (v5.13).
b88323e4 1081 bpftool_strip_required = bpf_framework_required and bpf_compiler == 'gcc'
e3759ac4
JH
1082 bpftool = find_program('bpftool',
1083 '/usr/sbin/bpftool',
b88323e4
JH
1084 required : bpftool_strip_required,
1085 version : bpftool_strip_version_requirement)
e3759ac4 1086
76abad4d
JH
1087 if bpftool.found()
1088 bpftool_strip = true
1089 deps_found = true
b88323e4 1090 elif bpf_compiler == 'clang'
76abad4d
JH
1091 # We require the 'bpftool gen skeleton' subcommand, it was added by 985ead416df39d6fe8e89580cc1db6aa273e0175 (v5.6).
1092 bpftool = find_program('bpftool',
1093 '/usr/sbin/bpftool',
1094 required : bpf_framework_required,
1095 version : '>= 5.6.0')
e3759ac4 1096 endif
68e101da 1097
76abad4d
JH
1098 # We use `llvm-strip` as a fallback if `bpftool gen object` strip support is not available.
1099 if not bpftool_strip and bpftool.found() and clang_supports_bpf
1100 if not meson.is_cross_build()
1101 llvm_strip_bin = run_command(clang, '--print-prog-name', 'llvm-strip',
1102 check : true).stdout().strip()
1103 else
1104 llvm_strip_bin = 'llvm-strip'
1105 endif
1106 llvm_strip = find_program(llvm_strip_bin, required : bpf_framework_required, version : '>= 10.0.0')
1107 deps_found = llvm_strip.found()
1108 endif
1109 endif
68e101da 1110
7d861e12 1111 # Can build BPF program from source code in restricted C
d40ce018 1112 conf.set10('BPF_FRAMEWORK', deps_found)
7d861e12
JK
1113endif
1114
5c23128d 1115libmount = dependency('mount',
c0b4b0f8 1116 version : fuzzer_build ? '>= 0' : '>= 2.30')
5c23128d 1117
e594a3b1
LP
1118want_libfdisk = get_option('fdisk')
1119if want_libfdisk != 'false' and not skip_deps
1120 libfdisk = dependency('fdisk',
baec7d78 1121 version : '>= 2.32',
e594a3b1
LP
1122 required : want_libfdisk == 'true')
1123 have = libfdisk.found()
1124else
1125 have = false
1126 libfdisk = []
1127endif
1128conf.set10('HAVE_LIBFDISK', have)
1129
1d8aae43 1130want_passwdqc = get_option('passwdqc')
70a5db58 1131want_pwquality = get_option('pwquality')
1d8aae43
EI
1132if want_passwdqc == 'true' and want_pwquality == 'true'
1133 error('passwdqc and pwquality cannot be requested simultaneously')
1134endif
1135
1136if want_pwquality != 'false' and want_passwdqc != 'true' and not skip_deps
51c425dc
DL
1137 libpwquality = dependency('pwquality',
1138 version : '>= 1.4.1',
1139 required : want_pwquality == 'true')
70a5db58
LP
1140 have = libpwquality.found()
1141else
1142 have = false
1143 libpwquality = []
1144endif
1145conf.set10('HAVE_PWQUALITY', have)
1146
1d8aae43
EI
1147if not have and want_passwdqc != 'false' and not skip_deps
1148 libpasswdqc = dependency('passwdqc',
1149 required : want_passwdqc == 'true')
1150 have = libpasswdqc.found()
1151else
1152 have = false
1153 libpasswdqc = []
1154endif
1155conf.set10('HAVE_PASSWDQC', have)
1156
5c23128d 1157want_seccomp = get_option('seccomp')
87ac55a1 1158if want_seccomp != 'false' and not skip_deps
37efbbd8 1159 libseccomp = dependency('libseccomp',
9f0e9c01 1160 version : '>= 2.3.1',
37efbbd8 1161 required : want_seccomp == 'true')
349cc4a5 1162 have = libseccomp.found()
5c23128d 1163else
349cc4a5 1164 have = false
37efbbd8 1165 libseccomp = []
5c23128d 1166endif
349cc4a5 1167conf.set10('HAVE_SECCOMP', have)
5c23128d
ZJS
1168
1169want_selinux = get_option('selinux')
87ac55a1 1170if want_selinux != 'false' and not skip_deps
37efbbd8
ZJS
1171 libselinux = dependency('libselinux',
1172 version : '>= 2.1.9',
1173 required : want_selinux == 'true')
349cc4a5 1174 have = libselinux.found()
5c23128d 1175else
349cc4a5 1176 have = false
37efbbd8 1177 libselinux = []
5c23128d 1178endif
349cc4a5 1179conf.set10('HAVE_SELINUX', have)
5c23128d
ZJS
1180
1181want_apparmor = get_option('apparmor')
87ac55a1 1182if want_apparmor != 'false' and not skip_deps
37efbbd8 1183 libapparmor = dependency('libapparmor',
2ffadd3c 1184 version : '>= 2.13',
37efbbd8 1185 required : want_apparmor == 'true')
349cc4a5 1186 have = libapparmor.found()
5c23128d 1187else
349cc4a5 1188 have = false
37efbbd8 1189 libapparmor = []
5c23128d 1190endif
349cc4a5 1191conf.set10('HAVE_APPARMOR', have)
5c23128d 1192
07b382cc
ZJS
1193have = get_option('smack') and get_option('smack-run-label') != ''
1194conf.set10('HAVE_SMACK_RUN_LABEL', have)
1195if have
1196 conf.set_quoted('SMACK_RUN_LABEL', get_option('smack-run-label'))
1197endif
5c23128d 1198
aa5ae971
ŁS
1199have = get_option('smack') and get_option('smack-default-process-label') != ''
1200if have
1201 conf.set_quoted('SMACK_DEFAULT_PROCESS_LABEL', get_option('smack-default-process-label'))
1202endif
1203
3ca0cb73
ZJS
1204want_polkit = get_option('polkit')
1205install_polkit = false
1206install_polkit_pkla = false
87ac55a1 1207if want_polkit != 'false' and not skip_deps
37efbbd8 1208 install_polkit = true
3ca0cb73 1209
37efbbd8
ZJS
1210 libpolkit = dependency('polkit-gobject-1',
1211 required : false)
1212 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
1213 message('Old polkit detected, will install pkla files')
1214 install_polkit_pkla = true
1215 endif
3ca0cb73 1216endif
349cc4a5 1217conf.set10('ENABLE_POLKIT', install_polkit)
3ca0cb73 1218
36f0387e 1219want_acl = get_option('acl')
87ac55a1 1220if want_acl != 'false' and not skip_deps
d625f717 1221 libacl = dependency('libacl', required : want_acl == 'true')
349cc4a5 1222 have = libacl.found()
36f0387e 1223else
349cc4a5 1224 have = false
36f0387e
ZJS
1225 libacl = []
1226endif
349cc4a5 1227conf.set10('HAVE_ACL', have)
36f0387e 1228
5c23128d 1229want_audit = get_option('audit')
87ac55a1 1230if want_audit != 'false' and not skip_deps
37efbbd8 1231 libaudit = dependency('audit', required : want_audit == 'true')
349cc4a5 1232 have = libaudit.found()
5c23128d 1233else
349cc4a5 1234 have = false
37efbbd8 1235 libaudit = []
5c23128d 1236endif
349cc4a5 1237conf.set10('HAVE_AUDIT', have)
5c23128d
ZJS
1238
1239want_blkid = get_option('blkid')
87ac55a1 1240if want_blkid != 'false' and not skip_deps
37efbbd8 1241 libblkid = dependency('blkid', required : want_blkid == 'true')
349cc4a5 1242 have = libblkid.found()
4fcc033b
KZ
1243
1244 conf.set10('HAVE_BLKID_PROBE_SET_HINT',
1245 have and cc.has_function('blkid_probe_set_hint', dependencies : libblkid))
5c23128d 1246else
349cc4a5 1247 have = false
37efbbd8 1248 libblkid = []
5c23128d 1249endif
349cc4a5 1250conf.set10('HAVE_BLKID', have)
5c23128d
ZJS
1251
1252want_kmod = get_option('kmod')
87ac55a1 1253if want_kmod != 'false' and not skip_deps
37efbbd8
ZJS
1254 libkmod = dependency('libkmod',
1255 version : '>= 15',
1256 required : want_kmod == 'true')
349cc4a5 1257 have = libkmod.found()
5c23128d 1258else
349cc4a5 1259 have = false
37efbbd8 1260 libkmod = []
5c23128d 1261endif
349cc4a5 1262conf.set10('HAVE_KMOD', have)
5c23128d 1263
ede5a78f
ST
1264want_xenctrl = get_option('xenctrl')
1265if want_xenctrl != 'false' and not skip_deps
1266 libxenctrl = dependency('xencontrol',
1267 version : '>= 4.9',
1268 required : want_xenctrl == 'true')
1269 have = libxenctrl.found()
1270else
1271 have = false
1272 libxenctrl = []
1273endif
1274conf.set10('HAVE_XENCTRL', have)
1275
5c23128d 1276want_pam = get_option('pam')
87ac55a1 1277if want_pam != 'false' and not skip_deps
d625f717
YW
1278 libpam = dependency('pam', required : false)
1279 if not libpam.found()
1280 # Debian older than bookworm and Ubuntu older than 22.10 do not provide the .pc file.
1281 libpam = cc.find_library('pam', required : want_pam == 'true')
1282 endif
1283 libpam_misc = dependency('pam_misc', required : false)
1284 if not libpam_misc.found()
1285 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
1286 endif
349cc4a5 1287 have = libpam.found() and libpam_misc.found()
5c23128d 1288else
349cc4a5 1289 have = false
37efbbd8
ZJS
1290 libpam = []
1291 libpam_misc = []
5c23128d 1292endif
349cc4a5 1293conf.set10('HAVE_PAM', have)
5c23128d
ZJS
1294
1295want_microhttpd = get_option('microhttpd')
87ac55a1 1296if want_microhttpd != 'false' and not skip_deps
37efbbd8
ZJS
1297 libmicrohttpd = dependency('libmicrohttpd',
1298 version : '>= 0.9.33',
1299 required : want_microhttpd == 'true')
349cc4a5 1300 have = libmicrohttpd.found()
5c23128d 1301else
349cc4a5 1302 have = false
37efbbd8 1303 libmicrohttpd = []
5c23128d 1304endif
349cc4a5 1305conf.set10('HAVE_MICROHTTPD', have)
5c23128d
ZJS
1306
1307want_libcryptsetup = get_option('libcryptsetup')
d1ae38d8
OK
1308want_libcryptsetup_plugins = get_option('libcryptsetup-plugins')
1309
1310if want_libcryptsetup_plugins == 'true' and want_libcryptsetup == 'false'
1311 error('libcryptsetup-plugins can not be requested without libcryptsetup')
1312endif
1313
87ac55a1 1314if want_libcryptsetup != 'false' and not skip_deps
37efbbd8 1315 libcryptsetup = dependency('libcryptsetup',
d1ae38d8
OK
1316 version : want_libcryptsetup_plugins == 'true' ? '>= 2.4.0' : '>= 2.0.1',
1317 required : want_libcryptsetup == 'true' or want_libcryptsetup_plugins == 'true')
349cc4a5 1318 have = libcryptsetup.found()
70a5db58 1319
aac80717
ZJS
1320 foreach ident : ['crypt_set_metadata_size',
1321 'crypt_activate_by_signed_key',
48a09a8f
DDM
1322 'crypt_token_max',
1323 'crypt_reencrypt_init_by_passphrase',
1324 'crypt_reencrypt',
1325 'crypt_set_data_offset']
aac80717
ZJS
1326 have_ident = have and cc.has_function(
1327 ident,
1328 prefix : '#include <libcryptsetup.h>',
1329 dependencies : libcryptsetup)
1330 conf.set10('HAVE_' + ident.to_upper(), have_ident)
1331 endforeach
5c23128d 1332else
349cc4a5 1333 have = false
37efbbd8 1334 libcryptsetup = []
5c23128d 1335endif
349cc4a5 1336conf.set10('HAVE_LIBCRYPTSETUP', have)
5c23128d 1337
d1ae38d8 1338if want_libcryptsetup_plugins != 'false' and not skip_deps
aac80717
ZJS
1339 have = (cc.has_function(
1340 'crypt_activate_by_token_pin',
1341 prefix : '#include <libcryptsetup.h>',
1342 dependencies : libcryptsetup) and
1343 cc.has_function(
1344 'crypt_token_external_path',
1345 prefix : '#include <libcryptsetup.h>',
1346 dependencies : libcryptsetup))
d1ae38d8
OK
1347else
1348 have = false
1349endif
1350conf.set10('HAVE_LIBCRYPTSETUP_PLUGINS', have)
1351
5c23128d 1352want_libcurl = get_option('libcurl')
87ac55a1 1353if want_libcurl != 'false' and not skip_deps
37efbbd8
ZJS
1354 libcurl = dependency('libcurl',
1355 version : '>= 7.32.0',
1356 required : want_libcurl == 'true')
349cc4a5 1357 have = libcurl.found()
5c23128d 1358else
349cc4a5 1359 have = false
37efbbd8 1360 libcurl = []
5c23128d 1361endif
349cc4a5 1362conf.set10('HAVE_LIBCURL', have)
47350c5f 1363conf.set10('CURL_NO_OLDIES', conf.get('BUILD_MODE_DEVELOPER') == 1)
5c23128d
ZJS
1364
1365want_libidn = get_option('libidn')
87057e24
ZJS
1366want_libidn2 = get_option('libidn2')
1367if want_libidn == 'true' and want_libidn2 == 'true'
1368 error('libidn and libidn2 cannot be requested simultaneously')
1369endif
1370
1b931399
YW
1371if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1372 libidn = dependency('libidn2',
1373 required : want_libidn2 == 'true')
349cc4a5 1374 have = libidn.found()
87057e24 1375else
349cc4a5 1376 have = false
87057e24
ZJS
1377 libidn = []
1378endif
1b931399
YW
1379conf.set10('HAVE_LIBIDN2', have)
1380if not have and want_libidn != 'false' and not skip_deps
7f7ab228 1381 # libidn is used for both libidn and libidn2 objects
1b931399
YW
1382 libidn = dependency('libidn',
1383 required : want_libidn == 'true')
349cc4a5
ZJS
1384 have = libidn.found()
1385else
1386 have = false
5c23128d 1387endif
1b931399 1388conf.set10('HAVE_LIBIDN', have)
5c23128d
ZJS
1389
1390want_libiptc = get_option('libiptc')
87ac55a1 1391if want_libiptc != 'false' and not skip_deps
37efbbd8
ZJS
1392 libiptc = dependency('libiptc',
1393 required : want_libiptc == 'true')
349cc4a5 1394 have = libiptc.found()
5c23128d 1395else
349cc4a5 1396 have = false
37efbbd8 1397 libiptc = []
5c23128d 1398endif
349cc4a5 1399conf.set10('HAVE_LIBIPTC', have)
5c23128d
ZJS
1400
1401want_qrencode = get_option('qrencode')
87ac55a1 1402if want_qrencode != 'false' and not skip_deps
37efbbd8 1403 libqrencode = dependency('libqrencode',
3f5225d7 1404 version : '>= 3',
37efbbd8 1405 required : want_qrencode == 'true')
349cc4a5 1406 have = libqrencode.found()
5c23128d 1407else
349cc4a5 1408 have = false
37efbbd8 1409 libqrencode = []
5c23128d 1410endif
349cc4a5 1411conf.set10('HAVE_QRENCODE', have)
5c23128d 1412
a44fb601 1413want_gcrypt = get_option('gcrypt')
87ac55a1 1414if want_gcrypt != 'false' and not skip_deps
d625f717
YW
1415 libgcrypt = dependency('libgcrypt', required : want_gcrypt == 'true')
1416 libgpg_error = dependency('gpg-error', required : false)
1417 if not libgpg_error.found()
1418 # CentOS 8 does not provide the .pc file.
1419 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1420 endif
349cc4a5 1421 have = libgcrypt.found() and libgpg_error.found()
a44fb601 1422else
349cc4a5
ZJS
1423 have = false
1424endif
1425if not have
1426 # link to neither of the libs if one is not found
a44fb601
ZJS
1427 libgcrypt = []
1428 libgpg_error = []
1429endif
349cc4a5 1430conf.set10('HAVE_GCRYPT', have)
a44fb601 1431
5c23128d 1432want_gnutls = get_option('gnutls')
87ac55a1 1433if want_gnutls != 'false' and not skip_deps
37efbbd8
ZJS
1434 libgnutls = dependency('gnutls',
1435 version : '>= 3.1.4',
1436 required : want_gnutls == 'true')
349cc4a5 1437 have = libgnutls.found()
5c23128d 1438else
349cc4a5 1439 have = false
37efbbd8 1440 libgnutls = []
5c23128d 1441endif
349cc4a5 1442conf.set10('HAVE_GNUTLS', have)
5c23128d 1443
096cbdce 1444want_openssl = get_option('openssl')
87ac55a1 1445if want_openssl != 'false' and not skip_deps
096cbdce
IT
1446 libopenssl = dependency('openssl',
1447 version : '>= 1.1.0',
1448 required : want_openssl == 'true')
1449 have = libopenssl.found()
1450else
1451 have = false
1452 libopenssl = []
1453endif
1454conf.set10('HAVE_OPENSSL', have)
1455
839fddbe
LP
1456want_p11kit = get_option('p11kit')
1457if want_p11kit != 'false' and not skip_deps
1458 libp11kit = dependency('p11-kit-1',
6164ec4c
ZJS
1459 version : '>= 0.23.3',
1460 required : want_p11kit == 'true')
839fddbe 1461 have = libp11kit.found()
da035a3a 1462 libp11kit_cflags = libp11kit.partial_dependency(includes: true, compile_args: true)
839fddbe
LP
1463else
1464 have = false
da035a3a 1465 libp11kit_cflags = []
839fddbe
LP
1466 libp11kit = []
1467endif
1468conf.set10('HAVE_P11KIT', have)
1469
af4fbd46
LP
1470want_libfido2 = get_option('libfido2')
1471if want_libfido2 != 'false' and not skip_deps
e0f435f9
YW
1472 if conf.get('HAVE_OPENSSL') == 1
1473 libfido2 = dependency('libfido2',
1474 required : want_libfido2 == 'true')
1475 have = libfido2.found()
1476 elif want_libfido2 == 'true'
1477 error('libfido2=true requires openssl')
1478 else
1479 have = false
1480 libfido2 = []
1481 endif
af4fbd46
LP
1482else
1483 have = false
1484 libfido2 = []
1485endif
1486conf.set10('HAVE_LIBFIDO2', have)
1487
5e521624
LP
1488want_tpm2 = get_option('tpm2')
1489if want_tpm2 != 'false' and not skip_deps
d7a57308 1490 tpm2 = dependency('tss2-esys tss2-rc tss2-mu tss2-tcti-device',
ba081955 1491 required : want_tpm2 == 'true')
5e521624 1492 have = tpm2.found()
155c5129 1493 have_esys3 = tpm2.version().version_compare('>= 3.0.0')
5e521624
LP
1494else
1495 have = false
155c5129 1496 have_esys3 = false
5e521624
LP
1497 tpm2 = []
1498endif
1499conf.set10('HAVE_TPM2', have)
155c5129 1500conf.set10('HAVE_TSS2_ESYS3', have_esys3)
5e521624 1501
5c23128d 1502want_elfutils = get_option('elfutils')
87ac55a1 1503if want_elfutils != 'false' and not skip_deps
37efbbd8
ZJS
1504 libdw = dependency('libdw',
1505 required : want_elfutils == 'true')
349cc4a5 1506 have = libdw.found()
d48c2721
LB
1507
1508 # New in elfutils 0.177
1509 conf.set10('HAVE_DWELF_ELF_E_MACHINE_STRING',
1510 have and cc.has_function('dwelf_elf_e_machine_string', dependencies : libdw))
5c23128d 1511else
349cc4a5 1512 have = false
37efbbd8 1513 libdw = []
5c23128d 1514endif
349cc4a5 1515conf.set10('HAVE_ELFUTILS', have)
5c23128d
ZJS
1516
1517want_zlib = get_option('zlib')
87ac55a1 1518if want_zlib != 'false' and not skip_deps
37efbbd8
ZJS
1519 libz = dependency('zlib',
1520 required : want_zlib == 'true')
349cc4a5 1521 have = libz.found()
5c23128d 1522else
349cc4a5 1523 have = false
37efbbd8 1524 libz = []
5c23128d 1525endif
349cc4a5 1526conf.set10('HAVE_ZLIB', have)
5c23128d
ZJS
1527
1528want_bzip2 = get_option('bzip2')
87ac55a1 1529if want_bzip2 != 'false' and not skip_deps
d625f717
YW
1530 libbzip2 = dependency('bzip2', required : false)
1531 if not libbzip2.found()
1532 # Debian and Ubuntu do not provide the .pc file.
1533 libbzip2 = cc.find_library('bz2', required : want_bzip2 == 'true')
1534 endif
349cc4a5 1535 have = libbzip2.found()
5c23128d 1536else
349cc4a5 1537 have = false
37efbbd8 1538 libbzip2 = []
5c23128d 1539endif
349cc4a5 1540conf.set10('HAVE_BZIP2', have)
5c23128d
ZJS
1541
1542want_xz = get_option('xz')
87ac55a1 1543if want_xz != 'false' and not skip_deps
37efbbd8
ZJS
1544 libxz = dependency('liblzma',
1545 required : want_xz == 'true')
d80b051c 1546 have_xz = libxz.found()
5c23128d 1547else
d80b051c 1548 have_xz = false
37efbbd8 1549 libxz = []
5c23128d 1550endif
d80b051c 1551conf.set10('HAVE_XZ', have_xz)
5c23128d
ZJS
1552
1553want_lz4 = get_option('lz4')
87ac55a1 1554if want_lz4 != 'false' and not skip_deps
37efbbd8 1555 liblz4 = dependency('liblz4',
e0a1d4b0 1556 version : '>= 1.3.0',
37efbbd8 1557 required : want_lz4 == 'true')
d80b051c 1558 have_lz4 = liblz4.found()
5c23128d 1559else
d80b051c 1560 have_lz4 = false
37efbbd8 1561 liblz4 = []
5c23128d 1562endif
d80b051c 1563conf.set10('HAVE_LZ4', have_lz4)
5c23128d 1564
ef5924aa
NL
1565want_zstd = get_option('zstd')
1566if want_zstd != 'false' and not skip_deps
1567 libzstd = dependency('libzstd',
1568 required : want_zstd == 'true',
1569 version : '>= 1.4.0')
d80b051c 1570 have_zstd = libzstd.found()
ef5924aa 1571else
d80b051c 1572 have_zstd = false
ef5924aa
NL
1573 libzstd = []
1574endif
d80b051c
LP
1575conf.set10('HAVE_ZSTD', have_zstd)
1576
1577conf.set10('HAVE_COMPRESSION', have_xz or have_lz4 or have_zstd)
ef5924aa 1578
cd3c6322
LB
1579compression = get_option('default-compression')
1580if compression == 'auto'
1581 if have_zstd
1582 compression = 'zstd'
1583 elif have_lz4
1584 compression = 'lz4'
1585 elif have_xz
1586 compression = 'xz'
1587 else
1588 compression = 'none'
1589 endif
1590elif compression == 'zstd' and not have_zstd
1591 error('default-compression=zstd requires zstd')
1592elif compression == 'lz4' and not have_lz4
1593 error('default-compression=lz4 requires lz4')
1594elif compression == 'xz' and not have_xz
1595 error('default-compression=xz requires xz')
1596endif
1788c6f3 1597conf.set('DEFAULT_COMPRESSION', 'COMPRESSION_@0@'.format(compression.to_upper()))
cd3c6322 1598
a44fb601 1599want_xkbcommon = get_option('xkbcommon')
87ac55a1 1600if want_xkbcommon != 'false' and not skip_deps
a44fb601
ZJS
1601 libxkbcommon = dependency('xkbcommon',
1602 version : '>= 0.3.0',
1603 required : want_xkbcommon == 'true')
349cc4a5 1604 have = libxkbcommon.found()
a44fb601 1605else
349cc4a5 1606 have = false
a44fb601
ZJS
1607 libxkbcommon = []
1608endif
349cc4a5 1609conf.set10('HAVE_XKBCOMMON', have)
a44fb601 1610
c4c978a0 1611want_pcre2 = get_option('pcre2')
8739f309 1612if want_pcre2 != 'false' and not skip_deps
c4c978a0
ZJS
1613 libpcre2 = dependency('libpcre2-8',
1614 required : want_pcre2 == 'true')
1615 have = libpcre2.found()
1616else
1617 have = false
1618 libpcre2 = []
1619endif
1620conf.set10('HAVE_PCRE2', have)
1621
69e96427 1622want_glib = get_option('glib')
87ac55a1 1623if want_glib != 'false' and not skip_deps
37efbbd8
ZJS
1624 libglib = dependency('glib-2.0',
1625 version : '>= 2.22.0',
1626 required : want_glib == 'true')
1627 libgobject = dependency('gobject-2.0',
1628 version : '>= 2.22.0',
1629 required : want_glib == 'true')
1630 libgio = dependency('gio-2.0',
1631 required : want_glib == 'true')
2c201c21 1632 have = libglib.found() and libgobject.found() and libgio.found()
69e96427 1633else
349cc4a5 1634 have = false
37efbbd8
ZJS
1635 libglib = []
1636 libgobject = []
1637 libgio = []
69e96427 1638endif
349cc4a5 1639conf.set10('HAVE_GLIB', have)
69e96427
ZJS
1640
1641want_dbus = get_option('dbus')
87ac55a1 1642if want_dbus != 'false' and not skip_deps
37efbbd8
ZJS
1643 libdbus = dependency('dbus-1',
1644 version : '>= 1.3.2',
1645 required : want_dbus == 'true')
349cc4a5 1646 have = libdbus.found()
69e96427 1647else
349cc4a5 1648 have = false
37efbbd8 1649 libdbus = []
69e96427 1650endif
349cc4a5 1651conf.set10('HAVE_DBUS', have)
69e96427 1652
1bd0cc45
YW
1653dbusdatadir = datadir / 'dbus-1'
1654if conf.get('HAVE_DBUS') == 1
1655 dbusdatadir = libdbus.get_variable(pkgconfig: 'datadir', default_value: datadir) / 'dbus-1'
1656endif
1657
1658dbuspolicydir = get_option('dbuspolicydir')
1659if dbuspolicydir == ''
1660 dbuspolicydir = dbusdatadir / 'system.d'
1661endif
1662
1663dbussessionservicedir = get_option('dbussessionservicedir')
1664if dbussessionservicedir == ''
1665 dbussessionservicedir = dbusdatadir / 'services'
1666 if conf.get('HAVE_DBUS') == 1
1667 dbussessionservicedir = libdbus.get_variable(pkgconfig: 'session_bus_services_dir', default_value: dbussessionservicedir)
1668 endif
1669endif
1670
1671dbussystemservicedir = get_option('dbussystemservicedir')
1672if dbussystemservicedir == ''
1673 dbussystemservicedir = dbusdatadir / 'system-services'
1674 if conf.get('HAVE_DBUS') == 1
1675 dbussystemservicedir = libdbus.get_variable(pkgconfig: 'system_bus_services_dir', default_value: dbussystemservicedir)
1676 endif
1677endif
1678
1679dbus_interfaces_dir = get_option('dbus-interfaces-dir')
1680if dbus_interfaces_dir == '' or dbus_interfaces_dir == 'yes'
1681 if meson.is_cross_build() and dbus_interfaces_dir != 'yes'
1682 dbus_interfaces_dir = 'no'
1683 warning('Exporting D-Bus interface XML files is disabled during cross build. Pass path or "yes" to force enable.')
1684 else
1685 dbus_interfaces_dir = dbusdatadir / 'interfaces'
1686 if conf.get('HAVE_DBUS') == 1
1687 dbus_interfaces_dir = libdbus.get_variable(pkgconfig: 'interfaces_dir', default_value: dbus_interfaces_dir)
1688 endif
1689 endif
1690endif
1bd0cc45 1691
e37ad765
ZJS
1692# We support one or the other. If gcrypt is available, we assume it's there to
1693# be used, and use it in preference.
1694opt = get_option('cryptolib')
1695if opt == 'openssl' and conf.get('HAVE_OPENSSL') == 0
1696 error('openssl requested as the default cryptolib, but not available')
1697endif
1698conf.set10('PREFER_OPENSSL',
1699 opt == 'openssl' or (opt == 'auto' and conf.get('HAVE_OPENSSL') == 1 and conf.get('HAVE_GCRYPT') == 0))
1700conf.set10('HAVE_OPENSSL_OR_GCRYPT',
1701 conf.get('HAVE_OPENSSL') == 1 or conf.get('HAVE_GCRYPT') == 1)
9bcf483b 1702lib_openssl_or_gcrypt = conf.get('PREFER_OPENSSL') == 1 ? [libopenssl] : [libgcrypt, libgpg_error]
42303dcb 1703
56ddbf10
YW
1704dns_over_tls = get_option('dns-over-tls')
1705if dns_over_tls != 'false'
e37ad765
ZJS
1706 if dns_over_tls == 'gnutls' and conf.get('PREFER_OPENSSL') == 1
1707 error('Sorry, -Ddns-over-tls=gnutls is not supported when openssl is used as the cryptolib')
1708 endif
1709
1f9aa3d2
LB
1710 if dns_over_tls == 'gnutls'
1711 have_openssl = false
096cbdce 1712 else
1f9aa3d2
LB
1713 have_openssl = conf.get('HAVE_OPENSSL') == 1
1714 if dns_over_tls == 'openssl' and not have_openssl
1715 error('DNS-over-TLS support was requested with openssl, but dependencies are not available')
096cbdce 1716 endif
56ddbf10 1717 endif
1f9aa3d2
LB
1718 if dns_over_tls == 'openssl' or have_openssl
1719 have_gnutls = false
096cbdce 1720 else
1f9aa3d2
LB
1721 have_gnutls = conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0')
1722 if dns_over_tls != 'auto' and not have_gnutls
1723 str = dns_over_tls == 'gnutls' ? ' with gnutls' : ''
b349bc59 1724 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
096cbdce
IT
1725 endif
1726 endif
1727 have = have_gnutls or have_openssl
56ddbf10 1728else
be5536a6
MO
1729 have = false
1730 have_gnutls = false
1731 have_openssl = false
56ddbf10
YW
1732endif
1733conf.set10('ENABLE_DNS_OVER_TLS', have)
096cbdce
IT
1734conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1735conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
56ddbf10 1736
c9299be2 1737default_dns_over_tls = get_option('default-dns-over-tls')
87ac55a1 1738if skip_deps
c9299be2 1739 default_dns_over_tls = 'no'
5d67a7ae 1740endif
56ddbf10 1741if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
4310bfc2 1742 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 1743 default_dns_over_tls = 'no'
5d67a7ae 1744endif
c9299be2
IT
1745conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1746 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
411d1f4c 1747conf.set_quoted('DEFAULT_DNS_OVER_TLS_MODE_STR', default_dns_over_tls)
5d67a7ae 1748
3614df05
ZJS
1749default_mdns = get_option('default-mdns')
1750conf.set('DEFAULT_MDNS_MODE',
1751 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
411d1f4c 1752conf.set_quoted('DEFAULT_MDNS_MODE_STR', default_mdns)
3614df05
ZJS
1753
1754default_llmnr = get_option('default-llmnr')
1755conf.set('DEFAULT_LLMNR_MODE',
1756 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
411d1f4c 1757conf.set_quoted('DEFAULT_LLMNR_MODE_STR', default_llmnr)
3614df05 1758
e594a3b1
LP
1759want_repart = get_option('repart')
1760if want_repart != 'false'
6b12086e 1761 have = conf.get('HAVE_LIBFDISK') == 1
e594a3b1
LP
1762 if want_repart == 'true' and not have
1763 error('repart support was requested, but dependencies are not available')
1764 endif
1765else
1766 have = false
1767endif
1768conf.set10('ENABLE_REPART', have)
1769
7e8facb3
ZJS
1770default_dnssec = get_option('default-dnssec')
1771if skip_deps
1772 default_dnssec = 'no'
1773endif
1774if default_dnssec != 'no' and conf.get('HAVE_OPENSSL_OR_GCRYPT') == 0
1775 message('default-dnssec cannot be set to yes or allow-downgrade openssl and gcrypt are disabled. Setting default-dnssec to no.')
1776 default_dnssec = 'no'
1777endif
1778conf.set('DEFAULT_DNSSEC_MODE',
1779 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1780conf.set_quoted('DEFAULT_DNSSEC_MODE_STR', default_dnssec)
1781
43cc7a3e
LP
1782want_sysupdate = get_option('sysupdate')
1783if want_sysupdate != 'false'
1784 have = (conf.get('HAVE_OPENSSL') == 1 and
1785 conf.get('HAVE_LIBFDISK') == 1)
1786 if want_sysupdate == 'true' and not have
1787 error('sysupdate support was requested, but dependencies are not available')
1788 endif
1789else
1790 have = false
1791endif
1792conf.set10('ENABLE_SYSUPDATE', have)
1793
5c23128d 1794want_importd = get_option('importd')
4390be30 1795if want_importd != 'false'
349cc4a5 1796 have = (conf.get('HAVE_LIBCURL') == 1 and
6214d42b 1797 conf.get('HAVE_OPENSSL_OR_GCRYPT') == 1 and
349cc4a5 1798 conf.get('HAVE_ZLIB') == 1 and
6214d42b 1799 conf.get('HAVE_XZ') == 1)
349cc4a5 1800 if want_importd == 'true' and not have
37efbbd8
ZJS
1801 error('importd support was requested, but dependencies are not available')
1802 endif
349cc4a5
ZJS
1803else
1804 have = false
5c23128d 1805endif
349cc4a5 1806conf.set10('ENABLE_IMPORTD', have)
5c23128d 1807
70a5db58
LP
1808want_homed = get_option('homed')
1809if want_homed != 'false'
1810 have = (conf.get('HAVE_OPENSSL') == 1 and
1811 conf.get('HAVE_LIBFDISK') == 1 and
1812 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1813 if want_homed == 'true' and not have
1814 error('homed support was requested, but dependencies are not available')
1815 endif
1816else
1817 have = false
1818endif
1819conf.set10('ENABLE_HOMED', have)
1820
af06ddf5
YW
1821have = have and conf.get('HAVE_PAM') == 1
1822conf.set10('ENABLE_PAM_HOME', have)
1823
5c23128d 1824want_remote = get_option('remote')
4390be30 1825if want_remote != 'false'
349cc4a5
ZJS
1826 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1827 conf.get('HAVE_LIBCURL') == 1]
37efbbd8
ZJS
1828 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1829 # it's possible to build one without the other. Complain only if
5238e957 1830 # support was explicitly requested. The auxiliary files like sysusers
37efbbd8
ZJS
1831 # config should be installed when any of the programs are built.
1832 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1833 error('remote support was requested, but dependencies are not available')
1834 endif
349cc4a5
ZJS
1835 have = have_deps[0] or have_deps[1]
1836else
1837 have = false
5c23128d 1838endif
349cc4a5 1839conf.set10('ENABLE_REMOTE', have)
5c23128d 1840
b3259a6e
ZJS
1841foreach term : ['analyze',
1842 'backlight',
a9149d87 1843 'binfmt',
dfca5587 1844 'compat-mutable-uid-boundaries',
a9149d87 1845 'coredump',
b3259a6e
ZJS
1846 'efi',
1847 'environment-d',
1848 'firstboot',
1849 'gshadow',
1850 'hibernate',
a9149d87 1851 'hostnamed',
b3259a6e
ZJS
1852 'hwdb',
1853 'idn',
1854 'ima',
1855 'initrd',
1782534b 1856 'kernel-install',
b3259a6e 1857 'ldconfig',
a9149d87 1858 'localed',
b3259a6e 1859 'logind',
a9149d87
ZJS
1860 'machined',
1861 'networkd',
dfca5587 1862 'nscd',
b3259a6e
ZJS
1863 'nss-myhostname',
1864 'nss-systemd',
1782534b 1865 'oomd',
b3259a6e
ZJS
1866 'portabled',
1867 'pstore',
a9149d87 1868 'quotacheck',
b3259a6e
ZJS
1869 'randomseed',
1870 'resolve',
1871 'rfkill',
1872 'smack',
dfca5587 1873 'sysext',
a9149d87 1874 'sysusers',
b3259a6e
ZJS
1875 'timedated',
1876 'timesyncd',
a9149d87 1877 'tmpfiles',
a9149d87 1878 'tpm',
b3259a6e
ZJS
1879 'userdb',
1880 'utmp',
1881 'vconsole',
1882 'xdg-autostart']
a9149d87
ZJS
1883 have = get_option(term)
1884 name = 'ENABLE_' + term.underscorify().to_upper()
1885 conf.set10(name, have)
5c23128d
ZJS
1886endforeach
1887
bd7e6aa7
ZJS
1888enable_sysusers = conf.get('ENABLE_SYSUSERS') == 1
1889
08540a95
YW
1890foreach tuple : [['nss-mymachines', 'machined'],
1891 ['nss-resolve', 'resolve']]
1892 want = get_option(tuple[0])
1893 if want != 'false'
1894 have = get_option(tuple[1])
1895 if want == 'true' and not have
1896 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1897 endif
1898 else
1899 have = false
1900 endif
1901 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1902 conf.set10(name, have)
1903endforeach
1904
1905enable_nss = false
1906foreach term : ['ENABLE_NSS_MYHOSTNAME',
1907 'ENABLE_NSS_MYMACHINES',
1908 'ENABLE_NSS_RESOLVE',
1909 'ENABLE_NSS_SYSTEMD']
1910 if conf.get(term) == 1
1911 enable_nss = true
1912 endif
1913endforeach
1914conf.set10('ENABLE_NSS', enable_nss)
1915
348b4437 1916conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
6129ec85 1917
b68dfb9e 1918conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
00d82c81 1919
db7f5ab6
JJ
1920############################################################
1921
9c45bfb2
FS
1922pymod = import('python')
1923python = pymod.find_installation('python3', required : true, modules : ['jinja2'])
1924python_39 = python.language_version().version_compare('>=3.9')
1925
4d3ef2d1
LP
1926############################################################
1927
1928if conf.get('BPF_FRAMEWORK') == 1
1929 bpf_clang_flags = [
1930 '-std=gnu11',
1931 '-Wno-compare-distinct-pointer-types',
1932 '-fno-stack-protector',
1933 '-O2',
1934 '-target',
1935 'bpf',
1936 '-g',
1937 '-c',
1938 ]
1939
1940 bpf_gcc_flags = [
1941 '-std=gnu11',
1942 '-fno-stack-protector',
1943 '-O2',
1944 '-mkernel=5.2',
1945 '-mcpu=v3',
1946 '-mco-re',
1947 '-gbtf',
1948 '-c',
1949 ]
1950
1951 # Generate defines that are appropriate to tell the compiler what architecture
1952 # we're compiling for. By default we just map meson's cpu_family to __<cpu_family>__.
1953 # This dictionary contains the exceptions where this doesn't work.
1954 #
1955 # C.f. https://mesonbuild.com/Reference-tables.html#cpu-families
1956 # and src/basic/missing_syscall_def.h.
1957 cpu_arch_defines = {
1958 'ppc' : ['-D__powerpc__'],
1959 'ppc64' : ['-D__powerpc64__', '-D_CALL_ELF=2'],
1960 'riscv32' : ['-D__riscv', '-D__riscv_xlen=32'],
1961 'riscv64' : ['-D__riscv', '-D__riscv_xlen=64'],
1962 'x86' : ['-D__i386__'],
1963
1964 # For arm, assume hardware fp is available.
1965 'arm' : ['-D__arm__', '-D__ARM_PCS_VFP'],
1966 }
1967
1968 bpf_arch_flags = cpu_arch_defines.get(host_machine.cpu_family(),
1969 ['-D__@0@__'.format(host_machine.cpu_family())])
1970 if bpf_compiler == 'gcc'
1971 bpf_arch_flags += ['-m' + host_machine.endian() + '-endian']
1972 endif
1973
1974 libbpf_include_dir = libbpf.get_variable(pkgconfig : 'includedir')
1975
1976 bpf_o_unstripped_cmd = []
1977 if bpf_compiler == 'clang'
1978 bpf_o_unstripped_cmd += [
1979 clang,
1980 bpf_clang_flags,
1981 bpf_arch_flags,
1982 ]
1983 elif bpf_compiler == 'gcc'
1984 bpf_o_unstripped_cmd += [
1985 bpf_gcc,
1986 bpf_gcc_flags,
1987 bpf_arch_flags,
1988 ]
1989 endif
1990
1991 bpf_o_unstripped_cmd += ['-I.']
1992
1993 if not meson.is_cross_build() and bpf_compiler == 'clang'
1994 target_triplet_cmd = run_command('gcc', '-dumpmachine', check: false)
1995 if target_triplet_cmd.returncode() == 0
1996 target_triplet = target_triplet_cmd.stdout().strip()
1997 bpf_o_unstripped_cmd += [
1998 '-isystem',
1999 '/usr/include/@0@'.format(target_triplet)
2000 ]
2001 endif
2002 endif
2003
2004 bpf_o_unstripped_cmd += [
2005 '-idirafter',
2006 libbpf_include_dir,
2007 '@INPUT@',
2008 '-o',
2009 '@OUTPUT@'
2010 ]
2011
2012 if bpftool_strip
2013 bpf_o_cmd = [
2014 bpftool,
2015 'gen',
2016 'object',
2017 '@OUTPUT@',
2018 '@INPUT@'
2019 ]
2020 elif bpf_compiler == 'clang'
2021 bpf_o_cmd = [
2022 llvm_strip,
2023 '-g',
2024 '@INPUT@',
2025 '-o',
2026 '@OUTPUT@'
2027 ]
2028 endif
2029
2030 skel_h_cmd = [
2031 bpftool,
2032 'gen',
2033 'skeleton',
2034 '@INPUT@'
2035 ]
2036endif
2037
dfca5587
JJ
2038#####################################################################
2039
2040efi_arch = {
31ffb6b1
JJ
2041 'aarch64' : 'aa64',
2042 'arm' : 'arm',
2043 'loongarch32' : 'loongarch32',
2044 'loongarch64' : 'loongarch64',
2045 'riscv32' : 'riscv32',
2046 'riscv64' : 'riscv64',
2047 'x86_64' : 'x64',
2048 'x86' : 'ia32',
dfca5587
JJ
2049}.get(host_machine.cpu_family(), '')
2050
2051if get_option('bootloader') != 'false' and efi_arch != ''
2052 conf.set_quoted('EFI_MACHINE_TYPE_NAME', efi_arch)
4729e84e
LB
2053elif get_option('bootloader') == 'false' and efi_arch != ''
2054 # Ensure that if the option is explicitly set to false, then no EFI code is built, including tests
2055 efi_arch = ''
dfca5587
JJ
2056elif get_option('bootloader') == 'true' and efi_arch == ''
2057 error('EFI not supported for this arch.')
2058endif
2afeaf16
JJ
2059
2060efi_arch_alt = ''
7ea44f17 2061efi_cpu_family_alt = ''
2afeaf16
JJ
2062if efi_arch == 'x64' and cc.links('''
2063 #include <limits.h>
2064 int main(int argc, char *argv[]) {
2065 return __builtin_popcount(argc - CHAR_MAX);
2066 }''', args : ['-m32', '-march=i686'], name : '32bit build possible')
2067 efi_arch_alt = 'ia32'
7ea44f17 2068 efi_cpu_family_alt = 'x86'
2afeaf16
JJ
2069endif
2070
2071have_pyelftools = pymod.find_installation('python3', required : false, modules : ['elftools']).found()
09444a2e
DDM
2072if get_option('bootloader') == 'true' and not have_pyelftools
2073 error('EFI bootloader support requires pyelftools.')
2afeaf16
JJ
2074endif
2075
dfca5587
JJ
2076conf.set10(
2077 'ENABLE_BOOTLOADER',
2078 get_option('efi') and
2079 get_option('bootloader') in ['auto', 'true'] and
2afeaf16 2080 efi_arch != '' and
2afeaf16 2081 have_pyelftools,
dfca5587
JJ
2082)
2083
9c45bfb2 2084if get_option('ukify') == 'auto'
dfca5587
JJ
2085 want_ukify = python_39 and conf.get('ENABLE_BOOTLOADER') == 1
2086elif get_option('ukify') == 'true' and (not python_39 or conf.get('ENABLE_BOOTLOADER') != 1)
2087 error('ukify requires Python >= 3.9 and -Dbootloader=true')
9c45bfb2
FS
2088else
2089 want_ukify = get_option('ukify') == 'true'
2090endif
2091conf.set10('ENABLE_UKIFY', want_ukify)
2092
2093############################################################
b0bd2ae8 2094
2afeaf16
JJ
2095elf2efi_lds = project_source_root / 'tools/elf2efi.lds'
2096elf2efi_py = find_program('tools/elf2efi.py')
2097export_dbus_interfaces_py = find_program('tools/dbus_exporter.py')
d3821a33 2098generate_gperfs = find_program('tools/generate-gperfs.py')
f6fe732f
YW
2099make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
2100make_directive_index_py = find_program('tools/make-directive-index.py')
2101make_man_index_py = find_program('tools/make-man-index.py')
6b1aac3c 2102meson_render_jinja2 = find_program('tools/meson-render-jinja2.py')
d3821a33 2103update_dbus_docs_py = find_program('tools/update-dbus-docs.py')
d3821a33 2104update_hwdb_autosuspend_sh = find_program('tools/update-hwdb-autosuspend.sh')
2afeaf16
JJ
2105update_hwdb_sh = find_program('tools/update-hwdb.sh')
2106update_man_rules_py = find_program('tools/update-man-rules.py')
d3821a33
ZJS
2107update_syscall_tables_sh = find_program('tools/update-syscall-tables.sh')
2108xml_helper_py = find_program('tools/xml_helper.py')
f6fe732f 2109
db7f5ab6 2110############################################################
5c23128d 2111
e95acdfe
YW
2112version_tag = get_option('version-tag')
2113if version_tag == ''
2114 # Check that we have either .git/ (a normal clone) or a .git file (a work-tree) and that we don't
2115 # get confused if a tarball is extracted in a higher-level git repository.
2116 if git.found() and fs.exists(project_source_root / '.git')
2117 # Apparently git describe has a bug where it always considers the work-tree dirty when
2118 # invoked with --git-dir (even though 'git status' is happy). Work around this issue by
2119 # cd-ing to the source directory.
2120 version_tag = run_command(
2121 sh, '-c',
2122 'cd "$MESON_SOURCE_ROOT"; git describe --abbrev=7 --dirty=^ 2>/dev/null | sed "s/^v//; s/-rc/~rc/"',
2123 check : true,
2124 ).stdout().strip()
2125 else
2126 version_tag = meson.project_version()
2127 endif
2128endif
2129
2130vcs_data = configuration_data()
2131vcs_data.set('VCS_TAG', version_tag)
2132version_h = configure_file(configuration : vcs_data,
2133 input : 'src/version/version.h.in',
2134 output : 'version.h')
2135
2136versiondep = declare_dependency(
2137 sources : version_h,
2138 include_directories : include_directories('.'),
2139)
2140
2141shared_lib_tag = get_option('shared-lib-tag')
2142if shared_lib_tag == ''
2143 shared_lib_tag = meson.project_version()
2144endif
2145
2146############################################################
2147
7e43be7d 2148if get_option('b_coverage')
92148283 2149 userspace_c_args += ['-include', 'src/basic/coverage.h']
7e43be7d
FS
2150endif
2151
2152############################################################
2153
5c23128d 2154config_h = configure_file(
37efbbd8
ZJS
2155 output : 'config.h',
2156 configuration : conf)
5c23128d 2157
92148283 2158userspace_c_args += ['-include', 'config.h']
f6fe732f 2159
8f04a1ca
ZJS
2160jinja2_cmdline = [meson_render_jinja2, config_h, version_h]
2161
92148283
JJ
2162userspace = declare_dependency(
2163 compile_args : userspace_c_args,
2164 link_args : userspace_c_ld_args,
40c7d3c7 2165 dependencies : versiondep,
92148283
JJ
2166)
2167
c18dde32
ZJS
2168man_page_depends = []
2169
f6fe732f 2170############################################################
348b4437 2171
1d21a7bd
YW
2172tests = []
2173simple_tests = []
2174fuzzers = []
2175simple_fuzzers = []
2176catalogs = []
2177
b61016f2
YW
2178# binaries that have --help and are intended for use by humans,
2179# usually, but not always, installed in /bin.
2180public_programs = []
2181
e3c68924 2182# D-Bus introspection XML export
2183dbus_programs = []
e3c68924 2184
3f80c139
ZJS
2185# A list of boot stubs. Required for testing of ukify.
2186boot_stubs = []
2187
8d40961c
YW
2188basic_includes = include_directories(
2189 'src/basic',
e5bc5f1f 2190 'src/fundamental',
8d40961c
YW
2191 'src/systemd',
2192 '.')
2193
2194libsystemd_includes = [basic_includes, include_directories(
2195 'src/libsystemd/sd-bus',
2196 'src/libsystemd/sd-device',
2197 'src/libsystemd/sd-event',
2198 'src/libsystemd/sd-hwdb',
2199 'src/libsystemd/sd-id128',
2200 'src/libsystemd/sd-journal',
2201 'src/libsystemd/sd-netlink',
2202 'src/libsystemd/sd-network',
2203 'src/libsystemd/sd-resolve')]
2204
2205includes = [libsystemd_includes, include_directories('src/shared')]
5c23128d 2206
5c23128d
ZJS
2207subdir('po')
2208subdir('catalog')
dfca5587 2209subdir('src/fundamental')
5c23128d
ZJS
2210subdir('src/basic')
2211subdir('src/libsystemd')
3976f372
YW
2212subdir('src/shared')
2213subdir('src/udev')
2214subdir('src/libudev')
d1ae38d8 2215subdir('src/cryptsetup/cryptsetup-tokens')
5c23128d 2216
5c23128d 2217libsystemd = shared_library(
37efbbd8 2218 'systemd',
56d50ab1 2219 version : libsystemd_version,
8d40961c 2220 include_directories : libsystemd_includes,
37efbbd8
ZJS
2221 link_args : ['-shared',
2222 '-Wl,--version-script=' + libsystemd_sym_path],
34e221a5 2223 link_with : [libbasic,
acc50c92
LP
2224 libbasic_gcrypt,
2225 libbasic_compress],
99b9f8fd 2226 link_whole : [libsystemd_static],
92148283
JJ
2227 dependencies : [librt,
2228 threads,
2229 userspace],
37efbbd8
ZJS
2230 link_depends : libsystemd_sym,
2231 install : true,
0a5e638c 2232 install_tag: 'libsystemd',
b0d3095f 2233 install_dir : libdir)
5c23128d 2234
039f1673
LB
2235alias_target('libsystemd', libsystemd)
2236
70848ecf
DC
2237install_libsystemd_static = static_library(
2238 'systemd',
2239 libsystemd_sources,
975464e0
ZJS
2240 basic_sources,
2241 basic_gcrypt_sources,
acc50c92 2242 basic_compress_sources,
e5bc5f1f 2243 fundamental_sources,
8d40961c 2244 include_directories : libsystemd_includes,
70848ecf
DC
2245 build_by_default : static_libsystemd != 'false',
2246 install : static_libsystemd != 'false',
0a5e638c 2247 install_tag: 'libsystemd',
b0d3095f 2248 install_dir : libdir,
40dbce36 2249 pic : static_libsystemd_pic,
92148283 2250 dependencies : [libblkid,
975464e0 2251 libcap,
92148283 2252 libdl,
011d129c 2253 libgcrypt,
92148283
JJ
2254 liblz4,
2255 libmount,
c47511da 2256 libopenssl,
92148283
JJ
2257 librt,
2258 libxz,
2259 libzstd,
2260 threads,
40c7d3c7 2261 userspace],
70848ecf
DC
2262 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
2263
3976f372
YW
2264libudev = shared_library(
2265 'udev',
3976f372
YW
2266 version : libudev_version,
2267 include_directories : includes,
2268 link_args : ['-shared',
2269 '-Wl,--version-script=' + libudev_sym_path],
2270 link_with : [libsystemd_static, libshared_static],
2271 link_whole : libudev_basic,
92148283
JJ
2272 dependencies : [threads,
2273 userspace],
3976f372
YW
2274 link_depends : libudev_sym,
2275 install : true,
0a5e638c 2276 install_tag: 'libudev',
b0d3095f 2277 install_dir : libdir)
3976f372 2278
039f1673
LB
2279alias_target('libudev', libudev)
2280
3976f372
YW
2281install_libudev_static = static_library(
2282 'udev',
2283 basic_sources,
e5bc5f1f 2284 fundamental_sources,
3976f372
YW
2285 shared_sources,
2286 libsystemd_sources,
2287 libudev_sources,
3976f372
YW
2288 include_directories : includes,
2289 build_by_default : static_libudev != 'false',
2290 install : static_libudev != 'false',
0a5e638c 2291 install_tag: 'libudev',
b0d3095f 2292 install_dir : libdir,
3976f372 2293 link_depends : libudev_sym,
92148283
JJ
2294 dependencies : [libmount,
2295 libshared_deps,
40c7d3c7 2296 userspace],
3976f372
YW
2297 c_args : static_libudev_pic ? [] : ['-fno-PIC'],
2298 pic : static_libudev_pic)
2299
d1ae38d8
OK
2300if conf.get('HAVE_LIBCRYPTSETUP_PLUGINS') == 1
2301 if conf.get('HAVE_TPM2') == 1
6249face 2302 shared_library(
d1ae38d8 2303 'cryptsetup-token-systemd-tpm2',
c01543fd
ZJS
2304 cryptsetup_token_systemd_tpm2_sources,
2305 include_directories : includes,
d1ae38d8
OK
2306 link_args : ['-shared',
2307 '-Wl,--version-script=' + cryptsetup_token_sym_path],
c01543fd
ZJS
2308 link_with : [lib_cryptsetup_token_common,
2309 libshared],
2310 dependencies : [libcryptsetup,
2311 tpm2,
40c7d3c7 2312 userspace],
d1ae38d8 2313 link_depends : cryptsetup_token_sym,
b0d3095f 2314 install_rpath : pkglibdir,
d1ae38d8
OK
2315 install : true,
2316 install_dir : libcryptsetup_plugins_dir)
2317 endif
351716e1
OK
2318
2319 if conf.get('HAVE_LIBFIDO2') == 1
6249face 2320 shared_library(
351716e1 2321 'cryptsetup-token-systemd-fido2',
c01543fd
ZJS
2322 cryptsetup_token_systemd_fido2_sources,
2323 include_directories : includes,
351716e1
OK
2324 link_args : ['-shared',
2325 '-Wl,--version-script=' + cryptsetup_token_sym_path],
c01543fd
ZJS
2326 link_with : [lib_cryptsetup_token_common,
2327 libshared],
2328 dependencies : [libcryptsetup,
2329 libfido2,
40c7d3c7 2330 userspace],
351716e1 2331 link_depends : cryptsetup_token_sym,
b0d3095f 2332 install_rpath : pkglibdir,
351716e1
OK
2333 install : true,
2334 install_dir : libcryptsetup_plugins_dir)
2335 endif
8186022c
OK
2336
2337 if conf.get('HAVE_P11KIT') == 1
6249face 2338 shared_library(
8186022c 2339 'cryptsetup-token-systemd-pkcs11',
c01543fd
ZJS
2340 cryptsetup_token_systemd_pkcs11_sources,
2341 include_directories : includes,
8186022c
OK
2342 link_args : ['-shared',
2343 '-Wl,--version-script=' + cryptsetup_token_sym_path],
c01543fd
ZJS
2344 link_with : [lib_cryptsetup_token_common,
2345 libshared],
2346 dependencies : [libcryptsetup,
2347 libp11kit,
40c7d3c7 2348 userspace],
8186022c 2349 link_depends : cryptsetup_token_sym,
b0d3095f 2350 install_rpath : pkglibdir,
8186022c
OK
2351 install : true,
2352 install_dir : libcryptsetup_plugins_dir)
2353 endif
d1ae38d8
OK
2354endif
2355
47354b44
ZJS
2356############################################################
2357
b61016f2 2358# systemd-analyze requires 'libcore'
83b6af36 2359subdir('src/core')
b61016f2
YW
2360# systemd-journal-remote requires 'libjournal_core'
2361subdir('src/journal')
2362# systemd-networkd requires 'libsystemd_network'
2363subdir('src/libsystemd-network')
83b6af36
ZJS
2364
2365subdir('src/analyze')
cd4300f3 2366subdir('src/boot')
dfca5587 2367subdir('src/boot/efi')
f98df767 2368subdir('src/busctl')
b61016f2 2369subdir('src/coredump')
2ad279cf 2370subdir('src/cryptenroll')
b4d1892a 2371subdir('src/cryptsetup')
b61016f2 2372subdir('src/home')
83b6af36
ZJS
2373subdir('src/hostname')
2374subdir('src/import')
b61016f2 2375subdir('src/journal-remote')
83b6af36
ZJS
2376subdir('src/kernel-install')
2377subdir('src/locale')
b61016f2 2378subdir('src/login')
83b6af36 2379subdir('src/machine')
b61016f2 2380subdir('src/network')
83b6af36 2381subdir('src/nspawn')
b61016f2
YW
2382subdir('src/oom')
2383subdir('src/partition')
2384subdir('src/portable')
2385subdir('src/pstore')
83b6af36 2386subdir('src/resolve')
2a9b4bbe 2387subdir('src/rpm')
b61016f2 2388subdir('src/shutdown')
9bca4ae4 2389subdir('src/sysext')
c3512573 2390subdir('src/systemctl')
43cc7a3e 2391subdir('src/sysupdate')
83b6af36
ZJS
2392subdir('src/timedate')
2393subdir('src/timesync')
db64ba81 2394subdir('src/tmpfiles')
b61016f2 2395subdir('src/userdb')
0275e918 2396subdir('src/xdg-autostart-generator')
83b6af36 2397
3976f372
YW
2398subdir('src/systemd')
2399
83b6af36 2400subdir('src/test')
7db7d5b7 2401subdir('src/fuzz')
ef2ad30a 2402subdir('rules.d')
83b6af36 2403subdir('test')
a1d6dbb1 2404subdir('src/ukify/test') # needs to be last for test_env variable
83b6af36 2405
d30d9bf0
LB
2406alias_target('devel', libsystemd_pc, libudev_pc, systemd_pc, udev_pc)
2407
83b6af36
ZJS
2408############################################################
2409
2410# only static linking apart from libdl, to make sure that the
2411# module is linked to all libraries that it uses.
2412test_dlopen = executable(
37efbbd8
ZJS
2413 'test-dlopen',
2414 test_dlopen_c,
2415 include_directories : includes,
2416 link_with : [libbasic],
92148283
JJ
2417 dependencies : [libdl,
2418 userspace],
fd1939fb 2419 build_by_default : want_tests != 'false')
83b6af36 2420
08540a95 2421foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
cbaaf7b9 2422 ['systemd', 'ENABLE_NSS_SYSTEMD', ['nss-systemd.h', 'userdb-glue.c', 'userdb-glue.h']],
08540a95 2423 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
8d40961c 2424 ['resolve', 'ENABLE_NSS_RESOLVE', [], resolve_includes]]
5c23128d 2425
349cc4a5 2426 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
37efbbd8
ZJS
2427 if condition
2428 module = tuple[0]
37efbbd8
ZJS
2429
2430 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
fce9abb2 2431 version_script_arg = project_source_root / sym
37efbbd8 2432
1684c56f
LP
2433 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
2434 if tuple.length() > 2
cbaaf7b9
YW
2435 foreach s : tuple[2]
2436 sources += ['src/nss-@0@/@1@'.format(module, s)]
2437 endforeach
1684c56f
LP
2438 endif
2439
8d40961c
YW
2440 incs = tuple.length() > 3 ? tuple[3] : includes
2441
37efbbd8
ZJS
2442 nss = shared_library(
2443 'nss_' + module,
1684c56f 2444 sources,
37efbbd8 2445 version : '2',
8d40961c 2446 include_directories : incs,
b4b36f44
LP
2447 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
2448 link_args : ['-Wl,-z,nodelete',
2449 '-shared',
700805f6 2450 '-Wl,--version-script=' + version_script_arg],
37e4d7a8 2451 link_with : [libsystemd_static,
733cbd00 2452 libshared_static,
37efbbd8 2453 libbasic],
92148283
JJ
2454 dependencies : [librt,
2455 threads,
2456 userspace],
37efbbd8
ZJS
2457 link_depends : sym,
2458 install : true,
35d17e15 2459 install_tag : 'nss',
b0d3095f 2460 install_dir : libdir)
37efbbd8
ZJS
2461
2462 # We cannot use shared_module because it does not support version suffix.
2463 # Unfortunately shared_library insists on creating the symlink…
7c22f07c 2464 meson.add_install_script('sh', '-c',
37efbbd8 2465 'rm $DESTDIR@0@/libnss_@1@.so'
b0d3095f 2466 .format(libdir, module),
35d17e15
MG
2467 install_tag : 'nss'
2468 )
37efbbd8 2469
938be089
ZJS
2470 if want_tests != 'false'
2471 test('dlopen-nss_' + module,
2472 test_dlopen,
2473 # path to dlopen must include a slash
e93ada98
DDM
2474 args : nss.full_path(),
2475 depends : nss)
938be089 2476 endif
37efbbd8 2477 endif
5c23128d
ZJS
2478endforeach
2479
2480############################################################
2481
3761002e 2482exe = executable(
6164ec4c
ZJS
2483 'systemd',
2484 systemd_sources,
2485 include_directories : includes,
2486 link_with : [libcore,
2487 libshared],
c47511da 2488 dependencies : [libseccomp,
40c7d3c7 2489 userspace],
b0d3095f 2490 install_rpath : pkglibdir,
6164ec4c 2491 install : true,
b0d3095f 2492 install_dir : libexecdir)
3761002e
ZJS
2493dbus_programs += exe
2494public_programs += exe
5c23128d 2495
ba7f4ae6 2496meson.add_install_script(meson_make_symlink,
b0d3095f
LB
2497 libexecdir / 'systemd',
2498 sbindir / 'init')
ba7f4ae6 2499
4e8295f4 2500exe = executable(
6164ec4c
ZJS
2501 'systemd-analyze',
2502 systemd_analyze_sources,
8d40961c 2503 include_directories : core_includes,
6164ec4c
ZJS
2504 link_with : [libcore,
2505 libshared],
c47511da 2506 dependencies : [libseccomp,
40c7d3c7 2507 userspace],
b0d3095f 2508 install_rpath : pkglibdir,
9e4a50bc 2509 install : conf.get('ENABLE_ANALYZE') == 1)
9a01fe39
ZJS
2510if conf.get('ENABLE_ANALYZE') == 1
2511 public_programs += exe
2512endif
4e8295f4
ZJS
2513
2514if want_tests != 'false'
2515 test('test-compare-versions',
2516 test_compare_versions_sh,
2517 args : exe.full_path())
2518endif
5c23128d 2519
6164ec4c
ZJS
2520executable(
2521 'systemd-journald',
2522 systemd_journald_sources,
2523 include_directories : includes,
2524 link_with : [libjournal_core,
2525 libshared],
92148283 2526 dependencies : [liblz4,
ef5924aa 2527 libselinux,
92148283 2528 libxz,
c47511da 2529 libzstd,
92148283 2530 threads,
40c7d3c7 2531 userspace],
b0d3095f 2532 install_rpath : pkglibdir,
6164ec4c 2533 install : true,
b0d3095f 2534 install_dir : libexecdir)
5c23128d 2535
6164ec4c
ZJS
2536public_programs += executable(
2537 'systemd-cat',
2538 systemd_cat_sources,
2539 include_directories : includes,
2540 link_with : [libjournal_core,
2541 libshared],
3a21c554 2542 dependencies : [threads,
40c7d3c7 2543 userspace],
b0d3095f 2544 install_rpath : pkglibdir,
6164ec4c
ZJS
2545 install : true)
2546
0a0d4899 2547if get_option('link-journalctl-shared')
46fb302f 2548 journalctl_link_with = [libshared]
0a0d4899
JH
2549else
2550 journalctl_link_with = [libsystemd_static,
2551 libshared_static,
46fb302f 2552 libbasic_gcrypt]
0a0d4899
JH
2553endif
2554
6164ec4c
ZJS
2555public_programs += executable(
2556 'journalctl',
2557 journalctl_sources,
2558 include_directories : includes,
0a0d4899 2559 link_with : [journalctl_link_with],
92148283 2560 dependencies : [libdl,
6164ec4c 2561 liblz4,
92148283 2562 libxz,
9200bb30 2563 libzstd,
92148283 2564 threads,
40c7d3c7 2565 userspace],
b0d3095f
LB
2566 install_rpath : pkglibdir,
2567 install : true)
35a1ff4c 2568
6164ec4c
ZJS
2569executable(
2570 'systemd-getty-generator',
2571 'src/getty-generator/getty-generator.c',
2572 include_directories : includes,
2573 link_with : [libshared],
92148283 2574 dependencies : userspace,
b0d3095f 2575 install_rpath : pkglibdir,
6164ec4c
ZJS
2576 install : true,
2577 install_dir : systemgeneratordir)
5c23128d 2578
6164ec4c
ZJS
2579executable(
2580 'systemd-debug-generator',
2581 'src/debug-generator/debug-generator.c',
2582 include_directories : includes,
2583 link_with : [libshared],
92148283 2584 dependencies : userspace,
b0d3095f 2585 install_rpath : pkglibdir,
6164ec4c
ZJS
2586 install : true,
2587 install_dir : systemgeneratordir)
2588
2589executable(
2590 'systemd-run-generator',
2591 'src/run-generator/run-generator.c',
2592 include_directories : includes,
2593 link_with : [libshared],
92148283 2594 dependencies : userspace,
b0d3095f 2595 install_rpath : pkglibdir,
6164ec4c
ZJS
2596 install : true,
2597 install_dir : systemgeneratordir)
2598
8cc8a073 2599exe = executable(
6164ec4c
ZJS
2600 'systemd-fstab-generator',
2601 'src/fstab-generator/fstab-generator.c',
2602 include_directories : includes,
bac11cd6 2603 link_with : [libshared],
92148283 2604 dependencies : userspace,
b0d3095f 2605 install_rpath : pkglibdir,
6164ec4c
ZJS
2606 install : true,
2607 install_dir : systemgeneratordir)
5c23128d 2608
028a981c
ZJS
2609meson.add_install_script(meson_make_symlink,
2610 systemgeneratordir / 'systemd-fstab-generator',
b0d3095f 2611 libexecdir / 'systemd-sysroot-fstab-check')
028a981c 2612
8cc8a073
YW
2613if want_tests != 'false'
2614 test('test-fstab-generator',
2615 test_fstab_generator_sh,
2616 # https://github.com/mesonbuild/meson/issues/2681
e93ada98 2617 args : exe.full_path(),
e290bdb7 2618 env : test_env,
e93ada98 2619 depends : exe)
8cc8a073
YW
2620endif
2621
349cc4a5 2622if conf.get('ENABLE_ENVIRONMENT_D') == 1
6164ec4c
ZJS
2623 executable(
2624 '30-systemd-environment-d-generator',
2625 'src/environment-d-generator/environment-d-generator.c',
2626 include_directories : includes,
2627 link_with : [libshared],
92148283 2628 dependencies : userspace,
b0d3095f 2629 install_rpath : pkglibdir,
6164ec4c
ZJS
2630 install : true,
2631 install_dir : userenvgeneratordir)
7b76fce1 2632
37efbbd8 2633 meson.add_install_script(meson_make_symlink,
fce9abb2
ZJS
2634 sysconfdir / 'environment',
2635 environmentdir / '99-environment.conf')
5c23128d
ZJS
2636endif
2637
349cc4a5 2638if conf.get('ENABLE_HIBERNATE') == 1
6164ec4c
ZJS
2639 executable(
2640 'systemd-hibernate-resume-generator',
2641 'src/hibernate-resume/hibernate-resume-generator.c',
2642 include_directories : includes,
2643 link_with : [libshared],
92148283 2644 dependencies : userspace,
b0d3095f 2645 install_rpath : pkglibdir,
6164ec4c
ZJS
2646 install : true,
2647 install_dir : systemgeneratordir)
2648
2649 executable(
2650 'systemd-hibernate-resume',
2651 'src/hibernate-resume/hibernate-resume.c',
2652 include_directories : includes,
2653 link_with : [libshared],
92148283 2654 dependencies : userspace,
b0d3095f 2655 install_rpath : pkglibdir,
6164ec4c 2656 install : true,
b0d3095f 2657 install_dir : libexecdir)
37efbbd8
ZJS
2658endif
2659
349cc4a5 2660if conf.get('HAVE_BLKID') == 1
6164ec4c
ZJS
2661 executable(
2662 'systemd-gpt-auto-generator',
2663 'src/gpt-auto-generator/gpt-auto-generator.c',
6164ec4c
ZJS
2664 include_directories : includes,
2665 link_with : [libshared],
92148283
JJ
2666 dependencies : [libblkid,
2667 userspace],
b0d3095f 2668 install_rpath : pkglibdir,
6164ec4c
ZJS
2669 install : true,
2670 install_dir : systemgeneratordir)
2671
2672 public_programs += executable(
2673 'systemd-dissect',
2674 'src/dissect/dissect.c',
2675 include_directories : includes,
2676 link_with : [libshared],
40c7d3c7 2677 dependencies : [userspace],
b0d3095f 2678 install_rpath : pkglibdir,
5a151082 2679 install : true)
a164d9d5
LP
2680
2681 meson.add_install_script(meson_make_symlink,
2682 bindir / 'systemd-dissect',
b0d3095f 2683 sbindir / 'mount.ddi')
5c23128d
ZJS
2684endif
2685
1ec57f33 2686if conf.get('ENABLE_RESOLVE') == 1
e3c68924 2687 dbus_programs += executable(
6164ec4c
ZJS
2688 'systemd-resolved',
2689 systemd_resolved_sources,
8d40961c 2690 include_directories : resolve_includes,
6164ec4c
ZJS
2691 link_with : [libshared,
2692 libbasic_gcrypt,
2693 libsystemd_resolve_core],
92148283
JJ
2694 dependencies : [systemd_resolved_dependencies,
2695 userspace],
b0d3095f 2696 install_rpath : pkglibdir,
6164ec4c 2697 install : true,
b0d3095f 2698 install_dir : libexecdir)
6164ec4c
ZJS
2699
2700 public_programs += executable(
2701 'resolvectl',
2702 resolvectl_sources,
2703 include_directories : includes,
2704 link_with : [libshared,
2705 libbasic_gcrypt,
2706 libsystemd_resolve_core],
92148283 2707 dependencies : [lib_openssl_or_gcrypt,
c47511da 2708 libidn,
92148283
JJ
2709 libm,
2710 threads,
40c7d3c7 2711 userspace],
b0d3095f 2712 install_rpath : pkglibdir,
6164ec4c 2713 install : true)
088c1363
LP
2714
2715 meson.add_install_script(meson_make_symlink,
fce9abb2 2716 bindir / 'resolvectl',
b0d3095f 2717 sbindir / 'resolvconf')
c2e84cab
YW
2718
2719 meson.add_install_script(meson_make_symlink,
fce9abb2
ZJS
2720 bindir / 'resolvectl',
2721 bindir / 'systemd-resolve')
5c23128d
ZJS
2722endif
2723
349cc4a5 2724if conf.get('ENABLE_LOGIND') == 1
e3c68924 2725 dbus_programs += executable(
6164ec4c
ZJS
2726 'systemd-logind',
2727 systemd_logind_sources,
2728 include_directories : includes,
2729 link_with : [liblogind_core,
2730 libshared],
92148283
JJ
2731 dependencies : [libacl,
2732 threads,
40c7d3c7 2733 userspace],
b0d3095f 2734 install_rpath : pkglibdir,
6164ec4c 2735 install : true,
b0d3095f 2736 install_dir : libexecdir)
6164ec4c
ZJS
2737
2738 public_programs += executable(
2739 'loginctl',
2740 loginctl_sources,
2741 include_directories : includes,
2742 link_with : [libshared],
92148283 2743 dependencies : [liblz4,
ef5924aa 2744 libxz,
c47511da 2745 libzstd,
92148283 2746 threads,
40c7d3c7 2747 userspace],
b0d3095f
LB
2748 install_rpath : pkglibdir,
2749 install : true)
6164ec4c
ZJS
2750
2751 public_programs += executable(
2752 'systemd-inhibit',
2753 'src/login/inhibit.c',
2754 include_directories : includes,
2755 link_with : [libshared],
40c7d3c7 2756 dependencies : [userspace],
b0d3095f
LB
2757 install_rpath : pkglibdir,
2758 install : true)
37efbbd8 2759
349cc4a5 2760 if conf.get('HAVE_PAM') == 1
fce9abb2 2761 version_script_arg = project_source_root / pam_systemd_sym
37efbbd8
ZJS
2762 pam_systemd = shared_library(
2763 'pam_systemd',
2764 pam_systemd_c,
2765 name_prefix : '',
2766 include_directories : includes,
2767 link_args : ['-shared',
2768 '-Wl,--version-script=' + version_script_arg],
37e4d7a8 2769 link_with : [libsystemd_static,
37efbbd8 2770 libshared_static],
92148283 2771 dependencies : [libpam_misc,
37efbbd8 2772 libpam,
92148283 2773 threads,
40c7d3c7 2774 userspace],
37efbbd8
ZJS
2775 link_depends : pam_systemd_sym,
2776 install : true,
48139c7c 2777 install_tag : 'pam',
37efbbd8
ZJS
2778 install_dir : pamlibdir)
2779
938be089
ZJS
2780 if want_tests != 'false'
2781 test('dlopen-pam_systemd',
2782 test_dlopen,
2783 # path to dlopen must include a slash
e93ada98
DDM
2784 args : pam_systemd.full_path(),
2785 depends : pam_systemd)
938be089 2786 endif
37efbbd8 2787 endif
005a29f2 2788
6164ec4c
ZJS
2789 executable(
2790 'systemd-user-runtime-dir',
2791 user_runtime_dir_sources,
2792 include_directories : includes,
2793 link_with : [libshared],
92148283 2794 dependencies : userspace,
b0d3095f 2795 install_rpath : pkglibdir,
6164ec4c 2796 install : true,
b0d3095f 2797 install_dir : libexecdir)
07ee5adb 2798endif
a9f0f5e5 2799
349cc4a5 2800if conf.get('HAVE_PAM') == 1
6164ec4c
ZJS
2801 executable(
2802 'systemd-user-sessions',
2803 'src/user-sessions/user-sessions.c',
2804 include_directories : includes,
2805 link_with : [libshared],
92148283 2806 dependencies : userspace,
b0d3095f 2807 install_rpath : pkglibdir,
6164ec4c 2808 install : true,
b0d3095f 2809 install_dir : libexecdir)
5c23128d
ZJS
2810endif
2811
dfca5587 2812if conf.get('HAVE_BLKID') == 1 and conf.get('ENABLE_BOOTLOADER') == 1
79647020
RS
2813 if get_option('link-boot-shared')
2814 boot_link_with = [libshared]
2815 else
2816 boot_link_with = [libsystemd_static, libshared_static]
2817 endif
2818
50f2c32c 2819 exe = executable(
6164ec4c 2820 'bootctl',
cd4300f3 2821 bootctl_sources,
6164ec4c 2822 include_directories : includes,
79647020 2823 link_with : [boot_link_with],
c47511da 2824 dependencies : [libblkid,
40c7d3c7 2825 userspace],
b0d3095f 2826 install_rpath : pkglibdir,
6164ec4c 2827 install : true)
50f2c32c
ZJS
2828 public_programs += exe
2829
2830 if want_tests != 'false'
2831 test('test-bootctl-json',
2832 test_bootctl_json_sh,
2833 args : exe.full_path(),
2834 depends : exe)
2835 endif
6164ec4c
ZJS
2836
2837 public_programs += executable(
2838 'systemd-bless-boot',
2839 'src/boot/bless-boot.c',
2840 include_directories : includes,
79647020 2841 link_with : [boot_link_with],
c47511da 2842 dependencies : [libblkid,
40c7d3c7 2843 userspace],
b0d3095f 2844 install_rpath : pkglibdir,
6164ec4c 2845 install : true,
b0d3095f 2846 install_dir : libexecdir)
6164ec4c
ZJS
2847
2848 executable(
2849 'systemd-bless-boot-generator',
2850 'src/boot/bless-boot-generator.c',
2851 include_directories : includes,
79647020 2852 link_with : [boot_link_with],
92148283 2853 dependencies : userspace,
b0d3095f 2854 install_rpath : pkglibdir,
6164ec4c
ZJS
2855 install : true,
2856 install_dir : systemgeneratordir)
ca1092dc 2857
3286770d 2858 if conf.get('HAVE_OPENSSL') == 1 and conf.get('HAVE_TPM2') == 1
ca1092dc
LP
2859 executable(
2860 'systemd-measure',
2861 'src/boot/measure.c',
2862 include_directories : includes,
2863 link_with : [libshared],
c47511da 2864 dependencies : [libopenssl,
40c7d3c7 2865 userspace],
b0d3095f 2866 install_rpath : pkglibdir,
ca1092dc 2867 install : true,
b0d3095f 2868 install_dir : libexecdir)
708d7524
LP
2869 executable(
2870 'systemd-pcrphase',
2871 'src/boot/pcrphase.c',
2872 include_directories : includes,
2873 link_with : [libshared],
92148283
JJ
2874 dependencies : [libblkid,
2875 libopenssl,
c47511da 2876 tpm2,
40c7d3c7 2877 userspace],
b0d3095f 2878 install_rpath : pkglibdir,
708d7524 2879 install : true,
b0d3095f 2880 install_dir : libexecdir)
ca1092dc 2881 endif
6164ec4c
ZJS
2882endif
2883
2884executable(
2885 'systemd-boot-check-no-failures',
2886 'src/boot/boot-check-no-failures.c',
2887 include_directories : includes,
2888 link_with : [libshared],
c47511da 2889 dependencies : [libblkid,
40c7d3c7 2890 userspace],
b0d3095f 2891 install_rpath : pkglibdir,
6164ec4c 2892 install : true,
b0d3095f 2893 install_dir : libexecdir)
005a29f2 2894
6164ec4c
ZJS
2895public_programs += executable(
2896 'systemd-socket-activate',
7f4544c9 2897 'src/socket-activate/socket-activate.c',
6164ec4c
ZJS
2898 include_directories : includes,
2899 link_with : [libshared],
c47511da 2900 dependencies : [threads,
40c7d3c7 2901 userspace],
b0d3095f 2902 install_rpath : pkglibdir,
6164ec4c 2903 install : true)
f3794366 2904
2a2d002f 2905systemctl = executable(
6164ec4c 2906 'systemctl',
c3512573 2907 systemctl_sources,
6164ec4c
ZJS
2908 include_directories : includes,
2909 link_with : systemctl_link_with,
92148283
JJ
2910 dependencies : [libcap,
2911 liblz4,
6164ec4c
ZJS
2912 libselinux,
2913 libxz,
c47511da 2914 libzstd,
92148283 2915 threads,
40c7d3c7 2916 userspace],
b0d3095f
LB
2917 install_rpath : pkglibdir,
2918 install : true)
2a2d002f 2919public_programs += systemctl
5c23128d 2920
61d0578b 2921if conf.get('ENABLE_PORTABLED') == 1
c06d2e44
RS
2922 if get_option('link-portabled-shared')
2923 portabled_link_with = [libshared]
2924 else
2925 portabled_link_with = [libsystemd_static,
2926 libshared_static]
2927 endif
2928
e3c68924 2929 dbus_programs += executable(
6164ec4c
ZJS
2930 'systemd-portabled',
2931 systemd_portabled_sources,
2932 include_directories : includes,
c06d2e44 2933 link_with : [portabled_link_with],
92148283
JJ
2934 dependencies : [libselinux,
2935 threads,
40c7d3c7 2936 userspace],
b0d3095f 2937 install_rpath : pkglibdir,
6164ec4c 2938 install : true,
b0d3095f 2939 install_dir : libexecdir)
6164ec4c
ZJS
2940
2941 public_programs += executable(
2942 'portablectl',
2943 'src/portable/portablectl.c',
2944 include_directories : includes,
c06d2e44 2945 link_with : [portabled_link_with],
c47511da 2946 dependencies : [threads,
40c7d3c7 2947 userspace],
b0d3095f
LB
2948 install_rpath : pkglibdir,
2949 install : true)
61d0578b
LP
2950endif
2951
9bca4ae4
LP
2952if conf.get('ENABLE_SYSEXT') == 1
2953 public_programs += executable(
2954 'systemd-sysext',
2955 systemd_sysext_sources,
2956 include_directories : includes,
2957 link_with : [libshared],
40c7d3c7 2958 dependencies : [userspace],
b0d3095f
LB
2959 install_rpath : pkglibdir,
2960 install : true)
9bca4ae4
LP
2961endif
2962
d093b62c 2963if conf.get('ENABLE_USERDB') == 1
6164ec4c
ZJS
2964 executable(
2965 'systemd-userwork',
2966 systemd_userwork_sources,
2967 include_directories : includes,
2968 link_with : [libshared],
c47511da 2969 dependencies : [threads,
40c7d3c7 2970 userspace],
b0d3095f 2971 install_rpath : pkglibdir,
6164ec4c 2972 install : true,
b0d3095f 2973 install_dir : libexecdir)
6164ec4c
ZJS
2974
2975 executable(
2976 'systemd-userdbd',
2977 systemd_userdbd_sources,
2978 include_directories : includes,
2979 link_with : [libshared],
c47511da 2980 dependencies : [threads,
40c7d3c7 2981 userspace],
b0d3095f 2982 install_rpath : pkglibdir,
6164ec4c 2983 install : true,
b0d3095f 2984 install_dir : libexecdir)
6164ec4c 2985
460e5af0 2986 public_programs += executable(
6164ec4c
ZJS
2987 'userdbctl',
2988 userdbctl_sources,
2989 include_directories : includes,
2990 link_with : [libshared],
c47511da 2991 dependencies : [threads,
40c7d3c7 2992 userspace],
b0d3095f 2993 install_rpath : pkglibdir,
003a6761 2994 install : true)
d093b62c
LP
2995endif
2996
70a5db58 2997if conf.get('ENABLE_HOMED') == 1
6164ec4c
ZJS
2998 executable(
2999 'systemd-homework',
3000 systemd_homework_sources,
3001 include_directories : includes,
f8cf3d19
LP
3002 link_with : [libshared,
3003 libshared_fdisk],
92148283 3004 dependencies : [libblkid,
6164ec4c 3005 libcrypt,
6164ec4c 3006 libfdisk,
92148283 3007 libopenssl,
c47511da 3008 libp11kit,
92148283 3009 threads,
40c7d3c7 3010 userspace],
b0d3095f 3011 install_rpath : pkglibdir,
6164ec4c 3012 install : true,
b0d3095f 3013 install_dir : libexecdir)
6164ec4c 3014
e3c68924 3015 dbus_programs += executable(
6164ec4c
ZJS
3016 'systemd-homed',
3017 systemd_homed_sources,
8d40961c 3018 include_directories : home_includes,
6164ec4c 3019 link_with : [libshared],
92148283 3020 dependencies : [libcrypt,
c47511da 3021 libm,
92148283
JJ
3022 libopenssl,
3023 threads,
40c7d3c7 3024 userspace],
b0d3095f 3025 install_rpath : pkglibdir,
6164ec4c 3026 install : true,
b0d3095f 3027 install_dir : libexecdir)
6164ec4c 3028
460e5af0 3029 public_programs += executable(
6164ec4c
ZJS
3030 'homectl',
3031 homectl_sources,
3032 include_directories : includes,
3033 link_with : [libshared],
92148283
JJ
3034 dependencies : [libcrypt,
3035 libdl,
6164ec4c
ZJS
3036 libopenssl,
3037 libp11kit,
92148283 3038 threads,
40c7d3c7 3039 userspace],
b0d3095f 3040 install_rpath : pkglibdir,
003a6761 3041 install : true)
26cf9fb7
LP
3042
3043 if conf.get('HAVE_PAM') == 1
fce9abb2 3044 version_script_arg = project_source_root / pam_systemd_home_sym
a7127884 3045 pam_systemd_home = shared_library(
26cf9fb7
LP
3046 'pam_systemd_home',
3047 pam_systemd_home_c,
3048 name_prefix : '',
3049 include_directories : includes,
3050 link_args : ['-shared',
3051 '-Wl,--version-script=' + version_script_arg],
3052 link_with : [libsystemd_static,
3053 libshared_static],
92148283 3054 dependencies : [libcrypt,
26cf9fb7 3055 libpam_misc,
92148283
JJ
3056 libpam,
3057 threads,
40c7d3c7 3058 userspace],
26cf9fb7
LP
3059 link_depends : pam_systemd_home_sym,
3060 install : true,
48139c7c 3061 install_tag : 'pam',
26cf9fb7 3062 install_dir : pamlibdir)
a7127884
YW
3063
3064 if want_tests != 'false'
3065 test('dlopen-pam_systemd_home',
3066 test_dlopen,
3067 # path to dlopen must include a slash
3068 args : pam_systemd_home.full_path(),
3069 depends : pam_systemd_home)
3070 endif
26cf9fb7 3071 endif
70a5db58
LP
3072endif
3073
6589a569 3074foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
ba081955 3075 (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
ba7f4ae6 3076 meson.add_install_script(meson_make_symlink,
b0d3095f
LB
3077 bindir / 'systemctl',
3078 sbindir / alias)
ba7f4ae6
ZJS
3079endforeach
3080
63e2d171 3081meson.add_install_script(meson_make_symlink,
b0d3095f
LB
3082 bindir / 'udevadm',
3083 libexecdir / 'systemd-udevd')
63e2d171 3084
349cc4a5 3085if conf.get('ENABLE_BACKLIGHT') == 1
6164ec4c
ZJS
3086 executable(
3087 'systemd-backlight',
3088 'src/backlight/backlight.c',
3089 include_directories : includes,
3090 link_with : [libshared],
92148283 3091 dependencies : userspace,
b0d3095f 3092 install_rpath : pkglibdir,
6164ec4c 3093 install : true,
b0d3095f 3094 install_dir : libexecdir)
5c23128d
ZJS
3095endif
3096
349cc4a5 3097if conf.get('ENABLE_RFKILL') == 1
6164ec4c
ZJS
3098 executable(
3099 'systemd-rfkill',
3100 'src/rfkill/rfkill.c',
3101 include_directories : includes,
3102 link_with : [libshared],
92148283 3103 dependencies : userspace,
b0d3095f 3104 install_rpath : pkglibdir,
6164ec4c 3105 install : true,
b0d3095f 3106 install_dir : libexecdir)
6164ec4c
ZJS
3107endif
3108
3109executable(
3110 'systemd-system-update-generator',
3111 'src/system-update-generator/system-update-generator.c',
3112 include_directories : includes,
3113 link_with : [libshared],
92148283 3114 dependencies : userspace,
b0d3095f 3115 install_rpath : pkglibdir,
6164ec4c
ZJS
3116 install : true,
3117 install_dir : systemgeneratordir)
5c23128d 3118
349cc4a5 3119if conf.get('HAVE_LIBCRYPTSETUP') == 1
6164ec4c
ZJS
3120 executable(
3121 'systemd-cryptsetup',
3122 systemd_cryptsetup_sources,
3123 include_directories : includes,
3124 link_with : [libshared],
3125 dependencies : [libcryptsetup,
92148283 3126 libopenssl,
c47511da 3127 libp11kit,
40c7d3c7 3128 userspace],
b0d3095f 3129 install_rpath : pkglibdir,
6164ec4c 3130 install : true,
b0d3095f 3131 install_dir : libexecdir)
6164ec4c
ZJS
3132
3133 executable(
3134 'systemd-cryptsetup-generator',
3135 'src/cryptsetup/cryptsetup-generator.c',
3136 include_directories : includes,
3137 link_with : [libshared],
92148283 3138 dependencies : userspace,
b0d3095f 3139 install_rpath : pkglibdir,
6164ec4c
ZJS
3140 install : true,
3141 install_dir : systemgeneratordir)
3142
3143 executable(
3144 'systemd-veritysetup',
3145 'src/veritysetup/veritysetup.c',
3146 include_directories : includes,
3147 link_with : [libshared],
c47511da 3148 dependencies : [libcryptsetup,
40c7d3c7 3149 userspace],
b0d3095f 3150 install_rpath : pkglibdir,
6164ec4c 3151 install : true,
b0d3095f 3152 install_dir : libexecdir)
6164ec4c
ZJS
3153
3154 executable(
3155 'systemd-veritysetup-generator',
3156 'src/veritysetup/veritysetup-generator.c',
3157 include_directories : includes,
3158 link_with : [libshared],
40c7d3c7 3159 dependencies : [userspace],
b0d3095f 3160 install_rpath : pkglibdir,
6164ec4c
ZJS
3161 install : true,
3162 install_dir : systemgeneratordir)
8710a681 3163
3761002e 3164 public_programs += executable(
8710a681
LP
3165 'systemd-cryptenroll',
3166 systemd_cryptenroll_sources,
3167 include_directories : includes,
3168 link_with : [libshared],
3169 dependencies : [libcryptsetup,
5e521624 3170 libdl,
8710a681 3171 libopenssl,
c47511da 3172 libp11kit,
40c7d3c7 3173 userspace],
b0d3095f 3174 install_rpath : pkglibdir,
a1fd722b 3175 install : true)
1f1a2243
TA
3176
3177 executable(
3178 'systemd-integritysetup',
3179 ['src/integritysetup/integritysetup.c', 'src/integritysetup/integrity-util.c'],
3180 include_directories : includes,
3181 link_with : [libshared],
c47511da 3182 dependencies : [libcryptsetup,
40c7d3c7 3183 userspace],
b0d3095f 3184 install_rpath : pkglibdir,
1f1a2243 3185 install : true,
b0d3095f 3186 install_dir : libexecdir)
1f1a2243
TA
3187
3188 executable(
3189 'systemd-integritysetup-generator',
3190 ['src/integritysetup/integritysetup-generator.c', 'src/integritysetup/integrity-util.c'],
3191 include_directories : includes,
3192 link_with : [libshared],
92148283 3193 dependencies : userspace,
b0d3095f 3194 install_rpath : pkglibdir,
1f1a2243
TA
3195 install : true,
3196 install_dir : systemgeneratordir)
5c23128d
ZJS
3197endif
3198
349cc4a5 3199if conf.get('HAVE_SYSV_COMPAT') == 1
e93ada98 3200 exe = executable(
6164ec4c
ZJS
3201 'systemd-sysv-generator',
3202 'src/sysv-generator/sysv-generator.c',
3203 include_directories : includes,
3204 link_with : [libshared],
92148283 3205 dependencies : userspace,
b0d3095f 3206 install_rpath : pkglibdir,
6164ec4c
ZJS
3207 install : true,
3208 install_dir : systemgeneratordir)
3209
e93ada98
DDM
3210 sysv_generator_test_py = find_program('test/sysv-generator-test.py')
3211 if want_tests != 'false'
3212 test('sysv-generator-test',
3213 sysv_generator_test_py,
3214 depends : exe)
3215 endif
3216
6164ec4c
ZJS
3217 executable(
3218 'systemd-rc-local-generator',
3219 'src/rc-local-generator/rc-local-generator.c',
3220 include_directories : includes,
3221 link_with : [libshared],
92148283 3222 dependencies : userspace,
b0d3095f 3223 install_rpath : pkglibdir,
6164ec4c
ZJS
3224 install : true,
3225 install_dir : systemgeneratordir)
5c23128d
ZJS
3226endif
3227
8feca247
BB
3228if conf.get('ENABLE_XDG_AUTOSTART') == 1
3229 executable(
3230 'systemd-xdg-autostart-generator',
0275e918 3231 systemd_xdg_autostart_generator_sources,
8feca247
BB
3232 include_directories : includes,
3233 link_with : [libshared],
92148283 3234 dependencies : userspace,
b0d3095f 3235 install_rpath : pkglibdir,
8feca247
BB
3236 install : true,
3237 install_dir : usergeneratordir)
3238
3239 executable(
3240 'systemd-xdg-autostart-condition',
3241 'src/xdg-autostart-generator/xdg-autostart-condition.c',
3242 include_directories : includes,
3243 link_with : [libshared],
92148283 3244 dependencies : userspace,
b0d3095f 3245 install_rpath : pkglibdir,
8feca247 3246 install : true,
b0d3095f 3247 install_dir : libexecdir)
8feca247
BB
3248endif
3249
349cc4a5 3250if conf.get('ENABLE_HOSTNAMED') == 1
e3c68924 3251 dbus_programs += executable(
6164ec4c
ZJS
3252 'systemd-hostnamed',
3253 'src/hostname/hostnamed.c',
3254 include_directories : includes,
3255 link_with : [libshared],
92148283 3256 dependencies : userspace,
b0d3095f 3257 install_rpath : pkglibdir,
6164ec4c 3258 install : true,
b0d3095f 3259 install_dir : libexecdir)
6164ec4c
ZJS
3260
3261 public_programs += executable(
3262 'hostnamectl',
3263 'src/hostname/hostnamectl.c',
3264 include_directories : includes,
3265 link_with : [libshared],
40c7d3c7 3266 dependencies : [userspace],
b0d3095f 3267 install_rpath : pkglibdir,
6164ec4c 3268 install : true)
5c23128d
ZJS
3269endif
3270
349cc4a5 3271if conf.get('ENABLE_LOCALED') == 1
e3c68924 3272 dbus_programs += executable(
6164ec4c
ZJS
3273 'systemd-localed',
3274 systemd_localed_sources,
bfa0ade9 3275 include_directories : includes,
6164ec4c 3276 link_with : [libshared],
d45cbc07 3277 dependencies : libxkbcommon_deps +
40c7d3c7 3278 [userspace],
b0d3095f 3279 install_rpath : pkglibdir,
6164ec4c 3280 install : true,
b0d3095f 3281 install_dir : libexecdir)
6164ec4c
ZJS
3282
3283 public_programs += executable(
3284 'localectl',
3285 localectl_sources,
3286 include_directories : includes,
3287 link_with : [libshared],
40c7d3c7 3288 dependencies : [userspace],
b0d3095f 3289 install_rpath : pkglibdir,
6164ec4c 3290 install : true)
5c23128d
ZJS
3291endif
3292
349cc4a5 3293if conf.get('ENABLE_TIMEDATED') == 1
e3c68924 3294 dbus_programs += executable(
6164ec4c
ZJS
3295 'systemd-timedated',
3296 'src/timedate/timedated.c',
3297 include_directories : includes,
3298 link_with : [libshared],
92148283 3299 dependencies : userspace,
b0d3095f 3300 install_rpath : pkglibdir,
6164ec4c 3301 install : true,
b0d3095f 3302 install_dir : libexecdir)
6129ec85 3303endif
5c23128d 3304
6129ec85 3305if conf.get('ENABLE_TIMEDATECTL') == 1
6164ec4c
ZJS
3306 public_programs += executable(
3307 'timedatectl',
3308 'src/timedate/timedatectl.c',
3309 include_directories : includes,
b0d3095f 3310 install_rpath : pkglibdir,
6164ec4c 3311 link_with : [libshared],
c47511da 3312 dependencies : [libm,
40c7d3c7 3313 userspace],
6164ec4c 3314 install : true)
5c23128d
ZJS
3315endif
3316
349cc4a5 3317if conf.get('ENABLE_TIMESYNCD') == 1
6164ec4c
ZJS
3318 executable(
3319 'systemd-timesyncd',
3320 systemd_timesyncd_sources,
3321 include_directories : includes,
f5a5284e 3322 link_with : [libtimesyncd_core],
92148283
JJ
3323 dependencies : [libm,
3324 threads,
40c7d3c7 3325 userspace],
b0d3095f 3326 install_rpath : pkglibdir,
6164ec4c 3327 install : true,
b0d3095f 3328 install_dir : libexecdir)
6164ec4c
ZJS
3329
3330 executable(
3331 'systemd-time-wait-sync',
cf242350 3332 'src/timesync/wait-sync.c',
6164ec4c 3333 include_directories : includes,
f5a5284e 3334 link_with : [libtimesyncd_core],
92148283 3335 dependencies : userspace,
b0d3095f 3336 install_rpath : pkglibdir,
6164ec4c 3337 install : true,
b0d3095f 3338 install_dir : libexecdir)
5c23128d
ZJS
3339endif
3340
349cc4a5 3341if conf.get('ENABLE_MACHINED') == 1
e3c68924 3342 dbus_programs += executable(
6164ec4c
ZJS
3343 'systemd-machined',
3344 systemd_machined_sources,
3345 include_directories : includes,
3346 link_with : [libmachine_core,
3347 libshared],
92148283 3348 dependencies : userspace,
b0d3095f 3349 install_rpath : pkglibdir,
6164ec4c 3350 install : true,
b0d3095f 3351 install_dir : libexecdir)
6164ec4c
ZJS
3352
3353 public_programs += executable(
3354 'machinectl',
3355 'src/machine/machinectl.c',
3356 include_directories : includes,
3357 link_with : [libshared],
92148283 3358 dependencies : [liblz4,
6164ec4c 3359 libxz,
c47511da 3360 libzstd,
92148283 3361 threads,
40c7d3c7 3362 userspace],
b0d3095f
LB
3363 install_rpath : pkglibdir,
3364 install : true)
5c23128d
ZJS
3365endif
3366
349cc4a5 3367if conf.get('ENABLE_IMPORTD') == 1
e3c68924 3368 dbus_programs += executable(
6164ec4c
ZJS
3369 'systemd-importd',
3370 systemd_importd_sources,
3371 include_directories : includes,
3372 link_with : [libshared],
c47511da 3373 dependencies : [threads,
40c7d3c7 3374 userspace],
b0d3095f 3375 install_rpath : pkglibdir,
6164ec4c 3376 install : true,
b0d3095f 3377 install_dir : libexecdir)
6164ec4c
ZJS
3378
3379 systemd_pull = executable(
3380 'systemd-pull',
3381 systemd_pull_sources,
3382 include_directories : includes,
b93f018f
ZJS
3383 link_with : [libshared,
3384 lib_import_common],
92148283 3385 dependencies : [lib_openssl_or_gcrypt,
6164ec4c 3386 libbzip2,
92148283 3387 libcurl,
c47511da 3388 libxz,
92148283 3389 libz,
40c7d3c7 3390 userspace],
b0d3095f 3391 install_rpath : pkglibdir,
6164ec4c 3392 install : true,
b0d3095f 3393 install_dir : libexecdir)
6164ec4c
ZJS
3394
3395 systemd_import = executable(
3396 'systemd-import',
3397 systemd_import_sources,
3398 include_directories : includes,
b93f018f
ZJS
3399 link_with : [libshared,
3400 lib_import_common],
92148283
JJ
3401 dependencies : [libbzip2,
3402 libcurl,
c47511da 3403 libxz,
92148283 3404 libz,
40c7d3c7 3405 userspace],
b0d3095f 3406 install_rpath : pkglibdir,
6164ec4c 3407 install : true,
b0d3095f 3408 install_dir : libexecdir)
6164ec4c
ZJS
3409
3410 systemd_import_fs = executable(
3411 'systemd-import-fs',
3412 systemd_import_fs_sources,
3413 include_directories : includes,
b93f018f
ZJS
3414 link_with : [libshared,
3415 lib_import_common],
40c7d3c7 3416 dependencies : [userspace],
b0d3095f 3417 install_rpath : pkglibdir,
6164ec4c 3418 install : true,
b0d3095f 3419 install_dir : libexecdir)
6164ec4c
ZJS
3420
3421 systemd_export = executable(
3422 'systemd-export',
3423 systemd_export_sources,
3424 include_directories : includes,
b93f018f
ZJS
3425 link_with : [libshared,
3426 lib_import_common],
92148283
JJ
3427 dependencies : [libbzip2,
3428 libcurl,
c47511da 3429 libxz,
92148283 3430 libz,
40c7d3c7 3431 userspace],
b0d3095f 3432 install_rpath : pkglibdir,
6164ec4c 3433 install : true,
b0d3095f 3434 install_dir : libexecdir)
1d7579c4
LP
3435
3436 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
37efbbd8
ZJS
3437endif
3438
349cc4a5 3439if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
6164ec4c
ZJS
3440 public_programs += executable(
3441 'systemd-journal-upload',
3442 systemd_journal_upload_sources,
3443 include_directories : includes,
3444 link_with : [libshared],
92148283 3445 dependencies : [libcurl,
6164ec4c 3446 libgnutls,
ef5924aa 3447 liblz4,
92148283 3448 libxz,
c47511da 3449 libzstd,
92148283 3450 threads,
40c7d3c7 3451 userspace],
b0d3095f 3452 install_rpath : pkglibdir,
6164ec4c 3453 install : true,
b0d3095f 3454 install_dir : libexecdir)
5c23128d
ZJS
3455endif
3456
349cc4a5 3457if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
6164ec4c
ZJS
3458 public_programs += executable(
3459 'systemd-journal-remote',
3460 systemd_journal_remote_sources,
035b0f8f 3461 include_directories : journal_includes,
6164ec4c
ZJS
3462 link_with : [libshared,
3463 libsystemd_journal_remote],
92148283
JJ
3464 dependencies : [libgnutls,
3465 liblz4,
6164ec4c 3466 libmicrohttpd,
6164ec4c 3467 libxz,
c47511da 3468 libzstd,
92148283 3469 threads,
40c7d3c7 3470 userspace],
b0d3095f 3471 install_rpath : pkglibdir,
6164ec4c 3472 install : true,
b0d3095f 3473 install_dir : libexecdir)
6164ec4c
ZJS
3474
3475 public_programs += executable(
3476 'systemd-journal-gatewayd',
3477 systemd_journal_gatewayd_sources,
035b0f8f 3478 include_directories : journal_includes,
6164ec4c 3479 link_with : [libshared],
92148283
JJ
3480 dependencies : [libgnutls,
3481 liblz4,
6164ec4c 3482 libmicrohttpd,
6164ec4c 3483 libxz,
c47511da 3484 libzstd,
92148283 3485 threads,
40c7d3c7 3486 userspace],
b0d3095f 3487 install_rpath : pkglibdir,
6164ec4c 3488 install : true,
b0d3095f 3489 install_dir : libexecdir)
5c23128d
ZJS
3490endif
3491
349cc4a5 3492if conf.get('ENABLE_COREDUMP') == 1
6164ec4c
ZJS
3493 executable(
3494 'systemd-coredump',
3495 systemd_coredump_sources,
3496 include_directories : includes,
acc50c92
LP
3497 link_with : [libshared,
3498 libbasic_compress],
92148283 3499 dependencies : [libacl,
ef5924aa 3500 liblz4,
92148283 3501 libxz,
c47511da 3502 libzstd,
92148283 3503 threads,
40c7d3c7 3504 userspace],
b0d3095f 3505 install_rpath : pkglibdir,
6164ec4c 3506 install : true,
b0d3095f 3507 install_dir : libexecdir)
6164ec4c
ZJS
3508
3509 public_programs += executable(
3510 'coredumpctl',
3511 coredumpctl_sources,
3512 include_directories : includes,
acc50c92
LP
3513 link_with : [libshared,
3514 libbasic_compress],
92148283 3515 dependencies : [liblz4,
6164ec4c 3516 libxz,
c47511da 3517 libzstd,
92148283 3518 threads,
40c7d3c7 3519 userspace],
b0d3095f 3520 install_rpath : pkglibdir,
6164ec4c 3521 install : true)
5c23128d
ZJS
3522endif
3523
9b4abc69 3524if conf.get('ENABLE_PSTORE') == 1
6164ec4c
ZJS
3525 executable(
3526 'systemd-pstore',
3527 systemd_pstore_sources,
3528 include_directories : includes,
3529 link_with : [libshared],
92148283 3530 dependencies : [libacl,
ef5924aa 3531 liblz4,
92148283 3532 libxz,
c47511da 3533 libzstd,
92148283 3534 threads,
40c7d3c7 3535 userspace],
b0d3095f 3536 install_rpath : pkglibdir,
6164ec4c 3537 install : true,
b0d3095f 3538 install_dir : libexecdir)
9b4abc69
ED
3539endif
3540
9de5e321 3541if conf.get('ENABLE_OOMD') == 1
e3c68924 3542 dbus_programs += executable('systemd-oomd',
9de5e321
AZ
3543 systemd_oomd_sources,
3544 include_directories : includes,
3545 link_with : [libshared],
c47511da 3546 dependencies : [libatomic,
40c7d3c7 3547 userspace],
b0d3095f 3548 install_rpath : pkglibdir,
9de5e321 3549 install : true,
b0d3095f 3550 install_dir : libexecdir)
5c616ecf
AZ
3551
3552 public_programs += executable(
ba081955
ZJS
3553 'oomctl',
3554 oomctl_sources,
3555 include_directories : includes,
3556 link_with : [libshared],
40c7d3c7 3557 dependencies : [userspace],
b0d3095f 3558 install_rpath : pkglibdir,
cfd4c84a 3559 install : true)
9de5e321
AZ
3560endif
3561
349cc4a5 3562if conf.get('ENABLE_BINFMT') == 1
6164ec4c
ZJS
3563 public_programs += executable(
3564 'systemd-binfmt',
3565 'src/binfmt/binfmt.c',
3566 include_directories : includes,
3567 link_with : [libshared],
40c7d3c7 3568 dependencies : [userspace],
b0d3095f 3569 install_rpath : pkglibdir,
6164ec4c 3570 install : true,
b0d3095f 3571 install_dir : libexecdir)
37efbbd8 3572
7c22f07c
ZJS
3573 meson.add_install_script('sh', '-c',
3574 mkdir_p.format(binfmtdir))
d7aa78c3 3575 if install_sysconfdir
7c22f07c 3576 meson.add_install_script('sh', '-c',
fce9abb2 3577 mkdir_p.format(sysconfdir / 'binfmt.d'))
d7aa78c3 3578 endif
37efbbd8
ZJS
3579endif
3580
43cc7a3e
LP
3581if conf.get('ENABLE_SYSUPDATE') == 1
3582 exe = executable(
3583 'systemd-sysupdate',
3584 systemd_sysupdate_sources,
3585 include_directories : includes,
f8cf3d19
LP
3586 link_with : [libshared,
3587 libshared_fdisk],
92148283 3588 dependencies : [libblkid,
43cc7a3e 3589 libfdisk,
c47511da 3590 libopenssl,
92148283 3591 threads,
40c7d3c7 3592 userspace],
b0d3095f 3593 install_rpath : pkglibdir,
43cc7a3e 3594 install : true,
b0d3095f 3595 install_dir : libexecdir)
43cc7a3e
LP
3596 public_programs += exe
3597endif
3598
349cc4a5 3599if conf.get('ENABLE_VCONSOLE') == 1
6164ec4c
ZJS
3600 executable(
3601 'systemd-vconsole-setup',
3602 'src/vconsole/vconsole-setup.c',
3603 include_directories : includes,
3604 link_with : [libshared],
92148283 3605 dependencies : userspace,
b0d3095f 3606 install_rpath : pkglibdir,
6164ec4c 3607 install : true,
b0d3095f 3608 install_dir : libexecdir)
5c23128d
ZJS
3609endif
3610
349cc4a5 3611if conf.get('ENABLE_RANDOMSEED') == 1
6164ec4c
ZJS
3612 executable(
3613 'systemd-random-seed',
3614 'src/random-seed/random-seed.c',
3615 include_directories : includes,
3616 link_with : [libshared],
40c7d3c7 3617 dependencies : [userspace],
b0d3095f 3618 install_rpath : pkglibdir,
6164ec4c 3619 install : true,
b0d3095f 3620 install_dir : libexecdir)
5c23128d
ZJS
3621endif
3622
349cc4a5 3623if conf.get('ENABLE_FIRSTBOOT') == 1
3761002e 3624 public_programs += executable(
6164ec4c
ZJS
3625 'systemd-firstboot',
3626 'src/firstboot/firstboot.c',
3627 include_directories : includes,
3628 link_with : [libshared],
c47511da 3629 dependencies : [libcrypt,
40c7d3c7 3630 userspace],
b0d3095f
LB
3631 install_rpath : pkglibdir,
3632 install : true)
6164ec4c
ZJS
3633endif
3634
3635executable(
3636 'systemd-remount-fs',
3637 'src/remount-fs/remount-fs.c',
3638 include_directories : includes,
bac11cd6 3639 link_with : [libshared],
40c7d3c7 3640 dependencies : [userspace],
b0d3095f 3641 install_rpath : pkglibdir,
6164ec4c 3642 install : true,
b0d3095f 3643 install_dir : libexecdir)
5c23128d 3644
6164ec4c
ZJS
3645executable(
3646 'systemd-machine-id-setup',
3647 'src/machine-id-setup/machine-id-setup-main.c',
3648 include_directories : includes,
bac11cd6 3649 link_with : [libshared],
40c7d3c7 3650 dependencies : [userspace],
b0d3095f
LB
3651 install_rpath : pkglibdir,
3652 install : true)
5c23128d 3653
6164ec4c
ZJS
3654executable(
3655 'systemd-fsck',
3656 'src/fsck/fsck.c',
3657 include_directories : includes,
3658 link_with : [libshared],
40c7d3c7 3659 dependencies : [userspace],
b0d3095f 3660 install_rpath : pkglibdir,
6164ec4c 3661 install : true,
b0d3095f 3662 install_dir : libexecdir)
5c23128d 3663
c47511da
ZJS
3664executable(
3665 'systemd-growfs',
3666 'src/partition/growfs.c',
3667 include_directories : includes,
3668 link_with : [libshared],
40c7d3c7 3669 dependencies : [userspace],
b0d3095f 3670 install_rpath : pkglibdir,
c47511da 3671 install : true,
b0d3095f 3672 install_dir : libexecdir)
80750adb 3673
6164ec4c
ZJS
3674executable(
3675 'systemd-makefs',
3676 'src/partition/makefs.c',
3677 include_directories : includes,
3678 link_with : [libshared],
40c7d3c7 3679 dependencies : [userspace],
b0d3095f 3680 install_rpath : pkglibdir,
6164ec4c 3681 install : true,
b0d3095f 3682 install_dir : libexecdir)
b7f28ac5 3683
6164ec4c
ZJS
3684executable(
3685 'systemd-sleep',
3686 'src/sleep/sleep.c',
3687 include_directories : includes,
3688 link_with : [libshared],
40c7d3c7 3689 dependencies : [userspace],
b0d3095f 3690 install_rpath : pkglibdir,
6164ec4c 3691 install : true,
b0d3095f 3692 install_dir : libexecdir)
5c23128d 3693
225d08b8 3694if install_sysconfdir_samples
d7aa78c3
JT
3695 install_data('src/sleep/sleep.conf',
3696 install_dir : pkgsysconfdir)
3697endif
d25e127d 3698
6164ec4c
ZJS
3699public_programs += executable(
3700 'systemd-sysctl',
3701 'src/sysctl/sysctl.c',
3702 include_directories : includes,
3703 link_with : [libshared],
40c7d3c7 3704 dependencies : [userspace],
b0d3095f 3705 install_rpath : pkglibdir,
6164ec4c 3706 install : true,
b0d3095f 3707 install_dir : libexecdir)
5c23128d 3708
251dc2f1 3709public_programs += executable(
6164ec4c
ZJS
3710 'systemd-ac-power',
3711 'src/ac-power/ac-power.c',
3712 include_directories : includes,
3713 link_with : [libshared],
40c7d3c7 3714 dependencies : [userspace],
b0d3095f 3715 install_rpath : pkglibdir,
251dc2f1 3716 install : true)
5c23128d 3717
6164ec4c
ZJS
3718public_programs += executable(
3719 'systemd-detect-virt',
3720 'src/detect-virt/detect-virt.c',
3721 include_directories : includes,
3722 link_with : [libshared],
40c7d3c7 3723 dependencies : [userspace],
b0d3095f 3724 install_rpath : pkglibdir,
6164ec4c 3725 install : true)
5c23128d 3726
6164ec4c
ZJS
3727public_programs += executable(
3728 'systemd-delta',
3729 'src/delta/delta.c',
3730 include_directories : includes,
3731 link_with : [libshared],
40c7d3c7 3732 dependencies : [userspace],
b0d3095f 3733 install_rpath : pkglibdir,
6164ec4c 3734 install : true)
5c23128d 3735
6164ec4c
ZJS
3736public_programs += executable(
3737 'systemd-escape',
3738 'src/escape/escape.c',
3739 include_directories : includes,
3740 link_with : [libshared],
40c7d3c7 3741 dependencies : [userspace],
b0d3095f
LB
3742 install_rpath : pkglibdir,
3743 install : true)
6164ec4c
ZJS
3744
3745public_programs += executable(
3746 'systemd-notify',
3747 'src/notify/notify.c',
3748 include_directories : includes,
3749 link_with : [libshared],
40c7d3c7 3750 dependencies : [userspace],
b0d3095f
LB
3751 install_rpath : pkglibdir,
3752 install : true)
6164ec4c 3753
5945640e
LP
3754public_programs += executable(
3755 'systemd-creds',
3756 'src/creds/creds.c',
3757 include_directories : includes,
3758 link_with : [libshared],
3759 dependencies : [threads,
c47511da 3760 libopenssl,
40c7d3c7 3761 userspace],
b0d3095f
LB
3762 install_rpath : pkglibdir,
3763 install : true)
5945640e 3764
e3d4148d
OJ
3765public_programs += executable(
3766 'systemd-battery-check',
3767 'src/battery-check/battery-check.c',
3768 include_directories : includes,
3769 link_with : [libshared],
40c7d3c7 3770 dependencies : [userspace],
b0d3095f
LB
3771 install_rpath : pkglibdir,
3772 install_dir : libexecdir,
e3d4148d
OJ
3773 install : true)
3774
24039e12
DDM
3775# Protecting files from the distro in /usr doesn't make sense since they can be trivially accessed otherwise,
3776# so don't restrict the access mode in /usr. That doesn't apply to /etc, so we do restrict the access mode
3777# there.
3778meson.add_install_script('sh', '-c', mkdir_p.format(credstoredir))
3779if install_sysconfdir
40fb9eeb 3780 # Keep in sync with tmpfiles.d/credstore.conf
24039e12 3781 meson.add_install_script('sh', '-c', mkdir_p_mode.format(sysconfdir / 'credstore', '0700'))
40fb9eeb 3782 meson.add_install_script('sh', '-c', mkdir_p_mode.format(sysconfdir / 'credstore.encrypted', '0700'))
24039e12
DDM
3783endif
3784
6164ec4c
ZJS
3785executable(
3786 'systemd-volatile-root',
3787 'src/volatile-root/volatile-root.c',
3788 include_directories : includes,
3789 link_with : [libshared],
92148283 3790 dependencies : userspace,
b0d3095f 3791 install_rpath : pkglibdir,
cdf7ad38 3792 install : conf.get('ENABLE_INITRD') == 1,
b0d3095f 3793 install_dir : libexecdir)
6164ec4c
ZJS
3794
3795executable(
3796 'systemd-cgroups-agent',
3797 'src/cgroups-agent/cgroups-agent.c',
3798 include_directories : includes,
3799 link_with : [libshared],
92148283 3800 dependencies : userspace,
b0d3095f 3801 install_rpath : pkglibdir,
6164ec4c 3802 install : true,
b0d3095f 3803 install_dir : libexecdir)
6164ec4c 3804
2a2d002f 3805systemd_id128 = executable(
6164ec4c
ZJS
3806 'systemd-id128',
3807 'src/id128/id128.c',
3808 include_directories : includes,
3809 link_with : [libshared],
40c7d3c7 3810 dependencies : [userspace],
b0d3095f 3811 install_rpath : pkglibdir,
6164ec4c 3812 install : true)
2a2d002f
ZJS
3813public_programs += systemd_id128
3814
3815if want_tests != 'false'
3816 test('test-systemctl-enable',
3817 test_systemctl_enable_sh,
3818 # https://github.com/mesonbuild/meson/issues/2681
3819 args : [systemctl.full_path(),
3820 systemd_id128.full_path()])
3821endif
6164ec4c
ZJS
3822
3823public_programs += executable(
3824 'systemd-path',
3825 'src/path/path.c',
3826 include_directories : includes,
3827 link_with : [libshared],
40c7d3c7 3828 dependencies : [userspace],
b0d3095f 3829 install_rpath : pkglibdir,
6164ec4c
ZJS
3830 install : true)
3831
3832public_programs += executable(
3833 'systemd-ask-password',
3834 'src/ask-password/ask-password.c',
3835 include_directories : includes,
3836 link_with : [libshared],
40c7d3c7 3837 dependencies : [userspace],
b0d3095f
LB
3838 install_rpath : pkglibdir,
3839 install : true)
6164ec4c
ZJS
3840
3841executable(
3842 'systemd-reply-password',
3843 'src/reply-password/reply-password.c',
3844 include_directories : includes,
3845 link_with : [libshared],
92148283 3846 dependencies : userspace,
b0d3095f 3847 install_rpath : pkglibdir,
6164ec4c 3848 install : true,
b0d3095f 3849 install_dir : libexecdir)
6164ec4c
ZJS
3850
3851public_programs += executable(
3852 'systemd-tty-ask-password-agent',
3853 'src/tty-ask-password-agent/tty-ask-password-agent.c',
3854 include_directories : includes,
3855 link_with : [libshared],
40c7d3c7 3856 dependencies : [userspace],
b0d3095f
LB
3857 install_rpath : pkglibdir,
3858 install : true)
6164ec4c
ZJS
3859
3860public_programs += executable(
3861 'systemd-cgls',
3862 'src/cgls/cgls.c',
3863 include_directories : includes,
3864 link_with : [libshared],
40c7d3c7 3865 dependencies : [userspace],
b0d3095f 3866 install_rpath : pkglibdir,
6164ec4c
ZJS
3867 install : true)
3868
3869public_programs += executable(
3870 'systemd-cgtop',
3871 'src/cgtop/cgtop.c',
3872 include_directories : includes,
3873 link_with : [libshared],
40c7d3c7 3874 dependencies : [userspace],
b0d3095f 3875 install_rpath : pkglibdir,
6164ec4c
ZJS
3876 install : true)
3877
3878executable(
3879 'systemd-initctl',
3880 'src/initctl/initctl.c',
3881 include_directories : includes,
3882 link_with : [libshared],
92148283 3883 dependencies : userspace,
b0d3095f 3884 install_rpath : pkglibdir,
6589a569 3885 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
b0d3095f 3886 install_dir : libexecdir)
5c23128d 3887
6164ec4c
ZJS
3888public_programs += executable(
3889 'systemd-mount',
3890 'src/mount/mount-tool.c',
3891 include_directories : includes,
3892 link_with : [libshared],
c47511da 3893 dependencies: [libmount,
40c7d3c7 3894 userspace],
b0d3095f 3895 install_rpath : pkglibdir,
6164ec4c 3896 install : true)
5c23128d 3897
7b76fce1 3898meson.add_install_script(meson_make_symlink,
fce9abb2 3899 'systemd-mount', bindir / 'systemd-umount')
7b76fce1 3900
6164ec4c
ZJS
3901public_programs += executable(
3902 'systemd-run',
3903 'src/run/run.c',
3904 include_directories : includes,
3905 link_with : [libshared],
40c7d3c7 3906 dependencies : [userspace],
b0d3095f 3907 install_rpath : pkglibdir,
6164ec4c
ZJS
3908 install : true)
3909
3910public_programs += executable(
3911 'systemd-stdio-bridge',
3912 'src/stdio-bridge/stdio-bridge.c',
3913 include_directories : includes,
3914 link_with : [libshared],
40c7d3c7 3915 dependencies : [userspace],
b0d3095f 3916 install_rpath : pkglibdir,
6164ec4c
ZJS
3917 install : true)
3918
3919public_programs += executable(
3920 'busctl',
f98df767 3921 busctl_sources,
6164ec4c
ZJS
3922 include_directories : includes,
3923 link_with : [libshared],
40c7d3c7 3924 dependencies : [userspace],
b0d3095f 3925 install_rpath : pkglibdir,
6164ec4c 3926 install : true)
5c23128d 3927
bd7e6aa7
ZJS
3928if enable_sysusers
3929 exe = executable(
6164ec4c
ZJS
3930 'systemd-sysusers',
3931 'src/sysusers/sysusers.c',
3932 include_directories : includes,
3933 link_with : [libshared],
40c7d3c7 3934 dependencies : [userspace],
b0d3095f
LB
3935 install_rpath : pkglibdir,
3936 install : true)
bd7e6aa7
ZJS
3937 public_programs += exe
3938
3939 if want_tests != 'false'
3940 test('test-sysusers',
3941 test_sysusers_sh,
3942 # https://github.com/mesonbuild/meson/issues/2681
3943 args : exe.full_path())
3944 endif
8ef8f3d5 3945
b62ee354
ZJS
3946 exe = executable(
3947 'systemd-sysusers.standalone',
3948 'src/sysusers/sysusers.c',
3949 include_directories : includes,
3950 c_args : '-DSTANDALONE',
3951 link_with : [libshared_static,
3952 libbasic,
3953 libbasic_gcrypt,
3954 libsystemd_static],
40c7d3c7 3955 dependencies : [userspace],
b62ee354 3956 build_by_default: have_standalone_binaries,
b0d3095f 3957 install : have_standalone_binaries)
8ef8f3d5 3958 if have_standalone_binaries
bd7e6aa7
ZJS
3959 public_programs += exe
3960
3961 if want_tests != 'false'
3962 test('test-sysusers.standalone',
3963 test_sysusers_sh,
3964 # https://github.com/mesonbuild/meson/issues/2681
3965 args : exe.full_path())
3966 endif
8ef8f3d5 3967 endif
5c23128d
ZJS
3968endif
3969
349cc4a5 3970if conf.get('ENABLE_TMPFILES') == 1
6164ec4c
ZJS
3971 exe = executable(
3972 'systemd-tmpfiles',
db64ba81 3973 systemd_tmpfiles_sources,
6164ec4c
ZJS
3974 include_directories : includes,
3975 link_with : [libshared],
c47511da 3976 dependencies : [libacl,
40c7d3c7 3977 userspace],
b0d3095f
LB
3978 install_rpath : pkglibdir,
3979 install : true)
5a8b1640 3980 public_programs += exe
d9daae55 3981
938be089
ZJS
3982 if want_tests != 'false'
3983 test('test-systemd-tmpfiles',
3984 test_systemd_tmpfiles_py,
3985 # https://github.com/mesonbuild/meson/issues/2681
3986 args : exe.full_path())
3987 endif
db64ba81 3988
b62ee354
ZJS
3989 exe = executable(
3990 'systemd-tmpfiles.standalone',
3991 systemd_tmpfiles_sources,
3992 include_directories : includes,
3993 c_args : '-DSTANDALONE',
3994 link_with : [libshared_static,
3995 libbasic,
3996 libbasic_gcrypt,
3997 libsystemd_static],
3998 dependencies : [libacl,
40c7d3c7 3999 userspace],
b62ee354 4000 build_by_default: have_standalone_binaries,
b0d3095f 4001 install : have_standalone_binaries)
db64ba81 4002 if have_standalone_binaries
bf93f24a
MG
4003 public_programs += exe
4004
4005 if want_tests != 'false'
4006 test('test-systemd-tmpfiles.standalone',
4007 test_systemd_tmpfiles_py,
4008 # https://github.com/mesonbuild/meson/issues/2681
4009 args : exe.full_path())
4010 endif
db64ba81 4011 endif
5c23128d
ZJS
4012endif
4013
349cc4a5 4014if conf.get('ENABLE_HWDB') == 1
ecd1bfdd 4015 systemd_hwdb = executable(
6164ec4c
ZJS
4016 'systemd-hwdb',
4017 'src/hwdb/hwdb.c',
6164ec4c 4018 include_directories : includes,
e4b127e2 4019 link_with : udev_link_with,
40c7d3c7 4020 dependencies : [userspace],
6164ec4c 4021 install_rpath : udev_rpath,
b0d3095f 4022 install : true)
ecd1bfdd
ZJS
4023 public_programs += systemd_hwdb
4024
4025 if want_tests != 'false'
4026 test('hwdb-test',
4027 hwdb_test_sh,
02e0f430 4028 suite : 'dist',
ecd1bfdd
ZJS
4029 args : [systemd_hwdb.full_path()],
4030 timeout : 90)
4031 endif
37efbbd8
ZJS
4032endif
4033
349cc4a5 4034if conf.get('ENABLE_QUOTACHECK') == 1
6164ec4c
ZJS
4035 executable(
4036 'systemd-quotacheck',
4037 'src/quotacheck/quotacheck.c',
4038 include_directories : includes,
4039 link_with : [libshared],
92148283 4040 dependencies : userspace,
b0d3095f 4041 install_rpath : pkglibdir,
6164ec4c 4042 install : true,
b0d3095f 4043 install_dir : libexecdir)
6164ec4c
ZJS
4044endif
4045
4046public_programs += executable(
4047 'systemd-socket-proxyd',
4048 'src/socket-proxy/socket-proxyd.c',
4049 include_directories : includes,
4050 link_with : [libshared],
c47511da 4051 dependencies : [threads,
40c7d3c7 4052 userspace],
b0d3095f 4053 install_rpath : pkglibdir,
6164ec4c 4054 install : true,
b0d3095f 4055 install_dir : libexecdir)
5c23128d 4056
9b264c1d 4057udevadm = executable(
6164ec4c
ZJS
4058 'udevadm',
4059 udevadm_sources,
6164ec4c 4060 include_directories : includes,
e4b127e2 4061 link_with : [libudevd_core],
92148283 4062 dependencies : [libacl,
c47511da 4063 libblkid,
92148283
JJ
4064 libidn,
4065 libkmod,
4066 threads,
40c7d3c7 4067 userspace],
6164ec4c 4068 install_rpath : udev_rpath,
b0d3095f 4069 install : true)
9b264c1d
FS
4070public_programs += udevadm
4071
9382642c
DL
4072if want_tests != 'false'
4073 test('udev-rules-check',
4074 udevadm,
02e0f430 4075 suite : 'dist',
9382642c
DL
4076 args : ['verify', '--resolve-names=never', all_rules])
4077endif
4078
9b264c1d
FS
4079if conf.get('ENABLE_REPART') == 1
4080 exe = executable(
4081 'systemd-repart',
4082 systemd_repart_sources,
4083 include_directories : includes,
f8cf3d19
LP
4084 link_with : [libshared,
4085 libshared_fdisk],
92148283 4086 dependencies : [libblkid,
b456191d 4087 libfdisk,
c47511da 4088 libopenssl,
92148283 4089 threads,
40c7d3c7 4090 userspace],
b0d3095f
LB
4091 install_rpath : pkglibdir,
4092 install : true)
9b264c1d 4093 public_programs += exe
3c3e14a7 4094
b62ee354
ZJS
4095 exe = executable(
4096 'systemd-repart.standalone',
4097 systemd_repart_sources,
4098 include_directories : includes,
4099 c_args : '-DSTANDALONE',
4100 link_with : [libshared_static,
4101 libbasic,
4102 libbasic_gcrypt,
4103 libsystemd_static,
4104 libshared_fdisk],
4105 dependencies : [libblkid,
4106 libfdisk,
4107 libopenssl,
4108 threads,
40c7d3c7 4109 userspace],
b62ee354 4110 build_by_default: have_standalone_binaries,
b0d3095f
LB
4111 install_rpath : pkglibdir,
4112 install : have_standalone_binaries)
3c3e14a7 4113 if have_standalone_binaries
9702d824 4114 public_programs += exe
3c3e14a7 4115 endif
9b264c1d 4116endif
6164ec4c
ZJS
4117
4118executable(
4119 'systemd-shutdown',
4120 systemd_shutdown_sources,
4121 include_directories : includes,
bac11cd6 4122 link_with : [libshared],
c47511da 4123 dependencies : [libmount,
40c7d3c7 4124 userspace],
b0d3095f 4125 install_rpath : pkglibdir,
6164ec4c 4126 install : true,
b0d3095f 4127 install_dir : libexecdir)
6164ec4c 4128
b62ee354
ZJS
4129executable(
4130 'systemd-shutdown.standalone',
4131 systemd_shutdown_sources,
4132 include_directories : includes,
4133 c_args : '-DSTANDALONE',
4134 link_with : [libshared_static,
4135 libbasic,
4136 libsystemd_static],
4137 dependencies : [libmount,
40c7d3c7 4138 userspace],
b62ee354 4139 build_by_default: have_standalone_binaries,
b0d3095f 4140 install_rpath : pkglibdir,
b62ee354 4141 install : have_standalone_binaries,
b0d3095f 4142 install_dir : libexecdir)
6ed3aca5 4143
6164ec4c
ZJS
4144executable(
4145 'systemd-update-done',
4146 'src/update-done/update-done.c',
4147 include_directories : includes,
4148 link_with : [libshared],
40c7d3c7 4149 dependencies : [userspace],
b0d3095f 4150 install_rpath : pkglibdir,
6164ec4c 4151 install : true,
b0d3095f 4152 install_dir : libexecdir)
6164ec4c
ZJS
4153
4154executable(
4155 'systemd-update-utmp',
4156 'src/update-utmp/update-utmp.c',
4157 include_directories : includes,
4158 link_with : [libshared],
c47511da 4159 dependencies : [libaudit,
40c7d3c7 4160 userspace],
b0d3095f 4161 install_rpath : pkglibdir,
55678b9e 4162 install : (conf.get('ENABLE_UTMP') == 1),
b0d3095f 4163 install_dir : libexecdir)
5c23128d 4164
349cc4a5 4165if conf.get('HAVE_KMOD') == 1
6164ec4c
ZJS
4166 executable(
4167 'systemd-modules-load',
4168 'src/modules-load/modules-load.c',
4169 include_directories : includes,
4170 link_with : [libshared],
c47511da 4171 dependencies : [libkmod,
40c7d3c7 4172 userspace],
b0d3095f 4173 install_rpath : pkglibdir,
6164ec4c 4174 install : true,
b0d3095f 4175 install_dir : libexecdir)
94e75a54 4176
7c22f07c
ZJS
4177 meson.add_install_script('sh', '-c',
4178 mkdir_p.format(modulesloaddir))
d7aa78c3 4179 if install_sysconfdir
7c22f07c 4180 meson.add_install_script('sh', '-c',
fce9abb2 4181 mkdir_p.format(sysconfdir / 'modules-load.d'))
d7aa78c3 4182 endif
5c23128d
ZJS
4183endif
4184
6164ec4c
ZJS
4185public_programs += executable(
4186 'systemd-nspawn',
4187 systemd_nspawn_sources,
4188 include_directories : includes,
bac11cd6 4189 link_with : [libnspawn_core,
6164ec4c
ZJS
4190 libshared],
4191 dependencies : [libblkid,
c47511da 4192 libseccomp,
40c7d3c7 4193 userspace],
b0d3095f 4194 install_rpath : pkglibdir,
6164ec4c 4195 install : true)
5c23128d 4196
349cc4a5 4197if conf.get('ENABLE_NETWORKD') == 1
9ff2b35f 4198 dbus_programs += executable(
6164ec4c
ZJS
4199 'systemd-networkd',
4200 systemd_networkd_sources,
8d40961c 4201 include_directories : network_includes,
6164ec4c
ZJS
4202 link_with : [libnetworkd_core,
4203 libsystemd_network,
6164ec4c 4204 networkd_link_with],
c47511da 4205 dependencies : [threads,
40c7d3c7 4206 userspace],
b0d3095f 4207 install_rpath : pkglibdir,
6164ec4c 4208 install : true,
b0d3095f 4209 install_dir : libexecdir)
6164ec4c 4210
3761002e 4211 public_programs += executable(
6164ec4c
ZJS
4212 'systemd-networkd-wait-online',
4213 systemd_networkd_wait_online_sources,
4214 include_directories : includes,
8d40961c 4215 link_with : [networkd_link_with],
40c7d3c7 4216 dependencies : [userspace],
b0d3095f 4217 install_rpath : pkglibdir,
6164ec4c 4218 install : true,
b0d3095f 4219 install_dir : libexecdir)
6164ec4c
ZJS
4220
4221 public_programs += executable(
4222 'networkctl',
4223 networkctl_sources,
8d40961c 4224 include_directories : libsystemd_network_includes,
6164ec4c
ZJS
4225 link_with : [libsystemd_network,
4226 networkd_link_with],
40c7d3c7 4227 dependencies : [userspace],
b0d3095f
LB
4228 install_rpath : pkglibdir,
4229 install : true)
987dd89c 4230endif
6164ec4c 4231
987dd89c
YW
4232exe = executable(
4233 'systemd-network-generator',
4234 network_generator_sources,
4235 include_directories : includes,
4236 link_with : [networkd_link_with],
40c7d3c7 4237 dependencies : [userspace],
b0d3095f 4238 install_rpath : pkglibdir,
987dd89c 4239 install : true,
b0d3095f 4240 install_dir : libexecdir)
fbaa1137 4241
987dd89c
YW
4242if want_tests != 'false'
4243 test('test-network-generator-conversion',
4244 test_network_generator_conversion_sh,
4245 # https://github.com/mesonbuild/meson/issues/2681
e93ada98
DDM
4246 args : exe.full_path(),
4247 depends : exe)
dcfe072a 4248endif
e821f6a9 4249
6164ec4c
ZJS
4250executable(
4251 'systemd-sulogin-shell',
73e994f2 4252 'src/sulogin-shell/sulogin-shell.c',
6164ec4c
ZJS
4253 include_directories : includes,
4254 link_with : [libshared],
40c7d3c7 4255 dependencies : [userspace],
b0d3095f 4256 install_rpath : pkglibdir,
6164ec4c 4257 install : true,
b0d3095f 4258 install_dir : libexecdir)
e821f6a9 4259
42551ea7 4260kernel_install = executable(
99d8cbce 4261 'kernel-install',
42551ea7
YW
4262 'src/kernel-install/kernel-install.c',
4263 include_directories : includes,
4264 link_with : [libshared],
40c7d3c7 4265 dependencies : [userspace],
b0d3095f
LB
4266 install_rpath : pkglibdir,
4267 install : want_kernel_install)
42551ea7 4268public_programs += kernel_install
f875e6bc 4269
f9a6cb0e 4270ukify = custom_target(
30ec2eae
ZJS
4271 'ukify',
4272 input : 'src/ukify/ukify.py',
4273 output : 'ukify',
4274 command : [jinja2_cmdline, '@INPUT@', '@OUTPUT@'],
9a01fe39 4275 install : want_ukify,
30ec2eae 4276 install_mode : 'rwxr-xr-x',
b0d3095f 4277 install_dir : libexecdir)
9a01fe39 4278if want_ukify
42551ea7 4279 public_programs += ukify
f9a6cb0e
ZJS
4280endif
4281
4282if want_tests != 'false' and want_kernel_install
42551ea7
YW
4283 args = [kernel_install.full_path(), loaderentry_install.full_path(), uki_copy_install]
4284 deps = [kernel_install, loaderentry_install]
3f80c139 4285 if want_ukify and boot_stubs.length() > 0
42551ea7
YW
4286 args += [ukify.full_path(), ukify_install.full_path(), boot_stubs[0]]
4287 deps += [ukify, ukify_install, boot_stubs[0]]
f9a6cb0e
ZJS
4288 endif
4289
4290 test('test-kernel-install',
4291 test_kernel_install_sh,
4292 env : test_env,
42551ea7
YW
4293 args : args,
4294 depends: deps)
30ec2eae
ZJS
4295endif
4296
69e96427
ZJS
4297############################################################
4298
e93ada98 4299runtest_env = custom_target(
e2d41370
FB
4300 'systemd-runtest.env',
4301 output : 'systemd-runtest.env',
0f4c4f38
ZJS
4302 command : [sh, '-c',
4303 '{ echo SYSTEMD_TEST_DATA=@0@; echo SYSTEMD_CATALOG_DIR=@1@; } >@OUTPUT@'.format(
fce9abb2
ZJS
4304 project_source_root / 'test',
4305 project_build_root / 'catalog')],
e93ada98 4306 depends : catalogs,
e2d41370
FB
4307 build_by_default : true)
4308
a626cb15
ZJS
4309test_cflags = ['-DTEST_CODE=1']
4310# We intentionally do not do inline initializations with definitions for a
4311# bunch of _cleanup_ variables in tests, to ensure valgrind is triggered if we
4312# use the variable unexpectedly. This triggers a lot of maybe-uninitialized
4313# false positives when the combination of -O2 and -flto is used. Suppress them.
b528a628 4314if '-O2' in c_args and '-flto=auto' in c_args
a626cb15
ZJS
4315 test_cflags += cc.first_supported_argument('-Wno-maybe-uninitialized')
4316endif
4317
c12e10d7 4318foreach test : simple_tests
822cd3ff 4319 tests += { 'sources' : [test] }
c12e10d7
JJ
4320endforeach
4321
0454cf05 4322TESTS = {}
822cd3ff
JJ
4323foreach test : tests
4324 sources = test.get('sources')
4325 condition = test.get('condition', '')
4326 type = test.get('type', '')
4327 base = test.get('base', {})
92148283
JJ
4328 deps = [
4329 base.get('dependencies', []),
4330 test.get('dependencies', []),
92148283 4331 ]
37efbbd8 4332
c20d2914 4333 name = fs.name(sources[0])
40c7d3c7
YW
4334 if name.endswith('.cc')
4335 deps += [versiondep]
4336 else
92148283
JJ
4337 deps += [userspace]
4338 endif
c20d2914 4339 name = fs.stem(name)
3b2bdd62 4340
ff5becf5 4341 suite = fs.name(fs.parent(sources[0])).replace('sd-', '')
c3191c6d 4342
822cd3ff 4343 if condition != '' and conf.get(condition) == 0
37efbbd8 4344 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
822cd3ff
JJ
4345 continue
4346 endif
4347
4348 exe = executable(
4349 name,
4350 sources,
4351 include_directories : [base.get('includes', []), test.get('includes', includes)],
4352 link_with : [base.get('link_with', []), test.get('link_with', libshared)],
92148283 4353 dependencies : deps,
822cd3ff
JJ
4354 c_args : [test_cflags, test.get('c_args', [])],
4355 build_by_default : want_tests != 'false',
b0d3095f 4356 install_rpath : pkglibdir,
822cd3ff 4357 install : install_tests,
26c2b302 4358 install_dir : unittestsdir / type,
822cd3ff
JJ
4359 link_depends : runtest_env)
4360
4361 if type == 'manual'
4362 message('@0@ is a manual test'.format(name))
4363 elif type == 'unsafe' and want_tests != 'unsafe'
4364 message('@0@ is an unsafe test'.format(name))
4365 elif want_tests != 'false'
4366 test(name, exe,
b0bd2ae8
ZJS
4367 env : test_env,
4368 timeout : test.get('timeout', 30),
4369 suite : suite,
4370 is_parallel : test.get('parallel', true))
37efbbd8 4371 endif
0454cf05
ZJS
4372
4373 TESTS += { name : exe }
69e96427
ZJS
4374endforeach
4375
0632b4cd 4376exe = executable(
37efbbd8
ZJS
4377 'test-libsystemd-sym',
4378 test_libsystemd_sym_c,
4379 include_directories : includes,
4380 link_with : [libsystemd],
92148283 4381 dependencies : userspace,
fd1939fb 4382 build_by_default : want_tests != 'false',
37efbbd8 4383 install : install_tests,
26c2b302 4384 install_dir : unittestsdir)
938be089
ZJS
4385if want_tests != 'false'
4386 test('test-libsystemd-sym', exe)
4387endif
37ab1a25 4388
0632b4cd
ZJS
4389exe = executable(
4390 'test-libsystemd-static-sym',
4391 test_libsystemd_sym_c,
4392 include_directories : includes,
0632b4cd 4393 link_with : [install_libsystemd_static],
92148283
JJ
4394 dependencies : [
4395 # threads is already included in dependencies on the library,
4396 # but does not seem to get propagated. Add here as a work-around.
4397 threads,
4398 userspace,
4399 ],
d37dee74
YW
4400 build_by_default : want_tests != 'false' and static_libsystemd != 'false',
4401 install : install_tests and static_libsystemd != 'false',
26c2b302 4402 install_dir : unittestsdir)
d37dee74 4403if want_tests != 'false' and static_libsystemd != 'false'
0632b4cd
ZJS
4404 test('test-libsystemd-static-sym', exe)
4405endif
37ab1a25 4406
0632b4cd 4407exe = executable(
37efbbd8
ZJS
4408 'test-libudev-sym',
4409 test_libudev_sym_c,
e4b127e2 4410 include_directories : libudev_includes,
a626cb15 4411 c_args : ['-Wno-deprecated-declarations'] + test_cflags,
37efbbd8 4412 link_with : [libudev],
92148283 4413 dependencies : userspace,
fd1939fb 4414 build_by_default : want_tests != 'false',
37efbbd8 4415 install : install_tests,
26c2b302 4416 install_dir : unittestsdir)
938be089
ZJS
4417if want_tests != 'false'
4418 test('test-libudev-sym', exe)
4419endif
0632b4cd
ZJS
4420
4421exe = executable(
4422 'test-libudev-static-sym',
4423 test_libudev_sym_c,
e4b127e2 4424 include_directories : libudev_includes,
a626cb15 4425 c_args : ['-Wno-deprecated-declarations'] + test_cflags,
0632b4cd 4426 link_with : [install_libudev_static],
92148283 4427 dependencies : userspace,
d37dee74
YW
4428 build_by_default : want_tests != 'false' and static_libudev != 'false',
4429 install : install_tests and static_libudev != 'false',
26c2b302 4430 install_dir : unittestsdir)
d37dee74 4431if want_tests != 'false' and static_libudev != 'false'
0632b4cd
ZJS
4432 test('test-libudev-static-sym', exe)
4433endif
e0bec52f 4434
0454cf05 4435if want_tests != 'false'
67b1c943 4436 exe = TESTS.get('udev-rule-runner')
0454cf05
ZJS
4437 test('test-udev',
4438 test_udev_py,
4439 args : ['-v'],
67b1c943
YW
4440 env : ['UDEV_RULE_RUNNER=' + exe.full_path()],
4441 depends : exe,
0454cf05
ZJS
4442 timeout : 180)
4443endif
4444
69e96427 4445############################################################
5c23128d 4446
a9a7153c 4447foreach fuzzer : simple_fuzzers
2ed35b2f 4448 fuzzers += { 'sources' : [fuzzer] }
a9a7153c
JJ
4449endforeach
4450
7db7d5b7
JR
4451fuzzer_exes = []
4452
2ed35b2f
JJ
4453foreach fuzzer : fuzzers
4454 sources = fuzzer.get('sources')
4455 base = fuzzer.get('base', {})
4456 dependencies = [base.get('dependencies', []), fuzzer.get('dependencies', [])]
7e299ffe
ZJS
4457 link_args = []
4458
4459 if want_ossfuzz
4460 dependencies += fuzzing_engine
4461 elif want_libfuzzer
4462 if fuzzing_engine.found()
9c5c4677
EV
4463 dependencies += fuzzing_engine
4464 else
7e299ffe 4465 link_args += ['-fsanitize=fuzzer']
9c5c4677 4466 endif
7e299ffe 4467 else
2ed35b2f 4468 sources += files('src/fuzz/fuzz-main.c')
7e299ffe 4469 endif
7e343b53 4470 sources += fuzz_generated_directives
7db7d5b7 4471
ff5becf5 4472 name = fs.stem(sources[0])
7db7d5b7 4473
f78ad5f0 4474 exe = executable(
7e299ffe
ZJS
4475 name,
4476 sources,
2ed35b2f
JJ
4477 include_directories : [
4478 base.get('includes', []),
4479 fuzzer.get('includes', includes),
4480 include_directories('src/fuzz'),
4481 ],
4482 link_with : [base.get('link_with', []), fuzzer.get('link_with', libshared)],
92148283
JJ
4483 dependencies : [
4484 dependencies,
4485 userspace,
92148283 4486 ],
2ed35b2f 4487 c_args : [test_cflags, fuzzer.get('c_args', [])],
7e299ffe
ZJS
4488 link_args: link_args,
4489 install : false,
f78ad5f0
ZJS
4490 build_by_default : fuzzer_build)
4491 fuzzer_exes += exe
4492
7db5761d 4493 if want_tests != 'false' and name in fuzz_regression_tests
f78ad5f0
ZJS
4494 # Run the fuzz regression tests without any sanitizers enabled.
4495 # Additional invocations with sanitizers may be added below.
7e343b53
MK
4496 foreach tuple : fuzz_regression_tests[name]
4497 fuzz_dir = tuple[0]
4498 fuzz_in = tuple[1]
7db5761d
MK
4499 test('@0@_@1@'.format(name, fuzz_in),
4500 exe,
ec2c6ac0 4501 suite : 'fuzz',
7e343b53
MK
4502 args : [fuzz_dir != '' ? project_source_root / fuzz_dir / name / fuzz_in
4503 : fuzz_generated_in_dir / '@0@_@1@'.format(name, fuzz_in)])
f78ad5f0
ZJS
4504 endforeach
4505 endif
7e299ffe 4506endforeach
7db7d5b7 4507
6839ce33 4508alias_target('fuzzers', fuzzer_exes)
7db7d5b7
JR
4509
4510############################################################
4511
10783aef
ZJS
4512subdir('docs/sysvinit')
4513subdir('docs/var-log')
4514subdir('hwdb.d')
4515subdir('man')
378e9d2b 4516subdir('modprobe.d')
10783aef
ZJS
4517subdir('network')
4518subdir('presets')
4519subdir('shell-completion/bash')
4520subdir('shell-completion/zsh')
5c23128d
ZJS
4521subdir('sysctl.d')
4522subdir('sysusers.d')
4523subdir('tmpfiles.d')
4f10b807 4524subdir('units')
5c23128d 4525
5c23128d
ZJS
4526install_subdir('factory/etc',
4527 install_dir : factorydir)
623370e6 4528subdir('factory/templates')
5c23128d 4529
d7aa78c3
JT
4530if install_sysconfdir
4531 install_data('xorg/50-systemd-user.sh',
4532 install_dir : xinitrcdir)
4533endif
f09eb768 4534install_data('LICENSE.GPL2',
5c23128d 4535 'LICENSE.LGPL2.1',
f09eb768
LP
4536 'NEWS',
4537 'README',
eea98402 4538 'docs/CODING_STYLE.md',
1d1cb168 4539 'docs/DISTRO_PORTING.md',
9e825ebf 4540 'docs/ENVIRONMENT.md',
5425f8a5 4541 'docs/HACKING.md',
9e825ebf 4542 'docs/TRANSIENT-SETTINGS.md',
b6dc0d7d 4543 'docs/TRANSLATORS.md',
9e825ebf 4544 'docs/UIDS-GIDS.md',
5c23128d 4545 install_dir : docdir)
d68b342b 4546
9c6e32a2
LB
4547install_subdir('LICENSES',
4548 install_dir : docdir)
4549
7c22f07c
ZJS
4550meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
4551meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
94e75a54 4552
d68b342b
ZJS
4553############################################################
4554
2d4efd1d
LB
4555# Ensure that changes to the docs/ directory do not break the
4556# basic Github pages build. But only run it in developer mode,
4557# as it might be fragile due to changes in the tooling, and it is
4558# not generally useful for users.
4559jekyll = find_program('jekyll', required : false)
4560if get_option('mode') == 'developer' and want_tests != 'false' and jekyll.found()
4561 test('github-pages',
4562 jekyll,
02e0f430 4563 suite : 'dist',
2d4efd1d 4564 args : ['build',
fce9abb2
ZJS
4565 '--source', project_source_root / 'docs',
4566 '--destination', project_build_root / '_site'])
2d4efd1d
LB
4567endif
4568
4569############################################################
4570
dd1e33c8 4571check_help = find_program('tools/check-help.sh')
ffb7406b 4572check_version = find_program('tools/check-version.sh')
005a29f2
ZJS
4573
4574foreach exec : public_programs
739a62bb 4575 name = fs.name(exec.full_path())
938be089
ZJS
4576 if want_tests != 'false'
4577 test('check-help-' + name,
dd1e33c8 4578 check_help,
02e0f430 4579 suite : 'dist',
e93ada98
DDM
4580 args : exec.full_path(),
4581 depends: exec)
ffb7406b
ZJS
4582
4583 test('check-version-' + name,
4584 check_version,
02e0f430 4585 suite : 'dist',
ffb7406b
ZJS
4586 args : [exec.full_path(),
4587 meson.project_version()],
4588 depends: exec)
938be089 4589 endif
005a29f2
ZJS
4590endforeach
4591
52d4d1d3 4592# Enable tests for all supported sanitizers
7db5761d 4593foreach tuple : fuzz_sanitizers
52d4d1d3
ZJS
4594 sanitizer = tuple[0]
4595 build = tuple[1]
b68dfb9e 4596
7a6397d2 4597 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
7db5761d
MK
4598 foreach fuzzer, fuzz_ins : fuzz_regression_tests
4599 name = '@0@:@1@'.format(fuzzer, sanitizer)
4600 if want_tests == 'false'
4601 message('Not compiling @0@ because tests is set to false'.format(name))
4602 continue
52d4d1d3 4603 endif
7db5761d
MK
4604 if not fuzz_tests
4605 message('Not compiling @0@ because fuzz-tests is set to false'.format(name))
4606 continue
4607 endif
4608 exe = custom_target(
4609 name,
4610 output : name,
7e343b53 4611 depends : [build] + fuzz_generated_directives,
7db5761d
MK
4612 command : [ln, '-fs',
4613 build.full_path() / fuzzer,
4614 '@OUTPUT@'],
4615 build_by_default : true)
4616
7e343b53
MK
4617 foreach tuple : fuzz_ins
4618 fuzz_dir = tuple[0]
4619 fuzz_in = tuple[1]
4620
7db5761d 4621 test('@0@_@1@_@2@'.format(fuzzer, fuzz_in, sanitizer),
52d4d1d3 4622 env,
14056a52 4623 suite : 'fuzz+san',
89767158
EV
4624 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
4625 timeout : 60,
52d4d1d3 4626 args : [exe.full_path(),
7e343b53
MK
4627 fuzz_dir != '' ? project_source_root / fuzz_dir / fuzzer / fuzz_in
4628 : fuzz_generated_in_dir / '@0@_@1@'.format(fuzzer, fuzz_in)])
7db5761d 4629 endforeach
52d4d1d3 4630 endforeach
b68dfb9e
ZJS
4631 endif
4632endforeach
4633
4634############################################################
4635
0700e8ba 4636if git.found()
37efbbd8 4637 all_files = run_command(
0f4c4f38
ZJS
4638 env, '-u', 'GIT_WORK_TREE',
4639 git, '--git-dir=@0@/.git'.format(project_source_root),
ba9ca60a 4640 'ls-files', ':/*.[ch]', ':/*.cc',
e92777d2
ZJS
4641 check : false)
4642 if all_files.returncode() == 0
4643 all_files = files(all_files.stdout().split())
4644
4645 custom_target(
4646 'tags',
4647 output : 'tags',
4648 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
4649 run_target(
4650 'ctags',
691db9a7 4651 command : [env, 'ctags', '--tag-relative=never', '-o', '@0@/tags'.format(project_source_root)] + all_files)
60892358
ZJS
4652
4653 ############################################
4654
4655 if want_tests != 'false' and conf.get('BUILD_MODE_DEVELOPER') == 1
4656 test('check-includes',
4657 files('tools/check-includes.py'),
4658 args: all_files,
4659 env : ['PROJECT_SOURCE_ROOT=@0@'.format(project_source_root)])
4660 endif
e92777d2 4661 endif
177929c2 4662
60892358
ZJS
4663 ####################################################
4664
dd1e33c8 4665 git_contrib_sh = find_program('tools/git-contrib.sh')
a923e085 4666 run_target(
37efbbd8 4667 'git-contrib',
dd1e33c8 4668 command : [git_contrib_sh])
dd6ab3df 4669
60892358
ZJS
4670 ####################################################
4671
dd6ab3df 4672 git_head = run_command(
e92777d2
ZJS
4673 git, '--git-dir=@0@/.git'.format(project_source_root),
4674 'rev-parse', 'HEAD',
4675 check : false).stdout().strip()
dd6ab3df 4676 git_head_short = run_command(
e92777d2
ZJS
4677 git, '--git-dir=@0@/.git'.format(project_source_root),
4678 'rev-parse', '--short=7', 'HEAD',
4679 check : false).stdout().strip()
dd6ab3df
ZJS
4680
4681 run_target(
4682 'git-snapshot',
0f4c4f38 4683 command : [git, 'archive',
1485aacb 4684 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
dd6ab3df
ZJS
4685 git_head_short),
4686 '--prefix', 'systemd-@0@/'.format(git_head),
4687 'HEAD'])
4688endif
829257d1
ZJS
4689
4690############################################################
4691
dd1e33c8 4692check_api_docs_sh = find_program('tools/check-api-docs.sh')
51b13863
LP
4693run_target(
4694 'check-api-docs',
4695 depends : [man, libsystemd, libudev],
dd1e33c8 4696 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
51b13863 4697
f12c5d36
ZJS
4698alias_target('update-dbus-docs', update_dbus_docs)
4699alias_target('update-man-rules', update_man_rules)
e3c368f6 4700
0628d48e
LB
4701if not meson.is_cross_build()
4702 custom_target(
4703 'export-dbus-interfaces',
4645074e 4704 output : fs.name(dbus_interfaces_dir),
0628d48e 4705 install : dbus_interfaces_dir != 'no',
4645074e 4706 install_dir : fs.parent(dbus_interfaces_dir),
0628d48e
LB
4707 command : [export_dbus_interfaces_py, '@OUTPUT@', dbus_programs])
4708endif
e3c68924 4709
51b13863 4710############################################################
829257d1 4711
e92777d2
ZJS
4712alt_time_epoch = run_command('date', '-Is', '-u', '-d', '@@0@'.format(time_epoch),
4713 check : true).stdout().strip()
12085ebb
ZJS
4714
4715summary({
12085ebb
ZJS
4716 'split bin-sbin' : split_bin,
4717 'prefix directory' : prefixdir,
12085ebb
ZJS
4718 'sysconf directory' : sysconfdir,
4719 'include directory' : includedir,
4720 'lib directory' : libdir,
12085ebb
ZJS
4721 'SysV init scripts' : sysvinit_path,
4722 'SysV rc?.d directories' : sysvrcnd_path,
4723 'PAM modules directory' : pamlibdir,
4724 'PAM configuration directory' : pamconfdir,
4725 'libcryptsetup plugins directory' : libcryptsetup_plugins_dir,
4726 'RPM macros directory' : rpmmacrosdir,
4727 'modprobe.d directory' : modprobedir,
4728 'D-Bus policy directory' : dbuspolicydir,
4729 'D-Bus session directory' : dbussessionservicedir,
4730 'D-Bus system directory' : dbussystemservicedir,
7e560e79 4731 'D-Bus interfaces directory' : dbus_interfaces_dir,
12085ebb
ZJS
4732 'bash completions directory' : bashcompletiondir,
4733 'zsh completions directory' : zshcompletiondir,
a2b0cd3f 4734 'private shared lib version tag' : shared_lib_tag,
12085ebb
ZJS
4735 'extra start script' : get_option('rc-local'),
4736 'debug shell' : '@0@ @ @1@'.format(get_option('debug-shell'),
4737 get_option('debug-tty')),
4738 'system UIDs' : '<=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_UID_MAX'),
4739 conf.get('SYSTEM_ALLOC_UID_MIN')),
4740 'system GIDs' : '<=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_GID_MAX'),
4741 conf.get('SYSTEM_ALLOC_GID_MIN')),
4742 'dynamic UIDs' : '@0@…@1@'.format(dynamic_uid_min, dynamic_uid_max),
4743 'container UID bases' : '@0@…@1@'.format(container_uid_base_min, container_uid_base_max),
4744 'static UID/GID allocations' : ' '.join(static_ugids),
4745 '/dev/kvm access mode' : get_option('dev-kvm-mode'),
4746 'render group access mode' : get_option('group-render-mode'),
4747 'certificate root directory' : get_option('certificate-root'),
4748 'support URL' : support_url,
4749 'nobody user name' : nobody_user,
4750 'nobody group name' : nobody_group,
4751 'fallback hostname' : get_option('fallback-hostname'),
9798deaf 4752 'default compression method' : compression,
12085ebb
ZJS
4753 'default DNSSEC mode' : default_dnssec,
4754 'default DNS-over-TLS mode' : default_dns_over_tls,
4755 'default mDNS mode' : default_mdns,
4756 'default LLMNR mode' : default_llmnr,
4757 'default DNS servers' : dns_servers.split(' '),
4758 'default NTP servers' : ntp_servers.split(' '),
4759 'default cgroup hierarchy' : default_hierarchy,
4760 'default net.naming-scheme value' : default_net_naming_scheme,
4761 'default KillUserProcesses value' : kill_user_processes,
4762 'default locale' : default_locale,
88b6f0de 4763 'default nspawn locale' : nspawn_locale,
79dec86a 4764 'default status unit format' : status_unit_format_default,
12085ebb
ZJS
4765 'default user $PATH' :
4766 default_user_path != '' ? default_user_path : '(same as system services)',
4767 'systemd service watchdog' : service_watchdog == '' ? 'disabled' : service_watchdog,
4768 'time epoch' : '@0@ (@1@)'.format(time_epoch, alt_time_epoch)})
829257d1
ZJS
4769
4770# TODO:
4771# CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
4772# CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
4773# LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
4774
829257d1
ZJS
4775found = []
4776missing = []
4777
4778foreach tuple : [
56d68e71
ZJS
4779 # dependencies
4780 ['ACL'],
829257d1 4781 ['AUDIT'],
829257d1 4782 ['AppArmor'],
56d68e71
ZJS
4783 ['IMA'],
4784 ['PAM'],
829257d1 4785 ['SECCOMP'],
56d68e71 4786 ['SELinux'],
829257d1 4787 ['SMACK'],
56d68e71
ZJS
4788 ['blkid'],
4789 ['elfutils'],
829257d1 4790 ['gcrypt'],
829257d1 4791 ['gnutls'],
7d861e12 4792 ['libbpf'],
56d68e71 4793 ['libcryptsetup'],
d1ae38d8 4794 ['libcryptsetup-plugins'],
829257d1 4795 ['libcurl'],
56d68e71
ZJS
4796 ['libfdisk'],
4797 ['libfido2'],
829257d1 4798 ['libidn'],
56d68e71 4799 ['libidn2'],
829257d1 4800 ['libiptc'],
56d68e71
ZJS
4801 ['microhttpd'],
4802 ['openssl'],
4803 ['p11kit'],
1d8aae43 4804 ['passwdqc'],
56d68e71
ZJS
4805 ['pcre2'],
4806 ['pwquality'],
4807 ['qrencode'],
4808 ['tpm2'],
4809 ['xkbcommon'],
4810
4811 # compression libs
4812 ['zstd'],
4813 ['lz4'],
4814 ['xz'],
4815 ['zlib'],
4816 ['bzip2'],
4817
4818 # components
4819 ['backlight'],
829257d1 4820 ['binfmt'],
dfca5587 4821 ['bootloader'],
0a0d4899 4822 ['bpf-framework', conf.get('BPF_FRAMEWORK') == 1],
56d68e71 4823 ['coredump'],
56d68e71 4824 ['efi'],
dfca5587 4825 ['environment.d'],
829257d1 4826 ['firstboot'],
56d68e71
ZJS
4827 ['hibernate'],
4828 ['homed'],
4829 ['hostnamed'],
4830 ['hwdb'],
4831 ['importd'],
4832 ['initrd'],
f887eab1 4833 ['kernel-install'],
56d68e71 4834 ['localed'],
829257d1
ZJS
4835 ['logind'],
4836 ['machined'],
56d68e71
ZJS
4837 ['networkd'],
4838 ['nss-myhostname'],
4839 ['nss-mymachines'],
4840 ['nss-resolve'],
4841 ['nss-systemd'],
4842 ['oomd'],
61d0578b 4843 ['portabled'],
56d68e71
ZJS
4844 ['pstore'],
4845 ['quotacheck'],
4846 ['randomseed'],
4847 ['repart'],
4848 ['resolve'],
4849 ['rfkill'],
9bca4ae4 4850 ['sysext'],
0a0d4899 4851 ['systemd-analyze', conf.get('ENABLE_ANALYZE') == 1],
43cc7a3e 4852 ['sysupdate'],
56d68e71 4853 ['sysusers'],
829257d1
ZJS
4854 ['timedated'],
4855 ['timesyncd'],
56d68e71
ZJS
4856 ['tmpfiles'],
4857 ['userdb'],
4858 ['vconsole'],
4859 ['xdg-autostart'],
4860
4861 # optional features
56d68e71 4862 ['idn'],
829257d1 4863 ['polkit'],
56d68e71 4864 ['nscd'],
0a0d4899 4865 ['legacy-pkla', install_polkit_pkla],
829257d1 4866 ['kmod'],
ede5a78f 4867 ['xenctrl'],
829257d1
ZJS
4868 ['dbus'],
4869 ['glib'],
829257d1 4870 ['tpm'],
0a0d4899
JH
4871 ['man pages', want_man],
4872 ['html pages', want_html],
4873 ['man page indices', want_man and have_lxml],
829257d1 4874 ['SysV compat'],
56d68e71 4875 ['compat-mutable-uid-boundaries'],
829257d1
ZJS
4876 ['utmp'],
4877 ['ldconfig'],
0a0d4899
JH
4878 ['adm group', get_option('adm-group')],
4879 ['wheel group', get_option('wheel-group')],
b14e1b43 4880 ['gshadow'],
829257d1
ZJS
4881 ['debug hashmap'],
4882 ['debug mmap cache'],
d6601495 4883 ['debug siphash'],
0a0d4899 4884 ['trace logging', conf.get('LOG_TRACE') == 1],
69525346
YW
4885 ['slow tests', slow_tests],
4886 ['fuzz tests', fuzz_tests],
0a0d4899
JH
4887 ['install tests', install_tests],
4888 ['link-udev-shared', get_option('link-udev-shared')],
4889 ['link-systemctl-shared', get_option('link-systemctl-shared')],
4890 ['link-networkd-shared', get_option('link-networkd-shared')],
4891 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
4892 ['link-journalctl-shared', get_option('link-journalctl-shared')],
4893 ['link-boot-shared', get_option('link-boot-shared')],
c06d2e44 4894 ['link-portabled-shared', get_option('link-portabled-shared')],
93651582 4895 ['first-boot-full-preset'],
ceedbf81 4896 ['fexecve'],
0a0d4899
JH
4897 ['standalone-binaries', get_option('standalone-binaries')],
4898 ['coverage', get_option('b_coverage')],
829257d1
ZJS
4899]
4900
af4d7860
ZJS
4901 if tuple.length() >= 2
4902 cond = tuple[1]
4903 else
829257d1
ZJS
4904 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
4905 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
349cc4a5 4906 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
829257d1
ZJS
4907 endif
4908 if cond
5a8b1640 4909 found += tuple[0]
829257d1 4910 else
5a8b1640 4911 missing += tuple[0]
829257d1
ZJS
4912 endif
4913endforeach
4914
c716c253
ZJS
4915if static_libsystemd == 'false'
4916 missing += 'static-libsystemd'
4917else
4918 found += 'static-libsystemd(@0@)'.format(static_libsystemd)
4919endif
4920
4921if static_libudev == 'false'
4922 missing += 'static-libudev'
4923else
4924 found += 'static-libudev(@0@)'.format(static_libudev)
4925endif
4926
57633d23
ZJS
4927if conf.get('HAVE_OPENSSL_OR_GCRYPT') == 1 and conf.get('PREFER_OPENSSL') == 1
4928 found += 'cryptolib(openssl)'
4929elif conf.get('HAVE_OPENSSL_OR_GCRYPT') == 1
4930 found += 'cryptolib(gcrypt)'
4931else
4932 missing += 'cryptolib'
4933endif
4934
237f2da9
ZJS
4935if conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1
4936 found += 'DNS-over-TLS(gnutls)'
4937elif conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1
4938 found += 'DNS-over-TLS(openssl)'
4939else
4940 missing += 'DNS-over-TLS'
4941endif
4942
12085ebb
ZJS
4943summary({
4944 'enabled' : ', '.join(found),
4945 'disabled' : ', '.join(missing)},
4946 section : 'Features')