]> git.ipfire.org Git - thirdparty/systemd.git/blame - meson.build
core/execute: fall back to execve() for scripts
[thirdparty/systemd.git] / meson.build
CommitLineData
3a726fcd 1# SPDX-License-Identifier: LGPL-2.1+
3a726fcd 2
5c23128d 3project('systemd', 'c',
3994922b 4 version : '246',
5c23128d
ZJS
5 license : 'LGPLv2+',
6 default_options: [
37efbbd8
ZJS
7 'c_std=gnu99',
8 'prefix=/usr',
9 'sysconfdir=/etc',
10 'localstatedir=/var',
827ca909 11 'warning_level=2',
5c23128d 12 ],
7a6397d2 13 meson_version : '>= 0.46',
5c23128d
ZJS
14 )
15
3994922b 16libsystemd_version = '0.29.0'
3b684be0 17libudev_version = '1.7.0'
56d50ab1 18
348b4437 19# We need the same data in two different formats, ugh!
5c23128d
ZJS
20# Also, for hysterical reasons, we use different variable
21# names, sometimes. Not all variables are included in every
22# set. Ugh, ugh, ugh!
23conf = configuration_data()
6ffeca8c
ZJS
24conf.set('PROJECT_VERSION', meson.project_version(),
25 description : 'Numerical project version (used where a simple number is expected)')
5c23128d
ZJS
26
27substs = configuration_data()
a67c318d 28substs.set('PROJECT_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
6ffeca8c
ZJS
29substs.set('PROJECT_VERSION', meson.project_version(),
30 description : 'Numerical project version (used where a simple number is expected)')
5c23128d 31
1485aacb
DC
32# This is to be used instead of meson.source_root(), as the latter will return
33# the wrong result when systemd is being built as a meson subproject
34project_source_root = meson.current_source_dir()
81e06775 35project_build_root = meson.current_build_dir()
a0b15b41 36relative_source_path = run_command('realpath',
81e06775 37 '--relative-to=@0@'.format(project_build_root),
a0b15b41
ZJS
38 project_source_root).stdout().strip()
39conf.set_quoted('RELATIVE_SOURCE_PATH', relative_source_path)
1485aacb 40
839bdf25
ZJS
41conf.set10('DEVELOPER_MODE', get_option('mode') == 'developer',
42 description : 'enable additional checks only suitable in development')
43
c09edc79
ZJS
44want_ossfuzz = get_option('oss-fuzz')
45want_libfuzzer = get_option('llvm-fuzz')
6b8d32ea
EV
46if want_ossfuzz + want_libfuzzer > 1
47 error('only one of oss-fuzz or llvm-fuzz can be specified')
c09edc79 48endif
87ac55a1
EV
49
50skip_deps = want_ossfuzz or want_libfuzzer
6b8d32ea 51fuzzer_build = want_ossfuzz or want_libfuzzer
c09edc79 52
5c23128d
ZJS
53#####################################################################
54
003c8879 55# Try to install the git pre-commit hook
e2d612a8
ZJS
56add_git_hook_sh = find_program('tools/add-git-hook.sh', required : false)
57if add_git_hook_sh.found()
58 git_hook = run_command(add_git_hook_sh)
59 if git_hook.returncode() == 0
60 message(git_hook.stdout().strip())
61 endif
003c8879
ZJS
62endif
63
64#####################################################################
65
2675413e
ZJS
66if get_option('split-usr') == 'auto'
67 split_usr = run_command('test', '-L', '/bin').returncode() != 0
68else
69 split_usr = get_option('split-usr') == 'true'
70endif
671f0f8d
ZJS
71conf.set10('HAVE_SPLIT_USR', split_usr,
72 description : '/usr/bin and /bin directories are separate')
9a8e64b0 73
157baa87
ZJS
74if get_option('split-bin') == 'auto'
75 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
76else
77 split_bin = get_option('split-bin') == 'true'
78endif
671f0f8d
ZJS
79conf.set10('HAVE_SPLIT_BIN', split_bin,
80 description : 'bin and sbin directories are separate')
157baa87 81
74344a17 82rootprefixdir = get_option('rootprefix')
74344a17
ZJS
83# Unusual rootprefixdir values are used by some distros
84# (see https://github.com/systemd/systemd/pull/7461).
ba7f4ae6 85rootprefix_default = split_usr ? '/' : '/usr'
9a8e64b0
ZJS
86if rootprefixdir == ''
87 rootprefixdir = rootprefix_default
74344a17 88endif
23bdba61 89rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
5c23128d 90
8ef8f3d5
FB
91have_standalone_binaries = get_option('standalone-binaries')
92
5c23128d
ZJS
93sysvinit_path = get_option('sysvinit-path')
94sysvrcnd_path = get_option('sysvrcnd-path')
348b4437 95conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
349cc4a5 96 description : 'SysV init scripts and rcN.d links are supported')
5c23128d 97
cdf7ad38
NL
98if get_option('hibernate') and not get_option('initrd')
99 error('hibernate depends on initrd')
100endif
101
a8b627aa
LP
102conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
103conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
09dad04c 104conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
a8b627aa 105
23bdba61 106# join_paths ignores the preceding arguments if an absolute component is
5c23128d
ZJS
107# encountered, so this should canonicalize various paths when they are
108# absolute or relative.
109prefixdir = get_option('prefix')
110if not prefixdir.startswith('/')
37efbbd8 111 error('Prefix is not absolute: "@0@"'.format(prefixdir))
5c23128d
ZJS
112endif
113bindir = join_paths(prefixdir, get_option('bindir'))
114libdir = join_paths(prefixdir, get_option('libdir'))
115sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
116includedir = join_paths(prefixdir, get_option('includedir'))
117datadir = join_paths(prefixdir, get_option('datadir'))
118localstatedir = join_paths('/', get_option('localstatedir'))
119
120rootbindir = join_paths(rootprefixdir, 'bin')
157baa87 121rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
5c23128d
ZJS
122rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
123
124rootlibdir = get_option('rootlibdir')
125if rootlibdir == ''
37efbbd8 126 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
5c23128d
ZJS
127endif
128
129# Dirs of external packages
a95696e3
BM
130pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
131pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
e17e5ba9
MB
132polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
133polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
134polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
e17e5ba9 135xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
8a38aac3
YW
136rpmmacrosdir = get_option('rpmmacrosdir')
137if rpmmacrosdir != 'no'
138 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
139endif
02fa054d 140modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
5c23128d
ZJS
141
142# Our own paths
e17e5ba9
MB
143pkgdatadir = join_paths(datadir, 'systemd')
144environmentdir = join_paths(prefixdir, 'lib/environment.d')
145pkgsysconfdir = join_paths(sysconfdir, 'systemd')
146userunitdir = join_paths(prefixdir, 'lib/systemd/user')
147userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
148tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
149sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
150sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
151binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
152modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
153networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
154pkgincludedir = join_paths(includedir, 'systemd')
155systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
156usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
157systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
158userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
159systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
160systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
161systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
162systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
163udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
e17e5ba9
MB
164udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
165udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
166catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
167kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
168factorydir = join_paths(datadir, 'factory')
e17e5ba9
MB
169bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
170testsdir = join_paths(prefixdir, 'lib/systemd/tests')
171systemdstatedir = join_paths(localstatedir, 'lib/systemd')
172catalogstatedir = join_paths(systemdstatedir, 'catalog')
173randomseeddir = join_paths(localstatedir, 'lib/systemd')
61d0578b 174profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
e5ea741c 175ntpservicelistdir = join_paths(rootprefixdir, 'lib/systemd/ntp-units.d')
5c23128d 176
75aaade1
TB
177docdir = get_option('docdir')
178if docdir == ''
179 docdir = join_paths(datadir, 'doc/systemd')
180endif
181
5c23128d
ZJS
182dbuspolicydir = get_option('dbuspolicydir')
183if dbuspolicydir == ''
37efbbd8 184 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
5c23128d
ZJS
185endif
186
187dbussessionservicedir = get_option('dbussessionservicedir')
188if dbussessionservicedir == ''
37efbbd8 189 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
5c23128d
ZJS
190endif
191
192dbussystemservicedir = get_option('dbussystemservicedir')
193if dbussystemservicedir == ''
37efbbd8 194 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
5c23128d
ZJS
195endif
196
197pamlibdir = get_option('pamlibdir')
198if pamlibdir == ''
37efbbd8 199 pamlibdir = join_paths(rootlibdir, 'security')
5c23128d
ZJS
200endif
201
202pamconfdir = get_option('pamconfdir')
203if pamconfdir == ''
bae66f4b 204 pamconfdir = join_paths(prefixdir, 'lib/pam.d')
5c23128d
ZJS
205endif
206
444d5863 207memory_accounting_default = get_option('memory-accounting-default')
36cf4507 208status_unit_format_default = get_option('status-unit-format-default')
444d5863 209
5c23128d 210conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
96d33e4a 211conf.set_quoted('SYSTEM_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'system'))
5c23128d
ZJS
212conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
213conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
214conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
452d2dfd 215conf.set_quoted('RC_LOCAL_PATH', get_option('rc-local'))
96164a39 216
f7c5427c 217conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
96164a39 218
96d33e4a
ZJS
219conf.set_quoted('USER_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'user'))
220conf.set_quoted('USER_DATA_UNIT_DIR', userunitdir)
5c23128d 221conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
e17e5ba9
MB
222conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
223conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
224conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
225conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
da495a03 226conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
7f2806d5 227conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
e17e5ba9 228conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
e17e5ba9
MB
229conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
230conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
231conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
74344a17 232conf.set_quoted('ROOTPREFIX', rootprefixdir)
b612c26c 233conf.set_quoted('ROOTPREFIX_NOSLASH', rootprefixdir_noslash)
3131bfe3 234conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
e17e5ba9
MB
235conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
236conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
96d33e4a
ZJS
237conf.set_quoted('SYSTEM_GENERATOR_DIR', systemgeneratordir)
238conf.set_quoted('USER_GENERATOR_DIR', usergeneratordir)
239conf.set_quoted('SYSTEM_ENV_GENERATOR_DIR', systemenvgeneratordir)
240conf.set_quoted('USER_ENV_GENERATOR_DIR', userenvgeneratordir)
5c23128d
ZJS
241conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
242conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
e17e5ba9
MB
243conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
244conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
e2d41370 245conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
49cdae63 246conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
5c23128d 247conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
e17e5ba9 248conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
5c23128d
ZJS
249conf.set_quoted('LIBDIR', libdir)
250conf.set_quoted('ROOTLIBDIR', rootlibdir)
251conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
252conf.set_quoted('BOOTLIBDIR', bootlibdir)
e17e5ba9
MB
253conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
254conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
1d7579c4 255conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
e17e5ba9
MB
256conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
257conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
258conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
259conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
70a5db58 260conf.set_quoted('SYSTEMD_HOMEWORK_PATH', join_paths(rootlibexecdir, 'systemd-homework'))
d093b62c 261conf.set_quoted('SYSTEMD_USERWORK_PATH', join_paths(rootlibexecdir, 'systemd-userwork'))
30538ff1 262conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
7f672e86 263conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
36cf4507 264conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
5c23128d 265
5c23128d 266substs.set('prefix', prefixdir)
1c2c7c6c 267substs.set('rootprefix', rootprefixdir)
23bdba61 268substs.set('rootprefix_noslash', rootprefixdir_noslash)
3131bfe3
ZJS
269substs.set('exec_prefix', prefixdir)
270substs.set('libdir', libdir)
271substs.set('rootlibdir', rootlibdir)
272substs.set('includedir', includedir)
1c2c7c6c 273substs.set('sysconfdir', sysconfdir)
3131bfe3
ZJS
274substs.set('bindir', bindir)
275substs.set('rootbindir', rootbindir)
5c23128d
ZJS
276substs.set('rootlibexecdir', rootlibexecdir)
277substs.set('systemunitdir', systemunitdir)
278substs.set('userunitdir', userunitdir)
279substs.set('systempresetdir', systempresetdir)
280substs.set('userpresetdir', userpresetdir)
281substs.set('udevhwdbdir', udevhwdbdir)
282substs.set('udevrulesdir', udevrulesdir)
3131bfe3 283substs.set('udevlibexecdir', udevlibexecdir)
424e80b4 284substs.set('environmentdir', environmentdir)
5c23128d
ZJS
285substs.set('catalogdir', catalogdir)
286substs.set('tmpfilesdir', tmpfilesdir)
287substs.set('sysusersdir', sysusersdir)
288substs.set('sysctldir', sysctldir)
289substs.set('binfmtdir', binfmtdir)
290substs.set('modulesloaddir', modulesloaddir)
424e80b4 291substs.set('modprobedir', modprobedir)
5c23128d
ZJS
292substs.set('systemgeneratordir', systemgeneratordir)
293substs.set('usergeneratordir', usergeneratordir)
294substs.set('systemenvgeneratordir', systemenvgeneratordir)
295substs.set('userenvgeneratordir', userenvgeneratordir)
296substs.set('systemshutdowndir', systemshutdowndir)
297substs.set('systemsleepdir', systemsleepdir)
2a4c156d 298substs.set('CERTIFICATEROOT', get_option('certificate-root'))
e17e5ba9 299substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
2a4c156d
ZJS
300substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
301substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
bd7e6aa7 302substs.set('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
452d2dfd 303substs.set('RC_LOCAL_PATH', get_option('rc-local'))
444d5863 304substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
36cf4507 305substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
c02b6ee4 306substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
81e06775 307substs.set('BUILD_ROOT', project_build_root)
5c23128d
ZJS
308
309#####################################################################
310
311cc = meson.get_compiler('c')
312pkgconfig = import('pkgconfig')
dd1e33c8 313check_compilation_sh = find_program('tools/check-compilation.sh')
b68dfb9e 314meson_build_sh = find_program('tools/meson-build.sh')
5c23128d 315
d3da291e
ZJS
316want_tests = get_option('tests')
317slow_tests = want_tests != 'false' and get_option('slow-tests')
c56463fd 318fuzz_tests = want_tests != 'false' and get_option('fuzz-tests')
d3da291e
ZJS
319install_tests = get_option('install-tests')
320
46e63a2a 321if add_languages('cpp', required : fuzzer_build)
3b2bdd62 322 # Used only for tests
e9f4f566
ZJS
323 cxx = meson.get_compiler('cpp')
324 cxx_cmd = ' '.join(cxx.cmd_array())
1b2acaa7 325else
9b0ca019 326 cxx_cmd = ''
94e2523b
ZJS
327endif
328
31e57a35 329if want_libfuzzer
9c5c4677
EV
330 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
331 if fuzzing_engine.found()
332 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
333 elif cc.has_argument('-fsanitize=fuzzer-no-link')
334 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
335 else
336 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
337 endif
c09edc79 338elif want_ossfuzz
7db7d5b7
JR
339 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
340endif
341
e9f4f566
ZJS
342# Those generate many false positives, and we do not want to change the code to
343# avoid them.
344basic_disabled_warnings = [
345 '-Wno-unused-parameter',
346 '-Wno-missing-field-initializers',
347 '-Wno-unused-result',
348 '-Wno-format-signedness',
349]
e9f4f566 350
30a4ddff 351possible_cc_flags = [
30a4ddff
YW
352 '-Werror=undef',
353 '-Wlogical-op',
354 '-Wmissing-include-dirs',
355 '-Wold-style-definition',
356 '-Wpointer-arith',
357 '-Winit-self',
30a4ddff
YW
358 '-Wfloat-equal',
359 '-Wsuggest-attribute=noreturn',
360 '-Werror=missing-prototypes',
361 '-Werror=implicit-function-declaration',
362 '-Werror=missing-declarations',
363 '-Werror=return-type',
364 '-Werror=incompatible-pointer-types',
365 '-Werror=format=2',
366 '-Wstrict-prototypes',
367 '-Wredundant-decls',
368 '-Wmissing-noreturn',
369 '-Wimplicit-fallthrough=5',
370 '-Wshadow',
371 '-Wendif-labels',
372 '-Wstrict-aliasing=2',
373 '-Wwrite-strings',
374 '-Werror=overflow',
b05ecb8c 375 '-Werror=shift-count-overflow',
d28b67d4 376 '-Werror=shift-overflow=2',
30a4ddff
YW
377 '-Wdate-time',
378 '-Wnested-externs',
bf7efeb1
FB
379
380 # negative arguments are correctly detected starting with meson 0.46.
eed33623
ZJS
381 '-Wno-error=#warnings', # clang
382 '-Wno-string-plus-int', # clang
bf7efeb1 383
bf7efeb1
FB
384 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
385 # optimizations enabled, producing essentially false positives.
386 '-Wno-maybe-uninitialized',
387
30a4ddff
YW
388 '-ffast-math',
389 '-fno-common',
390 '-fdiagnostics-show-option',
391 '-fno-strict-aliasing',
392 '-fvisibility=hidden',
393 '-fstack-protector',
394 '-fstack-protector-strong',
395 '--param=ssp-buffer-size=4',
396]
397
398# --as-needed and --no-undefined are provided by meson by default,
399# run mesonconf to see what is enabled
400possible_link_flags = [
401 '-Wl,-z,relro',
402 '-Wl,-z,now',
68e70ac2 403 '-fstack-protector',
30a4ddff 404]
5c23128d 405
30a4ddff
YW
406if cc.get_id() == 'clang'
407 possible_cc_flags += [
408 '-Wno-typedef-redefinition',
409 '-Wno-gnu-variable-sized-type-not-at-end',
410 ]
411endif
412
413if get_option('buildtype') != 'debug'
414 possible_cc_flags += [
415 '-ffunction-sections',
416 '-fdata-sections',
417 ]
418
419 possible_link_flags += '-Wl,--gc-sections'
420endif
421
e9f4f566 422add_project_arguments(cc.get_supported_arguments(basic_disabled_warnings), language : 'c')
30a4ddff 423add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
7a6397d2 424add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
30a4ddff 425
94c0c5b7
ZJS
426have = cc.has_argument('-Wzero-length-bounds')
427conf.set10('HAVE_ZERO_LENGTH_BOUNDS', have)
428
9e70f2f8 429if cc.compiles('''
5c23128d
ZJS
430 #include <time.h>
431 #include <inttypes.h>
432 typedef uint64_t usec_t;
433 usec_t now(clockid_t clock);
434 int main(void) {
435 struct timespec now;
436 return 0;
437 }
38c1c96d 438''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
37efbbd8 439 add_project_arguments('-Werror=shadow', language : 'c')
5c23128d
ZJS
440endif
441
e9f4f566
ZJS
442if cxx_cmd != ''
443 add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp')
444endif
445
0e3cc902 446cpp = ' '.join(cc.cmd_array()) + ' -E'
9cc0e6e9 447
6695c200
ZJS
448has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
449
5c23128d
ZJS
450#####################################################################
451# compilation result tests
452
2c201c21
ZJS
453conf.set('_GNU_SOURCE', true)
454conf.set('__SANE_USERSPACE_TYPES__', true)
6695c200 455conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
5c23128d 456
5c23128d
ZJS
457conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
458conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
459conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
460conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
461
462decl_headers = '''
463#include <uchar.h>
4c2e1b39 464#include <sys/stat.h>
5c23128d 465'''
5c23128d
ZJS
466
467foreach decl : ['char16_t',
468 'char32_t',
4c2e1b39 469 'struct statx',
5c23128d 470 ]
2c201c21
ZJS
471
472 # We get -1 if the size cannot be determined
9c869d08
ZJS
473 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
474
475 if decl == 'struct statx'
476 if have
477 want_linux_stat_h = false
478 else
479 have = cc.sizeof(decl,
480 prefix : decl_headers + '#include <linux/stat.h>',
481 args : '-D_GNU_SOURCE') > 0
482 want_linux_stat_h = have
483 endif
484 endif
485
349cc4a5 486 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
5c23128d
ZJS
487endforeach
488
9c869d08 489conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
75720bff 490
5c23128d 491foreach ident : ['secure_getenv', '__secure_getenv']
349cc4a5 492 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
5c23128d
ZJS
493endforeach
494
495foreach ident : [
85db59b7 496 ['memfd_create', '''#include <sys/mman.h>'''],
7b961e40
LP
497 ['gettid', '''#include <sys/types.h>
498 #include <unistd.h>'''],
3c042add
LP
499 ['pivot_root', '''#include <stdlib.h>
500 #include <unistd.h>'''], # no known header declares pivot_root
85db59b7 501 ['name_to_handle_at', '''#include <sys/types.h>
37efbbd8
ZJS
502 #include <sys/stat.h>
503 #include <fcntl.h>'''],
85db59b7 504 ['setns', '''#include <sched.h>'''],
2acfd0ff
LP
505 ['renameat2', '''#include <stdio.h>
506 #include <fcntl.h>'''],
37efbbd8
ZJS
507 ['kcmp', '''#include <linux/kcmp.h>'''],
508 ['keyctl', '''#include <sys/types.h>
509 #include <keyutils.h>'''],
85db59b7 510 ['copy_file_range', '''#include <sys/syscall.h>
37efbbd8 511 #include <unistd.h>'''],
71e5200f
DM
512 ['bpf', '''#include <sys/syscall.h>
513 #include <unistd.h>'''],
4c2e1b39
LP
514 ['statx', '''#include <sys/types.h>
515 #include <sys/stat.h>
516 #include <unistd.h>'''],
aa484f35
ZJS
517 ['explicit_bzero' , '''#include <string.h>'''],
518 ['reallocarray', '''#include <malloc.h>'''],
b070c7c0
MS
519 ['set_mempolicy', '''#include <stdlib.h>
520 #include <unistd.h>'''],
521 ['get_mempolicy', '''#include <stdlib.h>
522 #include <unistd.h>'''],
5f152f43
LP
523 ['pidfd_send_signal', '''#include <stdlib.h>
524 #include <unistd.h>
525 #include <signal.h>
526 #include <sys/wait.h>'''],
527 ['pidfd_open', '''#include <stdlib.h>
528 #include <unistd.h>
529 #include <signal.h>
530 #include <sys/wait.h>'''],
5ead4e85
LP
531 ['rt_sigqueueinfo', '''#include <stdlib.h>
532 #include <unistd.h>
533 #include <signal.h>
534 #include <sys/wait.h>'''],
4b6f74f5 535 ['mallinfo', '''#include <malloc.h>'''],
441e0fdb 536 ['close_range', '''#include <unistd.h>'''],
37efbbd8
ZJS
537]
538
85db59b7 539 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
4b9545f1 540 conf.set10('HAVE_' + ident[0].to_upper(), have)
5c23128d
ZJS
541endforeach
542
85db59b7 543if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
349cc4a5 544 conf.set10('USE_SYS_RANDOM_H', true)
4b9545f1 545 conf.set10('HAVE_GETRANDOM', true)
4984c8be
ZJS
546else
547 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
349cc4a5 548 conf.set10('USE_SYS_RANDOM_H', false)
4b9545f1 549 conf.set10('HAVE_GETRANDOM', have)
4984c8be
ZJS
550endif
551
5c23128d
ZJS
552#####################################################################
553
1485aacb
DC
554vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
555 project_source_root,
e1ca734e 556 get_option('version-tag'),
681bd2c5
ZJS
557 meson.project_version()]
558
d1084aa2
LT
559version_h = vcs_tag(
560 input : 'src/version/version.h.in',
561 output : 'version.h',
562 command: vcs_tagger)
563
564versiondep = declare_dependency(sources: version_h)
565
5c23128d 566sed = find_program('sed')
5c23128d 567awk = find_program('awk')
d730e2d1 568m4 = find_program('m4')
5c23128d 569stat = find_program('stat')
d68b342b 570git = find_program('git', required : false)
b68dfb9e 571env = find_program('env')
b1ffacb6 572perl = find_program('perl', required : false)
5c23128d 573
1485aacb 574meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
94e75a54 575mkdir_p = 'mkdir -p $DESTDIR/@0@'
d83f4f50
ZJS
576test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
577splash_bmp = files('test/splash.bmp')
94e75a54 578
5c23128d
ZJS
579# if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
580# /usr/sbin, /sbin, and fall back to the default from middle column.
2fa645f1 581progs = [['quotaon', '/usr/sbin/quotaon' ],
5c23128d 582 ['quotacheck', '/usr/sbin/quotacheck' ],
5c23128d
ZJS
583 ['kmod', '/usr/bin/kmod' ],
584 ['kexec', '/usr/sbin/kexec' ],
585 ['sulogin', '/usr/sbin/sulogin' ],
586 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
587 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
588 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
589 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
6db90462 590 ['nologin', '/usr/sbin/nologin', ],
5c23128d
ZJS
591 ]
592foreach prog : progs
37efbbd8
ZJS
593 path = get_option(prog[0] + '-path')
594 if path != ''
595 message('Using @1@ for @0@'.format(prog[0], path))
596 else
597 exe = find_program(prog[0],
598 '/usr/sbin/' + prog[0],
599 '/sbin/' + prog[0],
600 required: false)
601 path = exe.found() ? exe.path() : prog[1]
602 endif
603 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
604 conf.set_quoted(name, path)
605 substs.set(name, path)
5c23128d
ZJS
606endforeach
607
2fa645f1
MG
608conf.set_quoted('TELINIT', get_option('telinit-path'))
609
1276a9f6 610if run_command('ln', '--relative', '--help').returncode() != 0
cd001016 611 error('ln does not support --relative (added in coreutils 8.16)')
1276a9f6 612endif
5c23128d
ZJS
613
614############################################################
615
616gperf = find_program('gperf')
617
618gperf_test_format = '''
619#include <string.h>
620const char * in_word_set(const char *, @0@);
621@1@
622'''
623gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
624gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
625gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
626if cc.compiles(gperf_test)
37efbbd8 627 gperf_len_type = 'size_t'
5c23128d 628else
37efbbd8
ZJS
629 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
630 if cc.compiles(gperf_test)
631 gperf_len_type = 'unsigned'
632 else
633 error('unable to determine gperf len type')
634 endif
5c23128d
ZJS
635endif
636message('gperf len type is @0@'.format(gperf_len_type))
37efbbd8
ZJS
637conf.set('GPERF_LEN_TYPE', gperf_len_type,
638 description : 'The type of gperf "len" parameter')
5c23128d
ZJS
639
640############################################################
641
642if not cc.has_header('sys/capability.h')
37efbbd8 643 error('POSIX caps headers not found')
5c23128d 644endif
9f555bba 645foreach header : ['crypt.h',
5c23128d
ZJS
646 'linux/memfd.h',
647 'linux/vm_sockets.h',
af8786b1 648 'sys/auxv.h',
5c23128d
ZJS
649 'valgrind/memcheck.h',
650 'valgrind/valgrind.h',
651 ]
2c201c21 652
349cc4a5
ZJS
653 conf.set10('HAVE_' + header.underscorify().to_upper(),
654 cc.has_header(header))
5c23128d
ZJS
655endforeach
656
657############################################################
658
eef4b800
ZJS
659fallback_hostname = get_option('fallback-hostname')
660if fallback_hostname == '' or fallback_hostname[0] == '.' or fallback_hostname[0] == '-'
661 error('Invalid fallback-hostname configuration')
662 # A more extensive test is done in test-hostname-util. Let's catch
663 # the most obvious errors here so we don't fail with an assert later.
664endif
665conf.set_quoted('FALLBACK_HOSTNAME', fallback_hostname)
666
5248e7e1
ZJS
667conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
668gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
5c23128d
ZJS
669
670default_hierarchy = get_option('default-hierarchy')
671conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
672 description : 'default cgroup hierarchy as string')
673if default_hierarchy == 'legacy'
37efbbd8 674 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
5c23128d 675elif default_hierarchy == 'hybrid'
37efbbd8 676 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
5c23128d 677else
37efbbd8 678 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
5c23128d
ZJS
679endif
680
06da5c63
ZJS
681default_net_naming_scheme = get_option('default-net-naming-scheme')
682conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
683
5c23128d 684time_epoch = get_option('time-epoch')
ac09340e 685if time_epoch == -1
0390b094
ZJS
686 time_epoch = run_command('sh', ['-c', 'echo "$SOURCE_DATE_EPOCH"']).stdout().strip()
687 if time_epoch == '' and git.found() and run_command('test', '-e', '.git').returncode() == 0
bd190899
DDM
688 # If we're in a git repository, use the creation time of the latest git tag.
689 latest_tag = run_command('git', 'describe', '--abbrev=0', '--tags').stdout().strip()
0390b094
ZJS
690 time_epoch = run_command('git', 'log', '-1', '--format=%at', latest_tag).stdout()
691 endif
692 if time_epoch == ''
6dbf352c 693 NEWS = files('NEWS')
0390b094 694 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
6dbf352c 695 endif
0390b094 696 time_epoch = time_epoch.to_int()
5c23128d 697endif
5c23128d
ZJS
698conf.set('TIME_EPOCH', time_epoch)
699
fc1a5d1a
ZJS
700foreach tuple : [['system-alloc-uid-min', 'SYS_UID_MIN', 1], # Also see login.defs(5).
701 ['system-uid-max', 'SYS_UID_MAX', 999],
702 ['system-alloc-gid-min', 'SYS_GID_MIN', 1],
703 ['system-gid-max', 'SYS_GID_MAX', 999]]
704 v = get_option(tuple[0])
705 if v == -1
706 v = run_command(
707 awk,
708 '/^\s*@0@\s+/ { uid=$2 } END { print uid }'.format(tuple[1]),
709 '/etc/login.defs').stdout().strip()
710 if v == ''
711 v = tuple[2]
712 else
713 v = v.to_int()
714 endif
2f62cf35 715 endif
fc1a5d1a
ZJS
716 conf.set(tuple[0].underscorify().to_upper(), v)
717 substs.set(tuple[0].underscorify().to_upper(), v)
718endforeach
719if conf.get('SYSTEM_ALLOC_UID_MIN') >= conf.get('SYSTEM_UID_MAX')
720 error('Invalid uid allocation range')
5c23128d 721endif
fc1a5d1a
ZJS
722if conf.get('SYSTEM_ALLOC_GID_MIN') >= conf.get('SYSTEM_GID_MAX')
723 error('Invalid gid allocation range')
5c23128d 724endif
5c23128d 725
ac09340e
YW
726dynamic_uid_min = get_option('dynamic-uid-min')
727dynamic_uid_max = get_option('dynamic-uid-max')
87d5e4f2
LP
728conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
729conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
730substs.set('dynamicuidmin', dynamic_uid_min)
731substs.set('dynamicuidmax', dynamic_uid_max)
732
ac09340e
YW
733container_uid_base_min = get_option('container-uid-base-min')
734container_uid_base_max = get_option('container-uid-base-max')
87d5e4f2
LP
735conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
736conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
737substs.set('containeruidbasemin', container_uid_base_min)
738substs.set('containeruidbasemax', container_uid_base_max)
739
afde4574
LP
740nobody_user = get_option('nobody-user')
741nobody_group = get_option('nobody-group')
742
2484bff3
CQ
743if not meson.is_cross_build()
744 getent_result = run_command('getent', 'passwd', '65534')
745 if getent_result.returncode() == 0
746 name = getent_result.stdout().split(':')[0]
747 if name != nobody_user
748 warning('\n' +
749 '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) +
750 'Your build will result in an user table setup that is incompatible with the local system.')
751 endif
afde4574 752 endif
2484bff3
CQ
753 id_result = run_command('id', '-u', nobody_user)
754 if id_result.returncode() == 0
755 id = id_result.stdout().to_int()
756 if id != 65534
757 warning('\n' +
758 '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) +
759 'Your build will result in an user table setup that is incompatible with the local system.')
760 endif
afde4574 761 endif
afde4574 762
2484bff3
CQ
763 getent_result = run_command('getent', 'group', '65534')
764 if getent_result.returncode() == 0
765 name = getent_result.stdout().split(':')[0]
766 if name != nobody_group
767 warning('\n' +
768 '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) +
769 'Your build will result in an group table setup that is incompatible with the local system.')
770 endif
afde4574 771 endif
2484bff3
CQ
772 id_result = run_command('id', '-g', nobody_group)
773 if id_result.returncode() == 0
774 id = id_result.stdout().to_int()
775 if id != 65534
776 warning('\n' +
777 'The local group with the configured group name "@0@" of the nobody group does not have UID 65534 (it has @1@).\n'.format(nobody_group, id) +
778 'Your build will result in an group table setup that is incompatible with the local system.')
779 endif
afde4574
LP
780 endif
781endif
8374cc62 782if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
8ea9fad7
YW
783 warning('\n' +
784 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
785 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
8374cc62 786endif
afde4574
LP
787
788conf.set_quoted('NOBODY_USER_NAME', nobody_user)
789conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
60712021
YW
790substs.set('NOBODY_USER_NAME', nobody_user)
791substs.set('NOBODY_GROUP_NAME', nobody_group)
87d5e4f2 792
5c23128d
ZJS
793tty_gid = get_option('tty-gid')
794conf.set('TTY_GID', tty_gid)
2a4c156d 795substs.set('TTY_GID', tty_gid)
5c23128d 796
2aed63f4 797# Ensure provided GID argument is numeric, otherwise fall back to default assignment
ac09340e
YW
798users_gid = get_option('users-gid')
799substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
84786b8e 800
348b4437
YW
801conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
802conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
5c23128d 803
ace5e311
MB
804dev_kvm_mode = get_option('dev-kvm-mode')
805substs.set('DEV_KVM_MODE', dev_kvm_mode)
806conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
055a083a
MB
807group_render_mode = get_option('group-render-mode')
808substs.set('GROUP_RENDER_MODE', group_render_mode)
809conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
5c23128d 810
2a4c156d
ZJS
811kill_user_processes = get_option('default-kill-user-processes')
812conf.set10('KILL_USER_PROCESSES', kill_user_processes)
c7f7e859 813conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
2a4c156d 814substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
5c23128d 815
829257d1
ZJS
816dns_servers = get_option('dns-servers')
817conf.set_quoted('DNS_SERVERS', dns_servers)
818substs.set('DNS_SERVERS', dns_servers)
5c23128d 819
829257d1
ZJS
820ntp_servers = get_option('ntp-servers')
821conf.set_quoted('NTP_SERVERS', ntp_servers)
822substs.set('NTP_SERVERS', ntp_servers)
5c23128d 823
8ca9e92c 824default_locale = get_option('default-locale')
03475e22 825if default_locale == ''
50f2fc77
JH
826 if not meson.is_cross_build()
827 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
828 default_locale = run_command(choose_default_locale_sh).stdout().strip()
829 else
830 default_locale = 'C.UTF-8'
831 endif
03475e22 832endif
8ca9e92c
DR
833conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
834
5c23128d
ZJS
835conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
836
21d0dd5a 837service_watchdog = get_option('service-watchdog')
7bc9ea51
AZ
838watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
839substs.set('SERVICE_WATCHDOG', watchdog_value)
21d0dd5a 840
3131bfe3
ZJS
841substs.set('SUSHELL', get_option('debug-shell'))
842substs.set('DEBUGTTY', get_option('debug-tty'))
93912e87 843conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
3131bfe3 844
349cc4a5
ZJS
845enable_debug_hashmap = false
846enable_debug_mmap_cache = false
d6601495 847enable_debug_siphash = false
8f6b442a 848foreach name : get_option('debug-extra')
ad7aa760
YW
849 if name == 'hashmap'
850 enable_debug_hashmap = true
851 elif name == 'mmap-cache'
852 enable_debug_mmap_cache = true
d6601495
YW
853 elif name == 'siphash'
854 enable_debug_siphash = true
ad7aa760
YW
855 else
856 message('unknown debug option "@0@", ignoring'.format(name))
857 endif
858endforeach
349cc4a5
ZJS
859conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
860conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
d6601495 861conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
671677da 862
d18cb393 863conf.set10('VALGRIND', get_option('valgrind'))
fd5dec9a 864conf.set10('LOG_TRACE', get_option('log-trace'))
d18cb393 865
3602ca6f
ZJS
866default_user_path = get_option('user-path')
867if default_user_path != ''
868 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
5bc655cd
ZJS
869 default_user_path_display = default_user_path
870else
871 # meson 0.49 fails when ?: is used in .format()
872 default_user_path_display = '(same as system services)'
3602ca6f
ZJS
873endif
874
5bc655cd 875
5c23128d
ZJS
876#####################################################################
877
878threads = dependency('threads')
879librt = cc.find_library('rt')
880libm = cc.find_library('m')
881libdl = cc.find_library('dl')
882libcrypt = cc.find_library('crypt')
883
06ca077b 884crypt_header = conf.get('HAVE_CRYPT_H') == 1 ? '''#include <crypt.h>''' : '''#include <unistd.h>'''
e8644a41 885foreach ident : [
feee7f62
LB
886 ['crypt_ra', crypt_header],
887 ['crypt_preferred_method', crypt_header],
888 ['crypt_gensalt_ra', crypt_header]]
e8644a41
ZJS
889
890 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE',
891 dependencies : libcrypt)
892 conf.set10('HAVE_' + ident[0].to_upper(), have)
893endforeach
894
1800cc85
ZJS
895libcap = dependency('libcap', required : false)
896if not libcap.found()
897 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
898 libcap = cc.find_library('cap')
899endif
900
5c23128d 901libmount = dependency('mount',
c0b4b0f8 902 version : fuzzer_build ? '>= 0' : '>= 2.30')
5c23128d 903
e594a3b1
LP
904want_libfdisk = get_option('fdisk')
905if want_libfdisk != 'false' and not skip_deps
906 libfdisk = dependency('fdisk',
e71f5585 907 version : '>= 2.33',
e594a3b1
LP
908 required : want_libfdisk == 'true')
909 have = libfdisk.found()
910else
911 have = false
912 libfdisk = []
913endif
914conf.set10('HAVE_LIBFDISK', have)
915
70a5db58
LP
916want_pwquality = get_option('pwquality')
917if want_pwquality != 'false' and not skip_deps
918 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
919 have = libpwquality.found()
920else
921 have = false
922 libpwquality = []
923endif
924conf.set10('HAVE_PWQUALITY', have)
925
5c23128d 926want_seccomp = get_option('seccomp')
87ac55a1 927if want_seccomp != 'false' and not skip_deps
37efbbd8 928 libseccomp = dependency('libseccomp',
9f0e9c01 929 version : '>= 2.3.1',
37efbbd8 930 required : want_seccomp == 'true')
349cc4a5 931 have = libseccomp.found()
5c23128d 932else
349cc4a5 933 have = false
37efbbd8 934 libseccomp = []
5c23128d 935endif
349cc4a5 936conf.set10('HAVE_SECCOMP', have)
5c23128d
ZJS
937
938want_selinux = get_option('selinux')
87ac55a1 939if want_selinux != 'false' and not skip_deps
37efbbd8
ZJS
940 libselinux = dependency('libselinux',
941 version : '>= 2.1.9',
942 required : want_selinux == 'true')
349cc4a5 943 have = libselinux.found()
5c23128d 944else
349cc4a5 945 have = false
37efbbd8 946 libselinux = []
5c23128d 947endif
349cc4a5 948conf.set10('HAVE_SELINUX', have)
5c23128d
ZJS
949
950want_apparmor = get_option('apparmor')
87ac55a1 951if want_apparmor != 'false' and not skip_deps
37efbbd8 952 libapparmor = dependency('libapparmor',
2ffadd3c 953 version : '>= 2.13',
37efbbd8 954 required : want_apparmor == 'true')
349cc4a5 955 have = libapparmor.found()
5c23128d 956else
349cc4a5 957 have = false
37efbbd8 958 libapparmor = []
5c23128d 959endif
349cc4a5 960conf.set10('HAVE_APPARMOR', have)
5c23128d 961
5c23128d
ZJS
962smack_run_label = get_option('smack-run-label')
963if smack_run_label != ''
37efbbd8 964 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
5c23128d
ZJS
965endif
966
3ca0cb73
ZJS
967want_polkit = get_option('polkit')
968install_polkit = false
969install_polkit_pkla = false
87ac55a1 970if want_polkit != 'false' and not skip_deps
37efbbd8 971 install_polkit = true
3ca0cb73 972
37efbbd8
ZJS
973 libpolkit = dependency('polkit-gobject-1',
974 required : false)
975 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
976 message('Old polkit detected, will install pkla files')
977 install_polkit_pkla = true
978 endif
3ca0cb73 979endif
349cc4a5 980conf.set10('ENABLE_POLKIT', install_polkit)
3ca0cb73 981
36f0387e 982want_acl = get_option('acl')
87ac55a1 983if want_acl != 'false' and not skip_deps
36f0387e 984 libacl = cc.find_library('acl', required : want_acl == 'true')
349cc4a5 985 have = libacl.found()
36f0387e 986else
349cc4a5 987 have = false
36f0387e
ZJS
988 libacl = []
989endif
349cc4a5 990conf.set10('HAVE_ACL', have)
36f0387e 991
5c23128d 992want_audit = get_option('audit')
87ac55a1 993if want_audit != 'false' and not skip_deps
37efbbd8 994 libaudit = dependency('audit', required : want_audit == 'true')
349cc4a5 995 have = libaudit.found()
5c23128d 996else
349cc4a5 997 have = false
37efbbd8 998 libaudit = []
5c23128d 999endif
349cc4a5 1000conf.set10('HAVE_AUDIT', have)
5c23128d
ZJS
1001
1002want_blkid = get_option('blkid')
87ac55a1 1003if want_blkid != 'false' and not skip_deps
37efbbd8 1004 libblkid = dependency('blkid', required : want_blkid == 'true')
349cc4a5 1005 have = libblkid.found()
5c23128d 1006else
349cc4a5 1007 have = false
37efbbd8 1008 libblkid = []
5c23128d 1009endif
349cc4a5 1010conf.set10('HAVE_BLKID', have)
5c23128d
ZJS
1011
1012want_kmod = get_option('kmod')
87ac55a1 1013if want_kmod != 'false' and not skip_deps
37efbbd8
ZJS
1014 libkmod = dependency('libkmod',
1015 version : '>= 15',
1016 required : want_kmod == 'true')
349cc4a5 1017 have = libkmod.found()
5c23128d 1018else
349cc4a5 1019 have = false
37efbbd8 1020 libkmod = []
5c23128d 1021endif
349cc4a5 1022conf.set10('HAVE_KMOD', have)
5c23128d
ZJS
1023
1024want_pam = get_option('pam')
87ac55a1 1025if want_pam != 'false' and not skip_deps
37efbbd8
ZJS
1026 libpam = cc.find_library('pam', required : want_pam == 'true')
1027 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
349cc4a5 1028 have = libpam.found() and libpam_misc.found()
5c23128d 1029else
349cc4a5 1030 have = false
37efbbd8
ZJS
1031 libpam = []
1032 libpam_misc = []
5c23128d 1033endif
349cc4a5 1034conf.set10('HAVE_PAM', have)
5c23128d
ZJS
1035
1036want_microhttpd = get_option('microhttpd')
87ac55a1 1037if want_microhttpd != 'false' and not skip_deps
37efbbd8
ZJS
1038 libmicrohttpd = dependency('libmicrohttpd',
1039 version : '>= 0.9.33',
1040 required : want_microhttpd == 'true')
349cc4a5 1041 have = libmicrohttpd.found()
5c23128d 1042else
349cc4a5 1043 have = false
37efbbd8 1044 libmicrohttpd = []
5c23128d 1045endif
349cc4a5 1046conf.set10('HAVE_MICROHTTPD', have)
5c23128d
ZJS
1047
1048want_libcryptsetup = get_option('libcryptsetup')
87ac55a1 1049if want_libcryptsetup != 'false' and not skip_deps
37efbbd8 1050 libcryptsetup = dependency('libcryptsetup',
d90874b4 1051 version : '>= 2.0.1',
37efbbd8 1052 required : want_libcryptsetup == 'true')
349cc4a5 1053 have = libcryptsetup.found()
70a5db58
LP
1054
1055 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1056 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
c2923fdc
LB
1057 conf.set10('HAVE_CRYPT_ACTIVATE_BY_SIGNED_KEY',
1058 have and cc.has_function('crypt_activate_by_signed_key', dependencies : libcryptsetup))
5c23128d 1059else
349cc4a5 1060 have = false
37efbbd8 1061 libcryptsetup = []
5c23128d 1062endif
349cc4a5 1063conf.set10('HAVE_LIBCRYPTSETUP', have)
5c23128d
ZJS
1064
1065want_libcurl = get_option('libcurl')
87ac55a1 1066if want_libcurl != 'false' and not skip_deps
37efbbd8
ZJS
1067 libcurl = dependency('libcurl',
1068 version : '>= 7.32.0',
1069 required : want_libcurl == 'true')
349cc4a5 1070 have = libcurl.found()
5c23128d 1071else
349cc4a5 1072 have = false
37efbbd8 1073 libcurl = []
5c23128d 1074endif
349cc4a5 1075conf.set10('HAVE_LIBCURL', have)
5c23128d
ZJS
1076
1077want_libidn = get_option('libidn')
87057e24
ZJS
1078want_libidn2 = get_option('libidn2')
1079if want_libidn == 'true' and want_libidn2 == 'true'
1080 error('libidn and libidn2 cannot be requested simultaneously')
1081endif
1082
1b931399
YW
1083if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1084 libidn = dependency('libidn2',
1085 required : want_libidn2 == 'true')
349cc4a5 1086 have = libidn.found()
87057e24 1087else
349cc4a5 1088 have = false
87057e24
ZJS
1089 libidn = []
1090endif
1b931399
YW
1091conf.set10('HAVE_LIBIDN2', have)
1092if not have and want_libidn != 'false' and not skip_deps
7f7ab228 1093 # libidn is used for both libidn and libidn2 objects
1b931399
YW
1094 libidn = dependency('libidn',
1095 required : want_libidn == 'true')
349cc4a5
ZJS
1096 have = libidn.found()
1097else
1098 have = false
5c23128d 1099endif
1b931399 1100conf.set10('HAVE_LIBIDN', have)
5c23128d
ZJS
1101
1102want_libiptc = get_option('libiptc')
87ac55a1 1103if want_libiptc != 'false' and not skip_deps
37efbbd8
ZJS
1104 libiptc = dependency('libiptc',
1105 required : want_libiptc == 'true')
349cc4a5 1106 have = libiptc.found()
5c23128d 1107else
349cc4a5 1108 have = false
37efbbd8 1109 libiptc = []
5c23128d 1110endif
349cc4a5 1111conf.set10('HAVE_LIBIPTC', have)
5c23128d
ZJS
1112
1113want_qrencode = get_option('qrencode')
87ac55a1 1114if want_qrencode != 'false' and not skip_deps
37efbbd8
ZJS
1115 libqrencode = dependency('libqrencode',
1116 required : want_qrencode == 'true')
349cc4a5 1117 have = libqrencode.found()
5c23128d 1118else
349cc4a5 1119 have = false
37efbbd8 1120 libqrencode = []
5c23128d 1121endif
349cc4a5 1122conf.set10('HAVE_QRENCODE', have)
5c23128d 1123
a44fb601 1124want_gcrypt = get_option('gcrypt')
87ac55a1 1125if want_gcrypt != 'false' and not skip_deps
a44fb601
ZJS
1126 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1127 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
349cc4a5 1128 have = libgcrypt.found() and libgpg_error.found()
a44fb601 1129else
349cc4a5
ZJS
1130 have = false
1131endif
1132if not have
1133 # link to neither of the libs if one is not found
a44fb601
ZJS
1134 libgcrypt = []
1135 libgpg_error = []
1136endif
349cc4a5 1137conf.set10('HAVE_GCRYPT', have)
a44fb601 1138
5c23128d 1139want_gnutls = get_option('gnutls')
87ac55a1 1140if want_gnutls != 'false' and not skip_deps
37efbbd8
ZJS
1141 libgnutls = dependency('gnutls',
1142 version : '>= 3.1.4',
1143 required : want_gnutls == 'true')
349cc4a5 1144 have = libgnutls.found()
5c23128d 1145else
349cc4a5 1146 have = false
37efbbd8 1147 libgnutls = []
5c23128d 1148endif
349cc4a5 1149conf.set10('HAVE_GNUTLS', have)
5c23128d 1150
096cbdce 1151want_openssl = get_option('openssl')
87ac55a1 1152if want_openssl != 'false' and not skip_deps
096cbdce
IT
1153 libopenssl = dependency('openssl',
1154 version : '>= 1.1.0',
1155 required : want_openssl == 'true')
1156 have = libopenssl.found()
1157else
1158 have = false
1159 libopenssl = []
1160endif
1161conf.set10('HAVE_OPENSSL', have)
1162
839fddbe
LP
1163want_p11kit = get_option('p11kit')
1164if want_p11kit != 'false' and not skip_deps
1165 libp11kit = dependency('p11-kit-1',
6164ec4c
ZJS
1166 version : '>= 0.23.3',
1167 required : want_p11kit == 'true')
839fddbe
LP
1168 have = libp11kit.found()
1169else
1170 have = false
1171 libp11kit = []
1172endif
1173conf.set10('HAVE_P11KIT', have)
1174
af4fbd46
LP
1175want_libfido2 = get_option('libfido2')
1176if want_libfido2 != 'false' and not skip_deps
1177 libfido2 = dependency('libfido2',
1178 required : want_libfido2 == 'true')
1179 have = libfido2.found()
1180else
1181 have = false
1182 libfido2 = []
1183endif
1184conf.set10('HAVE_LIBFIDO2', have)
1185
5c23128d 1186want_elfutils = get_option('elfutils')
87ac55a1 1187if want_elfutils != 'false' and not skip_deps
37efbbd8
ZJS
1188 libdw = dependency('libdw',
1189 required : want_elfutils == 'true')
349cc4a5 1190 have = libdw.found()
5c23128d 1191else
349cc4a5 1192 have = false
37efbbd8 1193 libdw = []
5c23128d 1194endif
349cc4a5 1195conf.set10('HAVE_ELFUTILS', have)
5c23128d
ZJS
1196
1197want_zlib = get_option('zlib')
87ac55a1 1198if want_zlib != 'false' and not skip_deps
37efbbd8
ZJS
1199 libz = dependency('zlib',
1200 required : want_zlib == 'true')
349cc4a5 1201 have = libz.found()
5c23128d 1202else
349cc4a5 1203 have = false
37efbbd8 1204 libz = []
5c23128d 1205endif
349cc4a5 1206conf.set10('HAVE_ZLIB', have)
5c23128d
ZJS
1207
1208want_bzip2 = get_option('bzip2')
87ac55a1 1209if want_bzip2 != 'false' and not skip_deps
37efbbd8
ZJS
1210 libbzip2 = cc.find_library('bz2',
1211 required : want_bzip2 == 'true')
349cc4a5 1212 have = libbzip2.found()
5c23128d 1213else
349cc4a5 1214 have = false
37efbbd8 1215 libbzip2 = []
5c23128d 1216endif
349cc4a5 1217conf.set10('HAVE_BZIP2', have)
5c23128d
ZJS
1218
1219want_xz = get_option('xz')
87ac55a1 1220if want_xz != 'false' and not skip_deps
37efbbd8
ZJS
1221 libxz = dependency('liblzma',
1222 required : want_xz == 'true')
d80b051c 1223 have_xz = libxz.found()
5c23128d 1224else
d80b051c 1225 have_xz = false
37efbbd8 1226 libxz = []
5c23128d 1227endif
d80b051c 1228conf.set10('HAVE_XZ', have_xz)
5c23128d
ZJS
1229
1230want_lz4 = get_option('lz4')
87ac55a1 1231if want_lz4 != 'false' and not skip_deps
37efbbd8 1232 liblz4 = dependency('liblz4',
e0a1d4b0 1233 version : '>= 1.3.0',
37efbbd8 1234 required : want_lz4 == 'true')
d80b051c 1235 have_lz4 = liblz4.found()
5c23128d 1236else
d80b051c 1237 have_lz4 = false
37efbbd8 1238 liblz4 = []
5c23128d 1239endif
d80b051c 1240conf.set10('HAVE_LZ4', have_lz4)
5c23128d 1241
ef5924aa
NL
1242want_zstd = get_option('zstd')
1243if want_zstd != 'false' and not skip_deps
1244 libzstd = dependency('libzstd',
1245 required : want_zstd == 'true',
1246 version : '>= 1.4.0')
d80b051c 1247 have_zstd = libzstd.found()
ef5924aa 1248else
d80b051c 1249 have_zstd = false
ef5924aa
NL
1250 libzstd = []
1251endif
d80b051c
LP
1252conf.set10('HAVE_ZSTD', have_zstd)
1253
1254conf.set10('HAVE_COMPRESSION', have_xz or have_lz4 or have_zstd)
ef5924aa 1255
a44fb601 1256want_xkbcommon = get_option('xkbcommon')
87ac55a1 1257if want_xkbcommon != 'false' and not skip_deps
a44fb601
ZJS
1258 libxkbcommon = dependency('xkbcommon',
1259 version : '>= 0.3.0',
1260 required : want_xkbcommon == 'true')
349cc4a5 1261 have = libxkbcommon.found()
a44fb601 1262else
349cc4a5 1263 have = false
a44fb601
ZJS
1264 libxkbcommon = []
1265endif
349cc4a5 1266conf.set10('HAVE_XKBCOMMON', have)
a44fb601 1267
c4c978a0
ZJS
1268want_pcre2 = get_option('pcre2')
1269if want_pcre2 != 'false'
1270 libpcre2 = dependency('libpcre2-8',
1271 required : want_pcre2 == 'true')
1272 have = libpcre2.found()
1273else
1274 have = false
1275 libpcre2 = []
1276endif
1277conf.set10('HAVE_PCRE2', have)
1278
69e96427 1279want_glib = get_option('glib')
87ac55a1 1280if want_glib != 'false' and not skip_deps
37efbbd8
ZJS
1281 libglib = dependency('glib-2.0',
1282 version : '>= 2.22.0',
1283 required : want_glib == 'true')
1284 libgobject = dependency('gobject-2.0',
1285 version : '>= 2.22.0',
1286 required : want_glib == 'true')
1287 libgio = dependency('gio-2.0',
1288 required : want_glib == 'true')
2c201c21 1289 have = libglib.found() and libgobject.found() and libgio.found()
69e96427 1290else
349cc4a5 1291 have = false
37efbbd8
ZJS
1292 libglib = []
1293 libgobject = []
1294 libgio = []
69e96427 1295endif
349cc4a5 1296conf.set10('HAVE_GLIB', have)
69e96427
ZJS
1297
1298want_dbus = get_option('dbus')
87ac55a1 1299if want_dbus != 'false' and not skip_deps
37efbbd8
ZJS
1300 libdbus = dependency('dbus-1',
1301 version : '>= 1.3.2',
1302 required : want_dbus == 'true')
349cc4a5 1303 have = libdbus.found()
69e96427 1304else
349cc4a5 1305 have = false
37efbbd8 1306 libdbus = []
69e96427 1307endif
349cc4a5 1308conf.set10('HAVE_DBUS', have)
69e96427 1309
42303dcb 1310default_dnssec = get_option('default-dnssec')
87ac55a1 1311if skip_deps
b4081f3e
JR
1312 default_dnssec = 'no'
1313endif
349cc4a5 1314if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
42303dcb
YW
1315 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1316 default_dnssec = 'no'
1317endif
1318conf.set('DEFAULT_DNSSEC_MODE',
1319 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1320substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1321
56ddbf10
YW
1322dns_over_tls = get_option('dns-over-tls')
1323if dns_over_tls != 'false'
096cbdce
IT
1324 if dns_over_tls == 'openssl'
1325 have_gnutls = false
1326 else
38e053c5 1327 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
096cbdce
IT
1328 if dns_over_tls == 'gnutls' and not have_gnutls
1329 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1330 endif
56ddbf10 1331 endif
096cbdce
IT
1332 if dns_over_tls == 'gnutls' or have_gnutls
1333 have_openssl = false
1334 else
1335 have_openssl = conf.get('HAVE_OPENSSL') == 1
1336 if dns_over_tls != 'auto' and not have_openssl
1337 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
b349bc59 1338 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
096cbdce
IT
1339 endif
1340 endif
1341 have = have_gnutls or have_openssl
56ddbf10 1342else
be5536a6
MO
1343 have = false
1344 have_gnutls = false
1345 have_openssl = false
56ddbf10
YW
1346endif
1347conf.set10('ENABLE_DNS_OVER_TLS', have)
096cbdce
IT
1348conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1349conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
56ddbf10 1350
c9299be2 1351default_dns_over_tls = get_option('default-dns-over-tls')
87ac55a1 1352if skip_deps
c9299be2 1353 default_dns_over_tls = 'no'
5d67a7ae 1354endif
56ddbf10 1355if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
4310bfc2 1356 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 1357 default_dns_over_tls = 'no'
5d67a7ae 1358endif
c9299be2
IT
1359conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1360 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1361substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
5d67a7ae 1362
3614df05
ZJS
1363default_mdns = get_option('default-mdns')
1364conf.set('DEFAULT_MDNS_MODE',
1365 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
1366substs.set('DEFAULT_MDNS_MODE', default_mdns)
1367
1368default_llmnr = get_option('default-llmnr')
1369conf.set('DEFAULT_LLMNR_MODE',
1370 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
1371substs.set('DEFAULT_LLMNR_MODE', default_llmnr)
1372
e594a3b1
LP
1373want_repart = get_option('repart')
1374if want_repart != 'false'
1375 have = (conf.get('HAVE_OPENSSL') == 1 and
1376 conf.get('HAVE_LIBFDISK') == 1)
1377 if want_repart == 'true' and not have
1378 error('repart support was requested, but dependencies are not available')
1379 endif
1380else
1381 have = false
1382endif
1383conf.set10('ENABLE_REPART', have)
1384
5c23128d 1385want_importd = get_option('importd')
4390be30 1386if want_importd != 'false'
349cc4a5
ZJS
1387 have = (conf.get('HAVE_LIBCURL') == 1 and
1388 conf.get('HAVE_ZLIB') == 1 and
349cc4a5
ZJS
1389 conf.get('HAVE_XZ') == 1 and
1390 conf.get('HAVE_GCRYPT') == 1)
1391 if want_importd == 'true' and not have
37efbbd8
ZJS
1392 error('importd support was requested, but dependencies are not available')
1393 endif
349cc4a5
ZJS
1394else
1395 have = false
5c23128d 1396endif
349cc4a5 1397conf.set10('ENABLE_IMPORTD', have)
5c23128d 1398
70a5db58
LP
1399want_homed = get_option('homed')
1400if want_homed != 'false'
1401 have = (conf.get('HAVE_OPENSSL') == 1 and
1402 conf.get('HAVE_LIBFDISK') == 1 and
1403 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1404 if want_homed == 'true' and not have
1405 error('homed support was requested, but dependencies are not available')
1406 endif
1407else
1408 have = false
1409endif
1410conf.set10('ENABLE_HOMED', have)
1411
af06ddf5
YW
1412have = have and conf.get('HAVE_PAM') == 1
1413conf.set10('ENABLE_PAM_HOME', have)
1414
5c23128d 1415want_remote = get_option('remote')
4390be30 1416if want_remote != 'false'
349cc4a5
ZJS
1417 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1418 conf.get('HAVE_LIBCURL') == 1]
37efbbd8
ZJS
1419 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1420 # it's possible to build one without the other. Complain only if
5238e957 1421 # support was explicitly requested. The auxiliary files like sysusers
37efbbd8
ZJS
1422 # config should be installed when any of the programs are built.
1423 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1424 error('remote support was requested, but dependencies are not available')
1425 endif
349cc4a5
ZJS
1426 have = have_deps[0] or have_deps[1]
1427else
1428 have = false
5c23128d 1429endif
349cc4a5 1430conf.set10('ENABLE_REMOTE', have)
5c23128d 1431
b3259a6e
ZJS
1432foreach term : ['analyze',
1433 'backlight',
a9149d87
ZJS
1434 'binfmt',
1435 'coredump',
b3259a6e
ZJS
1436 'efi',
1437 'environment-d',
1438 'firstboot',
1439 'gshadow',
1440 'hibernate',
a9149d87 1441 'hostnamed',
b3259a6e
ZJS
1442 'hwdb',
1443 'idn',
1444 'ima',
1445 'initrd',
53393c89 1446 'compat-mutable-uid-boundaries',
b3259a6e 1447 'ldconfig',
a9149d87 1448 'localed',
b3259a6e 1449 'logind',
a9149d87
ZJS
1450 'machined',
1451 'networkd',
b3259a6e
ZJS
1452 'nss-myhostname',
1453 'nss-systemd',
1454 'portabled',
1455 'pstore',
a9149d87 1456 'quotacheck',
b3259a6e
ZJS
1457 'randomseed',
1458 'resolve',
1459 'rfkill',
1460 'smack',
a9149d87 1461 'sysusers',
b3259a6e
ZJS
1462 'timedated',
1463 'timesyncd',
a9149d87 1464 'tmpfiles',
a9149d87 1465 'tpm',
b3259a6e
ZJS
1466 'userdb',
1467 'utmp',
1468 'vconsole',
1469 'xdg-autostart']
a9149d87
ZJS
1470 have = get_option(term)
1471 name = 'ENABLE_' + term.underscorify().to_upper()
1472 conf.set10(name, have)
aa25270c 1473 substs.set10(name, have)
5c23128d
ZJS
1474endforeach
1475
bd7e6aa7
ZJS
1476enable_sysusers = conf.get('ENABLE_SYSUSERS') == 1
1477
08540a95
YW
1478foreach tuple : [['nss-mymachines', 'machined'],
1479 ['nss-resolve', 'resolve']]
1480 want = get_option(tuple[0])
1481 if want != 'false'
1482 have = get_option(tuple[1])
1483 if want == 'true' and not have
1484 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1485 endif
1486 else
1487 have = false
1488 endif
1489 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1490 conf.set10(name, have)
1491endforeach
1492
1493enable_nss = false
1494foreach term : ['ENABLE_NSS_MYHOSTNAME',
1495 'ENABLE_NSS_MYMACHINES',
1496 'ENABLE_NSS_RESOLVE',
1497 'ENABLE_NSS_SYSTEMD']
1498 if conf.get(term) == 1
1499 enable_nss = true
1500 endif
1501endforeach
1502conf.set10('ENABLE_NSS', enable_nss)
1503
348b4437 1504conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
6129ec85 1505
69e96427 1506tests = []
7db7d5b7 1507fuzzers = []
69e96427 1508
b68dfb9e 1509conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
00d82c81 1510
5c23128d
ZJS
1511#####################################################################
1512
1513if get_option('efi')
37efbbd8 1514 efi_arch = host_machine.cpu_family()
b710072d 1515
6800fe7f 1516 if efi_arch == 'x86'
37efbbd8 1517 EFI_MACHINE_TYPE_NAME = 'ia32'
6800fe7f 1518 gnu_efi_arch = 'ia32'
37efbbd8
ZJS
1519 elif efi_arch == 'x86_64'
1520 EFI_MACHINE_TYPE_NAME = 'x64'
6800fe7f 1521 gnu_efi_arch = 'x86_64'
37efbbd8
ZJS
1522 elif efi_arch == 'arm'
1523 EFI_MACHINE_TYPE_NAME = 'arm'
6800fe7f 1524 gnu_efi_arch = 'arm'
37efbbd8
ZJS
1525 elif efi_arch == 'aarch64'
1526 EFI_MACHINE_TYPE_NAME = 'aa64'
6800fe7f 1527 gnu_efi_arch = 'aarch64'
37efbbd8
ZJS
1528 else
1529 EFI_MACHINE_TYPE_NAME = ''
6800fe7f 1530 gnu_efi_arch = ''
37efbbd8 1531 endif
5c23128d 1532
349cc4a5 1533 have = true
37efbbd8 1534 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
80c6fce8 1535
ac09340e 1536 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
349cc4a5
ZJS
1537else
1538 have = false
5c23128d 1539endif
349cc4a5 1540conf.set10('ENABLE_EFI', have)
5c23128d
ZJS
1541
1542#####################################################################
1543
1544config_h = configure_file(
37efbbd8
ZJS
1545 output : 'config.h',
1546 configuration : conf)
5c23128d 1547
348b4437
YW
1548meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1549
5c23128d 1550includes = include_directories('src/basic',
91b08bb0 1551 'src/boot',
c76dd733 1552 'src/home',
5c23128d
ZJS
1553 'src/shared',
1554 'src/systemd',
1555 'src/journal',
a38f7fec 1556 'src/journal-remote',
97d90615 1557 'src/nspawn',
5c23128d
ZJS
1558 'src/resolve',
1559 'src/timesync',
5c3376ef 1560 'src/time-wait-sync',
5c23128d
ZJS
1561 'src/login',
1562 'src/udev',
1563 'src/libudev',
1564 'src/core',
9e71f5d9 1565 'src/shutdown',
8feca247 1566 'src/xdg-autostart-generator',
5c23128d
ZJS
1567 'src/libsystemd/sd-bus',
1568 'src/libsystemd/sd-device',
a137a1c3 1569 'src/libsystemd/sd-event',
5c23128d
ZJS
1570 'src/libsystemd/sd-hwdb',
1571 'src/libsystemd/sd-id128',
1572 'src/libsystemd/sd-netlink',
1573 'src/libsystemd/sd-network',
ceb26cdb 1574 'src/libsystemd/sd-resolve',
5c23128d 1575 'src/libsystemd-network',
2d4ceca8 1576 '.')
5c23128d
ZJS
1577
1578add_project_arguments('-include', 'config.h', language : 'c')
1579
6ec439fd
YW
1580generate_gperfs = find_program('tools/generate-gperfs.py')
1581
5c23128d
ZJS
1582subdir('po')
1583subdir('catalog')
1584subdir('src/systemd')
1585subdir('src/basic')
1586subdir('src/libsystemd')
1587subdir('src/libsystemd-network')
5c23128d 1588subdir('src/journal')
5c23128d 1589subdir('src/login')
5c23128d
ZJS
1590
1591libjournal_core = static_library(
37efbbd8
ZJS
1592 'journal-core',
1593 libjournal_core_sources,
1594 journald_gperf_c,
1595 include_directories : includes,
1596 install : false)
5c23128d 1597
1485aacb 1598libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
5c23128d 1599libsystemd = shared_library(
37efbbd8 1600 'systemd',
a5d8835c 1601 disable_mempool_c,
56d50ab1 1602 version : libsystemd_version,
37efbbd8
ZJS
1603 include_directories : includes,
1604 link_args : ['-shared',
1605 '-Wl,--version-script=' + libsystemd_sym_path],
34e221a5
ZJS
1606 link_with : [libbasic,
1607 libbasic_gcrypt],
5e3cec87
ZJS
1608 link_whole : [libsystemd_static,
1609 libjournal_client],
37efbbd8
ZJS
1610 dependencies : [threads,
1611 librt,
1612 libxz,
ef5924aa 1613 libzstd,
37efbbd8
ZJS
1614 liblz4],
1615 link_depends : libsystemd_sym,
1616 install : true,
1617 install_dir : rootlibdir)
5c23128d 1618
70848ecf
DC
1619static_libsystemd = get_option('static-libsystemd')
1620static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1621
1622install_libsystemd_static = static_library(
1623 'systemd',
1624 libsystemd_sources,
1625 journal_client_sources,
975464e0
ZJS
1626 basic_sources,
1627 basic_gcrypt_sources,
be44b572 1628 disable_mempool_c,
70848ecf 1629 include_directories : includes,
70848ecf
DC
1630 build_by_default : static_libsystemd != 'false',
1631 install : static_libsystemd != 'false',
1632 install_dir : rootlibdir,
1633 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1634 dependencies : [threads,
1635 librt,
1636 libxz,
ef5924aa 1637 libzstd,
70848ecf 1638 liblz4,
975464e0
ZJS
1639 libcap,
1640 libblkid,
1641 libmount,
1642 libselinux,
70848ecf
DC
1643 libgcrypt],
1644 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1645
47354b44
ZJS
1646############################################################
1647
1648autosuspend_update_sh = find_program('tools/autosuspend-update.sh')
1649hwdb_update_sh = find_program('tools/hwdb-update.sh')
b61d777a 1650make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
47354b44
ZJS
1651make_directive_index_py = find_program('tools/make-directive-index.py')
1652make_man_index_py = find_program('tools/make-man-index.py')
1653syscall_names_update_sh = find_program('tools/syscall-names-update.sh')
1654xml_helper_py = find_program('tools/xml_helper.py')
4cc73cf9 1655update_dbus_docs_py = find_program('tools/update-dbus-docs.py')
b61d777a 1656
5c23128d
ZJS
1657############################################################
1658
83b6af36
ZJS
1659# binaries that have --help and are intended for use by humans,
1660# usually, but not always, installed in /bin.
1661public_programs = []
1662
1663subdir('src/libudev')
1664subdir('src/shared')
1665subdir('src/core')
9e71f5d9 1666subdir('src/shutdown')
83b6af36
ZJS
1667subdir('src/udev')
1668subdir('src/network')
1669
1670subdir('src/analyze')
1671subdir('src/journal-remote')
1672subdir('src/coredump')
9b4abc69 1673subdir('src/pstore')
83b6af36
ZJS
1674subdir('src/hostname')
1675subdir('src/import')
e594a3b1 1676subdir('src/partition')
83b6af36
ZJS
1677subdir('src/kernel-install')
1678subdir('src/locale')
1679subdir('src/machine')
61d0578b 1680subdir('src/portable')
d093b62c 1681subdir('src/userdb')
70a5db58 1682subdir('src/home')
83b6af36
ZJS
1683subdir('src/nspawn')
1684subdir('src/resolve')
1685subdir('src/timedate')
1686subdir('src/timesync')
db64ba81 1687subdir('src/tmpfiles')
83b6af36 1688subdir('src/vconsole')
83b6af36
ZJS
1689subdir('src/boot/efi')
1690
1691subdir('src/test')
7db7d5b7 1692subdir('src/fuzz')
ef2ad30a 1693subdir('rules.d')
83b6af36
ZJS
1694subdir('test')
1695
1696############################################################
1697
1698# only static linking apart from libdl, to make sure that the
1699# module is linked to all libraries that it uses.
1700test_dlopen = executable(
37efbbd8
ZJS
1701 'test-dlopen',
1702 test_dlopen_c,
a5d8835c 1703 disable_mempool_c,
37efbbd8
ZJS
1704 include_directories : includes,
1705 link_with : [libbasic],
fd1939fb
YW
1706 dependencies : [libdl],
1707 build_by_default : want_tests != 'false')
83b6af36 1708
08540a95 1709foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
037b0a47 1710 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h src/nss-systemd/nss-systemd.h'],
08540a95
YW
1711 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1712 ['resolve', 'ENABLE_NSS_RESOLVE']]
5c23128d 1713
349cc4a5 1714 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
37efbbd8
ZJS
1715 if condition
1716 module = tuple[0]
37efbbd8
ZJS
1717
1718 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1485aacb 1719 version_script_arg = join_paths(project_source_root, sym)
37efbbd8 1720
1684c56f
LP
1721 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1722 if tuple.length() > 2
1723 sources += tuple[2].split()
1724 endif
1725
37efbbd8
ZJS
1726 nss = shared_library(
1727 'nss_' + module,
1684c56f 1728 sources,
a5d8835c 1729 disable_mempool_c,
37efbbd8
ZJS
1730 version : '2',
1731 include_directories : includes,
b4b36f44
LP
1732 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1733 link_args : ['-Wl,-z,nodelete',
1734 '-shared',
700805f6 1735 '-Wl,--version-script=' + version_script_arg],
37e4d7a8 1736 link_with : [libsystemd_static,
733cbd00 1737 libshared_static,
37efbbd8
ZJS
1738 libbasic],
1739 dependencies : [threads,
5486a31d 1740 librt],
37efbbd8
ZJS
1741 link_depends : sym,
1742 install : true,
1743 install_dir : rootlibdir)
1744
1745 # We cannot use shared_module because it does not support version suffix.
1746 # Unfortunately shared_library insists on creating the symlink…
1747 meson.add_install_script('sh', '-c',
1748 'rm $DESTDIR@0@/libnss_@1@.so'
1749 .format(rootlibdir, module))
1750
938be089
ZJS
1751 if want_tests != 'false'
1752 test('dlopen-nss_' + module,
1753 test_dlopen,
1754 # path to dlopen must include a slash
1755 args : nss.full_path())
1756 endif
37efbbd8 1757 endif
5c23128d
ZJS
1758endforeach
1759
1760############################################################
1761
6164ec4c
ZJS
1762executable(
1763 'systemd',
1764 systemd_sources,
1765 include_directories : includes,
1766 link_with : [libcore,
1767 libshared],
1768 dependencies : [versiondep,
1769 threads,
1770 librt,
1771 libseccomp,
1772 libselinux,
1773 libmount,
1774 libblkid],
1775 install_rpath : rootlibexecdir,
1776 install : true,
1777 install_dir : rootlibexecdir)
5c23128d 1778
ba7f4ae6
ZJS
1779meson.add_install_script(meson_make_symlink,
1780 join_paths(rootlibexecdir, 'systemd'),
1781 join_paths(rootsbindir, 'init'))
1782
6164ec4c
ZJS
1783public_programs += executable(
1784 'systemd-analyze',
1785 systemd_analyze_sources,
1786 include_directories : includes,
1787 link_with : [libcore,
1788 libshared],
1789 dependencies : [versiondep,
1790 threads,
1791 librt,
1792 libseccomp,
1793 libselinux,
1794 libmount,
1795 libblkid],
1796 install_rpath : rootlibexecdir,
b3259a6e 1797 install : conf.get('ENABLE_ANALYZE'))
5c23128d 1798
6164ec4c
ZJS
1799executable(
1800 'systemd-journald',
1801 systemd_journald_sources,
1802 include_directories : includes,
1803 link_with : [libjournal_core,
1804 libshared],
1805 dependencies : [threads,
1806 libxz,
1807 liblz4,
ef5924aa
NL
1808 libselinux,
1809 libzstd],
6164ec4c
ZJS
1810 install_rpath : rootlibexecdir,
1811 install : true,
1812 install_dir : rootlibexecdir)
5c23128d 1813
6164ec4c
ZJS
1814public_programs += executable(
1815 'systemd-cat',
1816 systemd_cat_sources,
1817 include_directories : includes,
1818 link_with : [libjournal_core,
1819 libshared],
1820 dependencies : [threads],
1821 install_rpath : rootlibexecdir,
1822 install : true)
1823
1824public_programs += executable(
1825 'journalctl',
1826 journalctl_sources,
1827 include_directories : includes,
1828 link_with : [libshared],
1829 dependencies : [threads,
e44b5004 1830 libdl,
6164ec4c
ZJS
1831 libxz,
1832 liblz4,
9200bb30
LP
1833 libzstd,
1834 libdl],
6164ec4c
ZJS
1835 install_rpath : rootlibexecdir,
1836 install : true,
1837 install_dir : rootbindir)
35a1ff4c 1838
6164ec4c
ZJS
1839executable(
1840 'systemd-getty-generator',
1841 'src/getty-generator/getty-generator.c',
1842 include_directories : includes,
1843 link_with : [libshared],
1844 install_rpath : rootlibexecdir,
1845 install : true,
1846 install_dir : systemgeneratordir)
5c23128d 1847
6164ec4c
ZJS
1848executable(
1849 'systemd-debug-generator',
1850 'src/debug-generator/debug-generator.c',
1851 include_directories : includes,
1852 link_with : [libshared],
1853 install_rpath : rootlibexecdir,
1854 install : true,
1855 install_dir : systemgeneratordir)
1856
1857executable(
1858 'systemd-run-generator',
1859 'src/run-generator/run-generator.c',
1860 include_directories : includes,
1861 link_with : [libshared],
1862 install_rpath : rootlibexecdir,
1863 install : true,
1864 install_dir : systemgeneratordir)
1865
1866executable(
1867 'systemd-fstab-generator',
1868 'src/fstab-generator/fstab-generator.c',
1869 include_directories : includes,
1870 link_with : [libcore_shared,
1871 libshared],
1872 install_rpath : rootlibexecdir,
1873 install : true,
1874 install_dir : systemgeneratordir)
5c23128d 1875
349cc4a5 1876if conf.get('ENABLE_ENVIRONMENT_D') == 1
6164ec4c
ZJS
1877 executable(
1878 '30-systemd-environment-d-generator',
1879 'src/environment-d-generator/environment-d-generator.c',
1880 include_directories : includes,
1881 link_with : [libshared],
1882 install_rpath : rootlibexecdir,
1883 install : true,
1884 install_dir : userenvgeneratordir)
7b76fce1 1885
37efbbd8
ZJS
1886 meson.add_install_script(meson_make_symlink,
1887 join_paths(sysconfdir, 'environment'),
1888 join_paths(environmentdir, '99-environment.conf'))
5c23128d
ZJS
1889endif
1890
349cc4a5 1891if conf.get('ENABLE_HIBERNATE') == 1
6164ec4c
ZJS
1892 executable(
1893 'systemd-hibernate-resume-generator',
1894 'src/hibernate-resume/hibernate-resume-generator.c',
1895 include_directories : includes,
1896 link_with : [libshared],
1897 install_rpath : rootlibexecdir,
1898 install : true,
1899 install_dir : systemgeneratordir)
1900
1901 executable(
1902 'systemd-hibernate-resume',
1903 'src/hibernate-resume/hibernate-resume.c',
1904 include_directories : includes,
1905 link_with : [libshared],
1906 install_rpath : rootlibexecdir,
1907 install : true,
1908 install_dir : rootlibexecdir)
37efbbd8
ZJS
1909endif
1910
349cc4a5 1911if conf.get('HAVE_BLKID') == 1
6164ec4c
ZJS
1912 executable(
1913 'systemd-gpt-auto-generator',
1914 'src/gpt-auto-generator/gpt-auto-generator.c',
1915 'src/shared/blkid-util.h',
1916 include_directories : includes,
1917 link_with : [libshared],
1918 dependencies : libblkid,
1919 install_rpath : rootlibexecdir,
1920 install : true,
1921 install_dir : systemgeneratordir)
1922
1923 public_programs += executable(
1924 'systemd-dissect',
1925 'src/dissect/dissect.c',
1926 include_directories : includes,
1927 link_with : [libshared],
1928 install_rpath : rootlibexecdir,
5a151082 1929 install : true)
5c23128d
ZJS
1930endif
1931
1ec57f33 1932if conf.get('ENABLE_RESOLVE') == 1
6164ec4c
ZJS
1933 executable(
1934 'systemd-resolved',
1935 systemd_resolved_sources,
1936 include_directories : includes,
1937 link_with : [libshared,
1938 libbasic_gcrypt,
1939 libsystemd_resolve_core],
1940 dependencies : systemd_resolved_dependencies,
1941 install_rpath : rootlibexecdir,
1942 install : true,
1943 install_dir : rootlibexecdir)
1944
1945 public_programs += executable(
1946 'resolvectl',
1947 resolvectl_sources,
1948 include_directories : includes,
1949 link_with : [libshared,
1950 libbasic_gcrypt,
1951 libsystemd_resolve_core],
1952 dependencies : [threads,
1953 libgpg_error,
1954 libm,
1955 libidn],
1956 install_rpath : rootlibexecdir,
1957 install : true)
088c1363
LP
1958
1959 meson.add_install_script(meson_make_symlink,
6164ec4c
ZJS
1960 join_paths(bindir, 'resolvectl'),
1961 join_paths(rootsbindir, 'resolvconf'))
c2e84cab
YW
1962
1963 meson.add_install_script(meson_make_symlink,
6164ec4c
ZJS
1964 join_paths(bindir, 'resolvectl'),
1965 join_paths(bindir, 'systemd-resolve'))
5c23128d
ZJS
1966endif
1967
349cc4a5 1968if conf.get('ENABLE_LOGIND') == 1
6164ec4c
ZJS
1969 executable(
1970 'systemd-logind',
1971 systemd_logind_sources,
1972 include_directories : includes,
1973 link_with : [liblogind_core,
1974 libshared],
1975 dependencies : [threads,
1976 libacl],
1977 install_rpath : rootlibexecdir,
1978 install : true,
1979 install_dir : rootlibexecdir)
1980
1981 public_programs += executable(
1982 'loginctl',
1983 loginctl_sources,
1984 include_directories : includes,
1985 link_with : [libshared],
1986 dependencies : [threads,
1987 liblz4,
ef5924aa
NL
1988 libxz,
1989 libzstd],
6164ec4c
ZJS
1990 install_rpath : rootlibexecdir,
1991 install : true,
1992 install_dir : rootbindir)
1993
1994 public_programs += executable(
1995 'systemd-inhibit',
1996 'src/login/inhibit.c',
1997 include_directories : includes,
1998 link_with : [libshared],
1999 install_rpath : rootlibexecdir,
2000 install : true,
2001 install_dir : rootbindir)
37efbbd8 2002
349cc4a5 2003 if conf.get('HAVE_PAM') == 1
1485aacb 2004 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
37efbbd8
ZJS
2005 pam_systemd = shared_library(
2006 'pam_systemd',
2007 pam_systemd_c,
2008 name_prefix : '',
2009 include_directories : includes,
2010 link_args : ['-shared',
2011 '-Wl,--version-script=' + version_script_arg],
37e4d7a8 2012 link_with : [libsystemd_static,
37efbbd8
ZJS
2013 libshared_static],
2014 dependencies : [threads,
2015 libpam,
2016 libpam_misc],
2017 link_depends : pam_systemd_sym,
2018 install : true,
2019 install_dir : pamlibdir)
2020
938be089
ZJS
2021 if want_tests != 'false'
2022 test('dlopen-pam_systemd',
2023 test_dlopen,
2024 # path to dlopen must include a slash
c1cd6743 2025 args : pam_systemd.full_path())
938be089 2026 endif
37efbbd8 2027 endif
005a29f2 2028
6164ec4c
ZJS
2029 executable(
2030 'systemd-user-runtime-dir',
2031 user_runtime_dir_sources,
2032 include_directories : includes,
2033 link_with : [libshared],
2034 install_rpath : rootlibexecdir,
2035 install : true,
2036 install_dir : rootlibexecdir)
07ee5adb 2037endif
a9f0f5e5 2038
349cc4a5 2039if conf.get('HAVE_PAM') == 1
6164ec4c
ZJS
2040 executable(
2041 'systemd-user-sessions',
2042 'src/user-sessions/user-sessions.c',
2043 include_directories : includes,
2044 link_with : [libshared],
2045 install_rpath : rootlibexecdir,
2046 install : true,
2047 install_dir : rootlibexecdir)
5c23128d
ZJS
2048endif
2049
349cc4a5 2050if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
6164ec4c
ZJS
2051 public_programs += executable(
2052 'bootctl',
2053 'src/boot/bootctl.c',
2054 include_directories : includes,
2055 link_with : [libshared],
2056 dependencies : [libblkid],
2057 install_rpath : rootlibexecdir,
2058 install : true)
2059
2060 public_programs += executable(
2061 'systemd-bless-boot',
2062 'src/boot/bless-boot.c',
2063 include_directories : includes,
2064 link_with : [libshared],
2065 dependencies : [libblkid],
2066 install_rpath : rootlibexecdir,
2067 install : true,
2068 install_dir : rootlibexecdir)
2069
2070 executable(
2071 'systemd-bless-boot-generator',
2072 'src/boot/bless-boot-generator.c',
2073 include_directories : includes,
2074 link_with : [libshared],
2075 install_rpath : rootlibexecdir,
2076 install : true,
2077 install_dir : systemgeneratordir)
2078endif
2079
2080executable(
2081 'systemd-boot-check-no-failures',
2082 'src/boot/boot-check-no-failures.c',
2083 include_directories : includes,
2084 link_with : [libshared],
2085 dependencies : [libblkid],
2086 install_rpath : rootlibexecdir,
2087 install : true,
2088 install_dir : rootlibexecdir)
005a29f2 2089
6164ec4c
ZJS
2090public_programs += executable(
2091 'systemd-socket-activate',
2092 'src/activate/activate.c',
2093 include_directories : includes,
2094 link_with : [libshared],
2095 dependencies : [threads],
2096 install_rpath : rootlibexecdir,
2097 install : true)
f3794366
FS
2098
2099if get_option('link-systemctl-shared')
2100 systemctl_link_with = [libshared]
2101else
2102 systemctl_link_with = [libsystemd_static,
2103 libshared_static,
2104 libjournal_client,
2105 libbasic_gcrypt]
2106endif
2107
6164ec4c
ZJS
2108public_programs += executable(
2109 'systemctl',
daf71ef6
LP
2110 'src/systemctl/systemctl-add-dependency.c',
2111 'src/systemctl/systemctl-add-dependency.h',
2112 'src/systemctl/systemctl-cancel-job.c',
2113 'src/systemctl/systemctl-cancel-job.h',
2114 'src/systemctl/systemctl-clean-or-freeze.c',
2115 'src/systemctl/systemctl-clean-or-freeze.h',
2116 'src/systemctl/systemctl-compat-halt.c',
2117 'src/systemctl/systemctl-compat-halt.h',
2118 'src/systemctl/systemctl-compat-runlevel.c',
2119 'src/systemctl/systemctl-compat-runlevel.h',
2120 'src/systemctl/systemctl-compat-shutdown.c',
2121 'src/systemctl/systemctl-compat-shutdown.h',
2122 'src/systemctl/systemctl-compat-telinit.c',
2123 'src/systemctl/systemctl-compat-telinit.h',
2124 'src/systemctl/systemctl-daemon-reload.c',
2125 'src/systemctl/systemctl-daemon-reload.h',
2126 'src/systemctl/systemctl-edit.c',
2127 'src/systemctl/systemctl-edit.h',
2128 'src/systemctl/systemctl-enable.c',
2129 'src/systemctl/systemctl-enable.h',
2130 'src/systemctl/systemctl-is-active.c',
2131 'src/systemctl/systemctl-is-active.h',
2132 'src/systemctl/systemctl-is-enabled.c',
2133 'src/systemctl/systemctl-is-enabled.h',
2134 'src/systemctl/systemctl-is-system-running.c',
2135 'src/systemctl/systemctl-is-system-running.h',
2136 'src/systemctl/systemctl-kill.c',
2137 'src/systemctl/systemctl-kill.h',
2138 'src/systemctl/systemctl-list-dependencies.c',
2139 'src/systemctl/systemctl-list-dependencies.h',
2140 'src/systemctl/systemctl-list-jobs.c',
2141 'src/systemctl/systemctl-list-jobs.h',
2142 'src/systemctl/systemctl-list-machines.c',
2143 'src/systemctl/systemctl-list-machines.h',
2144 'src/systemctl/systemctl-list-unit-files.c',
2145 'src/systemctl/systemctl-list-unit-files.h',
2146 'src/systemctl/systemctl-list-units.c',
2147 'src/systemctl/systemctl-list-units.h',
2148 'src/systemctl/systemctl-log-setting.c',
2149 'src/systemctl/systemctl-log-setting.h',
2150 'src/systemctl/systemctl-logind.c',
2151 'src/systemctl/systemctl-logind.h',
2152 'src/systemctl/systemctl-preset-all.c',
2153 'src/systemctl/systemctl-preset-all.h',
2154 'src/systemctl/systemctl-reset-failed.c',
2155 'src/systemctl/systemctl-reset-failed.h',
2156 'src/systemctl/systemctl-service-watchdogs.c',
2157 'src/systemctl/systemctl-service-watchdogs.h',
2158 'src/systemctl/systemctl-set-default.c',
2159 'src/systemctl/systemctl-set-default.h',
2160 'src/systemctl/systemctl-set-environment.c',
2161 'src/systemctl/systemctl-set-environment.h',
2162 'src/systemctl/systemctl-set-property.c',
2163 'src/systemctl/systemctl-set-property.h',
2164 'src/systemctl/systemctl-show.c',
2165 'src/systemctl/systemctl-show.h',
2166 'src/systemctl/systemctl-start-special.c',
2167 'src/systemctl/systemctl-start-special.h',
2168 'src/systemctl/systemctl-start-unit.c',
2169 'src/systemctl/systemctl-start-unit.h',
2170 'src/systemctl/systemctl-switch-root.c',
2171 'src/systemctl/systemctl-switch-root.h',
2172 'src/systemctl/systemctl-sysv-compat.c',
2173 'src/systemctl/systemctl-sysv-compat.h',
2174 'src/systemctl/systemctl-trivial-method.c',
2175 'src/systemctl/systemctl-trivial-method.h',
2176 'src/systemctl/systemctl-util.c',
2177 'src/systemctl/systemctl-util.c',
2178 'src/systemctl/systemctl-util.h',
6164ec4c 2179 'src/systemctl/systemctl.c',
daf71ef6 2180 'src/systemctl/systemctl.h',
6164ec4c
ZJS
2181 include_directories : includes,
2182 link_with : systemctl_link_with,
2183 dependencies : [threads,
2184 libcap,
2185 libselinux,
2186 libxz,
ef5924aa
NL
2187 liblz4,
2188 libzstd],
6164ec4c
ZJS
2189 install_rpath : rootlibexecdir,
2190 install : true,
2191 install_dir : rootbindir)
5c23128d 2192
61d0578b 2193if conf.get('ENABLE_PORTABLED') == 1
6164ec4c
ZJS
2194 executable(
2195 'systemd-portabled',
2196 systemd_portabled_sources,
2197 include_directories : includes,
2198 link_with : [libshared],
2199 dependencies : [threads],
2200 install_rpath : rootlibexecdir,
2201 install : true,
2202 install_dir : rootlibexecdir)
2203
2204 public_programs += executable(
2205 'portablectl',
2206 'src/portable/portablectl.c',
2207 include_directories : includes,
2208 link_with : [libshared],
2209 dependencies : [threads],
2210 install_rpath : rootlibexecdir,
2211 install : true,
2212 install_dir : rootbindir)
61d0578b
LP
2213endif
2214
d093b62c 2215if conf.get('ENABLE_USERDB') == 1
6164ec4c
ZJS
2216 executable(
2217 'systemd-userwork',
2218 systemd_userwork_sources,
2219 include_directories : includes,
2220 link_with : [libshared],
2221 dependencies : [threads],
2222 install_rpath : rootlibexecdir,
2223 install : true,
2224 install_dir : rootlibexecdir)
2225
2226 executable(
2227 'systemd-userdbd',
2228 systemd_userdbd_sources,
2229 include_directories : includes,
2230 link_with : [libshared],
2231 dependencies : [threads],
2232 install_rpath : rootlibexecdir,
2233 install : true,
2234 install_dir : rootlibexecdir)
2235
460e5af0 2236 public_programs += executable(
6164ec4c
ZJS
2237 'userdbctl',
2238 userdbctl_sources,
2239 include_directories : includes,
2240 link_with : [libshared],
2241 dependencies : [threads],
2242 install_rpath : rootlibexecdir,
2243 install : true,
2244 install_dir : rootbindir)
d093b62c
LP
2245endif
2246
70a5db58 2247if conf.get('ENABLE_HOMED') == 1
6164ec4c
ZJS
2248 executable(
2249 'systemd-homework',
2250 systemd_homework_sources,
2251 include_directories : includes,
2252 link_with : [libshared],
2253 dependencies : [threads,
2254 libcryptsetup,
2255 libblkid,
2256 libcrypt,
2257 libopenssl,
2258 libfdisk,
7b78db28
LP
2259 libp11kit,
2260 libfido2],
6164ec4c
ZJS
2261 install_rpath : rootlibexecdir,
2262 install : true,
2263 install_dir : rootlibexecdir)
2264
2265 executable(
2266 'systemd-homed',
2267 systemd_homed_sources,
2268 include_directories : includes,
2269 link_with : [libshared],
2270 dependencies : [threads,
2271 libcrypt,
679badd7 2272 libopenssl],
6164ec4c
ZJS
2273 install_rpath : rootlibexecdir,
2274 install : true,
2275 install_dir : rootlibexecdir)
2276
460e5af0 2277 public_programs += executable(
6164ec4c
ZJS
2278 'homectl',
2279 homectl_sources,
2280 include_directories : includes,
2281 link_with : [libshared],
2282 dependencies : [threads,
2283 libcrypt,
2284 libopenssl,
2285 libp11kit,
da3920c3
LP
2286 libfido2,
2287 libdl],
6164ec4c
ZJS
2288 install_rpath : rootlibexecdir,
2289 install : true,
2290 install_dir : rootbindir)
26cf9fb7
LP
2291
2292 if conf.get('HAVE_PAM') == 1
2293 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2294 pam_systemd = shared_library(
2295 'pam_systemd_home',
2296 pam_systemd_home_c,
2297 name_prefix : '',
2298 include_directories : includes,
2299 link_args : ['-shared',
2300 '-Wl,--version-script=' + version_script_arg],
2301 link_with : [libsystemd_static,
2302 libshared_static],
2303 dependencies : [threads,
2304 libpam,
2305 libpam_misc,
2306 libcrypt],
2307 link_depends : pam_systemd_home_sym,
2308 install : true,
2309 install_dir : pamlibdir)
2310 endif
70a5db58
LP
2311endif
2312
6589a569
NL
2313foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
2314 (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
ba7f4ae6
ZJS
2315 meson.add_install_script(meson_make_symlink,
2316 join_paths(rootbindir, 'systemctl'),
2317 join_paths(rootsbindir, alias))
2318endforeach
2319
63e2d171
NL
2320meson.add_install_script(meson_make_symlink,
2321 join_paths(rootbindir, 'udevadm'),
2322 join_paths(rootlibexecdir, 'systemd-udevd'))
2323
349cc4a5 2324if conf.get('ENABLE_BACKLIGHT') == 1
6164ec4c
ZJS
2325 executable(
2326 'systemd-backlight',
2327 'src/backlight/backlight.c',
2328 include_directories : includes,
2329 link_with : [libshared],
2330 install_rpath : rootlibexecdir,
2331 install : true,
2332 install_dir : rootlibexecdir)
5c23128d
ZJS
2333endif
2334
349cc4a5 2335if conf.get('ENABLE_RFKILL') == 1
6164ec4c
ZJS
2336 executable(
2337 'systemd-rfkill',
2338 'src/rfkill/rfkill.c',
2339 include_directories : includes,
2340 link_with : [libshared],
2341 install_rpath : rootlibexecdir,
2342 install : true,
2343 install_dir : rootlibexecdir)
2344endif
2345
2346executable(
2347 'systemd-system-update-generator',
2348 'src/system-update-generator/system-update-generator.c',
2349 include_directories : includes,
2350 link_with : [libshared],
2351 install_rpath : rootlibexecdir,
2352 install : true,
2353 install_dir : systemgeneratordir)
5c23128d 2354
349cc4a5 2355if conf.get('HAVE_LIBCRYPTSETUP') == 1
08669709 2356 systemd_cryptsetup_sources = files('''
08669709 2357 src/cryptsetup/cryptsetup-pkcs11.h
1e2f3230
LP
2358 src/cryptsetup/cryptsetup-keyfile.c
2359 src/cryptsetup/cryptsetup-keyfile.h
23769fb3 2360 src/cryptsetup/cryptsetup.c
08669709
LP
2361'''.split())
2362
2363 if conf.get('HAVE_P11KIT') == 1
2364 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2365 endif
2366
6164ec4c
ZJS
2367 executable(
2368 'systemd-cryptsetup',
2369 systemd_cryptsetup_sources,
2370 include_directories : includes,
2371 link_with : [libshared],
2372 dependencies : [libcryptsetup,
2373 libp11kit],
2374 install_rpath : rootlibexecdir,
2375 install : true,
2376 install_dir : rootlibexecdir)
2377
2378 executable(
2379 'systemd-cryptsetup-generator',
2380 'src/cryptsetup/cryptsetup-generator.c',
2381 include_directories : includes,
2382 link_with : [libshared],
6164ec4c
ZJS
2383 install_rpath : rootlibexecdir,
2384 install : true,
2385 install_dir : systemgeneratordir)
2386
2387 executable(
2388 'systemd-veritysetup',
2389 'src/veritysetup/veritysetup.c',
2390 include_directories : includes,
2391 link_with : [libshared],
2392 dependencies : [libcryptsetup],
2393 install_rpath : rootlibexecdir,
2394 install : true,
2395 install_dir : rootlibexecdir)
2396
2397 executable(
2398 'systemd-veritysetup-generator',
2399 'src/veritysetup/veritysetup-generator.c',
2400 include_directories : includes,
2401 link_with : [libshared],
6164ec4c
ZJS
2402 install_rpath : rootlibexecdir,
2403 install : true,
2404 install_dir : systemgeneratordir)
5c23128d
ZJS
2405endif
2406
349cc4a5 2407if conf.get('HAVE_SYSV_COMPAT') == 1
6164ec4c
ZJS
2408 executable(
2409 'systemd-sysv-generator',
2410 'src/sysv-generator/sysv-generator.c',
2411 include_directories : includes,
2412 link_with : [libshared],
2413 install_rpath : rootlibexecdir,
2414 install : true,
2415 install_dir : systemgeneratordir)
2416
2417 executable(
2418 'systemd-rc-local-generator',
2419 'src/rc-local-generator/rc-local-generator.c',
2420 include_directories : includes,
2421 link_with : [libshared],
2422 install_rpath : rootlibexecdir,
2423 install : true,
2424 install_dir : systemgeneratordir)
5c23128d
ZJS
2425endif
2426
8feca247
BB
2427if conf.get('ENABLE_XDG_AUTOSTART') == 1
2428 executable(
2429 'systemd-xdg-autostart-generator',
2430 'src/xdg-autostart-generator/xdg-autostart-generator.c',
2431 'src/xdg-autostart-generator/xdg-autostart-service.c',
2432 include_directories : includes,
2433 link_with : [libshared],
2434 install_rpath : rootlibexecdir,
2435 install : true,
2436 install_dir : usergeneratordir)
2437
2438 executable(
2439 'systemd-xdg-autostart-condition',
2440 'src/xdg-autostart-generator/xdg-autostart-condition.c',
2441 include_directories : includes,
2442 link_with : [libshared],
2443 install_rpath : rootlibexecdir,
2444 install : true,
2445 install_dir : rootlibexecdir)
2446endif
2447
349cc4a5 2448if conf.get('ENABLE_HOSTNAMED') == 1
6164ec4c
ZJS
2449 executable(
2450 'systemd-hostnamed',
2451 'src/hostname/hostnamed.c',
2452 include_directories : includes,
2453 link_with : [libshared],
2454 install_rpath : rootlibexecdir,
2455 install : true,
2456 install_dir : rootlibexecdir)
2457
2458 public_programs += executable(
2459 'hostnamectl',
2460 'src/hostname/hostnamectl.c',
2461 include_directories : includes,
2462 link_with : [libshared],
2463 install_rpath : rootlibexecdir,
2464 install : true)
5c23128d
ZJS
2465endif
2466
349cc4a5
ZJS
2467if conf.get('ENABLE_LOCALED') == 1
2468 if conf.get('HAVE_XKBCOMMON') == 1
37efbbd8
ZJS
2469 # logind will load libxkbcommon.so dynamically on its own
2470 deps = [libdl]
2471 else
2472 deps = []
2473 endif
2474
6164ec4c
ZJS
2475 executable(
2476 'systemd-localed',
2477 systemd_localed_sources,
2478 include_directories : includes,
2479 link_with : [libshared],
2480 dependencies : deps,
2481 install_rpath : rootlibexecdir,
2482 install : true,
2483 install_dir : rootlibexecdir)
2484
2485 public_programs += executable(
2486 'localectl',
2487 localectl_sources,
2488 include_directories : includes,
2489 link_with : [libshared],
2490 install_rpath : rootlibexecdir,
2491 install : true)
5c23128d
ZJS
2492endif
2493
349cc4a5 2494if conf.get('ENABLE_TIMEDATED') == 1
6164ec4c
ZJS
2495 executable(
2496 'systemd-timedated',
2497 'src/timedate/timedated.c',
2498 include_directories : includes,
2499 link_with : [libshared],
2500 install_rpath : rootlibexecdir,
2501 install : true,
2502 install_dir : rootlibexecdir)
6129ec85 2503endif
5c23128d 2504
6129ec85 2505if conf.get('ENABLE_TIMEDATECTL') == 1
6164ec4c
ZJS
2506 public_programs += executable(
2507 'timedatectl',
2508 'src/timedate/timedatectl.c',
2509 include_directories : includes,
2510 install_rpath : rootlibexecdir,
2511 link_with : [libshared],
2512 dependencies : [libm],
2513 install : true)
5c23128d
ZJS
2514endif
2515
349cc4a5 2516if conf.get('ENABLE_TIMESYNCD') == 1
fd74a13e
RS
2517 if get_option('link-timesyncd-shared')
2518 timesyncd_link_with = [libshared]
2519 else
2520 timesyncd_link_with = [libsystemd_static,
2521 libshared_static,
2522 libjournal_client,
2523 libbasic_gcrypt]
2524 endif
2525
6164ec4c
ZJS
2526 executable(
2527 'systemd-timesyncd',
2528 systemd_timesyncd_sources,
2529 include_directories : includes,
2530 link_with : [timesyncd_link_with],
2531 dependencies : [threads,
2532 libm],
2533 install_rpath : rootlibexecdir,
2534 install : true,
2535 install_dir : rootlibexecdir)
2536
2537 executable(
2538 'systemd-time-wait-sync',
2539 'src/time-wait-sync/time-wait-sync.c',
2540 include_directories : includes,
2541 link_with : [timesyncd_link_with],
2542 install_rpath : rootlibexecdir,
2543 install : true,
2544 install_dir : rootlibexecdir)
5c23128d
ZJS
2545endif
2546
349cc4a5 2547if conf.get('ENABLE_MACHINED') == 1
6164ec4c
ZJS
2548 executable(
2549 'systemd-machined',
2550 systemd_machined_sources,
2551 include_directories : includes,
2552 link_with : [libmachine_core,
2553 libshared],
2554 install_rpath : rootlibexecdir,
2555 install : true,
2556 install_dir : rootlibexecdir)
2557
2558 public_programs += executable(
2559 'machinectl',
2560 'src/machine/machinectl.c',
2561 include_directories : includes,
2562 link_with : [libshared],
2563 dependencies : [threads,
2564 libxz,
ef5924aa
NL
2565 liblz4,
2566 libzstd],
6164ec4c
ZJS
2567 install_rpath : rootlibexecdir,
2568 install : true,
2569 install_dir : rootbindir)
5c23128d
ZJS
2570endif
2571
349cc4a5 2572if conf.get('ENABLE_IMPORTD') == 1
6164ec4c
ZJS
2573 executable(
2574 'systemd-importd',
2575 systemd_importd_sources,
2576 include_directories : includes,
2577 link_with : [libshared],
2578 dependencies : [threads],
2579 install_rpath : rootlibexecdir,
2580 install : true,
2581 install_dir : rootlibexecdir)
2582
2583 systemd_pull = executable(
2584 'systemd-pull',
2585 systemd_pull_sources,
2586 include_directories : includes,
2587 link_with : [libshared],
2588 dependencies : [versiondep,
2589 libcurl,
2590 libz,
2591 libbzip2,
2592 libxz,
2593 libgcrypt],
2594 install_rpath : rootlibexecdir,
2595 install : true,
2596 install_dir : rootlibexecdir)
2597
2598 systemd_import = executable(
2599 'systemd-import',
2600 systemd_import_sources,
2601 include_directories : includes,
2602 link_with : [libshared],
2603 dependencies : [libcurl,
2604 libz,
2605 libbzip2,
2606 libxz],
2607 install_rpath : rootlibexecdir,
2608 install : true,
2609 install_dir : rootlibexecdir)
2610
2611 systemd_import_fs = executable(
2612 'systemd-import-fs',
2613 systemd_import_fs_sources,
2614 include_directories : includes,
2615 link_with : [libshared],
2616 install_rpath : rootlibexecdir,
2617 install : true,
2618 install_dir : rootlibexecdir)
2619
2620 systemd_export = executable(
2621 'systemd-export',
2622 systemd_export_sources,
2623 include_directories : includes,
2624 link_with : [libshared],
2625 dependencies : [libcurl,
2626 libz,
2627 libbzip2,
2628 libxz],
2629 install_rpath : rootlibexecdir,
2630 install : true,
2631 install_dir : rootlibexecdir)
1d7579c4
LP
2632
2633 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
37efbbd8
ZJS
2634endif
2635
349cc4a5 2636if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
6164ec4c
ZJS
2637 public_programs += executable(
2638 'systemd-journal-upload',
2639 systemd_journal_upload_sources,
2640 include_directories : includes,
2641 link_with : [libshared],
2642 dependencies : [versiondep,
2643 threads,
2644 libcurl,
2645 libgnutls,
2646 libxz,
ef5924aa
NL
2647 liblz4,
2648 libzstd],
6164ec4c
ZJS
2649 install_rpath : rootlibexecdir,
2650 install : true,
2651 install_dir : rootlibexecdir)
5c23128d
ZJS
2652endif
2653
349cc4a5 2654if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
6164ec4c
ZJS
2655 public_programs += executable(
2656 'systemd-journal-remote',
2657 systemd_journal_remote_sources,
2658 include_directories : includes,
2659 link_with : [libshared,
2660 libsystemd_journal_remote],
2661 dependencies : [threads,
2662 libmicrohttpd,
2663 libgnutls,
2664 libxz,
ef5924aa
NL
2665 liblz4,
2666 libzstd],
6164ec4c
ZJS
2667 install_rpath : rootlibexecdir,
2668 install : true,
2669 install_dir : rootlibexecdir)
2670
2671 public_programs += executable(
2672 'systemd-journal-gatewayd',
2673 systemd_journal_gatewayd_sources,
2674 include_directories : includes,
2675 link_with : [libshared],
2676 dependencies : [threads,
2677 libmicrohttpd,
2678 libgnutls,
2679 libxz,
ef5924aa
NL
2680 liblz4,
2681 libzstd],
6164ec4c
ZJS
2682 install_rpath : rootlibexecdir,
2683 install : true,
2684 install_dir : rootlibexecdir)
5c23128d
ZJS
2685endif
2686
349cc4a5 2687if conf.get('ENABLE_COREDUMP') == 1
6164ec4c
ZJS
2688 executable(
2689 'systemd-coredump',
2690 systemd_coredump_sources,
2691 include_directories : includes,
2692 link_with : [libshared],
2693 dependencies : [threads,
2694 libacl,
2695 libdw,
2696 libxz,
ef5924aa
NL
2697 liblz4,
2698 libzstd],
6164ec4c
ZJS
2699 install_rpath : rootlibexecdir,
2700 install : true,
2701 install_dir : rootlibexecdir)
2702
2703 public_programs += executable(
2704 'coredumpctl',
2705 coredumpctl_sources,
2706 include_directories : includes,
2707 link_with : [libshared],
2708 dependencies : [threads,
2709 libxz,
ef5924aa
NL
2710 liblz4,
2711 libzstd],
6164ec4c
ZJS
2712 install_rpath : rootlibexecdir,
2713 install : true)
5c23128d
ZJS
2714endif
2715
9b4abc69 2716if conf.get('ENABLE_PSTORE') == 1
6164ec4c
ZJS
2717 executable(
2718 'systemd-pstore',
2719 systemd_pstore_sources,
2720 include_directories : includes,
2721 link_with : [libshared],
2722 dependencies : [threads,
2723 libacl,
2724 libdw,
2725 libxz,
ef5924aa
NL
2726 liblz4,
2727 libzstd],
6164ec4c
ZJS
2728 install_rpath : rootlibexecdir,
2729 install : true,
2730 install_dir : rootlibexecdir)
9b4abc69
ED
2731endif
2732
349cc4a5 2733if conf.get('ENABLE_BINFMT') == 1
6164ec4c
ZJS
2734 public_programs += executable(
2735 'systemd-binfmt',
2736 'src/binfmt/binfmt.c',
2737 include_directories : includes,
2738 link_with : [libshared],
2739 install_rpath : rootlibexecdir,
2740 install : true,
2741 install_dir : rootlibexecdir)
37efbbd8
ZJS
2742
2743 meson.add_install_script('sh', '-c',
2744 mkdir_p.format(binfmtdir))
2745 meson.add_install_script('sh', '-c',
2746 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2747endif
2748
e594a3b1 2749if conf.get('ENABLE_REPART') == 1
6164ec4c
ZJS
2750 exe = executable(
2751 'systemd-repart',
2752 systemd_repart_sources,
2753 include_directories : includes,
2754 link_with : [libshared],
2755 dependencies : [threads,
6164ec4c
ZJS
2756 libblkid,
2757 libfdisk,
2758 libopenssl],
2759 install_rpath : rootlibexecdir,
2760 install : true,
2761 install_dir : rootbindir)
2d2d0a57 2762 public_programs += exe
e29e4d57
ZJS
2763
2764 if want_tests != 'false'
2765 test('test-repart',
2766 test_repart_sh,
2767 args : exe.full_path())
2768 endif
e594a3b1
LP
2769endif
2770
349cc4a5 2771if conf.get('ENABLE_VCONSOLE') == 1
6164ec4c
ZJS
2772 executable(
2773 'systemd-vconsole-setup',
2774 'src/vconsole/vconsole-setup.c',
2775 include_directories : includes,
2776 link_with : [libshared],
2777 install_rpath : rootlibexecdir,
2778 install : true,
2779 install_dir : rootlibexecdir)
5c23128d
ZJS
2780endif
2781
349cc4a5 2782if conf.get('ENABLE_RANDOMSEED') == 1
6164ec4c
ZJS
2783 executable(
2784 'systemd-random-seed',
2785 'src/random-seed/random-seed.c',
2786 include_directories : includes,
2787 link_with : [libshared],
2788 install_rpath : rootlibexecdir,
2789 install : true,
2790 install_dir : rootlibexecdir)
5c23128d
ZJS
2791endif
2792
349cc4a5 2793if conf.get('ENABLE_FIRSTBOOT') == 1
6164ec4c
ZJS
2794 executable(
2795 'systemd-firstboot',
2796 'src/firstboot/firstboot.c',
2797 include_directories : includes,
2798 link_with : [libshared],
2799 dependencies : [libcrypt],
2800 install_rpath : rootlibexecdir,
2801 install : true,
2802 install_dir : rootbindir)
2803endif
2804
2805executable(
2806 'systemd-remount-fs',
2807 'src/remount-fs/remount-fs.c',
2808 include_directories : includes,
2809 link_with : [libcore_shared,
2810 libshared],
2811 install_rpath : rootlibexecdir,
2812 install : true,
2813 install_dir : rootlibexecdir)
5c23128d 2814
6164ec4c
ZJS
2815executable(
2816 'systemd-machine-id-setup',
2817 'src/machine-id-setup/machine-id-setup-main.c',
2818 include_directories : includes,
2819 link_with : [libcore_shared,
2820 libshared],
2821 install_rpath : rootlibexecdir,
2822 install : true,
2823 install_dir : rootbindir)
5c23128d 2824
6164ec4c
ZJS
2825executable(
2826 'systemd-fsck',
2827 'src/fsck/fsck.c',
2828 include_directories : includes,
2829 link_with : [libshared],
2830 install_rpath : rootlibexecdir,
2831 install : true,
2832 install_dir : rootlibexecdir)
5c23128d 2833
80750adb
ZJS
2834executable('systemd-growfs',
2835 'src/partition/growfs.c',
2836 include_directories : includes,
2837 link_with : [libshared],
2838 install_rpath : rootlibexecdir,
2839 install : true,
2840 install_dir : rootlibexecdir)
2841
6164ec4c
ZJS
2842executable(
2843 'systemd-makefs',
2844 'src/partition/makefs.c',
2845 include_directories : includes,
2846 link_with : [libshared],
2847 install_rpath : rootlibexecdir,
2848 install : true,
2849 install_dir : rootlibexecdir)
b7f28ac5 2850
6164ec4c
ZJS
2851executable(
2852 'systemd-sleep',
2853 'src/sleep/sleep.c',
2854 include_directories : includes,
2855 link_with : [libshared],
2856 install_rpath : rootlibexecdir,
2857 install : true,
2858 install_dir : rootlibexecdir)
5c23128d 2859
d25e127d
YW
2860install_data('src/sleep/sleep.conf',
2861 install_dir : pkgsysconfdir)
2862
6164ec4c
ZJS
2863public_programs += executable(
2864 'systemd-sysctl',
2865 'src/sysctl/sysctl.c',
2866 include_directories : includes,
2867 link_with : [libshared],
2868 install_rpath : rootlibexecdir,
2869 install : true,
2870 install_dir : rootlibexecdir)
5c23128d 2871
6164ec4c
ZJS
2872executable(
2873 'systemd-ac-power',
2874 'src/ac-power/ac-power.c',
2875 include_directories : includes,
2876 link_with : [libshared],
2877 install_rpath : rootlibexecdir,
2878 install : true,
2879 install_dir : rootlibexecdir)
5c23128d 2880
6164ec4c
ZJS
2881public_programs += executable(
2882 'systemd-detect-virt',
2883 'src/detect-virt/detect-virt.c',
2884 include_directories : includes,
2885 link_with : [libshared],
2886 install_rpath : rootlibexecdir,
2887 install : true)
5c23128d 2888
6164ec4c
ZJS
2889public_programs += executable(
2890 'systemd-delta',
2891 'src/delta/delta.c',
2892 include_directories : includes,
2893 link_with : [libshared],
2894 install_rpath : rootlibexecdir,
2895 install : true)
5c23128d 2896
6164ec4c
ZJS
2897public_programs += executable(
2898 'systemd-escape',
2899 'src/escape/escape.c',
2900 include_directories : includes,
2901 link_with : [libshared],
2902 install_rpath : rootlibexecdir,
2903 install : true,
2904 install_dir : rootbindir)
2905
2906public_programs += executable(
2907 'systemd-notify',
2908 'src/notify/notify.c',
2909 include_directories : includes,
2910 link_with : [libshared],
2911 install_rpath : rootlibexecdir,
2912 install : true,
2913 install_dir : rootbindir)
2914
2915executable(
2916 'systemd-volatile-root',
2917 'src/volatile-root/volatile-root.c',
2918 include_directories : includes,
2919 link_with : [libshared],
2920 install_rpath : rootlibexecdir,
cdf7ad38 2921 install : conf.get('ENABLE_INITRD') == 1,
6164ec4c
ZJS
2922 install_dir : rootlibexecdir)
2923
2924executable(
2925 'systemd-cgroups-agent',
2926 'src/cgroups-agent/cgroups-agent.c',
2927 include_directories : includes,
2928 link_with : [libshared],
2929 install_rpath : rootlibexecdir,
2930 install : true,
2931 install_dir : rootlibexecdir)
2932
2933public_programs += executable(
2934 'systemd-id128',
2935 'src/id128/id128.c',
2936 include_directories : includes,
2937 link_with : [libshared],
2938 install_rpath : rootlibexecdir,
2939 install : true)
2940
2941public_programs += executable(
2942 'systemd-path',
2943 'src/path/path.c',
2944 include_directories : includes,
2945 link_with : [libshared],
2946 install_rpath : rootlibexecdir,
2947 install : true)
2948
2949public_programs += executable(
2950 'systemd-ask-password',
2951 'src/ask-password/ask-password.c',
2952 include_directories : includes,
2953 link_with : [libshared],
2954 install_rpath : rootlibexecdir,
2955 install : true,
2956 install_dir : rootbindir)
2957
2958executable(
2959 'systemd-reply-password',
2960 'src/reply-password/reply-password.c',
2961 include_directories : includes,
2962 link_with : [libshared],
2963 install_rpath : rootlibexecdir,
2964 install : true,
2965 install_dir : rootlibexecdir)
2966
2967public_programs += executable(
2968 'systemd-tty-ask-password-agent',
2969 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2970 include_directories : includes,
2971 link_with : [libshared],
2972 install_rpath : rootlibexecdir,
2973 install : true,
2974 install_dir : rootbindir)
2975
2976public_programs += executable(
2977 'systemd-cgls',
2978 'src/cgls/cgls.c',
2979 include_directories : includes,
2980 link_with : [libshared],
2981 install_rpath : rootlibexecdir,
2982 install : true)
2983
2984public_programs += executable(
2985 'systemd-cgtop',
2986 'src/cgtop/cgtop.c',
2987 include_directories : includes,
2988 link_with : [libshared],
2989 install_rpath : rootlibexecdir,
2990 install : true)
2991
2992executable(
2993 'systemd-initctl',
2994 'src/initctl/initctl.c',
2995 include_directories : includes,
2996 link_with : [libshared],
2997 install_rpath : rootlibexecdir,
6589a569 2998 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
6164ec4c 2999 install_dir : rootlibexecdir)
5c23128d 3000
6164ec4c
ZJS
3001public_programs += executable(
3002 'systemd-mount',
3003 'src/mount/mount-tool.c',
3004 include_directories : includes,
3005 link_with : [libshared],
3006 dependencies: [libmount],
3007 install_rpath : rootlibexecdir,
3008 install : true)
5c23128d 3009
7b76fce1 3010meson.add_install_script(meson_make_symlink,
e17e5ba9 3011 'systemd-mount', join_paths(bindir, 'systemd-umount'))
7b76fce1 3012
6164ec4c
ZJS
3013public_programs += executable(
3014 'systemd-run',
3015 'src/run/run.c',
3016 include_directories : includes,
3017 link_with : [libshared],
3018 install_rpath : rootlibexecdir,
3019 install : true)
3020
3021public_programs += executable(
3022 'systemd-stdio-bridge',
3023 'src/stdio-bridge/stdio-bridge.c',
3024 include_directories : includes,
3025 link_with : [libshared],
3026 dependencies : [versiondep],
3027 install_rpath : rootlibexecdir,
3028 install : true)
3029
3030public_programs += executable(
3031 'busctl',
3032 'src/busctl/busctl.c',
3033 'src/busctl/busctl-introspect.c',
3034 'src/busctl/busctl-introspect.h',
3035 include_directories : includes,
3036 link_with : [libshared],
3037 install_rpath : rootlibexecdir,
3038 install : true)
5c23128d 3039
bd7e6aa7
ZJS
3040if enable_sysusers
3041 exe = executable(
6164ec4c
ZJS
3042 'systemd-sysusers',
3043 'src/sysusers/sysusers.c',
3044 include_directories : includes,
3045 link_with : [libshared],
3046 install_rpath : rootlibexecdir,
3047 install : true,
3048 install_dir : rootbindir)
bd7e6aa7
ZJS
3049 public_programs += exe
3050
3051 if want_tests != 'false'
3052 test('test-sysusers',
3053 test_sysusers_sh,
3054 # https://github.com/mesonbuild/meson/issues/2681
3055 args : exe.full_path())
3056 endif
8ef8f3d5
FB
3057
3058 if have_standalone_binaries
bd7e6aa7 3059 exe = executable(
8ef8f3d5
FB
3060 'systemd-sysusers.standalone',
3061 'src/sysusers/sysusers.c',
3062 include_directories : includes,
3063 link_with : [libshared_static,
3064 libbasic,
3065 libbasic_gcrypt,
3066 libsystemd_static,
3067 libjournal_client],
3068 install : true,
3069 install_dir : rootbindir)
bd7e6aa7
ZJS
3070 public_programs += exe
3071
3072 if want_tests != 'false'
3073 test('test-sysusers.standalone',
3074 test_sysusers_sh,
3075 # https://github.com/mesonbuild/meson/issues/2681
3076 args : exe.full_path())
3077 endif
8ef8f3d5 3078 endif
5c23128d
ZJS
3079endif
3080
349cc4a5 3081if conf.get('ENABLE_TMPFILES') == 1
6164ec4c
ZJS
3082 exe = executable(
3083 'systemd-tmpfiles',
db64ba81 3084 systemd_tmpfiles_sources,
6164ec4c
ZJS
3085 include_directories : includes,
3086 link_with : [libshared],
3087 dependencies : [libacl],
3088 install_rpath : rootlibexecdir,
3089 install : true,
3090 install_dir : rootbindir)
5a8b1640 3091 public_programs += exe
d9daae55 3092
938be089
ZJS
3093 if want_tests != 'false'
3094 test('test-systemd-tmpfiles',
3095 test_systemd_tmpfiles_py,
3096 # https://github.com/mesonbuild/meson/issues/2681
3097 args : exe.full_path())
3098 endif
db64ba81
FB
3099
3100 if have_standalone_binaries
3101 public_programs += executable(
3102 'systemd-tmpfiles.standalone',
3103 systemd_tmpfiles_sources,
3104 include_directories : includes,
3105 link_with : [libshared_static,
3106 libbasic,
3107 libbasic_gcrypt,
3108 libsystemd_static,
3109 libjournal_client],
3110 dependencies : [libacl],
3111 install : true,
3112 install_dir : rootbindir)
3113 endif
5c23128d
ZJS
3114endif
3115
349cc4a5 3116if conf.get('ENABLE_HWDB') == 1
6164ec4c
ZJS
3117 public_programs += executable(
3118 'systemd-hwdb',
3119 'src/hwdb/hwdb.c',
3120 'src/libsystemd/sd-hwdb/hwdb-internal.h',
3121 include_directories : includes,
3122 link_with : [libudev_static],
3123 install_rpath : udev_rpath,
3124 install : true,
3125 install_dir : rootbindir)
37efbbd8
ZJS
3126endif
3127
349cc4a5 3128if conf.get('ENABLE_QUOTACHECK') == 1
6164ec4c
ZJS
3129 executable(
3130 'systemd-quotacheck',
3131 'src/quotacheck/quotacheck.c',
3132 include_directories : includes,
3133 link_with : [libshared],
3134 install_rpath : rootlibexecdir,
3135 install : true,
3136 install_dir : rootlibexecdir)
3137endif
3138
3139public_programs += executable(
3140 'systemd-socket-proxyd',
3141 'src/socket-proxy/socket-proxyd.c',
3142 include_directories : includes,
3143 link_with : [libshared],
3144 dependencies : [threads],
3145 install_rpath : rootlibexecdir,
3146 install : true,
3147 install_dir : rootlibexecdir)
5c23128d 3148
6164ec4c
ZJS
3149public_programs += executable(
3150 'udevadm',
3151 udevadm_sources,
3152 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
3153 include_directories : includes,
3154 link_with : [libudev_core,
3155 libsystemd_network,
3156 libudev_static],
3157 dependencies : [versiondep,
3158 threads,
3159 libkmod,
3160 libidn,
3161 libacl,
3162 libblkid],
3163 install_rpath : udev_rpath,
3164 install : true,
3165 install_dir : rootbindir)
3166
3167executable(
3168 'systemd-shutdown',
3169 systemd_shutdown_sources,
3170 include_directories : includes,
3171 link_with : [libcore_shared,
3172 libshared],
3173 dependencies : [libmount],
3174 install_rpath : rootlibexecdir,
3175 install : true,
3176 install_dir : rootlibexecdir)
3177
3178executable(
3179 'systemd-update-done',
3180 'src/update-done/update-done.c',
3181 include_directories : includes,
3182 link_with : [libshared],
3183 install_rpath : rootlibexecdir,
3184 install : true,
3185 install_dir : rootlibexecdir)
3186
3187executable(
3188 'systemd-update-utmp',
3189 'src/update-utmp/update-utmp.c',
3190 include_directories : includes,
3191 link_with : [libshared],
3192 dependencies : [libaudit],
3193 install_rpath : rootlibexecdir,
55678b9e 3194 install : (conf.get('ENABLE_UTMP') == 1),
6164ec4c 3195 install_dir : rootlibexecdir)
5c23128d 3196
349cc4a5 3197if conf.get('HAVE_KMOD') == 1
6164ec4c
ZJS
3198 executable(
3199 'systemd-modules-load',
3200 'src/modules-load/modules-load.c',
3201 include_directories : includes,
3202 link_with : [libshared],
3203 dependencies : [libkmod],
3204 install_rpath : rootlibexecdir,
3205 install : true,
3206 install_dir : rootlibexecdir)
94e75a54 3207
37efbbd8
ZJS
3208 meson.add_install_script('sh', '-c',
3209 mkdir_p.format(modulesloaddir))
3210 meson.add_install_script('sh', '-c',
3211 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
5c23128d
ZJS
3212endif
3213
6164ec4c
ZJS
3214public_programs += executable(
3215 'systemd-nspawn',
3216 systemd_nspawn_sources,
3217 include_directories : includes,
3218 link_with : [libcore_shared,
3219 libnspawn_core,
3220 libshared],
3221 dependencies : [libblkid,
3222 libseccomp],
3223 install_rpath : rootlibexecdir,
3224 install : true)
5c23128d 3225
349cc4a5 3226if conf.get('ENABLE_NETWORKD') == 1
6164ec4c
ZJS
3227 executable(
3228 'systemd-networkd',
3229 systemd_networkd_sources,
3230 include_directories : network_include_dir,
3231 link_with : [libnetworkd_core,
3232 libsystemd_network,
3233 libudev_static,
3234 networkd_link_with],
3235 dependencies : [threads],
3236 install_rpath : rootlibexecdir,
3237 install : true,
3238 install_dir : rootlibexecdir)
3239
3240 executable(
3241 'systemd-networkd-wait-online',
3242 systemd_networkd_wait_online_sources,
3243 include_directories : includes,
3244 link_with : [libnetworkd_core,
3245 networkd_link_with],
3246 install_rpath : rootlibexecdir,
3247 install : true,
3248 install_dir : rootlibexecdir)
3249
3250 public_programs += executable(
3251 'networkctl',
3252 networkctl_sources,
3253 include_directories : includes,
3254 link_with : [libsystemd_network,
3255 networkd_link_with],
3256 install_rpath : rootlibexecdir,
3257 install : true,
3258 install_dir : rootbindir)
3259
3260 exe = executable(
3261 'systemd-network-generator',
3262 network_generator_sources,
3263 include_directories : includes,
3264 link_with : [networkd_link_with],
3265 install_rpath : rootlibexecdir,
3266 install : true,
3267 install_dir : rootlibexecdir)
fbaa1137
ZJS
3268
3269 if want_tests != 'false'
3270 test('test-network-generator-conversion',
3271 test_network_generator_conversion_sh,
3272 # https://github.com/mesonbuild/meson/issues/2681
3273 args : exe.full_path())
3274 endif
dcfe072a 3275endif
e821f6a9 3276
6164ec4c
ZJS
3277executable(
3278 'systemd-sulogin-shell',
3279 ['src/sulogin-shell/sulogin-shell.c'],
3280 include_directories : includes,
3281 link_with : [libshared],
3282 install_rpath : rootlibexecdir,
3283 install : true,
3284 install_dir : rootlibexecdir)
e821f6a9 3285
69e96427
ZJS
3286############################################################
3287
e2d41370
FB
3288custom_target(
3289 'systemd-runtest.env',
3290 output : 'systemd-runtest.env',
3291 command : ['sh', '-c', '{ ' +
1485aacb 3292 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
81e06775 3293 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
e2d41370
FB
3294 '} >@OUTPUT@'],
3295 build_by_default : true)
3296
69e96427 3297foreach tuple : tests
37efbbd8
ZJS
3298 sources = tuple[0]
3299 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3300 dependencies = tuple[2]
3301 condition = tuple.length() >= 4 ? tuple[3] : ''
3302 type = tuple.length() >= 5 ? tuple[4] : ''
3303 defs = tuple.length() >= 6 ? tuple[5] : []
3304 incs = tuple.length() >= 7 ? tuple[6] : includes
3305 timeout = 30
3306
3307 name = sources[0].split('/')[-1].split('.')[0]
3308 if type.startswith('timeout=')
3309 timeout = type.split('=')[1].to_int()
3310 type = ''
3311 endif
3b2bdd62
ZJS
3312
3313 if condition == '' or conf.get(condition) == 1
37efbbd8
ZJS
3314 exe = executable(
3315 name,
3316 sources,
3317 include_directories : incs,
3318 link_with : link_with,
60722ad7
ZJS
3319 dependencies : [versiondep,
3320 dependencies],
37efbbd8 3321 c_args : defs,
3b2bdd62 3322 build_by_default : want_tests != 'false',
37efbbd8 3323 install_rpath : rootlibexecdir,
7cdd9783
MB
3324 install : install_tests,
3325 install_dir : join_paths(testsdir, type))
37efbbd8
ZJS
3326
3327 if type == 'manual'
3328 message('@0@ is a manual test'.format(name))
3329 elif type == 'unsafe' and want_tests != 'unsafe'
3330 message('@0@ is an unsafe test'.format(name))
3b2bdd62 3331 elif want_tests != 'false'
37efbbd8
ZJS
3332 test(name, exe,
3333 env : test_env,
3334 timeout : timeout)
3335 endif
3336 else
3337 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3338 endif
69e96427
ZJS
3339endforeach
3340
0632b4cd 3341exe = executable(
37efbbd8
ZJS
3342 'test-libsystemd-sym',
3343 test_libsystemd_sym_c,
3344 include_directories : includes,
3345 link_with : [libsystemd],
fd1939fb 3346 build_by_default : want_tests != 'false',
37efbbd8
ZJS
3347 install : install_tests,
3348 install_dir : testsdir)
938be089
ZJS
3349if want_tests != 'false'
3350 test('test-libsystemd-sym', exe)
3351endif
37ab1a25 3352
0632b4cd
ZJS
3353exe = executable(
3354 'test-libsystemd-static-sym',
3355 test_libsystemd_sym_c,
3356 include_directories : includes,
0632b4cd
ZJS
3357 link_with : [install_libsystemd_static],
3358 dependencies : [threads], # threads is already included in dependencies on the library,
3359 # but does not seem to get propagated. Add here as a work-around.
fd1939fb 3360 build_by_default : want_tests != 'false' and static_libsystemd_pic,
20f3d32d 3361 install : install_tests and static_libsystemd_pic,
0632b4cd 3362 install_dir : testsdir)
938be089 3363if want_tests != 'false' and static_libsystemd_pic
0632b4cd
ZJS
3364 test('test-libsystemd-static-sym', exe)
3365endif
37ab1a25 3366
0632b4cd 3367exe = executable(
37efbbd8
ZJS
3368 'test-libudev-sym',
3369 test_libudev_sym_c,
3370 include_directories : includes,
c1cd6743 3371 c_args : '-Wno-deprecated-declarations',
37efbbd8 3372 link_with : [libudev],
fd1939fb 3373 build_by_default : want_tests != 'false',
37efbbd8
ZJS
3374 install : install_tests,
3375 install_dir : testsdir)
938be089
ZJS
3376if want_tests != 'false'
3377 test('test-libudev-sym', exe)
3378endif
0632b4cd
ZJS
3379
3380exe = executable(
3381 'test-libudev-static-sym',
3382 test_libudev_sym_c,
3383 include_directories : includes,
c1cd6743 3384 c_args : '-Wno-deprecated-declarations',
0632b4cd 3385 link_with : [install_libudev_static],
fd1939fb 3386 build_by_default : want_tests != 'false' and static_libudev_pic,
20f3d32d 3387 install : install_tests and static_libudev_pic,
0632b4cd 3388 install_dir : testsdir)
938be089 3389if want_tests != 'false' and static_libudev_pic
0632b4cd
ZJS
3390 test('test-libudev-static-sym', exe)
3391endif
e0bec52f 3392
69e96427 3393############################################################
5c23128d 3394
7db7d5b7
JR
3395fuzzer_exes = []
3396
5996740a 3397if get_option('tests') != 'false'
6164ec4c
ZJS
3398 foreach tuple : fuzzers
3399 sources = tuple[0]
3400 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3401 dependencies = tuple[2]
3402 defs = tuple.length() >= 4 ? tuple[3] : []
3403 incs = tuple.length() >= 5 ? tuple[4] : includes
3404 link_args = []
3405
3406 if want_ossfuzz
9c5c4677 3407 dependencies += fuzzing_engine
6164ec4c
ZJS
3408 elif want_libfuzzer
3409 if fuzzing_engine.found()
3410 dependencies += fuzzing_engine
3411 else
3412 link_args += ['-fsanitize=fuzzer']
3413 endif
9c5c4677 3414 else
6164ec4c 3415 sources += 'src/fuzz/fuzz-main.c'
9c5c4677 3416 endif
7db7d5b7 3417
6164ec4c 3418 name = sources[0].split('/')[-1].split('.')[0]
7db7d5b7 3419
6164ec4c
ZJS
3420 fuzzer_exes += executable(
3421 name,
3422 sources,
3423 include_directories : [incs, include_directories('src/fuzz')],
3424 link_with : link_with,
3425 dependencies : dependencies,
3426 c_args : defs,
3427 link_args: link_args,
3428 install : false)
3429 endforeach
5996740a 3430endif
7db7d5b7 3431
6164ec4c
ZJS
3432run_target(
3433 'fuzzers',
63058f43 3434 depends : fuzzer_exes,
7db7d5b7
JR
3435 command : ['true'])
3436
3437############################################################
3438
5c23128d
ZJS
3439subdir('sysctl.d')
3440subdir('sysusers.d')
3441subdir('tmpfiles.d')
4f10b807
ZJS
3442subdir('hwdb.d')
3443subdir('units')
e783f957 3444subdir('presets')
5c23128d
ZJS
3445subdir('network')
3446subdir('man')
3447subdir('shell-completion/bash')
3448subdir('shell-completion/zsh')
9e825ebf
FB
3449subdir('docs/sysvinit')
3450subdir('docs/var-log')
5c23128d 3451
5c23128d
ZJS
3452install_subdir('factory/etc',
3453 install_dir : factorydir)
3454
5c23128d
ZJS
3455install_data('xorg/50-systemd-user.sh',
3456 install_dir : xinitrcdir)
582faeb4
DJL
3457install_data('modprobe.d/systemd.conf',
3458 install_dir : modprobedir)
f09eb768 3459install_data('LICENSE.GPL2',
5c23128d 3460 'LICENSE.LGPL2.1',
f09eb768
LP
3461 'NEWS',
3462 'README',
eea98402 3463 'docs/CODING_STYLE.md',
1d1cb168 3464 'docs/DISTRO_PORTING.md',
9e825ebf 3465 'docs/ENVIRONMENT.md',
5425f8a5 3466 'docs/HACKING.md',
9e825ebf 3467 'docs/TRANSIENT-SETTINGS.md',
b6dc0d7d 3468 'docs/TRANSLATORS.md',
9e825ebf 3469 'docs/UIDS-GIDS.md',
5c23128d
ZJS
3470 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3471 install_dir : docdir)
d68b342b 3472
94e75a54
ZJS
3473meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3474meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3475
d68b342b
ZJS
3476############################################################
3477
dd1e33c8 3478check_help = find_program('tools/check-help.sh')
005a29f2
ZJS
3479
3480foreach exec : public_programs
37efbbd8 3481 name = exec.full_path().split('/')[-1]
938be089
ZJS
3482 if want_tests != 'false'
3483 test('check-help-' + name,
dd1e33c8 3484 check_help,
c1cd6743 3485 args : exec.full_path())
938be089 3486 endif
005a29f2
ZJS
3487endforeach
3488
3489############################################################
3490
c6448ee3
ZJS
3491check_directives_sh = find_program('tools/check-directives.sh')
3492
3493if want_tests != 'false'
3494 test('check-directives',
3495 check_directives_sh,
3496 args : project_source_root)
3497endif
3498
3499############################################################
3500
52d4d1d3
ZJS
3501# Enable tests for all supported sanitizers
3502foreach tuple : sanitizers
3503 sanitizer = tuple[0]
3504 build = tuple[1]
b68dfb9e 3505
7a6397d2 3506 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
52d4d1d3
ZJS
3507 prev = ''
3508 foreach p : fuzz_regression_tests
3509 b = p.split('/')[-2]
3510 c = p.split('/')[-1]
3511
3512 name = '@0@:@1@'.format(b, sanitizer)
3513
3514 if name != prev
3515 if want_tests == 'false'
3516 message('Not compiling @0@ because tests is set to false'.format(name))
c56463fd 3517 elif slow_tests or fuzz_tests
52d4d1d3
ZJS
3518 exe = custom_target(
3519 name,
3520 output : name,
3521 depends : build,
3522 command : [env, 'ln', '-fs',
3523 join_paths(build.full_path(), b),
3524 '@OUTPUT@'],
3525 build_by_default : true)
3526 else
c56463fd 3527 message('Not compiling @0@ because slow-tests/fuzz-tests is set to false'.format(name))
52d4d1d3
ZJS
3528 endif
3529 endif
3530 prev = name
3531
c56463fd 3532 if want_tests != 'false' and (slow_tests or fuzz_tests)
52d4d1d3
ZJS
3533 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3534 env,
89767158
EV
3535 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
3536 timeout : 60,
52d4d1d3 3537 args : [exe.full_path(),
1485aacb 3538 join_paths(project_source_root, p)])
52d4d1d3
ZJS
3539 endif
3540 endforeach
b68dfb9e
ZJS
3541 endif
3542endforeach
3543
52d4d1d3 3544
b68dfb9e
ZJS
3545############################################################
3546
0700e8ba 3547if git.found()
37efbbd8
ZJS
3548 all_files = run_command(
3549 git,
1485aacb 3550 ['--git-dir=@0@/.git'.format(project_source_root),
37efbbd8
ZJS
3551 'ls-files',
3552 ':/*.[ch]'])
3553 all_files = files(all_files.stdout().split())
d68b342b 3554
e85a690b 3555 custom_target(
0700e8ba 3556 'tags',
e85a690b 3557 output : 'tags',
1485aacb 3558 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
2f09974f 3559 run_target(
0700e8ba 3560 'ctags',
1485aacb 3561 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
d68b342b 3562endif
177929c2
ZJS
3563
3564if git.found()
dd1e33c8 3565 git_contrib_sh = find_program('tools/git-contrib.sh')
a923e085 3566 run_target(
37efbbd8 3567 'git-contrib',
dd1e33c8 3568 command : [git_contrib_sh])
177929c2 3569endif
dd6ab3df
ZJS
3570
3571if git.found()
3572 git_head = run_command(
3573 git,
1485aacb 3574 ['--git-dir=@0@/.git'.format(project_source_root),
dd6ab3df
ZJS
3575 'rev-parse', 'HEAD']).stdout().strip()
3576 git_head_short = run_command(
3577 git,
1485aacb 3578 ['--git-dir=@0@/.git'.format(project_source_root),
dd6ab3df
ZJS
3579 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3580
3581 run_target(
3582 'git-snapshot',
3583 command : ['git', 'archive',
1485aacb 3584 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
dd6ab3df
ZJS
3585 git_head_short),
3586 '--prefix', 'systemd-@0@/'.format(git_head),
3587 'HEAD'])
3588endif
829257d1
ZJS
3589
3590############################################################
3591
dd1e33c8 3592check_api_docs_sh = find_program('tools/check-api-docs.sh')
51b13863
LP
3593run_target(
3594 'check-api-docs',
3595 depends : [man, libsystemd, libudev],
dd1e33c8 3596 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
51b13863
LP
3597
3598############################################################
7bc9ea51 3599watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
51b13863 3600
829257d1
ZJS
3601status = [
3602 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3603
4c8e5f44 3604 'build mode: @0@'.format(get_option('mode')),
2675413e 3605 'split /usr: @0@'.format(split_usr),
157baa87 3606 'split bin-sbin: @0@'.format(split_bin),
359b496f
YW
3607 'prefix directory: @0@'.format(prefixdir),
3608 'rootprefix directory: @0@'.format(rootprefixdir),
3609 'sysconf directory: @0@'.format(sysconfdir),
3610 'include directory: @0@'.format(includedir),
3611 'lib directory: @0@'.format(libdir),
3612 'rootlib directory: @0@'.format(rootlibdir),
829257d1
ZJS
3613 'SysV init scripts: @0@'.format(sysvinit_path),
3614 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
359b496f
YW
3615 'PAM modules directory: @0@'.format(pamlibdir),
3616 'PAM configuration directory: @0@'.format(pamconfdir),
3617 'RPM macros directory: @0@'.format(rpmmacrosdir),
3618 'modprobe.d directory: @0@'.format(modprobedir),
3619 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3620 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3621 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3622 'bash completions directory: @0@'.format(bashcompletiondir),
3623 'zsh completions directory: @0@'.format(zshcompletiondir),
829257d1 3624 'extra start script: @0@'.format(get_option('rc-local')),
829257d1
ZJS
3625 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3626 get_option('debug-tty')),
3627 'TTY GID: @0@'.format(tty_gid),
ac09340e 3628 'users GID: @0@'.format(substs.get('USERS_GID')),
fc1a5d1a
ZJS
3629 'system UIDs: <=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_UID_MAX'),
3630 conf.get('SYSTEM_ALLOC_UID_MIN')),
3631 'system GIDs: <=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_GID_MAX'),
3632 conf.get('SYSTEM_ALLOC_GID_MIN')),
3633 'dynamic UIDs: @0@–@1@'.format(dynamic_uid_min, dynamic_uid_max),
3634 'container UID bases: @0@–@1@'.format(container_uid_base_min, container_uid_base_max),
829257d1 3635 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
4e15a734 3636 'render group access mode: @0@'.format(get_option('group-render-mode')),
359b496f 3637 'certificate root directory: @0@'.format(get_option('certificate-root')),
829257d1 3638 'support URL: @0@'.format(support_url),
afde4574
LP
3639 'nobody user name: @0@'.format(nobody_user),
3640 'nobody group name: @0@'.format(nobody_group),
829257d1 3641 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
5248e7e1 3642 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
829257d1
ZJS
3643
3644 'default DNSSEC mode: @0@'.format(default_dnssec),
c9299be2 3645 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3614df05
ZJS
3646 'default mDNS mode: @0@'.format(default_mdns),
3647 'default LLMNR mode: @0@'.format(default_llmnr),
829257d1 3648 'default cgroup hierarchy: @0@'.format(default_hierarchy),
06da5c63 3649 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
8ca9e92c 3650 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
21d0dd5a 3651 'default locale: @0@'.format(default_locale),
5bc655cd 3652 'default user $PATH: @0@'.format(default_user_path_display),
7bc9ea51 3653 'systemd service watchdog: @0@'.format(watchdog_opt)]
829257d1
ZJS
3654
3655alt_dns_servers = '\n '.join(dns_servers.split(' '))
3656alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3657status += [
3658 'default DNS servers: @0@'.format(alt_dns_servers),
3659 'default NTP servers: @0@'.format(alt_ntp_servers)]
3660
3661alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3662 '@@0@'.format(time_epoch)).stdout().strip()
3663status += [
3664 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3665
19d8c9c9 3666status += [
abc8caf7
ZJS
3667 'static libsystemd: @0@'.format(static_libsystemd),
3668 'static libudev: @0@'.format(static_libudev)]
19d8c9c9 3669
829257d1
ZJS
3670# TODO:
3671# CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3672# CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3673# LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3674
349cc4a5 3675if conf.get('ENABLE_EFI') == 1
5a8b1640 3676 status += 'efi arch: @0@'.format(efi_arch)
829257d1
ZJS
3677
3678 if have_gnu_efi
3679 status += [
3680 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
c512dfb9 3681 'EFI CC @0@'.format(' '.join(efi_cc)),
ce4121c6
ZJS
3682 'EFI lds: @0@'.format(efi_lds),
3683 'EFI crt0: @0@'.format(efi_crt0),
359b496f 3684 'EFI include directory: @0@'.format(efi_incdir)]
829257d1
ZJS
3685 endif
3686endif
3687
3688found = []
3689missing = []
3690
3691foreach tuple : [
3692 ['libcryptsetup'],
3693 ['PAM'],
70a5db58 3694 ['pwquality'],
c757517d 3695 ['libfdisk'],
839fddbe 3696 ['p11kit'],
af4fbd46 3697 ['libfido2'],
829257d1
ZJS
3698 ['AUDIT'],
3699 ['IMA'],
3700 ['AppArmor'],
3701 ['SELinux'],
3702 ['SECCOMP'],
3703 ['SMACK'],
3704 ['zlib'],
3705 ['xz'],
ef5924aa 3706 ['zstd'],
829257d1
ZJS
3707 ['lz4'],
3708 ['bzip2'],
3709 ['ACL'],
3710 ['gcrypt'],
3711 ['qrencode'],
3712 ['microhttpd'],
3713 ['gnutls'],
096cbdce 3714 ['openssl'],
829257d1 3715 ['libcurl'],
d1bf5675 3716 ['idn'],
cdf7ad38 3717 ['initrd'],
53393c89 3718 ['compat-mutable-uid-boundaries'],
87057e24 3719 ['libidn2'],
829257d1
ZJS
3720 ['libidn'],
3721 ['libiptc'],
3722 ['elfutils'],
3723 ['binfmt'],
e594a3b1 3724 ['repart'],
829257d1
ZJS
3725 ['vconsole'],
3726 ['quotacheck'],
3727 ['tmpfiles'],
3728 ['environment.d'],
3729 ['sysusers'],
3730 ['firstboot'],
3731 ['randomseed'],
3732 ['backlight'],
3733 ['rfkill'],
8feca247 3734 ['xdg-autostart'],
829257d1
ZJS
3735 ['logind'],
3736 ['machined'],
61d0578b 3737 ['portabled'],
d093b62c 3738 ['userdb'],
70a5db58 3739 ['homed'],
829257d1
ZJS
3740 ['importd'],
3741 ['hostnamed'],
3742 ['timedated'],
3743 ['timesyncd'],
3744 ['localed'],
3745 ['networkd'],
a7456af5 3746 ['resolve'],
096cbdce
IT
3747 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3748 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
829257d1 3749 ['coredump'],
9b4abc69 3750 ['pstore'],
829257d1
ZJS
3751 ['polkit'],
3752 ['legacy pkla', install_polkit_pkla],
3753 ['efi'],
3754 ['gnu-efi', have_gnu_efi],
3755 ['kmod'],
3756 ['xkbcommon'],
c4c978a0 3757 ['pcre2'],
829257d1
ZJS
3758 ['blkid'],
3759 ['dbus'],
3760 ['glib'],
6bd2bc8e
ZJS
3761 ['nss-myhostname'],
3762 ['nss-mymachines'],
3763 ['nss-resolve'],
3764 ['nss-systemd'],
829257d1
ZJS
3765 ['hwdb'],
3766 ['tpm'],
3767 ['man pages', want_man],
3768 ['html pages', want_html],
3769 ['man page indices', want_man and have_lxml],
829257d1
ZJS
3770 ['SysV compat'],
3771 ['utmp'],
3772 ['ldconfig'],
3773 ['hibernate'],
3774 ['adm group', get_option('adm-group')],
3775 ['wheel group', get_option('wheel-group')],
b14e1b43 3776 ['gshadow'],
829257d1
ZJS
3777 ['debug hashmap'],
3778 ['debug mmap cache'],
d6601495 3779 ['debug siphash'],
d18cb393 3780 ['valgrind', conf.get('VALGRIND') == 1],
fd5dec9a 3781 ['trace logging', conf.get('LOG_TRACE') == 1],
b6261be8 3782 ['install tests', install_tests],
19d8c9c9
LP
3783 ['link-udev-shared', get_option('link-udev-shared')],
3784 ['link-systemctl-shared', get_option('link-systemctl-shared')],
5ac8b50d 3785 ['link-networkd-shared', get_option('link-networkd-shared')],
fd74a13e 3786 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
f30bf4d9 3787 ['kernel-install', get_option('kernel-install')],
b3259a6e 3788 ['systemd-analyze', conf.get('ENABLE_ANALYZE') == 1],
829257d1
ZJS
3789]
3790
af4d7860
ZJS
3791 if tuple.length() >= 2
3792 cond = tuple[1]
3793 else
829257d1
ZJS
3794 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3795 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
349cc4a5 3796 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
829257d1
ZJS
3797 endif
3798 if cond
5a8b1640 3799 found += tuple[0]
829257d1 3800 else
5a8b1640 3801 missing += tuple[0]
829257d1
ZJS
3802 endif
3803endforeach
3804
3805status += [
9d39c1bf 3806 '',
829257d1 3807 'enabled features: @0@'.format(', '.join(found)),
9d39c1bf
ZJS
3808 '',
3809 'disabled features: @0@'.format(', '.join(missing)),
3810 '']
829257d1 3811message('\n '.join(status))
9a8e64b0
ZJS
3812
3813if rootprefixdir != rootprefix_default
8ea9fad7
YW
3814 warning('\n' +
3815 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3816 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3817 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
9a8e64b0 3818endif