]> git.ipfire.org Git - thirdparty/systemd.git/blame - meson.build
meson: move declarations of hibernate-resume
[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 = []
c335921e
YW
2177modules = [] # nss, pam, and other plugins
2178executables = []
2179executables_by_name = {}
1d21a7bd 2180
b61016f2
YW
2181# binaries that have --help and are intended for use by humans,
2182# usually, but not always, installed in /bin.
2183public_programs = []
2184
e3c68924 2185# D-Bus introspection XML export
2186dbus_programs = []
e3c68924 2187
3f80c139
ZJS
2188# A list of boot stubs. Required for testing of ukify.
2189boot_stubs = []
2190
8d40961c
YW
2191basic_includes = include_directories(
2192 'src/basic',
e5bc5f1f 2193 'src/fundamental',
8d40961c
YW
2194 'src/systemd',
2195 '.')
2196
2197libsystemd_includes = [basic_includes, include_directories(
2198 'src/libsystemd/sd-bus',
2199 'src/libsystemd/sd-device',
2200 'src/libsystemd/sd-event',
2201 'src/libsystemd/sd-hwdb',
2202 'src/libsystemd/sd-id128',
2203 'src/libsystemd/sd-journal',
2204 'src/libsystemd/sd-netlink',
2205 'src/libsystemd/sd-network',
2206 'src/libsystemd/sd-resolve')]
2207
2208includes = [libsystemd_includes, include_directories('src/shared')]
5c23128d 2209
5c23128d
ZJS
2210subdir('po')
2211subdir('catalog')
dfca5587 2212subdir('src/fundamental')
5c23128d
ZJS
2213subdir('src/basic')
2214subdir('src/libsystemd')
3976f372
YW
2215subdir('src/shared')
2216subdir('src/udev')
2217subdir('src/libudev')
5c23128d 2218
5c23128d 2219libsystemd = shared_library(
37efbbd8 2220 'systemd',
56d50ab1 2221 version : libsystemd_version,
8d40961c 2222 include_directories : libsystemd_includes,
37efbbd8
ZJS
2223 link_args : ['-shared',
2224 '-Wl,--version-script=' + libsystemd_sym_path],
34e221a5 2225 link_with : [libbasic,
acc50c92
LP
2226 libbasic_gcrypt,
2227 libbasic_compress],
99b9f8fd 2228 link_whole : [libsystemd_static],
92148283
JJ
2229 dependencies : [librt,
2230 threads,
2231 userspace],
37efbbd8
ZJS
2232 link_depends : libsystemd_sym,
2233 install : true,
0a5e638c 2234 install_tag: 'libsystemd',
b0d3095f 2235 install_dir : libdir)
5c23128d 2236
039f1673
LB
2237alias_target('libsystemd', libsystemd)
2238
70848ecf
DC
2239install_libsystemd_static = static_library(
2240 'systemd',
2241 libsystemd_sources,
975464e0
ZJS
2242 basic_sources,
2243 basic_gcrypt_sources,
acc50c92 2244 basic_compress_sources,
e5bc5f1f 2245 fundamental_sources,
8d40961c 2246 include_directories : libsystemd_includes,
70848ecf
DC
2247 build_by_default : static_libsystemd != 'false',
2248 install : static_libsystemd != 'false',
0a5e638c 2249 install_tag: 'libsystemd',
b0d3095f 2250 install_dir : libdir,
40dbce36 2251 pic : static_libsystemd_pic,
92148283 2252 dependencies : [libblkid,
975464e0 2253 libcap,
92148283 2254 libdl,
011d129c 2255 libgcrypt,
92148283
JJ
2256 liblz4,
2257 libmount,
c47511da 2258 libopenssl,
92148283
JJ
2259 librt,
2260 libxz,
2261 libzstd,
2262 threads,
40c7d3c7 2263 userspace],
70848ecf
DC
2264 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
2265
3976f372
YW
2266libudev = shared_library(
2267 'udev',
3976f372
YW
2268 version : libudev_version,
2269 include_directories : includes,
2270 link_args : ['-shared',
2271 '-Wl,--version-script=' + libudev_sym_path],
2272 link_with : [libsystemd_static, libshared_static],
2273 link_whole : libudev_basic,
92148283
JJ
2274 dependencies : [threads,
2275 userspace],
3976f372
YW
2276 link_depends : libudev_sym,
2277 install : true,
0a5e638c 2278 install_tag: 'libudev',
b0d3095f 2279 install_dir : libdir)
3976f372 2280
039f1673
LB
2281alias_target('libudev', libudev)
2282
3976f372
YW
2283install_libudev_static = static_library(
2284 'udev',
2285 basic_sources,
e5bc5f1f 2286 fundamental_sources,
3976f372
YW
2287 shared_sources,
2288 libsystemd_sources,
2289 libudev_sources,
3976f372
YW
2290 include_directories : includes,
2291 build_by_default : static_libudev != 'false',
2292 install : static_libudev != 'false',
0a5e638c 2293 install_tag: 'libudev',
b0d3095f 2294 install_dir : libdir,
3976f372 2295 link_depends : libudev_sym,
92148283
JJ
2296 dependencies : [libmount,
2297 libshared_deps,
40c7d3c7 2298 userspace],
3976f372
YW
2299 c_args : static_libudev_pic ? [] : ['-fno-PIC'],
2300 pic : static_libudev_pic)
2301
47354b44
ZJS
2302############################################################
2303
c335921e
YW
2304executable_template = {
2305 'include_directories' : includes,
2306 'link_with' : libshared,
2307 'install_rpath' : pkglibdir,
2308 'install' : true,
2309}
2310
2311generator_template = executable_template + {
2312 'install_dir' : systemgeneratordir,
2313}
2314
2315libexec_template = executable_template + {
2316 'install_dir' : libexecdir,
2317}
2318
2319executable_additional_kwargs = {
2320 'dependencies' : userspace,
2321}
2322
2323nss_template = {
2324 'version' : '2',
2325 'include_directories' : includes,
2326 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
2327 'link_args' : ['-z', 'nodelete'],
2328 'link_with' : [
2329 libsystemd_static,
2330 libshared_static,
2331 libbasic,
2332 ],
2333 'dependencies' : [
2334 librt,
2335 threads,
2336 ],
2337 'install' : true,
2338 'install_tag' : 'nss',
2339 'install_dir' : libdir,
2340}
2341
2342pam_template = {
2343 'name_prefix' : '',
2344 'include_directories' : includes,
2345 'link_with' : [
2346 libsystemd_static,
2347 libshared_static,
2348 ],
2349 'dependencies' : [
2350 libpam_misc,
2351 libpam,
2352 threads,
2353 ],
2354 'install' : true,
2355 'install_tag' : 'pam',
2356 'install_dir' : pamlibdir,
2357}
2358
2359module_additional_kwargs = {
2360 'link_args' : ['-shared'],
2361 'dependencies' : userspace,
2362}
2363
2364############################################################
2365
b61016f2 2366# systemd-analyze requires 'libcore'
83b6af36 2367subdir('src/core')
b61016f2
YW
2368# systemd-journal-remote requires 'libjournal_core'
2369subdir('src/journal')
2370# systemd-networkd requires 'libsystemd_network'
2371subdir('src/libsystemd-network')
83b6af36
ZJS
2372
2373subdir('src/analyze')
cd4300f3 2374subdir('src/boot')
dfca5587 2375subdir('src/boot/efi')
f98df767 2376subdir('src/busctl')
b61016f2 2377subdir('src/coredump')
2ad279cf 2378subdir('src/cryptenroll')
b4d1892a 2379subdir('src/cryptsetup')
2a456620
YW
2380subdir('src/debug-generator')
2381subdir('src/environment-d-generator')
2382subdir('src/fstab-generator')
2383subdir('src/getty-generator')
74093422 2384subdir('src/hibernate-resume')
b61016f2 2385subdir('src/home')
83b6af36
ZJS
2386subdir('src/hostname')
2387subdir('src/import')
b61016f2 2388subdir('src/journal-remote')
83b6af36
ZJS
2389subdir('src/kernel-install')
2390subdir('src/locale')
b61016f2 2391subdir('src/login')
83b6af36 2392subdir('src/machine')
b61016f2 2393subdir('src/network')
83b6af36 2394subdir('src/nspawn')
2080c097
YW
2395subdir('src/nss-myhostname')
2396subdir('src/nss-mymachines')
2397subdir('src/nss-resolve')
2398subdir('src/nss-systemd')
b61016f2
YW
2399subdir('src/oom')
2400subdir('src/partition')
2401subdir('src/portable')
2402subdir('src/pstore')
83b6af36 2403subdir('src/resolve')
2a9b4bbe 2404subdir('src/rpm')
2a456620 2405subdir('src/run-generator')
b61016f2 2406subdir('src/shutdown')
9bca4ae4 2407subdir('src/sysext')
c3512573 2408subdir('src/systemctl')
43cc7a3e 2409subdir('src/sysupdate')
83b6af36
ZJS
2410subdir('src/timedate')
2411subdir('src/timesync')
db64ba81 2412subdir('src/tmpfiles')
b61016f2 2413subdir('src/userdb')
0275e918 2414subdir('src/xdg-autostart-generator')
83b6af36 2415
3976f372
YW
2416subdir('src/systemd')
2417
83b6af36 2418subdir('src/test')
7db7d5b7 2419subdir('src/fuzz')
ef2ad30a 2420subdir('rules.d')
83b6af36 2421subdir('test')
a1d6dbb1 2422subdir('src/ukify/test') # needs to be last for test_env variable
83b6af36 2423
d30d9bf0
LB
2424alias_target('devel', libsystemd_pc, libudev_pc, systemd_pc, udev_pc)
2425
83b6af36
ZJS
2426############################################################
2427
c335921e
YW
2428foreach dict : executables
2429 name = dict.get('name')
2430
2431 build = true
2432 foreach cond : dict.get('conditions', [])
2433 if conf.get(cond) != 1
2434 build = false
2435 break
2436 endif
2437 endforeach
2438 if not build
2439 continue
2440 endif
2441
2442 kwargs = {}
2443 foreach key, val : dict
2444 if key in ['name', 'dbus', 'public', 'conditions']
2445 continue
2446 endif
2447 kwargs += { key : val }
2448 endforeach
2449
2450 foreach key, val : executable_additional_kwargs
2451 kwargs += { key : [ kwargs.get(key, []), val ]}
2452 endforeach
2453
2454 exe = executable(
2455 name,
2456 kwargs : kwargs,
2457 )
2458
2459 executables_by_name += { name : exe }
2460
2461 if dict.get('build_by_default', true)
2462 if dict.get('dbus', false)
2463 dbus_programs += exe
2464 endif
2465 if dict.get('public', false)
2466 public_programs += exe
2467 endif
2468 endif
2469endforeach
2470
2471############################################################
2472
83b6af36
ZJS
2473# only static linking apart from libdl, to make sure that the
2474# module is linked to all libraries that it uses.
2475test_dlopen = executable(
37efbbd8
ZJS
2476 'test-dlopen',
2477 test_dlopen_c,
2478 include_directories : includes,
2479 link_with : [libbasic],
92148283
JJ
2480 dependencies : [libdl,
2481 userspace],
fd1939fb 2482 build_by_default : want_tests != 'false')
83b6af36 2483
c335921e
YW
2484foreach dict : modules
2485 name = dict.get('name')
2486 is_nss = name.startswith('nss_')
2487 is_pam = name.startswith('pam_')
2488
2489 build = true
2490 foreach cond : dict.get('conditions', [])
2491 if conf.get(cond) != 1
2492 build = false
2493 break
2494 endif
2495 endforeach
2496 if not build
2497 continue
2498 endif
2499
2500 kwargs = {}
2501 foreach key, val : dict
2502 if key in ['name', 'conditions']
2503 continue
2504 endif
2505 kwargs += { key : val }
2506 endforeach
2507
2508 sym = meson.current_source_dir() / '@0@'.format(dict.get('link_depends')[0])
2509 kwargs += {
2510 'link_args' : [
2511 kwargs.get('link_args', []),
2512 '-Wl,--version-script=' + sym,
2513 ],
2514 }
2515 foreach key, val : module_additional_kwargs
2516 kwargs += { key : [ kwargs.get(key, []), val ]}
2517 endforeach
2518
2519 lib = shared_library(
2520 name,
2521 kwargs : kwargs,
2522 )
2523
2524 if is_nss
2525 # We cannot use shared_module because it does not support version suffix.
2526 # Unfortunately shared_library insists on creating the symlink…
2527 meson.add_install_script('sh', '-c', 'rm $DESTDIR@0@/lib@1@.so'.format(libdir, name),
2528 install_tag : 'nss')
2529 endif
2530
2531 if want_tests != 'false' and (is_nss or is_pam)
2532 test('dlopen-' + name,
2533 test_dlopen,
2534 # path to dlopen must include a slash
2535 args : lib.full_path(),
2536 depends : lib)
2537 endif
2538endforeach
2539
5c23128d
ZJS
2540############################################################
2541
4e8295f4 2542if want_tests != 'false'
f727f3b9 2543 exe = executables_by_name.get('systemd-analyze')
4e8295f4
ZJS
2544 test('test-compare-versions',
2545 test_compare_versions_sh,
2546 args : exe.full_path())
2547endif
35a1ff4c 2548
8cc8a073 2549if want_tests != 'false'
2a456620 2550 exe = executables_by_name.get('systemd-fstab-generator')
8cc8a073
YW
2551 test('test-fstab-generator',
2552 test_fstab_generator_sh,
2553 # https://github.com/mesonbuild/meson/issues/2681
e93ada98 2554 args : exe.full_path(),
e290bdb7 2555 env : test_env,
e93ada98 2556 depends : exe)
8cc8a073
YW
2557endif
2558
349cc4a5 2559if conf.get('HAVE_BLKID') == 1
6164ec4c
ZJS
2560 executable(
2561 'systemd-gpt-auto-generator',
2562 'src/gpt-auto-generator/gpt-auto-generator.c',
6164ec4c
ZJS
2563 include_directories : includes,
2564 link_with : [libshared],
92148283
JJ
2565 dependencies : [libblkid,
2566 userspace],
b0d3095f 2567 install_rpath : pkglibdir,
6164ec4c
ZJS
2568 install : true,
2569 install_dir : systemgeneratordir)
2570
2571 public_programs += executable(
2572 'systemd-dissect',
2573 'src/dissect/dissect.c',
2574 include_directories : includes,
2575 link_with : [libshared],
40c7d3c7 2576 dependencies : [userspace],
b0d3095f 2577 install_rpath : pkglibdir,
5a151082 2578 install : true)
a164d9d5
LP
2579
2580 meson.add_install_script(meson_make_symlink,
2581 bindir / 'systemd-dissect',
b0d3095f 2582 sbindir / 'mount.ddi')
5c23128d
ZJS
2583endif
2584
1ec57f33 2585if conf.get('ENABLE_RESOLVE') == 1
e3c68924 2586 dbus_programs += executable(
6164ec4c
ZJS
2587 'systemd-resolved',
2588 systemd_resolved_sources,
8d40961c 2589 include_directories : resolve_includes,
6164ec4c
ZJS
2590 link_with : [libshared,
2591 libbasic_gcrypt,
2592 libsystemd_resolve_core],
92148283
JJ
2593 dependencies : [systemd_resolved_dependencies,
2594 userspace],
b0d3095f 2595 install_rpath : pkglibdir,
6164ec4c 2596 install : true,
b0d3095f 2597 install_dir : libexecdir)
6164ec4c
ZJS
2598
2599 public_programs += executable(
2600 'resolvectl',
2601 resolvectl_sources,
2602 include_directories : includes,
2603 link_with : [libshared,
2604 libbasic_gcrypt,
2605 libsystemd_resolve_core],
92148283 2606 dependencies : [lib_openssl_or_gcrypt,
c47511da 2607 libidn,
92148283
JJ
2608 libm,
2609 threads,
40c7d3c7 2610 userspace],
b0d3095f 2611 install_rpath : pkglibdir,
6164ec4c 2612 install : true)
088c1363
LP
2613
2614 meson.add_install_script(meson_make_symlink,
fce9abb2 2615 bindir / 'resolvectl',
b0d3095f 2616 sbindir / 'resolvconf')
c2e84cab
YW
2617
2618 meson.add_install_script(meson_make_symlink,
fce9abb2
ZJS
2619 bindir / 'resolvectl',
2620 bindir / 'systemd-resolve')
5c23128d
ZJS
2621endif
2622
349cc4a5 2623if conf.get('ENABLE_LOGIND') == 1
e3c68924 2624 dbus_programs += executable(
6164ec4c
ZJS
2625 'systemd-logind',
2626 systemd_logind_sources,
2627 include_directories : includes,
2628 link_with : [liblogind_core,
2629 libshared],
92148283
JJ
2630 dependencies : [libacl,
2631 threads,
40c7d3c7 2632 userspace],
b0d3095f 2633 install_rpath : pkglibdir,
6164ec4c 2634 install : true,
b0d3095f 2635 install_dir : libexecdir)
6164ec4c
ZJS
2636
2637 public_programs += executable(
2638 'loginctl',
2639 loginctl_sources,
2640 include_directories : includes,
2641 link_with : [libshared],
92148283 2642 dependencies : [liblz4,
ef5924aa 2643 libxz,
c47511da 2644 libzstd,
92148283 2645 threads,
40c7d3c7 2646 userspace],
b0d3095f
LB
2647 install_rpath : pkglibdir,
2648 install : true)
6164ec4c
ZJS
2649
2650 public_programs += executable(
2651 'systemd-inhibit',
2652 'src/login/inhibit.c',
2653 include_directories : includes,
2654 link_with : [libshared],
40c7d3c7 2655 dependencies : [userspace],
b0d3095f
LB
2656 install_rpath : pkglibdir,
2657 install : true)
37efbbd8 2658
349cc4a5 2659 if conf.get('HAVE_PAM') == 1
fce9abb2 2660 version_script_arg = project_source_root / pam_systemd_sym
37efbbd8
ZJS
2661 pam_systemd = shared_library(
2662 'pam_systemd',
2663 pam_systemd_c,
2664 name_prefix : '',
2665 include_directories : includes,
2666 link_args : ['-shared',
2667 '-Wl,--version-script=' + version_script_arg],
37e4d7a8 2668 link_with : [libsystemd_static,
37efbbd8 2669 libshared_static],
92148283 2670 dependencies : [libpam_misc,
37efbbd8 2671 libpam,
92148283 2672 threads,
40c7d3c7 2673 userspace],
37efbbd8
ZJS
2674 link_depends : pam_systemd_sym,
2675 install : true,
48139c7c 2676 install_tag : 'pam',
37efbbd8
ZJS
2677 install_dir : pamlibdir)
2678
938be089
ZJS
2679 if want_tests != 'false'
2680 test('dlopen-pam_systemd',
2681 test_dlopen,
2682 # path to dlopen must include a slash
e93ada98
DDM
2683 args : pam_systemd.full_path(),
2684 depends : pam_systemd)
938be089 2685 endif
37efbbd8 2686 endif
005a29f2 2687
6164ec4c
ZJS
2688 executable(
2689 'systemd-user-runtime-dir',
2690 user_runtime_dir_sources,
2691 include_directories : includes,
2692 link_with : [libshared],
92148283 2693 dependencies : userspace,
b0d3095f 2694 install_rpath : pkglibdir,
6164ec4c 2695 install : true,
b0d3095f 2696 install_dir : libexecdir)
07ee5adb 2697endif
a9f0f5e5 2698
349cc4a5 2699if conf.get('HAVE_PAM') == 1
6164ec4c
ZJS
2700 executable(
2701 'systemd-user-sessions',
2702 'src/user-sessions/user-sessions.c',
2703 include_directories : includes,
2704 link_with : [libshared],
92148283 2705 dependencies : userspace,
b0d3095f 2706 install_rpath : pkglibdir,
6164ec4c 2707 install : true,
b0d3095f 2708 install_dir : libexecdir)
5c23128d
ZJS
2709endif
2710
dfca5587 2711if conf.get('HAVE_BLKID') == 1 and conf.get('ENABLE_BOOTLOADER') == 1
79647020
RS
2712 if get_option('link-boot-shared')
2713 boot_link_with = [libshared]
2714 else
2715 boot_link_with = [libsystemd_static, libshared_static]
2716 endif
2717
50f2c32c 2718 exe = executable(
6164ec4c 2719 'bootctl',
cd4300f3 2720 bootctl_sources,
6164ec4c 2721 include_directories : includes,
79647020 2722 link_with : [boot_link_with],
c47511da 2723 dependencies : [libblkid,
40c7d3c7 2724 userspace],
b0d3095f 2725 install_rpath : pkglibdir,
6164ec4c 2726 install : true)
50f2c32c
ZJS
2727 public_programs += exe
2728
2729 if want_tests != 'false'
2730 test('test-bootctl-json',
2731 test_bootctl_json_sh,
2732 args : exe.full_path(),
2733 depends : exe)
2734 endif
6164ec4c
ZJS
2735
2736 public_programs += executable(
2737 'systemd-bless-boot',
2738 'src/boot/bless-boot.c',
2739 include_directories : includes,
79647020 2740 link_with : [boot_link_with],
c47511da 2741 dependencies : [libblkid,
40c7d3c7 2742 userspace],
b0d3095f 2743 install_rpath : pkglibdir,
6164ec4c 2744 install : true,
b0d3095f 2745 install_dir : libexecdir)
6164ec4c
ZJS
2746
2747 executable(
2748 'systemd-bless-boot-generator',
2749 'src/boot/bless-boot-generator.c',
2750 include_directories : includes,
79647020 2751 link_with : [boot_link_with],
92148283 2752 dependencies : userspace,
b0d3095f 2753 install_rpath : pkglibdir,
6164ec4c
ZJS
2754 install : true,
2755 install_dir : systemgeneratordir)
ca1092dc 2756
3286770d 2757 if conf.get('HAVE_OPENSSL') == 1 and conf.get('HAVE_TPM2') == 1
ca1092dc
LP
2758 executable(
2759 'systemd-measure',
2760 'src/boot/measure.c',
2761 include_directories : includes,
2762 link_with : [libshared],
c47511da 2763 dependencies : [libopenssl,
40c7d3c7 2764 userspace],
b0d3095f 2765 install_rpath : pkglibdir,
ca1092dc 2766 install : true,
b0d3095f 2767 install_dir : libexecdir)
708d7524
LP
2768 executable(
2769 'systemd-pcrphase',
2770 'src/boot/pcrphase.c',
2771 include_directories : includes,
2772 link_with : [libshared],
92148283
JJ
2773 dependencies : [libblkid,
2774 libopenssl,
c47511da 2775 tpm2,
40c7d3c7 2776 userspace],
b0d3095f 2777 install_rpath : pkglibdir,
708d7524 2778 install : true,
b0d3095f 2779 install_dir : libexecdir)
ca1092dc 2780 endif
6164ec4c
ZJS
2781endif
2782
2783executable(
2784 'systemd-boot-check-no-failures',
2785 'src/boot/boot-check-no-failures.c',
2786 include_directories : includes,
2787 link_with : [libshared],
c47511da 2788 dependencies : [libblkid,
40c7d3c7 2789 userspace],
b0d3095f 2790 install_rpath : pkglibdir,
6164ec4c 2791 install : true,
b0d3095f 2792 install_dir : libexecdir)
005a29f2 2793
6164ec4c
ZJS
2794public_programs += executable(
2795 'systemd-socket-activate',
7f4544c9 2796 'src/socket-activate/socket-activate.c',
6164ec4c
ZJS
2797 include_directories : includes,
2798 link_with : [libshared],
c47511da 2799 dependencies : [threads,
40c7d3c7 2800 userspace],
b0d3095f 2801 install_rpath : pkglibdir,
6164ec4c 2802 install : true)
f3794366 2803
2a2d002f 2804systemctl = executable(
6164ec4c 2805 'systemctl',
c3512573 2806 systemctl_sources,
6164ec4c
ZJS
2807 include_directories : includes,
2808 link_with : systemctl_link_with,
92148283
JJ
2809 dependencies : [libcap,
2810 liblz4,
6164ec4c
ZJS
2811 libselinux,
2812 libxz,
c47511da 2813 libzstd,
92148283 2814 threads,
40c7d3c7 2815 userspace],
b0d3095f
LB
2816 install_rpath : pkglibdir,
2817 install : true)
2a2d002f 2818public_programs += systemctl
5c23128d 2819
61d0578b 2820if conf.get('ENABLE_PORTABLED') == 1
c06d2e44
RS
2821 if get_option('link-portabled-shared')
2822 portabled_link_with = [libshared]
2823 else
2824 portabled_link_with = [libsystemd_static,
2825 libshared_static]
2826 endif
2827
e3c68924 2828 dbus_programs += executable(
6164ec4c
ZJS
2829 'systemd-portabled',
2830 systemd_portabled_sources,
2831 include_directories : includes,
c06d2e44 2832 link_with : [portabled_link_with],
92148283
JJ
2833 dependencies : [libselinux,
2834 threads,
40c7d3c7 2835 userspace],
b0d3095f 2836 install_rpath : pkglibdir,
6164ec4c 2837 install : true,
b0d3095f 2838 install_dir : libexecdir)
6164ec4c
ZJS
2839
2840 public_programs += executable(
2841 'portablectl',
2842 'src/portable/portablectl.c',
2843 include_directories : includes,
c06d2e44 2844 link_with : [portabled_link_with],
c47511da 2845 dependencies : [threads,
40c7d3c7 2846 userspace],
b0d3095f
LB
2847 install_rpath : pkglibdir,
2848 install : true)
61d0578b
LP
2849endif
2850
9bca4ae4
LP
2851if conf.get('ENABLE_SYSEXT') == 1
2852 public_programs += executable(
2853 'systemd-sysext',
2854 systemd_sysext_sources,
2855 include_directories : includes,
2856 link_with : [libshared],
40c7d3c7 2857 dependencies : [userspace],
b0d3095f
LB
2858 install_rpath : pkglibdir,
2859 install : true)
9bca4ae4
LP
2860endif
2861
d093b62c 2862if conf.get('ENABLE_USERDB') == 1
6164ec4c
ZJS
2863 executable(
2864 'systemd-userwork',
2865 systemd_userwork_sources,
2866 include_directories : includes,
2867 link_with : [libshared],
c47511da 2868 dependencies : [threads,
40c7d3c7 2869 userspace],
b0d3095f 2870 install_rpath : pkglibdir,
6164ec4c 2871 install : true,
b0d3095f 2872 install_dir : libexecdir)
6164ec4c
ZJS
2873
2874 executable(
2875 'systemd-userdbd',
2876 systemd_userdbd_sources,
2877 include_directories : includes,
2878 link_with : [libshared],
c47511da 2879 dependencies : [threads,
40c7d3c7 2880 userspace],
b0d3095f 2881 install_rpath : pkglibdir,
6164ec4c 2882 install : true,
b0d3095f 2883 install_dir : libexecdir)
6164ec4c 2884
460e5af0 2885 public_programs += executable(
6164ec4c
ZJS
2886 'userdbctl',
2887 userdbctl_sources,
2888 include_directories : includes,
2889 link_with : [libshared],
c47511da 2890 dependencies : [threads,
40c7d3c7 2891 userspace],
b0d3095f 2892 install_rpath : pkglibdir,
003a6761 2893 install : true)
d093b62c
LP
2894endif
2895
70a5db58 2896if conf.get('ENABLE_HOMED') == 1
6164ec4c
ZJS
2897 executable(
2898 'systemd-homework',
2899 systemd_homework_sources,
2900 include_directories : includes,
f8cf3d19
LP
2901 link_with : [libshared,
2902 libshared_fdisk],
92148283 2903 dependencies : [libblkid,
6164ec4c 2904 libcrypt,
6164ec4c 2905 libfdisk,
92148283 2906 libopenssl,
c47511da 2907 libp11kit,
92148283 2908 threads,
40c7d3c7 2909 userspace],
b0d3095f 2910 install_rpath : pkglibdir,
6164ec4c 2911 install : true,
b0d3095f 2912 install_dir : libexecdir)
6164ec4c 2913
e3c68924 2914 dbus_programs += executable(
6164ec4c
ZJS
2915 'systemd-homed',
2916 systemd_homed_sources,
8d40961c 2917 include_directories : home_includes,
6164ec4c 2918 link_with : [libshared],
92148283 2919 dependencies : [libcrypt,
c47511da 2920 libm,
92148283
JJ
2921 libopenssl,
2922 threads,
40c7d3c7 2923 userspace],
b0d3095f 2924 install_rpath : pkglibdir,
6164ec4c 2925 install : true,
b0d3095f 2926 install_dir : libexecdir)
6164ec4c 2927
460e5af0 2928 public_programs += executable(
6164ec4c
ZJS
2929 'homectl',
2930 homectl_sources,
2931 include_directories : includes,
2932 link_with : [libshared],
92148283
JJ
2933 dependencies : [libcrypt,
2934 libdl,
6164ec4c
ZJS
2935 libopenssl,
2936 libp11kit,
92148283 2937 threads,
40c7d3c7 2938 userspace],
b0d3095f 2939 install_rpath : pkglibdir,
003a6761 2940 install : true)
26cf9fb7
LP
2941
2942 if conf.get('HAVE_PAM') == 1
fce9abb2 2943 version_script_arg = project_source_root / pam_systemd_home_sym
a7127884 2944 pam_systemd_home = shared_library(
26cf9fb7
LP
2945 'pam_systemd_home',
2946 pam_systemd_home_c,
2947 name_prefix : '',
2948 include_directories : includes,
2949 link_args : ['-shared',
2950 '-Wl,--version-script=' + version_script_arg],
2951 link_with : [libsystemd_static,
2952 libshared_static],
92148283 2953 dependencies : [libcrypt,
26cf9fb7 2954 libpam_misc,
92148283
JJ
2955 libpam,
2956 threads,
40c7d3c7 2957 userspace],
26cf9fb7
LP
2958 link_depends : pam_systemd_home_sym,
2959 install : true,
48139c7c 2960 install_tag : 'pam',
26cf9fb7 2961 install_dir : pamlibdir)
a7127884
YW
2962
2963 if want_tests != 'false'
2964 test('dlopen-pam_systemd_home',
2965 test_dlopen,
2966 # path to dlopen must include a slash
2967 args : pam_systemd_home.full_path(),
2968 depends : pam_systemd_home)
2969 endif
26cf9fb7 2970 endif
70a5db58
LP
2971endif
2972
6589a569 2973foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
ba081955 2974 (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
ba7f4ae6 2975 meson.add_install_script(meson_make_symlink,
b0d3095f
LB
2976 bindir / 'systemctl',
2977 sbindir / alias)
ba7f4ae6
ZJS
2978endforeach
2979
63e2d171 2980meson.add_install_script(meson_make_symlink,
b0d3095f
LB
2981 bindir / 'udevadm',
2982 libexecdir / 'systemd-udevd')
63e2d171 2983
349cc4a5 2984if conf.get('ENABLE_BACKLIGHT') == 1
6164ec4c
ZJS
2985 executable(
2986 'systemd-backlight',
2987 'src/backlight/backlight.c',
2988 include_directories : includes,
2989 link_with : [libshared],
92148283 2990 dependencies : userspace,
b0d3095f 2991 install_rpath : pkglibdir,
6164ec4c 2992 install : true,
b0d3095f 2993 install_dir : libexecdir)
5c23128d
ZJS
2994endif
2995
349cc4a5 2996if conf.get('ENABLE_RFKILL') == 1
6164ec4c
ZJS
2997 executable(
2998 'systemd-rfkill',
2999 'src/rfkill/rfkill.c',
3000 include_directories : includes,
3001 link_with : [libshared],
92148283 3002 dependencies : userspace,
b0d3095f 3003 install_rpath : pkglibdir,
6164ec4c 3004 install : true,
b0d3095f 3005 install_dir : libexecdir)
6164ec4c
ZJS
3006endif
3007
3008executable(
3009 'systemd-system-update-generator',
3010 'src/system-update-generator/system-update-generator.c',
3011 include_directories : includes,
3012 link_with : [libshared],
92148283 3013 dependencies : userspace,
b0d3095f 3014 install_rpath : pkglibdir,
6164ec4c
ZJS
3015 install : true,
3016 install_dir : systemgeneratordir)
5c23128d 3017
349cc4a5 3018if conf.get('HAVE_LIBCRYPTSETUP') == 1
6164ec4c
ZJS
3019 executable(
3020 'systemd-cryptsetup',
3021 systemd_cryptsetup_sources,
3022 include_directories : includes,
3023 link_with : [libshared],
3024 dependencies : [libcryptsetup,
92148283 3025 libopenssl,
c47511da 3026 libp11kit,
40c7d3c7 3027 userspace],
b0d3095f 3028 install_rpath : pkglibdir,
6164ec4c 3029 install : true,
b0d3095f 3030 install_dir : libexecdir)
6164ec4c
ZJS
3031
3032 executable(
3033 'systemd-cryptsetup-generator',
3034 'src/cryptsetup/cryptsetup-generator.c',
3035 include_directories : includes,
3036 link_with : [libshared],
92148283 3037 dependencies : userspace,
b0d3095f 3038 install_rpath : pkglibdir,
6164ec4c
ZJS
3039 install : true,
3040 install_dir : systemgeneratordir)
3041
3042 executable(
3043 'systemd-veritysetup',
3044 'src/veritysetup/veritysetup.c',
3045 include_directories : includes,
3046 link_with : [libshared],
c47511da 3047 dependencies : [libcryptsetup,
40c7d3c7 3048 userspace],
b0d3095f 3049 install_rpath : pkglibdir,
6164ec4c 3050 install : true,
b0d3095f 3051 install_dir : libexecdir)
6164ec4c
ZJS
3052
3053 executable(
3054 'systemd-veritysetup-generator',
3055 'src/veritysetup/veritysetup-generator.c',
3056 include_directories : includes,
3057 link_with : [libshared],
40c7d3c7 3058 dependencies : [userspace],
b0d3095f 3059 install_rpath : pkglibdir,
6164ec4c
ZJS
3060 install : true,
3061 install_dir : systemgeneratordir)
8710a681 3062
3761002e 3063 public_programs += executable(
8710a681
LP
3064 'systemd-cryptenroll',
3065 systemd_cryptenroll_sources,
3066 include_directories : includes,
3067 link_with : [libshared],
3068 dependencies : [libcryptsetup,
5e521624 3069 libdl,
8710a681 3070 libopenssl,
c47511da 3071 libp11kit,
40c7d3c7 3072 userspace],
b0d3095f 3073 install_rpath : pkglibdir,
a1fd722b 3074 install : true)
1f1a2243
TA
3075
3076 executable(
3077 'systemd-integritysetup',
3078 ['src/integritysetup/integritysetup.c', 'src/integritysetup/integrity-util.c'],
3079 include_directories : includes,
3080 link_with : [libshared],
c47511da 3081 dependencies : [libcryptsetup,
40c7d3c7 3082 userspace],
b0d3095f 3083 install_rpath : pkglibdir,
1f1a2243 3084 install : true,
b0d3095f 3085 install_dir : libexecdir)
1f1a2243
TA
3086
3087 executable(
3088 'systemd-integritysetup-generator',
3089 ['src/integritysetup/integritysetup-generator.c', 'src/integritysetup/integrity-util.c'],
3090 include_directories : includes,
3091 link_with : [libshared],
92148283 3092 dependencies : userspace,
b0d3095f 3093 install_rpath : pkglibdir,
1f1a2243
TA
3094 install : true,
3095 install_dir : systemgeneratordir)
5c23128d
ZJS
3096endif
3097
349cc4a5 3098if conf.get('HAVE_SYSV_COMPAT') == 1
e93ada98 3099 exe = executable(
6164ec4c
ZJS
3100 'systemd-sysv-generator',
3101 'src/sysv-generator/sysv-generator.c',
3102 include_directories : includes,
3103 link_with : [libshared],
92148283 3104 dependencies : userspace,
b0d3095f 3105 install_rpath : pkglibdir,
6164ec4c
ZJS
3106 install : true,
3107 install_dir : systemgeneratordir)
3108
e93ada98
DDM
3109 sysv_generator_test_py = find_program('test/sysv-generator-test.py')
3110 if want_tests != 'false'
3111 test('sysv-generator-test',
3112 sysv_generator_test_py,
3113 depends : exe)
3114 endif
3115
6164ec4c
ZJS
3116 executable(
3117 'systemd-rc-local-generator',
3118 'src/rc-local-generator/rc-local-generator.c',
3119 include_directories : includes,
3120 link_with : [libshared],
92148283 3121 dependencies : userspace,
b0d3095f 3122 install_rpath : pkglibdir,
6164ec4c
ZJS
3123 install : true,
3124 install_dir : systemgeneratordir)
5c23128d
ZJS
3125endif
3126
8feca247
BB
3127if conf.get('ENABLE_XDG_AUTOSTART') == 1
3128 executable(
3129 'systemd-xdg-autostart-generator',
0275e918 3130 systemd_xdg_autostart_generator_sources,
8feca247
BB
3131 include_directories : includes,
3132 link_with : [libshared],
92148283 3133 dependencies : userspace,
b0d3095f 3134 install_rpath : pkglibdir,
8feca247
BB
3135 install : true,
3136 install_dir : usergeneratordir)
3137
3138 executable(
3139 'systemd-xdg-autostart-condition',
3140 'src/xdg-autostart-generator/xdg-autostart-condition.c',
3141 include_directories : includes,
3142 link_with : [libshared],
92148283 3143 dependencies : userspace,
b0d3095f 3144 install_rpath : pkglibdir,
8feca247 3145 install : true,
b0d3095f 3146 install_dir : libexecdir)
8feca247
BB
3147endif
3148
349cc4a5 3149if conf.get('ENABLE_HOSTNAMED') == 1
e3c68924 3150 dbus_programs += executable(
6164ec4c
ZJS
3151 'systemd-hostnamed',
3152 'src/hostname/hostnamed.c',
3153 include_directories : includes,
3154 link_with : [libshared],
92148283 3155 dependencies : userspace,
b0d3095f 3156 install_rpath : pkglibdir,
6164ec4c 3157 install : true,
b0d3095f 3158 install_dir : libexecdir)
6164ec4c
ZJS
3159
3160 public_programs += executable(
3161 'hostnamectl',
3162 'src/hostname/hostnamectl.c',
3163 include_directories : includes,
3164 link_with : [libshared],
40c7d3c7 3165 dependencies : [userspace],
b0d3095f 3166 install_rpath : pkglibdir,
6164ec4c 3167 install : true)
5c23128d
ZJS
3168endif
3169
349cc4a5 3170if conf.get('ENABLE_LOCALED') == 1
e3c68924 3171 dbus_programs += executable(
6164ec4c
ZJS
3172 'systemd-localed',
3173 systemd_localed_sources,
bfa0ade9 3174 include_directories : includes,
6164ec4c 3175 link_with : [libshared],
d45cbc07 3176 dependencies : libxkbcommon_deps +
40c7d3c7 3177 [userspace],
b0d3095f 3178 install_rpath : pkglibdir,
6164ec4c 3179 install : true,
b0d3095f 3180 install_dir : libexecdir)
6164ec4c
ZJS
3181
3182 public_programs += executable(
3183 'localectl',
3184 localectl_sources,
3185 include_directories : includes,
3186 link_with : [libshared],
40c7d3c7 3187 dependencies : [userspace],
b0d3095f 3188 install_rpath : pkglibdir,
6164ec4c 3189 install : true)
5c23128d
ZJS
3190endif
3191
349cc4a5 3192if conf.get('ENABLE_TIMEDATED') == 1
e3c68924 3193 dbus_programs += executable(
6164ec4c
ZJS
3194 'systemd-timedated',
3195 'src/timedate/timedated.c',
3196 include_directories : includes,
3197 link_with : [libshared],
92148283 3198 dependencies : userspace,
b0d3095f 3199 install_rpath : pkglibdir,
6164ec4c 3200 install : true,
b0d3095f 3201 install_dir : libexecdir)
6129ec85 3202endif
5c23128d 3203
6129ec85 3204if conf.get('ENABLE_TIMEDATECTL') == 1
6164ec4c
ZJS
3205 public_programs += executable(
3206 'timedatectl',
3207 'src/timedate/timedatectl.c',
3208 include_directories : includes,
b0d3095f 3209 install_rpath : pkglibdir,
6164ec4c 3210 link_with : [libshared],
c47511da 3211 dependencies : [libm,
40c7d3c7 3212 userspace],
6164ec4c 3213 install : true)
5c23128d
ZJS
3214endif
3215
349cc4a5 3216if conf.get('ENABLE_TIMESYNCD') == 1
6164ec4c
ZJS
3217 executable(
3218 'systemd-timesyncd',
3219 systemd_timesyncd_sources,
3220 include_directories : includes,
f5a5284e 3221 link_with : [libtimesyncd_core],
92148283
JJ
3222 dependencies : [libm,
3223 threads,
40c7d3c7 3224 userspace],
b0d3095f 3225 install_rpath : pkglibdir,
6164ec4c 3226 install : true,
b0d3095f 3227 install_dir : libexecdir)
6164ec4c
ZJS
3228
3229 executable(
3230 'systemd-time-wait-sync',
cf242350 3231 'src/timesync/wait-sync.c',
6164ec4c 3232 include_directories : includes,
f5a5284e 3233 link_with : [libtimesyncd_core],
92148283 3234 dependencies : userspace,
b0d3095f 3235 install_rpath : pkglibdir,
6164ec4c 3236 install : true,
b0d3095f 3237 install_dir : libexecdir)
5c23128d
ZJS
3238endif
3239
349cc4a5 3240if conf.get('ENABLE_MACHINED') == 1
e3c68924 3241 dbus_programs += executable(
6164ec4c
ZJS
3242 'systemd-machined',
3243 systemd_machined_sources,
3244 include_directories : includes,
3245 link_with : [libmachine_core,
3246 libshared],
92148283 3247 dependencies : userspace,
b0d3095f 3248 install_rpath : pkglibdir,
6164ec4c 3249 install : true,
b0d3095f 3250 install_dir : libexecdir)
6164ec4c
ZJS
3251
3252 public_programs += executable(
3253 'machinectl',
3254 'src/machine/machinectl.c',
3255 include_directories : includes,
3256 link_with : [libshared],
92148283 3257 dependencies : [liblz4,
6164ec4c 3258 libxz,
c47511da 3259 libzstd,
92148283 3260 threads,
40c7d3c7 3261 userspace],
b0d3095f
LB
3262 install_rpath : pkglibdir,
3263 install : true)
5c23128d
ZJS
3264endif
3265
349cc4a5 3266if conf.get('ENABLE_IMPORTD') == 1
e3c68924 3267 dbus_programs += executable(
6164ec4c
ZJS
3268 'systemd-importd',
3269 systemd_importd_sources,
3270 include_directories : includes,
3271 link_with : [libshared],
c47511da 3272 dependencies : [threads,
40c7d3c7 3273 userspace],
b0d3095f 3274 install_rpath : pkglibdir,
6164ec4c 3275 install : true,
b0d3095f 3276 install_dir : libexecdir)
6164ec4c
ZJS
3277
3278 systemd_pull = executable(
3279 'systemd-pull',
3280 systemd_pull_sources,
3281 include_directories : includes,
b93f018f
ZJS
3282 link_with : [libshared,
3283 lib_import_common],
92148283 3284 dependencies : [lib_openssl_or_gcrypt,
6164ec4c 3285 libbzip2,
92148283 3286 libcurl,
c47511da 3287 libxz,
92148283 3288 libz,
40c7d3c7 3289 userspace],
b0d3095f 3290 install_rpath : pkglibdir,
6164ec4c 3291 install : true,
b0d3095f 3292 install_dir : libexecdir)
6164ec4c
ZJS
3293
3294 systemd_import = executable(
3295 'systemd-import',
3296 systemd_import_sources,
3297 include_directories : includes,
b93f018f
ZJS
3298 link_with : [libshared,
3299 lib_import_common],
92148283
JJ
3300 dependencies : [libbzip2,
3301 libcurl,
c47511da 3302 libxz,
92148283 3303 libz,
40c7d3c7 3304 userspace],
b0d3095f 3305 install_rpath : pkglibdir,
6164ec4c 3306 install : true,
b0d3095f 3307 install_dir : libexecdir)
6164ec4c
ZJS
3308
3309 systemd_import_fs = executable(
3310 'systemd-import-fs',
3311 systemd_import_fs_sources,
3312 include_directories : includes,
b93f018f
ZJS
3313 link_with : [libshared,
3314 lib_import_common],
40c7d3c7 3315 dependencies : [userspace],
b0d3095f 3316 install_rpath : pkglibdir,
6164ec4c 3317 install : true,
b0d3095f 3318 install_dir : libexecdir)
6164ec4c
ZJS
3319
3320 systemd_export = executable(
3321 'systemd-export',
3322 systemd_export_sources,
3323 include_directories : includes,
b93f018f
ZJS
3324 link_with : [libshared,
3325 lib_import_common],
92148283
JJ
3326 dependencies : [libbzip2,
3327 libcurl,
c47511da 3328 libxz,
92148283 3329 libz,
40c7d3c7 3330 userspace],
b0d3095f 3331 install_rpath : pkglibdir,
6164ec4c 3332 install : true,
b0d3095f 3333 install_dir : libexecdir)
1d7579c4
LP
3334
3335 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
37efbbd8
ZJS
3336endif
3337
349cc4a5 3338if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
6164ec4c
ZJS
3339 public_programs += executable(
3340 'systemd-journal-upload',
3341 systemd_journal_upload_sources,
3342 include_directories : includes,
3343 link_with : [libshared],
92148283 3344 dependencies : [libcurl,
6164ec4c 3345 libgnutls,
ef5924aa 3346 liblz4,
92148283 3347 libxz,
c47511da 3348 libzstd,
92148283 3349 threads,
40c7d3c7 3350 userspace],
b0d3095f 3351 install_rpath : pkglibdir,
6164ec4c 3352 install : true,
b0d3095f 3353 install_dir : libexecdir)
5c23128d
ZJS
3354endif
3355
349cc4a5 3356if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
6164ec4c
ZJS
3357 public_programs += executable(
3358 'systemd-journal-remote',
3359 systemd_journal_remote_sources,
035b0f8f 3360 include_directories : journal_includes,
6164ec4c
ZJS
3361 link_with : [libshared,
3362 libsystemd_journal_remote],
92148283
JJ
3363 dependencies : [libgnutls,
3364 liblz4,
6164ec4c 3365 libmicrohttpd,
6164ec4c 3366 libxz,
c47511da 3367 libzstd,
92148283 3368 threads,
40c7d3c7 3369 userspace],
b0d3095f 3370 install_rpath : pkglibdir,
6164ec4c 3371 install : true,
b0d3095f 3372 install_dir : libexecdir)
6164ec4c
ZJS
3373
3374 public_programs += executable(
3375 'systemd-journal-gatewayd',
3376 systemd_journal_gatewayd_sources,
035b0f8f 3377 include_directories : journal_includes,
6164ec4c 3378 link_with : [libshared],
92148283
JJ
3379 dependencies : [libgnutls,
3380 liblz4,
6164ec4c 3381 libmicrohttpd,
6164ec4c 3382 libxz,
c47511da 3383 libzstd,
92148283 3384 threads,
40c7d3c7 3385 userspace],
b0d3095f 3386 install_rpath : pkglibdir,
6164ec4c 3387 install : true,
b0d3095f 3388 install_dir : libexecdir)
5c23128d
ZJS
3389endif
3390
349cc4a5 3391if conf.get('ENABLE_COREDUMP') == 1
6164ec4c
ZJS
3392 executable(
3393 'systemd-coredump',
3394 systemd_coredump_sources,
3395 include_directories : includes,
acc50c92
LP
3396 link_with : [libshared,
3397 libbasic_compress],
92148283 3398 dependencies : [libacl,
ef5924aa 3399 liblz4,
92148283 3400 libxz,
c47511da 3401 libzstd,
92148283 3402 threads,
40c7d3c7 3403 userspace],
b0d3095f 3404 install_rpath : pkglibdir,
6164ec4c 3405 install : true,
b0d3095f 3406 install_dir : libexecdir)
6164ec4c
ZJS
3407
3408 public_programs += executable(
3409 'coredumpctl',
3410 coredumpctl_sources,
3411 include_directories : includes,
acc50c92
LP
3412 link_with : [libshared,
3413 libbasic_compress],
92148283 3414 dependencies : [liblz4,
6164ec4c 3415 libxz,
c47511da 3416 libzstd,
92148283 3417 threads,
40c7d3c7 3418 userspace],
b0d3095f 3419 install_rpath : pkglibdir,
6164ec4c 3420 install : true)
5c23128d
ZJS
3421endif
3422
9b4abc69 3423if conf.get('ENABLE_PSTORE') == 1
6164ec4c
ZJS
3424 executable(
3425 'systemd-pstore',
3426 systemd_pstore_sources,
3427 include_directories : includes,
3428 link_with : [libshared],
92148283 3429 dependencies : [libacl,
ef5924aa 3430 liblz4,
92148283 3431 libxz,
c47511da 3432 libzstd,
92148283 3433 threads,
40c7d3c7 3434 userspace],
b0d3095f 3435 install_rpath : pkglibdir,
6164ec4c 3436 install : true,
b0d3095f 3437 install_dir : libexecdir)
9b4abc69
ED
3438endif
3439
9de5e321 3440if conf.get('ENABLE_OOMD') == 1
e3c68924 3441 dbus_programs += executable('systemd-oomd',
9de5e321
AZ
3442 systemd_oomd_sources,
3443 include_directories : includes,
3444 link_with : [libshared],
c47511da 3445 dependencies : [libatomic,
40c7d3c7 3446 userspace],
b0d3095f 3447 install_rpath : pkglibdir,
9de5e321 3448 install : true,
b0d3095f 3449 install_dir : libexecdir)
5c616ecf
AZ
3450
3451 public_programs += executable(
ba081955
ZJS
3452 'oomctl',
3453 oomctl_sources,
3454 include_directories : includes,
3455 link_with : [libshared],
40c7d3c7 3456 dependencies : [userspace],
b0d3095f 3457 install_rpath : pkglibdir,
cfd4c84a 3458 install : true)
9de5e321
AZ
3459endif
3460
349cc4a5 3461if conf.get('ENABLE_BINFMT') == 1
6164ec4c
ZJS
3462 public_programs += executable(
3463 'systemd-binfmt',
3464 'src/binfmt/binfmt.c',
3465 include_directories : includes,
3466 link_with : [libshared],
40c7d3c7 3467 dependencies : [userspace],
b0d3095f 3468 install_rpath : pkglibdir,
6164ec4c 3469 install : true,
b0d3095f 3470 install_dir : libexecdir)
37efbbd8 3471
7c22f07c
ZJS
3472 meson.add_install_script('sh', '-c',
3473 mkdir_p.format(binfmtdir))
d7aa78c3 3474 if install_sysconfdir
7c22f07c 3475 meson.add_install_script('sh', '-c',
fce9abb2 3476 mkdir_p.format(sysconfdir / 'binfmt.d'))
d7aa78c3 3477 endif
37efbbd8
ZJS
3478endif
3479
43cc7a3e
LP
3480if conf.get('ENABLE_SYSUPDATE') == 1
3481 exe = executable(
3482 'systemd-sysupdate',
3483 systemd_sysupdate_sources,
3484 include_directories : includes,
f8cf3d19
LP
3485 link_with : [libshared,
3486 libshared_fdisk],
92148283 3487 dependencies : [libblkid,
43cc7a3e 3488 libfdisk,
c47511da 3489 libopenssl,
92148283 3490 threads,
40c7d3c7 3491 userspace],
b0d3095f 3492 install_rpath : pkglibdir,
43cc7a3e 3493 install : true,
b0d3095f 3494 install_dir : libexecdir)
43cc7a3e
LP
3495 public_programs += exe
3496endif
3497
349cc4a5 3498if conf.get('ENABLE_VCONSOLE') == 1
6164ec4c
ZJS
3499 executable(
3500 'systemd-vconsole-setup',
3501 'src/vconsole/vconsole-setup.c',
3502 include_directories : includes,
3503 link_with : [libshared],
92148283 3504 dependencies : userspace,
b0d3095f 3505 install_rpath : pkglibdir,
6164ec4c 3506 install : true,
b0d3095f 3507 install_dir : libexecdir)
5c23128d
ZJS
3508endif
3509
349cc4a5 3510if conf.get('ENABLE_RANDOMSEED') == 1
6164ec4c
ZJS
3511 executable(
3512 'systemd-random-seed',
3513 'src/random-seed/random-seed.c',
3514 include_directories : includes,
3515 link_with : [libshared],
40c7d3c7 3516 dependencies : [userspace],
b0d3095f 3517 install_rpath : pkglibdir,
6164ec4c 3518 install : true,
b0d3095f 3519 install_dir : libexecdir)
5c23128d
ZJS
3520endif
3521
349cc4a5 3522if conf.get('ENABLE_FIRSTBOOT') == 1
3761002e 3523 public_programs += executable(
6164ec4c
ZJS
3524 'systemd-firstboot',
3525 'src/firstboot/firstboot.c',
3526 include_directories : includes,
3527 link_with : [libshared],
c47511da 3528 dependencies : [libcrypt,
40c7d3c7 3529 userspace],
b0d3095f
LB
3530 install_rpath : pkglibdir,
3531 install : true)
6164ec4c
ZJS
3532endif
3533
3534executable(
3535 'systemd-remount-fs',
3536 'src/remount-fs/remount-fs.c',
3537 include_directories : includes,
bac11cd6 3538 link_with : [libshared],
40c7d3c7 3539 dependencies : [userspace],
b0d3095f 3540 install_rpath : pkglibdir,
6164ec4c 3541 install : true,
b0d3095f 3542 install_dir : libexecdir)
5c23128d 3543
6164ec4c
ZJS
3544executable(
3545 'systemd-machine-id-setup',
3546 'src/machine-id-setup/machine-id-setup-main.c',
3547 include_directories : includes,
bac11cd6 3548 link_with : [libshared],
40c7d3c7 3549 dependencies : [userspace],
b0d3095f
LB
3550 install_rpath : pkglibdir,
3551 install : true)
5c23128d 3552
6164ec4c
ZJS
3553executable(
3554 'systemd-fsck',
3555 'src/fsck/fsck.c',
3556 include_directories : includes,
3557 link_with : [libshared],
40c7d3c7 3558 dependencies : [userspace],
b0d3095f 3559 install_rpath : pkglibdir,
6164ec4c 3560 install : true,
b0d3095f 3561 install_dir : libexecdir)
5c23128d 3562
c47511da
ZJS
3563executable(
3564 'systemd-growfs',
3565 'src/partition/growfs.c',
3566 include_directories : includes,
3567 link_with : [libshared],
40c7d3c7 3568 dependencies : [userspace],
b0d3095f 3569 install_rpath : pkglibdir,
c47511da 3570 install : true,
b0d3095f 3571 install_dir : libexecdir)
80750adb 3572
6164ec4c
ZJS
3573executable(
3574 'systemd-makefs',
3575 'src/partition/makefs.c',
3576 include_directories : includes,
3577 link_with : [libshared],
40c7d3c7 3578 dependencies : [userspace],
b0d3095f 3579 install_rpath : pkglibdir,
6164ec4c 3580 install : true,
b0d3095f 3581 install_dir : libexecdir)
b7f28ac5 3582
6164ec4c
ZJS
3583executable(
3584 'systemd-sleep',
3585 'src/sleep/sleep.c',
3586 include_directories : includes,
3587 link_with : [libshared],
40c7d3c7 3588 dependencies : [userspace],
b0d3095f 3589 install_rpath : pkglibdir,
6164ec4c 3590 install : true,
b0d3095f 3591 install_dir : libexecdir)
5c23128d 3592
225d08b8 3593if install_sysconfdir_samples
d7aa78c3
JT
3594 install_data('src/sleep/sleep.conf',
3595 install_dir : pkgsysconfdir)
3596endif
d25e127d 3597
6164ec4c
ZJS
3598public_programs += executable(
3599 'systemd-sysctl',
3600 'src/sysctl/sysctl.c',
3601 include_directories : includes,
3602 link_with : [libshared],
40c7d3c7 3603 dependencies : [userspace],
b0d3095f 3604 install_rpath : pkglibdir,
6164ec4c 3605 install : true,
b0d3095f 3606 install_dir : libexecdir)
5c23128d 3607
251dc2f1 3608public_programs += executable(
6164ec4c
ZJS
3609 'systemd-ac-power',
3610 'src/ac-power/ac-power.c',
3611 include_directories : includes,
3612 link_with : [libshared],
40c7d3c7 3613 dependencies : [userspace],
b0d3095f 3614 install_rpath : pkglibdir,
251dc2f1 3615 install : true)
5c23128d 3616
6164ec4c
ZJS
3617public_programs += executable(
3618 'systemd-detect-virt',
3619 'src/detect-virt/detect-virt.c',
3620 include_directories : includes,
3621 link_with : [libshared],
40c7d3c7 3622 dependencies : [userspace],
b0d3095f 3623 install_rpath : pkglibdir,
6164ec4c 3624 install : true)
5c23128d 3625
6164ec4c
ZJS
3626public_programs += executable(
3627 'systemd-delta',
3628 'src/delta/delta.c',
3629 include_directories : includes,
3630 link_with : [libshared],
40c7d3c7 3631 dependencies : [userspace],
b0d3095f 3632 install_rpath : pkglibdir,
6164ec4c 3633 install : true)
5c23128d 3634
6164ec4c
ZJS
3635public_programs += executable(
3636 'systemd-escape',
3637 'src/escape/escape.c',
3638 include_directories : includes,
3639 link_with : [libshared],
40c7d3c7 3640 dependencies : [userspace],
b0d3095f
LB
3641 install_rpath : pkglibdir,
3642 install : true)
6164ec4c
ZJS
3643
3644public_programs += executable(
3645 'systemd-notify',
3646 'src/notify/notify.c',
3647 include_directories : includes,
3648 link_with : [libshared],
40c7d3c7 3649 dependencies : [userspace],
b0d3095f
LB
3650 install_rpath : pkglibdir,
3651 install : true)
6164ec4c 3652
5945640e
LP
3653public_programs += executable(
3654 'systemd-creds',
3655 'src/creds/creds.c',
3656 include_directories : includes,
3657 link_with : [libshared],
3658 dependencies : [threads,
c47511da 3659 libopenssl,
40c7d3c7 3660 userspace],
b0d3095f
LB
3661 install_rpath : pkglibdir,
3662 install : true)
5945640e 3663
e3d4148d
OJ
3664public_programs += executable(
3665 'systemd-battery-check',
3666 'src/battery-check/battery-check.c',
3667 include_directories : includes,
3668 link_with : [libshared],
40c7d3c7 3669 dependencies : [userspace],
b0d3095f
LB
3670 install_rpath : pkglibdir,
3671 install_dir : libexecdir,
e3d4148d
OJ
3672 install : true)
3673
24039e12
DDM
3674# Protecting files from the distro in /usr doesn't make sense since they can be trivially accessed otherwise,
3675# so don't restrict the access mode in /usr. That doesn't apply to /etc, so we do restrict the access mode
3676# there.
3677meson.add_install_script('sh', '-c', mkdir_p.format(credstoredir))
3678if install_sysconfdir
40fb9eeb 3679 # Keep in sync with tmpfiles.d/credstore.conf
24039e12 3680 meson.add_install_script('sh', '-c', mkdir_p_mode.format(sysconfdir / 'credstore', '0700'))
40fb9eeb 3681 meson.add_install_script('sh', '-c', mkdir_p_mode.format(sysconfdir / 'credstore.encrypted', '0700'))
24039e12
DDM
3682endif
3683
6164ec4c
ZJS
3684executable(
3685 'systemd-volatile-root',
3686 'src/volatile-root/volatile-root.c',
3687 include_directories : includes,
3688 link_with : [libshared],
92148283 3689 dependencies : userspace,
b0d3095f 3690 install_rpath : pkglibdir,
cdf7ad38 3691 install : conf.get('ENABLE_INITRD') == 1,
b0d3095f 3692 install_dir : libexecdir)
6164ec4c
ZJS
3693
3694executable(
3695 'systemd-cgroups-agent',
3696 'src/cgroups-agent/cgroups-agent.c',
3697 include_directories : includes,
3698 link_with : [libshared],
92148283 3699 dependencies : userspace,
b0d3095f 3700 install_rpath : pkglibdir,
6164ec4c 3701 install : true,
b0d3095f 3702 install_dir : libexecdir)
6164ec4c 3703
2a2d002f 3704systemd_id128 = executable(
6164ec4c
ZJS
3705 'systemd-id128',
3706 'src/id128/id128.c',
3707 include_directories : includes,
3708 link_with : [libshared],
40c7d3c7 3709 dependencies : [userspace],
b0d3095f 3710 install_rpath : pkglibdir,
6164ec4c 3711 install : true)
2a2d002f
ZJS
3712public_programs += systemd_id128
3713
3714if want_tests != 'false'
3715 test('test-systemctl-enable',
3716 test_systemctl_enable_sh,
3717 # https://github.com/mesonbuild/meson/issues/2681
3718 args : [systemctl.full_path(),
3719 systemd_id128.full_path()])
3720endif
6164ec4c
ZJS
3721
3722public_programs += executable(
3723 'systemd-path',
3724 'src/path/path.c',
3725 include_directories : includes,
3726 link_with : [libshared],
40c7d3c7 3727 dependencies : [userspace],
b0d3095f 3728 install_rpath : pkglibdir,
6164ec4c
ZJS
3729 install : true)
3730
3731public_programs += executable(
3732 'systemd-ask-password',
3733 'src/ask-password/ask-password.c',
3734 include_directories : includes,
3735 link_with : [libshared],
40c7d3c7 3736 dependencies : [userspace],
b0d3095f
LB
3737 install_rpath : pkglibdir,
3738 install : true)
6164ec4c
ZJS
3739
3740executable(
3741 'systemd-reply-password',
3742 'src/reply-password/reply-password.c',
3743 include_directories : includes,
3744 link_with : [libshared],
92148283 3745 dependencies : userspace,
b0d3095f 3746 install_rpath : pkglibdir,
6164ec4c 3747 install : true,
b0d3095f 3748 install_dir : libexecdir)
6164ec4c
ZJS
3749
3750public_programs += executable(
3751 'systemd-tty-ask-password-agent',
3752 'src/tty-ask-password-agent/tty-ask-password-agent.c',
3753 include_directories : includes,
3754 link_with : [libshared],
40c7d3c7 3755 dependencies : [userspace],
b0d3095f
LB
3756 install_rpath : pkglibdir,
3757 install : true)
6164ec4c
ZJS
3758
3759public_programs += executable(
3760 'systemd-cgls',
3761 'src/cgls/cgls.c',
3762 include_directories : includes,
3763 link_with : [libshared],
40c7d3c7 3764 dependencies : [userspace],
b0d3095f 3765 install_rpath : pkglibdir,
6164ec4c
ZJS
3766 install : true)
3767
3768public_programs += executable(
3769 'systemd-cgtop',
3770 'src/cgtop/cgtop.c',
3771 include_directories : includes,
3772 link_with : [libshared],
40c7d3c7 3773 dependencies : [userspace],
b0d3095f 3774 install_rpath : pkglibdir,
6164ec4c
ZJS
3775 install : true)
3776
3777executable(
3778 'systemd-initctl',
3779 'src/initctl/initctl.c',
3780 include_directories : includes,
3781 link_with : [libshared],
92148283 3782 dependencies : userspace,
b0d3095f 3783 install_rpath : pkglibdir,
6589a569 3784 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
b0d3095f 3785 install_dir : libexecdir)
5c23128d 3786
6164ec4c
ZJS
3787public_programs += executable(
3788 'systemd-mount',
3789 'src/mount/mount-tool.c',
3790 include_directories : includes,
3791 link_with : [libshared],
c47511da 3792 dependencies: [libmount,
40c7d3c7 3793 userspace],
b0d3095f 3794 install_rpath : pkglibdir,
6164ec4c 3795 install : true)
5c23128d 3796
7b76fce1 3797meson.add_install_script(meson_make_symlink,
fce9abb2 3798 'systemd-mount', bindir / 'systemd-umount')
7b76fce1 3799
6164ec4c
ZJS
3800public_programs += executable(
3801 'systemd-run',
3802 'src/run/run.c',
3803 include_directories : includes,
3804 link_with : [libshared],
40c7d3c7 3805 dependencies : [userspace],
b0d3095f 3806 install_rpath : pkglibdir,
6164ec4c
ZJS
3807 install : true)
3808
3809public_programs += executable(
3810 'systemd-stdio-bridge',
3811 'src/stdio-bridge/stdio-bridge.c',
3812 include_directories : includes,
3813 link_with : [libshared],
40c7d3c7 3814 dependencies : [userspace],
b0d3095f 3815 install_rpath : pkglibdir,
6164ec4c
ZJS
3816 install : true)
3817
3818public_programs += executable(
3819 'busctl',
f98df767 3820 busctl_sources,
6164ec4c
ZJS
3821 include_directories : includes,
3822 link_with : [libshared],
40c7d3c7 3823 dependencies : [userspace],
b0d3095f 3824 install_rpath : pkglibdir,
6164ec4c 3825 install : true)
5c23128d 3826
bd7e6aa7
ZJS
3827if enable_sysusers
3828 exe = executable(
6164ec4c
ZJS
3829 'systemd-sysusers',
3830 'src/sysusers/sysusers.c',
3831 include_directories : includes,
3832 link_with : [libshared],
40c7d3c7 3833 dependencies : [userspace],
b0d3095f
LB
3834 install_rpath : pkglibdir,
3835 install : true)
bd7e6aa7
ZJS
3836 public_programs += exe
3837
3838 if want_tests != 'false'
3839 test('test-sysusers',
3840 test_sysusers_sh,
3841 # https://github.com/mesonbuild/meson/issues/2681
3842 args : exe.full_path())
3843 endif
8ef8f3d5 3844
b62ee354
ZJS
3845 exe = executable(
3846 'systemd-sysusers.standalone',
3847 'src/sysusers/sysusers.c',
3848 include_directories : includes,
3849 c_args : '-DSTANDALONE',
3850 link_with : [libshared_static,
3851 libbasic,
3852 libbasic_gcrypt,
3853 libsystemd_static],
40c7d3c7 3854 dependencies : [userspace],
b62ee354 3855 build_by_default: have_standalone_binaries,
b0d3095f 3856 install : have_standalone_binaries)
8ef8f3d5 3857 if have_standalone_binaries
bd7e6aa7
ZJS
3858 public_programs += exe
3859
3860 if want_tests != 'false'
3861 test('test-sysusers.standalone',
3862 test_sysusers_sh,
3863 # https://github.com/mesonbuild/meson/issues/2681
3864 args : exe.full_path())
3865 endif
8ef8f3d5 3866 endif
5c23128d
ZJS
3867endif
3868
349cc4a5 3869if conf.get('ENABLE_TMPFILES') == 1
6164ec4c
ZJS
3870 exe = executable(
3871 'systemd-tmpfiles',
db64ba81 3872 systemd_tmpfiles_sources,
6164ec4c
ZJS
3873 include_directories : includes,
3874 link_with : [libshared],
c47511da 3875 dependencies : [libacl,
40c7d3c7 3876 userspace],
b0d3095f
LB
3877 install_rpath : pkglibdir,
3878 install : true)
5a8b1640 3879 public_programs += exe
d9daae55 3880
938be089
ZJS
3881 if want_tests != 'false'
3882 test('test-systemd-tmpfiles',
3883 test_systemd_tmpfiles_py,
3884 # https://github.com/mesonbuild/meson/issues/2681
3885 args : exe.full_path())
3886 endif
db64ba81 3887
b62ee354
ZJS
3888 exe = executable(
3889 'systemd-tmpfiles.standalone',
3890 systemd_tmpfiles_sources,
3891 include_directories : includes,
3892 c_args : '-DSTANDALONE',
3893 link_with : [libshared_static,
3894 libbasic,
3895 libbasic_gcrypt,
3896 libsystemd_static],
3897 dependencies : [libacl,
40c7d3c7 3898 userspace],
b62ee354 3899 build_by_default: have_standalone_binaries,
b0d3095f 3900 install : have_standalone_binaries)
db64ba81 3901 if have_standalone_binaries
bf93f24a
MG
3902 public_programs += exe
3903
3904 if want_tests != 'false'
3905 test('test-systemd-tmpfiles.standalone',
3906 test_systemd_tmpfiles_py,
3907 # https://github.com/mesonbuild/meson/issues/2681
3908 args : exe.full_path())
3909 endif
db64ba81 3910 endif
5c23128d
ZJS
3911endif
3912
349cc4a5 3913if conf.get('ENABLE_HWDB') == 1
ecd1bfdd 3914 systemd_hwdb = executable(
6164ec4c
ZJS
3915 'systemd-hwdb',
3916 'src/hwdb/hwdb.c',
6164ec4c 3917 include_directories : includes,
e4b127e2 3918 link_with : udev_link_with,
40c7d3c7 3919 dependencies : [userspace],
6164ec4c 3920 install_rpath : udev_rpath,
b0d3095f 3921 install : true)
ecd1bfdd
ZJS
3922 public_programs += systemd_hwdb
3923
3924 if want_tests != 'false'
3925 test('hwdb-test',
3926 hwdb_test_sh,
02e0f430 3927 suite : 'dist',
ecd1bfdd
ZJS
3928 args : [systemd_hwdb.full_path()],
3929 timeout : 90)
3930 endif
37efbbd8
ZJS
3931endif
3932
349cc4a5 3933if conf.get('ENABLE_QUOTACHECK') == 1
6164ec4c
ZJS
3934 executable(
3935 'systemd-quotacheck',
3936 'src/quotacheck/quotacheck.c',
3937 include_directories : includes,
3938 link_with : [libshared],
92148283 3939 dependencies : userspace,
b0d3095f 3940 install_rpath : pkglibdir,
6164ec4c 3941 install : true,
b0d3095f 3942 install_dir : libexecdir)
6164ec4c
ZJS
3943endif
3944
3945public_programs += executable(
3946 'systemd-socket-proxyd',
3947 'src/socket-proxy/socket-proxyd.c',
3948 include_directories : includes,
3949 link_with : [libshared],
c47511da 3950 dependencies : [threads,
40c7d3c7 3951 userspace],
b0d3095f 3952 install_rpath : pkglibdir,
6164ec4c 3953 install : true,
b0d3095f 3954 install_dir : libexecdir)
5c23128d 3955
9b264c1d 3956udevadm = executable(
6164ec4c
ZJS
3957 'udevadm',
3958 udevadm_sources,
6164ec4c 3959 include_directories : includes,
e4b127e2 3960 link_with : [libudevd_core],
92148283 3961 dependencies : [libacl,
c47511da 3962 libblkid,
92148283
JJ
3963 libidn,
3964 libkmod,
3965 threads,
40c7d3c7 3966 userspace],
6164ec4c 3967 install_rpath : udev_rpath,
b0d3095f 3968 install : true)
9b264c1d
FS
3969public_programs += udevadm
3970
9382642c
DL
3971if want_tests != 'false'
3972 test('udev-rules-check',
3973 udevadm,
02e0f430 3974 suite : 'dist',
9382642c
DL
3975 args : ['verify', '--resolve-names=never', all_rules])
3976endif
3977
9b264c1d
FS
3978if conf.get('ENABLE_REPART') == 1
3979 exe = executable(
3980 'systemd-repart',
3981 systemd_repart_sources,
3982 include_directories : includes,
f8cf3d19
LP
3983 link_with : [libshared,
3984 libshared_fdisk],
92148283 3985 dependencies : [libblkid,
b456191d 3986 libfdisk,
c47511da 3987 libopenssl,
92148283 3988 threads,
40c7d3c7 3989 userspace],
b0d3095f
LB
3990 install_rpath : pkglibdir,
3991 install : true)
9b264c1d 3992 public_programs += exe
3c3e14a7 3993
b62ee354
ZJS
3994 exe = executable(
3995 'systemd-repart.standalone',
3996 systemd_repart_sources,
3997 include_directories : includes,
3998 c_args : '-DSTANDALONE',
3999 link_with : [libshared_static,
4000 libbasic,
4001 libbasic_gcrypt,
4002 libsystemd_static,
4003 libshared_fdisk],
4004 dependencies : [libblkid,
4005 libfdisk,
4006 libopenssl,
4007 threads,
40c7d3c7 4008 userspace],
b62ee354 4009 build_by_default: have_standalone_binaries,
b0d3095f
LB
4010 install_rpath : pkglibdir,
4011 install : have_standalone_binaries)
3c3e14a7 4012 if have_standalone_binaries
9702d824 4013 public_programs += exe
3c3e14a7 4014 endif
9b264c1d 4015endif
6164ec4c
ZJS
4016
4017executable(
4018 'systemd-shutdown',
4019 systemd_shutdown_sources,
4020 include_directories : includes,
bac11cd6 4021 link_with : [libshared],
c47511da 4022 dependencies : [libmount,
40c7d3c7 4023 userspace],
b0d3095f 4024 install_rpath : pkglibdir,
6164ec4c 4025 install : true,
b0d3095f 4026 install_dir : libexecdir)
6164ec4c 4027
b62ee354
ZJS
4028executable(
4029 'systemd-shutdown.standalone',
4030 systemd_shutdown_sources,
4031 include_directories : includes,
4032 c_args : '-DSTANDALONE',
4033 link_with : [libshared_static,
4034 libbasic,
4035 libsystemd_static],
4036 dependencies : [libmount,
40c7d3c7 4037 userspace],
b62ee354 4038 build_by_default: have_standalone_binaries,
b0d3095f 4039 install_rpath : pkglibdir,
b62ee354 4040 install : have_standalone_binaries,
b0d3095f 4041 install_dir : libexecdir)
6ed3aca5 4042
6164ec4c
ZJS
4043executable(
4044 'systemd-update-done',
4045 'src/update-done/update-done.c',
4046 include_directories : includes,
4047 link_with : [libshared],
40c7d3c7 4048 dependencies : [userspace],
b0d3095f 4049 install_rpath : pkglibdir,
6164ec4c 4050 install : true,
b0d3095f 4051 install_dir : libexecdir)
6164ec4c
ZJS
4052
4053executable(
4054 'systemd-update-utmp',
4055 'src/update-utmp/update-utmp.c',
4056 include_directories : includes,
4057 link_with : [libshared],
c47511da 4058 dependencies : [libaudit,
40c7d3c7 4059 userspace],
b0d3095f 4060 install_rpath : pkglibdir,
55678b9e 4061 install : (conf.get('ENABLE_UTMP') == 1),
b0d3095f 4062 install_dir : libexecdir)
5c23128d 4063
349cc4a5 4064if conf.get('HAVE_KMOD') == 1
6164ec4c
ZJS
4065 executable(
4066 'systemd-modules-load',
4067 'src/modules-load/modules-load.c',
4068 include_directories : includes,
4069 link_with : [libshared],
c47511da 4070 dependencies : [libkmod,
40c7d3c7 4071 userspace],
b0d3095f 4072 install_rpath : pkglibdir,
6164ec4c 4073 install : true,
b0d3095f 4074 install_dir : libexecdir)
94e75a54 4075
7c22f07c
ZJS
4076 meson.add_install_script('sh', '-c',
4077 mkdir_p.format(modulesloaddir))
d7aa78c3 4078 if install_sysconfdir
7c22f07c 4079 meson.add_install_script('sh', '-c',
fce9abb2 4080 mkdir_p.format(sysconfdir / 'modules-load.d'))
d7aa78c3 4081 endif
5c23128d
ZJS
4082endif
4083
6164ec4c
ZJS
4084public_programs += executable(
4085 'systemd-nspawn',
4086 systemd_nspawn_sources,
4087 include_directories : includes,
bac11cd6 4088 link_with : [libnspawn_core,
6164ec4c
ZJS
4089 libshared],
4090 dependencies : [libblkid,
c47511da 4091 libseccomp,
40c7d3c7 4092 userspace],
b0d3095f 4093 install_rpath : pkglibdir,
6164ec4c 4094 install : true)
5c23128d 4095
349cc4a5 4096if conf.get('ENABLE_NETWORKD') == 1
9ff2b35f 4097 dbus_programs += executable(
6164ec4c
ZJS
4098 'systemd-networkd',
4099 systemd_networkd_sources,
8d40961c 4100 include_directories : network_includes,
6164ec4c
ZJS
4101 link_with : [libnetworkd_core,
4102 libsystemd_network,
6164ec4c 4103 networkd_link_with],
c47511da 4104 dependencies : [threads,
40c7d3c7 4105 userspace],
b0d3095f 4106 install_rpath : pkglibdir,
6164ec4c 4107 install : true,
b0d3095f 4108 install_dir : libexecdir)
6164ec4c 4109
3761002e 4110 public_programs += executable(
6164ec4c
ZJS
4111 'systemd-networkd-wait-online',
4112 systemd_networkd_wait_online_sources,
4113 include_directories : includes,
8d40961c 4114 link_with : [networkd_link_with],
40c7d3c7 4115 dependencies : [userspace],
b0d3095f 4116 install_rpath : pkglibdir,
6164ec4c 4117 install : true,
b0d3095f 4118 install_dir : libexecdir)
6164ec4c
ZJS
4119
4120 public_programs += executable(
4121 'networkctl',
4122 networkctl_sources,
8d40961c 4123 include_directories : libsystemd_network_includes,
6164ec4c
ZJS
4124 link_with : [libsystemd_network,
4125 networkd_link_with],
40c7d3c7 4126 dependencies : [userspace],
b0d3095f
LB
4127 install_rpath : pkglibdir,
4128 install : true)
987dd89c 4129endif
6164ec4c 4130
987dd89c
YW
4131exe = executable(
4132 'systemd-network-generator',
4133 network_generator_sources,
4134 include_directories : includes,
4135 link_with : [networkd_link_with],
40c7d3c7 4136 dependencies : [userspace],
b0d3095f 4137 install_rpath : pkglibdir,
987dd89c 4138 install : true,
b0d3095f 4139 install_dir : libexecdir)
fbaa1137 4140
987dd89c
YW
4141if want_tests != 'false'
4142 test('test-network-generator-conversion',
4143 test_network_generator_conversion_sh,
4144 # https://github.com/mesonbuild/meson/issues/2681
e93ada98
DDM
4145 args : exe.full_path(),
4146 depends : exe)
dcfe072a 4147endif
e821f6a9 4148
6164ec4c
ZJS
4149executable(
4150 'systemd-sulogin-shell',
73e994f2 4151 'src/sulogin-shell/sulogin-shell.c',
6164ec4c
ZJS
4152 include_directories : includes,
4153 link_with : [libshared],
40c7d3c7 4154 dependencies : [userspace],
b0d3095f 4155 install_rpath : pkglibdir,
6164ec4c 4156 install : true,
b0d3095f 4157 install_dir : libexecdir)
e821f6a9 4158
42551ea7 4159kernel_install = executable(
99d8cbce 4160 'kernel-install',
42551ea7
YW
4161 'src/kernel-install/kernel-install.c',
4162 include_directories : includes,
4163 link_with : [libshared],
40c7d3c7 4164 dependencies : [userspace],
b0d3095f
LB
4165 install_rpath : pkglibdir,
4166 install : want_kernel_install)
42551ea7 4167public_programs += kernel_install
f875e6bc 4168
f9a6cb0e 4169ukify = custom_target(
30ec2eae
ZJS
4170 'ukify',
4171 input : 'src/ukify/ukify.py',
4172 output : 'ukify',
4173 command : [jinja2_cmdline, '@INPUT@', '@OUTPUT@'],
9a01fe39 4174 install : want_ukify,
30ec2eae 4175 install_mode : 'rwxr-xr-x',
b0d3095f 4176 install_dir : libexecdir)
9a01fe39 4177if want_ukify
42551ea7 4178 public_programs += ukify
f9a6cb0e
ZJS
4179endif
4180
4181if want_tests != 'false' and want_kernel_install
42551ea7
YW
4182 args = [kernel_install.full_path(), loaderentry_install.full_path(), uki_copy_install]
4183 deps = [kernel_install, loaderentry_install]
3f80c139 4184 if want_ukify and boot_stubs.length() > 0
42551ea7
YW
4185 args += [ukify.full_path(), ukify_install.full_path(), boot_stubs[0]]
4186 deps += [ukify, ukify_install, boot_stubs[0]]
f9a6cb0e
ZJS
4187 endif
4188
4189 test('test-kernel-install',
4190 test_kernel_install_sh,
4191 env : test_env,
42551ea7
YW
4192 args : args,
4193 depends: deps)
30ec2eae
ZJS
4194endif
4195
69e96427
ZJS
4196############################################################
4197
e93ada98 4198runtest_env = custom_target(
e2d41370
FB
4199 'systemd-runtest.env',
4200 output : 'systemd-runtest.env',
0f4c4f38
ZJS
4201 command : [sh, '-c',
4202 '{ echo SYSTEMD_TEST_DATA=@0@; echo SYSTEMD_CATALOG_DIR=@1@; } >@OUTPUT@'.format(
fce9abb2
ZJS
4203 project_source_root / 'test',
4204 project_build_root / 'catalog')],
e93ada98 4205 depends : catalogs,
e2d41370
FB
4206 build_by_default : true)
4207
a626cb15
ZJS
4208test_cflags = ['-DTEST_CODE=1']
4209# We intentionally do not do inline initializations with definitions for a
4210# bunch of _cleanup_ variables in tests, to ensure valgrind is triggered if we
4211# use the variable unexpectedly. This triggers a lot of maybe-uninitialized
4212# false positives when the combination of -O2 and -flto is used. Suppress them.
b528a628 4213if '-O2' in c_args and '-flto=auto' in c_args
a626cb15
ZJS
4214 test_cflags += cc.first_supported_argument('-Wno-maybe-uninitialized')
4215endif
4216
c12e10d7 4217foreach test : simple_tests
822cd3ff 4218 tests += { 'sources' : [test] }
c12e10d7
JJ
4219endforeach
4220
0454cf05 4221TESTS = {}
822cd3ff
JJ
4222foreach test : tests
4223 sources = test.get('sources')
4224 condition = test.get('condition', '')
4225 type = test.get('type', '')
4226 base = test.get('base', {})
92148283
JJ
4227 deps = [
4228 base.get('dependencies', []),
4229 test.get('dependencies', []),
92148283 4230 ]
37efbbd8 4231
c20d2914 4232 name = fs.name(sources[0])
40c7d3c7
YW
4233 if name.endswith('.cc')
4234 deps += [versiondep]
4235 else
92148283
JJ
4236 deps += [userspace]
4237 endif
c20d2914 4238 name = fs.stem(name)
3b2bdd62 4239
ff5becf5 4240 suite = fs.name(fs.parent(sources[0])).replace('sd-', '')
c3191c6d 4241
822cd3ff 4242 if condition != '' and conf.get(condition) == 0
37efbbd8 4243 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
822cd3ff
JJ
4244 continue
4245 endif
4246
4247 exe = executable(
4248 name,
4249 sources,
4250 include_directories : [base.get('includes', []), test.get('includes', includes)],
4251 link_with : [base.get('link_with', []), test.get('link_with', libshared)],
92148283 4252 dependencies : deps,
822cd3ff
JJ
4253 c_args : [test_cflags, test.get('c_args', [])],
4254 build_by_default : want_tests != 'false',
b0d3095f 4255 install_rpath : pkglibdir,
822cd3ff 4256 install : install_tests,
26c2b302 4257 install_dir : unittestsdir / type,
822cd3ff
JJ
4258 link_depends : runtest_env)
4259
4260 if type == 'manual'
4261 message('@0@ is a manual test'.format(name))
4262 elif type == 'unsafe' and want_tests != 'unsafe'
4263 message('@0@ is an unsafe test'.format(name))
4264 elif want_tests != 'false'
4265 test(name, exe,
b0bd2ae8
ZJS
4266 env : test_env,
4267 timeout : test.get('timeout', 30),
4268 suite : suite,
4269 is_parallel : test.get('parallel', true))
37efbbd8 4270 endif
0454cf05
ZJS
4271
4272 TESTS += { name : exe }
69e96427
ZJS
4273endforeach
4274
0632b4cd 4275exe = executable(
37efbbd8
ZJS
4276 'test-libsystemd-sym',
4277 test_libsystemd_sym_c,
4278 include_directories : includes,
4279 link_with : [libsystemd],
92148283 4280 dependencies : userspace,
fd1939fb 4281 build_by_default : want_tests != 'false',
37efbbd8 4282 install : install_tests,
26c2b302 4283 install_dir : unittestsdir)
938be089
ZJS
4284if want_tests != 'false'
4285 test('test-libsystemd-sym', exe)
4286endif
37ab1a25 4287
0632b4cd
ZJS
4288exe = executable(
4289 'test-libsystemd-static-sym',
4290 test_libsystemd_sym_c,
4291 include_directories : includes,
0632b4cd 4292 link_with : [install_libsystemd_static],
92148283
JJ
4293 dependencies : [
4294 # threads is already included in dependencies on the library,
4295 # but does not seem to get propagated. Add here as a work-around.
4296 threads,
4297 userspace,
4298 ],
d37dee74
YW
4299 build_by_default : want_tests != 'false' and static_libsystemd != 'false',
4300 install : install_tests and static_libsystemd != 'false',
26c2b302 4301 install_dir : unittestsdir)
d37dee74 4302if want_tests != 'false' and static_libsystemd != 'false'
0632b4cd
ZJS
4303 test('test-libsystemd-static-sym', exe)
4304endif
37ab1a25 4305
0632b4cd 4306exe = executable(
37efbbd8
ZJS
4307 'test-libudev-sym',
4308 test_libudev_sym_c,
e4b127e2 4309 include_directories : libudev_includes,
a626cb15 4310 c_args : ['-Wno-deprecated-declarations'] + test_cflags,
37efbbd8 4311 link_with : [libudev],
92148283 4312 dependencies : userspace,
fd1939fb 4313 build_by_default : want_tests != 'false',
37efbbd8 4314 install : install_tests,
26c2b302 4315 install_dir : unittestsdir)
938be089
ZJS
4316if want_tests != 'false'
4317 test('test-libudev-sym', exe)
4318endif
0632b4cd
ZJS
4319
4320exe = executable(
4321 'test-libudev-static-sym',
4322 test_libudev_sym_c,
e4b127e2 4323 include_directories : libudev_includes,
a626cb15 4324 c_args : ['-Wno-deprecated-declarations'] + test_cflags,
0632b4cd 4325 link_with : [install_libudev_static],
92148283 4326 dependencies : userspace,
d37dee74
YW
4327 build_by_default : want_tests != 'false' and static_libudev != 'false',
4328 install : install_tests and static_libudev != 'false',
26c2b302 4329 install_dir : unittestsdir)
d37dee74 4330if want_tests != 'false' and static_libudev != 'false'
0632b4cd
ZJS
4331 test('test-libudev-static-sym', exe)
4332endif
e0bec52f 4333
0454cf05 4334if want_tests != 'false'
67b1c943 4335 exe = TESTS.get('udev-rule-runner')
0454cf05
ZJS
4336 test('test-udev',
4337 test_udev_py,
4338 args : ['-v'],
67b1c943
YW
4339 env : ['UDEV_RULE_RUNNER=' + exe.full_path()],
4340 depends : exe,
0454cf05
ZJS
4341 timeout : 180)
4342endif
4343
69e96427 4344############################################################
5c23128d 4345
a9a7153c 4346foreach fuzzer : simple_fuzzers
2ed35b2f 4347 fuzzers += { 'sources' : [fuzzer] }
a9a7153c
JJ
4348endforeach
4349
7db7d5b7
JR
4350fuzzer_exes = []
4351
2ed35b2f
JJ
4352foreach fuzzer : fuzzers
4353 sources = fuzzer.get('sources')
4354 base = fuzzer.get('base', {})
4355 dependencies = [base.get('dependencies', []), fuzzer.get('dependencies', [])]
7e299ffe
ZJS
4356 link_args = []
4357
4358 if want_ossfuzz
4359 dependencies += fuzzing_engine
4360 elif want_libfuzzer
4361 if fuzzing_engine.found()
9c5c4677
EV
4362 dependencies += fuzzing_engine
4363 else
7e299ffe 4364 link_args += ['-fsanitize=fuzzer']
9c5c4677 4365 endif
7e299ffe 4366 else
2ed35b2f 4367 sources += files('src/fuzz/fuzz-main.c')
7e299ffe 4368 endif
7e343b53 4369 sources += fuzz_generated_directives
7db7d5b7 4370
ff5becf5 4371 name = fs.stem(sources[0])
7db7d5b7 4372
f78ad5f0 4373 exe = executable(
7e299ffe
ZJS
4374 name,
4375 sources,
2ed35b2f
JJ
4376 include_directories : [
4377 base.get('includes', []),
4378 fuzzer.get('includes', includes),
4379 include_directories('src/fuzz'),
4380 ],
4381 link_with : [base.get('link_with', []), fuzzer.get('link_with', libshared)],
92148283
JJ
4382 dependencies : [
4383 dependencies,
4384 userspace,
92148283 4385 ],
2ed35b2f 4386 c_args : [test_cflags, fuzzer.get('c_args', [])],
7e299ffe
ZJS
4387 link_args: link_args,
4388 install : false,
f78ad5f0
ZJS
4389 build_by_default : fuzzer_build)
4390 fuzzer_exes += exe
4391
7db5761d 4392 if want_tests != 'false' and name in fuzz_regression_tests
f78ad5f0
ZJS
4393 # Run the fuzz regression tests without any sanitizers enabled.
4394 # Additional invocations with sanitizers may be added below.
7e343b53
MK
4395 foreach tuple : fuzz_regression_tests[name]
4396 fuzz_dir = tuple[0]
4397 fuzz_in = tuple[1]
7db5761d
MK
4398 test('@0@_@1@'.format(name, fuzz_in),
4399 exe,
ec2c6ac0 4400 suite : 'fuzz',
7e343b53
MK
4401 args : [fuzz_dir != '' ? project_source_root / fuzz_dir / name / fuzz_in
4402 : fuzz_generated_in_dir / '@0@_@1@'.format(name, fuzz_in)])
f78ad5f0
ZJS
4403 endforeach
4404 endif
7e299ffe 4405endforeach
7db7d5b7 4406
6839ce33 4407alias_target('fuzzers', fuzzer_exes)
7db7d5b7
JR
4408
4409############################################################
4410
10783aef
ZJS
4411subdir('docs/sysvinit')
4412subdir('docs/var-log')
4413subdir('hwdb.d')
4414subdir('man')
378e9d2b 4415subdir('modprobe.d')
10783aef
ZJS
4416subdir('network')
4417subdir('presets')
4418subdir('shell-completion/bash')
4419subdir('shell-completion/zsh')
5c23128d
ZJS
4420subdir('sysctl.d')
4421subdir('sysusers.d')
4422subdir('tmpfiles.d')
4f10b807 4423subdir('units')
5c23128d 4424
5c23128d
ZJS
4425install_subdir('factory/etc',
4426 install_dir : factorydir)
623370e6 4427subdir('factory/templates')
5c23128d 4428
d7aa78c3
JT
4429if install_sysconfdir
4430 install_data('xorg/50-systemd-user.sh',
4431 install_dir : xinitrcdir)
4432endif
f09eb768 4433install_data('LICENSE.GPL2',
5c23128d 4434 'LICENSE.LGPL2.1',
f09eb768
LP
4435 'NEWS',
4436 'README',
eea98402 4437 'docs/CODING_STYLE.md',
1d1cb168 4438 'docs/DISTRO_PORTING.md',
9e825ebf 4439 'docs/ENVIRONMENT.md',
5425f8a5 4440 'docs/HACKING.md',
9e825ebf 4441 'docs/TRANSIENT-SETTINGS.md',
b6dc0d7d 4442 'docs/TRANSLATORS.md',
9e825ebf 4443 'docs/UIDS-GIDS.md',
5c23128d 4444 install_dir : docdir)
d68b342b 4445
9c6e32a2
LB
4446install_subdir('LICENSES',
4447 install_dir : docdir)
4448
7c22f07c
ZJS
4449meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
4450meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
94e75a54 4451
d68b342b
ZJS
4452############################################################
4453
2d4efd1d
LB
4454# Ensure that changes to the docs/ directory do not break the
4455# basic Github pages build. But only run it in developer mode,
4456# as it might be fragile due to changes in the tooling, and it is
4457# not generally useful for users.
4458jekyll = find_program('jekyll', required : false)
4459if get_option('mode') == 'developer' and want_tests != 'false' and jekyll.found()
4460 test('github-pages',
4461 jekyll,
02e0f430 4462 suite : 'dist',
2d4efd1d 4463 args : ['build',
fce9abb2
ZJS
4464 '--source', project_source_root / 'docs',
4465 '--destination', project_build_root / '_site'])
2d4efd1d
LB
4466endif
4467
4468############################################################
4469
dd1e33c8 4470check_help = find_program('tools/check-help.sh')
ffb7406b 4471check_version = find_program('tools/check-version.sh')
005a29f2
ZJS
4472
4473foreach exec : public_programs
739a62bb 4474 name = fs.name(exec.full_path())
938be089
ZJS
4475 if want_tests != 'false'
4476 test('check-help-' + name,
dd1e33c8 4477 check_help,
02e0f430 4478 suite : 'dist',
e93ada98
DDM
4479 args : exec.full_path(),
4480 depends: exec)
ffb7406b
ZJS
4481
4482 test('check-version-' + name,
4483 check_version,
02e0f430 4484 suite : 'dist',
ffb7406b
ZJS
4485 args : [exec.full_path(),
4486 meson.project_version()],
4487 depends: exec)
938be089 4488 endif
005a29f2
ZJS
4489endforeach
4490
52d4d1d3 4491# Enable tests for all supported sanitizers
7db5761d 4492foreach tuple : fuzz_sanitizers
52d4d1d3
ZJS
4493 sanitizer = tuple[0]
4494 build = tuple[1]
b68dfb9e 4495
7a6397d2 4496 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
7db5761d
MK
4497 foreach fuzzer, fuzz_ins : fuzz_regression_tests
4498 name = '@0@:@1@'.format(fuzzer, sanitizer)
4499 if want_tests == 'false'
4500 message('Not compiling @0@ because tests is set to false'.format(name))
4501 continue
52d4d1d3 4502 endif
7db5761d
MK
4503 if not fuzz_tests
4504 message('Not compiling @0@ because fuzz-tests is set to false'.format(name))
4505 continue
4506 endif
4507 exe = custom_target(
4508 name,
4509 output : name,
7e343b53 4510 depends : [build] + fuzz_generated_directives,
7db5761d
MK
4511 command : [ln, '-fs',
4512 build.full_path() / fuzzer,
4513 '@OUTPUT@'],
4514 build_by_default : true)
4515
7e343b53
MK
4516 foreach tuple : fuzz_ins
4517 fuzz_dir = tuple[0]
4518 fuzz_in = tuple[1]
4519
7db5761d 4520 test('@0@_@1@_@2@'.format(fuzzer, fuzz_in, sanitizer),
52d4d1d3 4521 env,
14056a52 4522 suite : 'fuzz+san',
89767158
EV
4523 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
4524 timeout : 60,
52d4d1d3 4525 args : [exe.full_path(),
7e343b53
MK
4526 fuzz_dir != '' ? project_source_root / fuzz_dir / fuzzer / fuzz_in
4527 : fuzz_generated_in_dir / '@0@_@1@'.format(fuzzer, fuzz_in)])
7db5761d 4528 endforeach
52d4d1d3 4529 endforeach
b68dfb9e
ZJS
4530 endif
4531endforeach
4532
4533############################################################
4534
0700e8ba 4535if git.found()
37efbbd8 4536 all_files = run_command(
0f4c4f38
ZJS
4537 env, '-u', 'GIT_WORK_TREE',
4538 git, '--git-dir=@0@/.git'.format(project_source_root),
ba9ca60a 4539 'ls-files', ':/*.[ch]', ':/*.cc',
e92777d2
ZJS
4540 check : false)
4541 if all_files.returncode() == 0
4542 all_files = files(all_files.stdout().split())
4543
4544 custom_target(
4545 'tags',
4546 output : 'tags',
4547 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
4548 run_target(
4549 'ctags',
691db9a7 4550 command : [env, 'ctags', '--tag-relative=never', '-o', '@0@/tags'.format(project_source_root)] + all_files)
60892358
ZJS
4551
4552 ############################################
4553
4554 if want_tests != 'false' and conf.get('BUILD_MODE_DEVELOPER') == 1
4555 test('check-includes',
4556 files('tools/check-includes.py'),
4557 args: all_files,
4558 env : ['PROJECT_SOURCE_ROOT=@0@'.format(project_source_root)])
4559 endif
e92777d2 4560 endif
177929c2 4561
60892358
ZJS
4562 ####################################################
4563
dd1e33c8 4564 git_contrib_sh = find_program('tools/git-contrib.sh')
a923e085 4565 run_target(
37efbbd8 4566 'git-contrib',
dd1e33c8 4567 command : [git_contrib_sh])
dd6ab3df 4568
60892358
ZJS
4569 ####################################################
4570
dd6ab3df 4571 git_head = run_command(
e92777d2
ZJS
4572 git, '--git-dir=@0@/.git'.format(project_source_root),
4573 'rev-parse', 'HEAD',
4574 check : false).stdout().strip()
dd6ab3df 4575 git_head_short = run_command(
e92777d2
ZJS
4576 git, '--git-dir=@0@/.git'.format(project_source_root),
4577 'rev-parse', '--short=7', 'HEAD',
4578 check : false).stdout().strip()
dd6ab3df
ZJS
4579
4580 run_target(
4581 'git-snapshot',
0f4c4f38 4582 command : [git, 'archive',
1485aacb 4583 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
dd6ab3df
ZJS
4584 git_head_short),
4585 '--prefix', 'systemd-@0@/'.format(git_head),
4586 'HEAD'])
4587endif
829257d1
ZJS
4588
4589############################################################
4590
dd1e33c8 4591check_api_docs_sh = find_program('tools/check-api-docs.sh')
51b13863
LP
4592run_target(
4593 'check-api-docs',
4594 depends : [man, libsystemd, libudev],
dd1e33c8 4595 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
51b13863 4596
f12c5d36
ZJS
4597alias_target('update-dbus-docs', update_dbus_docs)
4598alias_target('update-man-rules', update_man_rules)
e3c368f6 4599
0628d48e
LB
4600if not meson.is_cross_build()
4601 custom_target(
4602 'export-dbus-interfaces',
4645074e 4603 output : fs.name(dbus_interfaces_dir),
0628d48e 4604 install : dbus_interfaces_dir != 'no',
4645074e 4605 install_dir : fs.parent(dbus_interfaces_dir),
0628d48e
LB
4606 command : [export_dbus_interfaces_py, '@OUTPUT@', dbus_programs])
4607endif
e3c68924 4608
51b13863 4609############################################################
829257d1 4610
e92777d2
ZJS
4611alt_time_epoch = run_command('date', '-Is', '-u', '-d', '@@0@'.format(time_epoch),
4612 check : true).stdout().strip()
12085ebb
ZJS
4613
4614summary({
12085ebb
ZJS
4615 'split bin-sbin' : split_bin,
4616 'prefix directory' : prefixdir,
12085ebb
ZJS
4617 'sysconf directory' : sysconfdir,
4618 'include directory' : includedir,
4619 'lib directory' : libdir,
12085ebb
ZJS
4620 'SysV init scripts' : sysvinit_path,
4621 'SysV rc?.d directories' : sysvrcnd_path,
4622 'PAM modules directory' : pamlibdir,
4623 'PAM configuration directory' : pamconfdir,
4624 'libcryptsetup plugins directory' : libcryptsetup_plugins_dir,
4625 'RPM macros directory' : rpmmacrosdir,
4626 'modprobe.d directory' : modprobedir,
4627 'D-Bus policy directory' : dbuspolicydir,
4628 'D-Bus session directory' : dbussessionservicedir,
4629 'D-Bus system directory' : dbussystemservicedir,
7e560e79 4630 'D-Bus interfaces directory' : dbus_interfaces_dir,
12085ebb
ZJS
4631 'bash completions directory' : bashcompletiondir,
4632 'zsh completions directory' : zshcompletiondir,
a2b0cd3f 4633 'private shared lib version tag' : shared_lib_tag,
12085ebb
ZJS
4634 'extra start script' : get_option('rc-local'),
4635 'debug shell' : '@0@ @ @1@'.format(get_option('debug-shell'),
4636 get_option('debug-tty')),
4637 'system UIDs' : '<=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_UID_MAX'),
4638 conf.get('SYSTEM_ALLOC_UID_MIN')),
4639 'system GIDs' : '<=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_GID_MAX'),
4640 conf.get('SYSTEM_ALLOC_GID_MIN')),
4641 'dynamic UIDs' : '@0@…@1@'.format(dynamic_uid_min, dynamic_uid_max),
4642 'container UID bases' : '@0@…@1@'.format(container_uid_base_min, container_uid_base_max),
4643 'static UID/GID allocations' : ' '.join(static_ugids),
4644 '/dev/kvm access mode' : get_option('dev-kvm-mode'),
4645 'render group access mode' : get_option('group-render-mode'),
4646 'certificate root directory' : get_option('certificate-root'),
4647 'support URL' : support_url,
4648 'nobody user name' : nobody_user,
4649 'nobody group name' : nobody_group,
4650 'fallback hostname' : get_option('fallback-hostname'),
9798deaf 4651 'default compression method' : compression,
12085ebb
ZJS
4652 'default DNSSEC mode' : default_dnssec,
4653 'default DNS-over-TLS mode' : default_dns_over_tls,
4654 'default mDNS mode' : default_mdns,
4655 'default LLMNR mode' : default_llmnr,
4656 'default DNS servers' : dns_servers.split(' '),
4657 'default NTP servers' : ntp_servers.split(' '),
4658 'default cgroup hierarchy' : default_hierarchy,
4659 'default net.naming-scheme value' : default_net_naming_scheme,
4660 'default KillUserProcesses value' : kill_user_processes,
4661 'default locale' : default_locale,
88b6f0de 4662 'default nspawn locale' : nspawn_locale,
79dec86a 4663 'default status unit format' : status_unit_format_default,
12085ebb
ZJS
4664 'default user $PATH' :
4665 default_user_path != '' ? default_user_path : '(same as system services)',
4666 'systemd service watchdog' : service_watchdog == '' ? 'disabled' : service_watchdog,
4667 'time epoch' : '@0@ (@1@)'.format(time_epoch, alt_time_epoch)})
829257d1
ZJS
4668
4669# TODO:
4670# CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
4671# CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
4672# LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
4673
829257d1
ZJS
4674found = []
4675missing = []
4676
4677foreach tuple : [
56d68e71
ZJS
4678 # dependencies
4679 ['ACL'],
829257d1 4680 ['AUDIT'],
829257d1 4681 ['AppArmor'],
56d68e71
ZJS
4682 ['IMA'],
4683 ['PAM'],
829257d1 4684 ['SECCOMP'],
56d68e71 4685 ['SELinux'],
829257d1 4686 ['SMACK'],
56d68e71
ZJS
4687 ['blkid'],
4688 ['elfutils'],
829257d1 4689 ['gcrypt'],
829257d1 4690 ['gnutls'],
7d861e12 4691 ['libbpf'],
56d68e71 4692 ['libcryptsetup'],
d1ae38d8 4693 ['libcryptsetup-plugins'],
829257d1 4694 ['libcurl'],
56d68e71
ZJS
4695 ['libfdisk'],
4696 ['libfido2'],
829257d1 4697 ['libidn'],
56d68e71 4698 ['libidn2'],
829257d1 4699 ['libiptc'],
56d68e71
ZJS
4700 ['microhttpd'],
4701 ['openssl'],
4702 ['p11kit'],
1d8aae43 4703 ['passwdqc'],
56d68e71
ZJS
4704 ['pcre2'],
4705 ['pwquality'],
4706 ['qrencode'],
4707 ['tpm2'],
4708 ['xkbcommon'],
4709
4710 # compression libs
4711 ['zstd'],
4712 ['lz4'],
4713 ['xz'],
4714 ['zlib'],
4715 ['bzip2'],
4716
4717 # components
4718 ['backlight'],
829257d1 4719 ['binfmt'],
dfca5587 4720 ['bootloader'],
0a0d4899 4721 ['bpf-framework', conf.get('BPF_FRAMEWORK') == 1],
56d68e71 4722 ['coredump'],
56d68e71 4723 ['efi'],
dfca5587 4724 ['environment.d'],
829257d1 4725 ['firstboot'],
56d68e71
ZJS
4726 ['hibernate'],
4727 ['homed'],
4728 ['hostnamed'],
4729 ['hwdb'],
4730 ['importd'],
4731 ['initrd'],
f887eab1 4732 ['kernel-install'],
56d68e71 4733 ['localed'],
829257d1
ZJS
4734 ['logind'],
4735 ['machined'],
56d68e71
ZJS
4736 ['networkd'],
4737 ['nss-myhostname'],
4738 ['nss-mymachines'],
4739 ['nss-resolve'],
4740 ['nss-systemd'],
4741 ['oomd'],
61d0578b 4742 ['portabled'],
56d68e71
ZJS
4743 ['pstore'],
4744 ['quotacheck'],
4745 ['randomseed'],
4746 ['repart'],
4747 ['resolve'],
4748 ['rfkill'],
9bca4ae4 4749 ['sysext'],
0a0d4899 4750 ['systemd-analyze', conf.get('ENABLE_ANALYZE') == 1],
43cc7a3e 4751 ['sysupdate'],
56d68e71 4752 ['sysusers'],
829257d1
ZJS
4753 ['timedated'],
4754 ['timesyncd'],
56d68e71
ZJS
4755 ['tmpfiles'],
4756 ['userdb'],
4757 ['vconsole'],
4758 ['xdg-autostart'],
4759
4760 # optional features
56d68e71 4761 ['idn'],
829257d1 4762 ['polkit'],
56d68e71 4763 ['nscd'],
0a0d4899 4764 ['legacy-pkla', install_polkit_pkla],
829257d1 4765 ['kmod'],
ede5a78f 4766 ['xenctrl'],
829257d1
ZJS
4767 ['dbus'],
4768 ['glib'],
829257d1 4769 ['tpm'],
0a0d4899
JH
4770 ['man pages', want_man],
4771 ['html pages', want_html],
4772 ['man page indices', want_man and have_lxml],
829257d1 4773 ['SysV compat'],
56d68e71 4774 ['compat-mutable-uid-boundaries'],
829257d1
ZJS
4775 ['utmp'],
4776 ['ldconfig'],
0a0d4899
JH
4777 ['adm group', get_option('adm-group')],
4778 ['wheel group', get_option('wheel-group')],
b14e1b43 4779 ['gshadow'],
829257d1
ZJS
4780 ['debug hashmap'],
4781 ['debug mmap cache'],
d6601495 4782 ['debug siphash'],
0a0d4899 4783 ['trace logging', conf.get('LOG_TRACE') == 1],
69525346
YW
4784 ['slow tests', slow_tests],
4785 ['fuzz tests', fuzz_tests],
0a0d4899
JH
4786 ['install tests', install_tests],
4787 ['link-udev-shared', get_option('link-udev-shared')],
4788 ['link-systemctl-shared', get_option('link-systemctl-shared')],
4789 ['link-networkd-shared', get_option('link-networkd-shared')],
4790 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
4791 ['link-journalctl-shared', get_option('link-journalctl-shared')],
4792 ['link-boot-shared', get_option('link-boot-shared')],
c06d2e44 4793 ['link-portabled-shared', get_option('link-portabled-shared')],
93651582 4794 ['first-boot-full-preset'],
ceedbf81 4795 ['fexecve'],
0a0d4899
JH
4796 ['standalone-binaries', get_option('standalone-binaries')],
4797 ['coverage', get_option('b_coverage')],
829257d1
ZJS
4798]
4799
af4d7860
ZJS
4800 if tuple.length() >= 2
4801 cond = tuple[1]
4802 else
829257d1
ZJS
4803 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
4804 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
349cc4a5 4805 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
829257d1
ZJS
4806 endif
4807 if cond
5a8b1640 4808 found += tuple[0]
829257d1 4809 else
5a8b1640 4810 missing += tuple[0]
829257d1
ZJS
4811 endif
4812endforeach
4813
c716c253
ZJS
4814if static_libsystemd == 'false'
4815 missing += 'static-libsystemd'
4816else
4817 found += 'static-libsystemd(@0@)'.format(static_libsystemd)
4818endif
4819
4820if static_libudev == 'false'
4821 missing += 'static-libudev'
4822else
4823 found += 'static-libudev(@0@)'.format(static_libudev)
4824endif
4825
57633d23
ZJS
4826if conf.get('HAVE_OPENSSL_OR_GCRYPT') == 1 and conf.get('PREFER_OPENSSL') == 1
4827 found += 'cryptolib(openssl)'
4828elif conf.get('HAVE_OPENSSL_OR_GCRYPT') == 1
4829 found += 'cryptolib(gcrypt)'
4830else
4831 missing += 'cryptolib'
4832endif
4833
237f2da9
ZJS
4834if conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1
4835 found += 'DNS-over-TLS(gnutls)'
4836elif conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1
4837 found += 'DNS-over-TLS(openssl)'
4838else
4839 missing += 'DNS-over-TLS'
4840endif
4841
12085ebb
ZJS
4842summary({
4843 'enabled' : ', '.join(found),
4844 'disabled' : ', '.join(missing)},
4845 section : 'Features')