]> git.ipfire.org Git - thirdparty/systemd.git/blame - meson.build
document udev escaped string in udev(7)
[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
d58c5f0f
ZJS
1415have = get_option('oomd')
1416if have == 'auto'
1417 have = get_option('mode') == 'developer'
1418else
1419 have = have == 'true'
1420 if have and get_option('mode') != 'developer'
1421 error('oomd is not available in release mode (yet)')
1422 endif
1423endif
c199dd3f
AZ
1424conf.set10('ENABLE_OOMD', have)
1425
5c23128d 1426want_remote = get_option('remote')
4390be30 1427if want_remote != 'false'
349cc4a5
ZJS
1428 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1429 conf.get('HAVE_LIBCURL') == 1]
37efbbd8
ZJS
1430 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1431 # it's possible to build one without the other. Complain only if
5238e957 1432 # support was explicitly requested. The auxiliary files like sysusers
37efbbd8
ZJS
1433 # config should be installed when any of the programs are built.
1434 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1435 error('remote support was requested, but dependencies are not available')
1436 endif
349cc4a5
ZJS
1437 have = have_deps[0] or have_deps[1]
1438else
1439 have = false
5c23128d 1440endif
349cc4a5 1441conf.set10('ENABLE_REMOTE', have)
5c23128d 1442
b3259a6e
ZJS
1443foreach term : ['analyze',
1444 'backlight',
a9149d87
ZJS
1445 'binfmt',
1446 'coredump',
b3259a6e
ZJS
1447 'efi',
1448 'environment-d',
1449 'firstboot',
1450 'gshadow',
1451 'hibernate',
a9149d87 1452 'hostnamed',
b3259a6e
ZJS
1453 'hwdb',
1454 'idn',
1455 'ima',
1456 'initrd',
53393c89 1457 'compat-mutable-uid-boundaries',
b3259a6e 1458 'ldconfig',
a9149d87 1459 'localed',
b3259a6e 1460 'logind',
a9149d87
ZJS
1461 'machined',
1462 'networkd',
b3259a6e
ZJS
1463 'nss-myhostname',
1464 'nss-systemd',
61ff7397 1465 'oomd',
b3259a6e
ZJS
1466 'portabled',
1467 'pstore',
a9149d87 1468 'quotacheck',
b3259a6e
ZJS
1469 'randomseed',
1470 'resolve',
1471 'rfkill',
1472 'smack',
a9149d87 1473 'sysusers',
b3259a6e
ZJS
1474 'timedated',
1475 'timesyncd',
a9149d87 1476 'tmpfiles',
a9149d87 1477 'tpm',
b3259a6e
ZJS
1478 'userdb',
1479 'utmp',
1480 'vconsole',
1481 'xdg-autostart']
a9149d87
ZJS
1482 have = get_option(term)
1483 name = 'ENABLE_' + term.underscorify().to_upper()
1484 conf.set10(name, have)
aa25270c 1485 substs.set10(name, have)
5c23128d
ZJS
1486endforeach
1487
bd7e6aa7
ZJS
1488enable_sysusers = conf.get('ENABLE_SYSUSERS') == 1
1489
08540a95
YW
1490foreach tuple : [['nss-mymachines', 'machined'],
1491 ['nss-resolve', 'resolve']]
1492 want = get_option(tuple[0])
1493 if want != 'false'
1494 have = get_option(tuple[1])
1495 if want == 'true' and not have
1496 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1497 endif
1498 else
1499 have = false
1500 endif
1501 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1502 conf.set10(name, have)
1503endforeach
1504
1505enable_nss = false
1506foreach term : ['ENABLE_NSS_MYHOSTNAME',
1507 'ENABLE_NSS_MYMACHINES',
1508 'ENABLE_NSS_RESOLVE',
1509 'ENABLE_NSS_SYSTEMD']
1510 if conf.get(term) == 1
1511 enable_nss = true
1512 endif
1513endforeach
1514conf.set10('ENABLE_NSS', enable_nss)
1515
348b4437 1516conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
6129ec85 1517
69e96427 1518tests = []
7db7d5b7 1519fuzzers = []
69e96427 1520
b68dfb9e 1521conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
00d82c81 1522
5c23128d
ZJS
1523#####################################################################
1524
1525if get_option('efi')
37efbbd8 1526 efi_arch = host_machine.cpu_family()
b710072d 1527
6800fe7f 1528 if efi_arch == 'x86'
37efbbd8 1529 EFI_MACHINE_TYPE_NAME = 'ia32'
6800fe7f 1530 gnu_efi_arch = 'ia32'
37efbbd8
ZJS
1531 elif efi_arch == 'x86_64'
1532 EFI_MACHINE_TYPE_NAME = 'x64'
6800fe7f 1533 gnu_efi_arch = 'x86_64'
37efbbd8
ZJS
1534 elif efi_arch == 'arm'
1535 EFI_MACHINE_TYPE_NAME = 'arm'
6800fe7f 1536 gnu_efi_arch = 'arm'
37efbbd8
ZJS
1537 elif efi_arch == 'aarch64'
1538 EFI_MACHINE_TYPE_NAME = 'aa64'
6800fe7f 1539 gnu_efi_arch = 'aarch64'
37efbbd8
ZJS
1540 else
1541 EFI_MACHINE_TYPE_NAME = ''
6800fe7f 1542 gnu_efi_arch = ''
37efbbd8 1543 endif
5c23128d 1544
349cc4a5 1545 have = true
37efbbd8 1546 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
80c6fce8 1547
ac09340e 1548 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
349cc4a5
ZJS
1549else
1550 have = false
5c23128d 1551endif
349cc4a5 1552conf.set10('ENABLE_EFI', have)
5c23128d
ZJS
1553
1554#####################################################################
1555
1556config_h = configure_file(
37efbbd8
ZJS
1557 output : 'config.h',
1558 configuration : conf)
5c23128d 1559
348b4437
YW
1560meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1561
5c23128d 1562includes = include_directories('src/basic',
91b08bb0 1563 'src/boot',
c76dd733 1564 'src/home',
5c23128d
ZJS
1565 'src/shared',
1566 'src/systemd',
1567 'src/journal',
a38f7fec 1568 'src/journal-remote',
97d90615 1569 'src/nspawn',
5c23128d
ZJS
1570 'src/resolve',
1571 'src/timesync',
5c3376ef 1572 'src/time-wait-sync',
5c23128d
ZJS
1573 'src/login',
1574 'src/udev',
1575 'src/libudev',
1576 'src/core',
9e71f5d9 1577 'src/shutdown',
8feca247 1578 'src/xdg-autostart-generator',
5c23128d
ZJS
1579 'src/libsystemd/sd-bus',
1580 'src/libsystemd/sd-device',
a137a1c3 1581 'src/libsystemd/sd-event',
5c23128d
ZJS
1582 'src/libsystemd/sd-hwdb',
1583 'src/libsystemd/sd-id128',
1584 'src/libsystemd/sd-netlink',
1585 'src/libsystemd/sd-network',
ceb26cdb 1586 'src/libsystemd/sd-resolve',
5c23128d 1587 'src/libsystemd-network',
2d4ceca8 1588 '.')
5c23128d
ZJS
1589
1590add_project_arguments('-include', 'config.h', language : 'c')
1591
6ec439fd
YW
1592generate_gperfs = find_program('tools/generate-gperfs.py')
1593
5c23128d
ZJS
1594subdir('po')
1595subdir('catalog')
1596subdir('src/systemd')
1597subdir('src/basic')
1598subdir('src/libsystemd')
1599subdir('src/libsystemd-network')
5c23128d 1600subdir('src/journal')
5c23128d 1601subdir('src/login')
5c23128d
ZJS
1602
1603libjournal_core = static_library(
37efbbd8
ZJS
1604 'journal-core',
1605 libjournal_core_sources,
1606 journald_gperf_c,
1607 include_directories : includes,
1608 install : false)
5c23128d 1609
1485aacb 1610libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
5c23128d 1611libsystemd = shared_library(
37efbbd8 1612 'systemd',
a5d8835c 1613 disable_mempool_c,
56d50ab1 1614 version : libsystemd_version,
37efbbd8
ZJS
1615 include_directories : includes,
1616 link_args : ['-shared',
1617 '-Wl,--version-script=' + libsystemd_sym_path],
34e221a5
ZJS
1618 link_with : [libbasic,
1619 libbasic_gcrypt],
5e3cec87
ZJS
1620 link_whole : [libsystemd_static,
1621 libjournal_client],
37efbbd8
ZJS
1622 dependencies : [threads,
1623 librt,
1624 libxz,
ef5924aa 1625 libzstd,
37efbbd8
ZJS
1626 liblz4],
1627 link_depends : libsystemd_sym,
1628 install : true,
1629 install_dir : rootlibdir)
5c23128d 1630
70848ecf
DC
1631static_libsystemd = get_option('static-libsystemd')
1632static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1633
1634install_libsystemd_static = static_library(
1635 'systemd',
1636 libsystemd_sources,
1637 journal_client_sources,
975464e0
ZJS
1638 basic_sources,
1639 basic_gcrypt_sources,
be44b572 1640 disable_mempool_c,
70848ecf 1641 include_directories : includes,
70848ecf
DC
1642 build_by_default : static_libsystemd != 'false',
1643 install : static_libsystemd != 'false',
1644 install_dir : rootlibdir,
1645 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1646 dependencies : [threads,
1647 librt,
1648 libxz,
ef5924aa 1649 libzstd,
70848ecf 1650 liblz4,
975464e0
ZJS
1651 libcap,
1652 libblkid,
1653 libmount,
1654 libselinux,
70848ecf
DC
1655 libgcrypt],
1656 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1657
47354b44
ZJS
1658############################################################
1659
1660autosuspend_update_sh = find_program('tools/autosuspend-update.sh')
1661hwdb_update_sh = find_program('tools/hwdb-update.sh')
b61d777a 1662make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
47354b44
ZJS
1663make_directive_index_py = find_program('tools/make-directive-index.py')
1664make_man_index_py = find_program('tools/make-man-index.py')
1665syscall_names_update_sh = find_program('tools/syscall-names-update.sh')
1666xml_helper_py = find_program('tools/xml_helper.py')
4cc73cf9 1667update_dbus_docs_py = find_program('tools/update-dbus-docs.py')
b61d777a 1668
5c23128d
ZJS
1669############################################################
1670
83b6af36
ZJS
1671# binaries that have --help and are intended for use by humans,
1672# usually, but not always, installed in /bin.
1673public_programs = []
1674
1675subdir('src/libudev')
1676subdir('src/shared')
1677subdir('src/core')
9e71f5d9 1678subdir('src/shutdown')
83b6af36
ZJS
1679subdir('src/udev')
1680subdir('src/network')
1681
1682subdir('src/analyze')
1683subdir('src/journal-remote')
1684subdir('src/coredump')
9b4abc69 1685subdir('src/pstore')
61ff7397 1686subdir('src/oom')
83b6af36
ZJS
1687subdir('src/hostname')
1688subdir('src/import')
e594a3b1 1689subdir('src/partition')
83b6af36
ZJS
1690subdir('src/kernel-install')
1691subdir('src/locale')
1692subdir('src/machine')
61d0578b 1693subdir('src/portable')
d093b62c 1694subdir('src/userdb')
70a5db58 1695subdir('src/home')
83b6af36
ZJS
1696subdir('src/nspawn')
1697subdir('src/resolve')
1698subdir('src/timedate')
1699subdir('src/timesync')
db64ba81 1700subdir('src/tmpfiles')
83b6af36 1701subdir('src/vconsole')
83b6af36
ZJS
1702subdir('src/boot/efi')
1703
1704subdir('src/test')
7db7d5b7 1705subdir('src/fuzz')
ef2ad30a 1706subdir('rules.d')
83b6af36
ZJS
1707subdir('test')
1708
1709############################################################
1710
1711# only static linking apart from libdl, to make sure that the
1712# module is linked to all libraries that it uses.
1713test_dlopen = executable(
37efbbd8
ZJS
1714 'test-dlopen',
1715 test_dlopen_c,
a5d8835c 1716 disable_mempool_c,
37efbbd8
ZJS
1717 include_directories : includes,
1718 link_with : [libbasic],
fd1939fb
YW
1719 dependencies : [libdl],
1720 build_by_default : want_tests != 'false')
83b6af36 1721
08540a95 1722foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
037b0a47 1723 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h src/nss-systemd/nss-systemd.h'],
08540a95
YW
1724 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1725 ['resolve', 'ENABLE_NSS_RESOLVE']]
5c23128d 1726
349cc4a5 1727 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
37efbbd8
ZJS
1728 if condition
1729 module = tuple[0]
37efbbd8
ZJS
1730
1731 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1485aacb 1732 version_script_arg = join_paths(project_source_root, sym)
37efbbd8 1733
1684c56f
LP
1734 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1735 if tuple.length() > 2
1736 sources += tuple[2].split()
1737 endif
1738
37efbbd8
ZJS
1739 nss = shared_library(
1740 'nss_' + module,
1684c56f 1741 sources,
a5d8835c 1742 disable_mempool_c,
37efbbd8
ZJS
1743 version : '2',
1744 include_directories : includes,
b4b36f44
LP
1745 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1746 link_args : ['-Wl,-z,nodelete',
1747 '-shared',
700805f6 1748 '-Wl,--version-script=' + version_script_arg],
37e4d7a8 1749 link_with : [libsystemd_static,
733cbd00 1750 libshared_static,
37efbbd8
ZJS
1751 libbasic],
1752 dependencies : [threads,
5486a31d 1753 librt],
37efbbd8
ZJS
1754 link_depends : sym,
1755 install : true,
1756 install_dir : rootlibdir)
1757
1758 # We cannot use shared_module because it does not support version suffix.
1759 # Unfortunately shared_library insists on creating the symlink…
1760 meson.add_install_script('sh', '-c',
1761 'rm $DESTDIR@0@/libnss_@1@.so'
1762 .format(rootlibdir, module))
1763
938be089
ZJS
1764 if want_tests != 'false'
1765 test('dlopen-nss_' + module,
1766 test_dlopen,
1767 # path to dlopen must include a slash
1768 args : nss.full_path())
1769 endif
37efbbd8 1770 endif
5c23128d
ZJS
1771endforeach
1772
1773############################################################
1774
6164ec4c
ZJS
1775executable(
1776 'systemd',
1777 systemd_sources,
1778 include_directories : includes,
1779 link_with : [libcore,
1780 libshared],
1781 dependencies : [versiondep,
1782 threads,
1783 librt,
1784 libseccomp,
1785 libselinux,
1786 libmount,
1787 libblkid],
1788 install_rpath : rootlibexecdir,
1789 install : true,
1790 install_dir : rootlibexecdir)
5c23128d 1791
ba7f4ae6
ZJS
1792meson.add_install_script(meson_make_symlink,
1793 join_paths(rootlibexecdir, 'systemd'),
1794 join_paths(rootsbindir, 'init'))
1795
6164ec4c
ZJS
1796public_programs += executable(
1797 'systemd-analyze',
1798 systemd_analyze_sources,
1799 include_directories : includes,
1800 link_with : [libcore,
1801 libshared],
1802 dependencies : [versiondep,
1803 threads,
1804 librt,
1805 libseccomp,
1806 libselinux,
1807 libmount,
1808 libblkid],
1809 install_rpath : rootlibexecdir,
b3259a6e 1810 install : conf.get('ENABLE_ANALYZE'))
5c23128d 1811
6164ec4c
ZJS
1812executable(
1813 'systemd-journald',
1814 systemd_journald_sources,
1815 include_directories : includes,
1816 link_with : [libjournal_core,
1817 libshared],
1818 dependencies : [threads,
1819 libxz,
1820 liblz4,
ef5924aa
NL
1821 libselinux,
1822 libzstd],
6164ec4c
ZJS
1823 install_rpath : rootlibexecdir,
1824 install : true,
1825 install_dir : rootlibexecdir)
5c23128d 1826
6164ec4c
ZJS
1827public_programs += executable(
1828 'systemd-cat',
1829 systemd_cat_sources,
1830 include_directories : includes,
1831 link_with : [libjournal_core,
1832 libshared],
1833 dependencies : [threads],
1834 install_rpath : rootlibexecdir,
1835 install : true)
1836
1837public_programs += executable(
1838 'journalctl',
1839 journalctl_sources,
1840 include_directories : includes,
1841 link_with : [libshared],
1842 dependencies : [threads,
e44b5004 1843 libdl,
6164ec4c
ZJS
1844 libxz,
1845 liblz4,
9200bb30
LP
1846 libzstd,
1847 libdl],
6164ec4c
ZJS
1848 install_rpath : rootlibexecdir,
1849 install : true,
1850 install_dir : rootbindir)
35a1ff4c 1851
6164ec4c
ZJS
1852executable(
1853 'systemd-getty-generator',
1854 'src/getty-generator/getty-generator.c',
1855 include_directories : includes,
1856 link_with : [libshared],
1857 install_rpath : rootlibexecdir,
1858 install : true,
1859 install_dir : systemgeneratordir)
5c23128d 1860
6164ec4c
ZJS
1861executable(
1862 'systemd-debug-generator',
1863 'src/debug-generator/debug-generator.c',
1864 include_directories : includes,
1865 link_with : [libshared],
1866 install_rpath : rootlibexecdir,
1867 install : true,
1868 install_dir : systemgeneratordir)
1869
1870executable(
1871 'systemd-run-generator',
1872 'src/run-generator/run-generator.c',
1873 include_directories : includes,
1874 link_with : [libshared],
1875 install_rpath : rootlibexecdir,
1876 install : true,
1877 install_dir : systemgeneratordir)
1878
1879executable(
1880 'systemd-fstab-generator',
1881 'src/fstab-generator/fstab-generator.c',
1882 include_directories : includes,
1883 link_with : [libcore_shared,
1884 libshared],
1885 install_rpath : rootlibexecdir,
1886 install : true,
1887 install_dir : systemgeneratordir)
5c23128d 1888
349cc4a5 1889if conf.get('ENABLE_ENVIRONMENT_D') == 1
6164ec4c
ZJS
1890 executable(
1891 '30-systemd-environment-d-generator',
1892 'src/environment-d-generator/environment-d-generator.c',
1893 include_directories : includes,
1894 link_with : [libshared],
1895 install_rpath : rootlibexecdir,
1896 install : true,
1897 install_dir : userenvgeneratordir)
7b76fce1 1898
37efbbd8
ZJS
1899 meson.add_install_script(meson_make_symlink,
1900 join_paths(sysconfdir, 'environment'),
1901 join_paths(environmentdir, '99-environment.conf'))
5c23128d
ZJS
1902endif
1903
349cc4a5 1904if conf.get('ENABLE_HIBERNATE') == 1
6164ec4c
ZJS
1905 executable(
1906 'systemd-hibernate-resume-generator',
1907 'src/hibernate-resume/hibernate-resume-generator.c',
1908 include_directories : includes,
1909 link_with : [libshared],
1910 install_rpath : rootlibexecdir,
1911 install : true,
1912 install_dir : systemgeneratordir)
1913
1914 executable(
1915 'systemd-hibernate-resume',
1916 'src/hibernate-resume/hibernate-resume.c',
1917 include_directories : includes,
1918 link_with : [libshared],
1919 install_rpath : rootlibexecdir,
1920 install : true,
1921 install_dir : rootlibexecdir)
37efbbd8
ZJS
1922endif
1923
349cc4a5 1924if conf.get('HAVE_BLKID') == 1
6164ec4c
ZJS
1925 executable(
1926 'systemd-gpt-auto-generator',
1927 'src/gpt-auto-generator/gpt-auto-generator.c',
1928 'src/shared/blkid-util.h',
1929 include_directories : includes,
1930 link_with : [libshared],
1931 dependencies : libblkid,
1932 install_rpath : rootlibexecdir,
1933 install : true,
1934 install_dir : systemgeneratordir)
1935
1936 public_programs += executable(
1937 'systemd-dissect',
1938 'src/dissect/dissect.c',
1939 include_directories : includes,
1940 link_with : [libshared],
1941 install_rpath : rootlibexecdir,
5a151082 1942 install : true)
5c23128d
ZJS
1943endif
1944
1ec57f33 1945if conf.get('ENABLE_RESOLVE') == 1
6164ec4c
ZJS
1946 executable(
1947 'systemd-resolved',
1948 systemd_resolved_sources,
1949 include_directories : includes,
1950 link_with : [libshared,
1951 libbasic_gcrypt,
1952 libsystemd_resolve_core],
1953 dependencies : systemd_resolved_dependencies,
1954 install_rpath : rootlibexecdir,
1955 install : true,
1956 install_dir : rootlibexecdir)
1957
1958 public_programs += executable(
1959 'resolvectl',
1960 resolvectl_sources,
1961 include_directories : includes,
1962 link_with : [libshared,
1963 libbasic_gcrypt,
1964 libsystemd_resolve_core],
1965 dependencies : [threads,
1966 libgpg_error,
1967 libm,
1968 libidn],
1969 install_rpath : rootlibexecdir,
1970 install : true)
088c1363
LP
1971
1972 meson.add_install_script(meson_make_symlink,
6164ec4c
ZJS
1973 join_paths(bindir, 'resolvectl'),
1974 join_paths(rootsbindir, 'resolvconf'))
c2e84cab
YW
1975
1976 meson.add_install_script(meson_make_symlink,
6164ec4c
ZJS
1977 join_paths(bindir, 'resolvectl'),
1978 join_paths(bindir, 'systemd-resolve'))
5c23128d
ZJS
1979endif
1980
349cc4a5 1981if conf.get('ENABLE_LOGIND') == 1
6164ec4c
ZJS
1982 executable(
1983 'systemd-logind',
1984 systemd_logind_sources,
1985 include_directories : includes,
1986 link_with : [liblogind_core,
1987 libshared],
1988 dependencies : [threads,
1989 libacl],
1990 install_rpath : rootlibexecdir,
1991 install : true,
1992 install_dir : rootlibexecdir)
1993
1994 public_programs += executable(
1995 'loginctl',
1996 loginctl_sources,
1997 include_directories : includes,
1998 link_with : [libshared],
1999 dependencies : [threads,
2000 liblz4,
ef5924aa
NL
2001 libxz,
2002 libzstd],
6164ec4c
ZJS
2003 install_rpath : rootlibexecdir,
2004 install : true,
2005 install_dir : rootbindir)
2006
2007 public_programs += executable(
2008 'systemd-inhibit',
2009 'src/login/inhibit.c',
2010 include_directories : includes,
2011 link_with : [libshared],
2012 install_rpath : rootlibexecdir,
2013 install : true,
2014 install_dir : rootbindir)
37efbbd8 2015
349cc4a5 2016 if conf.get('HAVE_PAM') == 1
1485aacb 2017 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
37efbbd8
ZJS
2018 pam_systemd = shared_library(
2019 'pam_systemd',
2020 pam_systemd_c,
2021 name_prefix : '',
2022 include_directories : includes,
2023 link_args : ['-shared',
2024 '-Wl,--version-script=' + version_script_arg],
37e4d7a8 2025 link_with : [libsystemd_static,
37efbbd8
ZJS
2026 libshared_static],
2027 dependencies : [threads,
2028 libpam,
2029 libpam_misc],
2030 link_depends : pam_systemd_sym,
2031 install : true,
2032 install_dir : pamlibdir)
2033
938be089
ZJS
2034 if want_tests != 'false'
2035 test('dlopen-pam_systemd',
2036 test_dlopen,
2037 # path to dlopen must include a slash
c1cd6743 2038 args : pam_systemd.full_path())
938be089 2039 endif
37efbbd8 2040 endif
005a29f2 2041
6164ec4c
ZJS
2042 executable(
2043 'systemd-user-runtime-dir',
2044 user_runtime_dir_sources,
2045 include_directories : includes,
2046 link_with : [libshared],
2047 install_rpath : rootlibexecdir,
2048 install : true,
2049 install_dir : rootlibexecdir)
07ee5adb 2050endif
a9f0f5e5 2051
349cc4a5 2052if conf.get('HAVE_PAM') == 1
6164ec4c
ZJS
2053 executable(
2054 'systemd-user-sessions',
2055 'src/user-sessions/user-sessions.c',
2056 include_directories : includes,
2057 link_with : [libshared],
2058 install_rpath : rootlibexecdir,
2059 install : true,
2060 install_dir : rootlibexecdir)
5c23128d
ZJS
2061endif
2062
349cc4a5 2063if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
6164ec4c
ZJS
2064 public_programs += executable(
2065 'bootctl',
2066 'src/boot/bootctl.c',
2067 include_directories : includes,
2068 link_with : [libshared],
2069 dependencies : [libblkid],
2070 install_rpath : rootlibexecdir,
2071 install : true)
2072
2073 public_programs += executable(
2074 'systemd-bless-boot',
2075 'src/boot/bless-boot.c',
2076 include_directories : includes,
2077 link_with : [libshared],
2078 dependencies : [libblkid],
2079 install_rpath : rootlibexecdir,
2080 install : true,
2081 install_dir : rootlibexecdir)
2082
2083 executable(
2084 'systemd-bless-boot-generator',
2085 'src/boot/bless-boot-generator.c',
2086 include_directories : includes,
2087 link_with : [libshared],
2088 install_rpath : rootlibexecdir,
2089 install : true,
2090 install_dir : systemgeneratordir)
2091endif
2092
2093executable(
2094 'systemd-boot-check-no-failures',
2095 'src/boot/boot-check-no-failures.c',
2096 include_directories : includes,
2097 link_with : [libshared],
2098 dependencies : [libblkid],
2099 install_rpath : rootlibexecdir,
2100 install : true,
2101 install_dir : rootlibexecdir)
005a29f2 2102
6164ec4c
ZJS
2103public_programs += executable(
2104 'systemd-socket-activate',
2105 'src/activate/activate.c',
2106 include_directories : includes,
2107 link_with : [libshared],
2108 dependencies : [threads],
2109 install_rpath : rootlibexecdir,
2110 install : true)
f3794366
FS
2111
2112if get_option('link-systemctl-shared')
2113 systemctl_link_with = [libshared]
2114else
2115 systemctl_link_with = [libsystemd_static,
2116 libshared_static,
2117 libjournal_client,
2118 libbasic_gcrypt]
2119endif
2120
6164ec4c
ZJS
2121public_programs += executable(
2122 'systemctl',
daf71ef6
LP
2123 'src/systemctl/systemctl-add-dependency.c',
2124 'src/systemctl/systemctl-add-dependency.h',
2125 'src/systemctl/systemctl-cancel-job.c',
2126 'src/systemctl/systemctl-cancel-job.h',
2127 'src/systemctl/systemctl-clean-or-freeze.c',
2128 'src/systemctl/systemctl-clean-or-freeze.h',
2129 'src/systemctl/systemctl-compat-halt.c',
2130 'src/systemctl/systemctl-compat-halt.h',
2131 'src/systemctl/systemctl-compat-runlevel.c',
2132 'src/systemctl/systemctl-compat-runlevel.h',
2133 'src/systemctl/systemctl-compat-shutdown.c',
2134 'src/systemctl/systemctl-compat-shutdown.h',
2135 'src/systemctl/systemctl-compat-telinit.c',
2136 'src/systemctl/systemctl-compat-telinit.h',
2137 'src/systemctl/systemctl-daemon-reload.c',
2138 'src/systemctl/systemctl-daemon-reload.h',
2139 'src/systemctl/systemctl-edit.c',
2140 'src/systemctl/systemctl-edit.h',
2141 'src/systemctl/systemctl-enable.c',
2142 'src/systemctl/systemctl-enable.h',
2143 'src/systemctl/systemctl-is-active.c',
2144 'src/systemctl/systemctl-is-active.h',
2145 'src/systemctl/systemctl-is-enabled.c',
2146 'src/systemctl/systemctl-is-enabled.h',
2147 'src/systemctl/systemctl-is-system-running.c',
2148 'src/systemctl/systemctl-is-system-running.h',
2149 'src/systemctl/systemctl-kill.c',
2150 'src/systemctl/systemctl-kill.h',
2151 'src/systemctl/systemctl-list-dependencies.c',
2152 'src/systemctl/systemctl-list-dependencies.h',
2153 'src/systemctl/systemctl-list-jobs.c',
2154 'src/systemctl/systemctl-list-jobs.h',
2155 'src/systemctl/systemctl-list-machines.c',
2156 'src/systemctl/systemctl-list-machines.h',
2157 'src/systemctl/systemctl-list-unit-files.c',
2158 'src/systemctl/systemctl-list-unit-files.h',
2159 'src/systemctl/systemctl-list-units.c',
2160 'src/systemctl/systemctl-list-units.h',
2161 'src/systemctl/systemctl-log-setting.c',
2162 'src/systemctl/systemctl-log-setting.h',
2163 'src/systemctl/systemctl-logind.c',
2164 'src/systemctl/systemctl-logind.h',
2165 'src/systemctl/systemctl-preset-all.c',
2166 'src/systemctl/systemctl-preset-all.h',
2167 'src/systemctl/systemctl-reset-failed.c',
2168 'src/systemctl/systemctl-reset-failed.h',
2169 'src/systemctl/systemctl-service-watchdogs.c',
2170 'src/systemctl/systemctl-service-watchdogs.h',
2171 'src/systemctl/systemctl-set-default.c',
2172 'src/systemctl/systemctl-set-default.h',
2173 'src/systemctl/systemctl-set-environment.c',
2174 'src/systemctl/systemctl-set-environment.h',
2175 'src/systemctl/systemctl-set-property.c',
2176 'src/systemctl/systemctl-set-property.h',
2177 'src/systemctl/systemctl-show.c',
2178 'src/systemctl/systemctl-show.h',
2179 'src/systemctl/systemctl-start-special.c',
2180 'src/systemctl/systemctl-start-special.h',
2181 'src/systemctl/systemctl-start-unit.c',
2182 'src/systemctl/systemctl-start-unit.h',
2183 'src/systemctl/systemctl-switch-root.c',
2184 'src/systemctl/systemctl-switch-root.h',
2185 'src/systemctl/systemctl-sysv-compat.c',
2186 'src/systemctl/systemctl-sysv-compat.h',
2187 'src/systemctl/systemctl-trivial-method.c',
2188 'src/systemctl/systemctl-trivial-method.h',
2189 'src/systemctl/systemctl-util.c',
2190 'src/systemctl/systemctl-util.c',
2191 'src/systemctl/systemctl-util.h',
6164ec4c 2192 'src/systemctl/systemctl.c',
daf71ef6 2193 'src/systemctl/systemctl.h',
6164ec4c
ZJS
2194 include_directories : includes,
2195 link_with : systemctl_link_with,
2196 dependencies : [threads,
2197 libcap,
2198 libselinux,
2199 libxz,
ef5924aa
NL
2200 liblz4,
2201 libzstd],
6164ec4c
ZJS
2202 install_rpath : rootlibexecdir,
2203 install : true,
2204 install_dir : rootbindir)
5c23128d 2205
61d0578b 2206if conf.get('ENABLE_PORTABLED') == 1
6164ec4c
ZJS
2207 executable(
2208 'systemd-portabled',
2209 systemd_portabled_sources,
2210 include_directories : includes,
2211 link_with : [libshared],
2212 dependencies : [threads],
2213 install_rpath : rootlibexecdir,
2214 install : true,
2215 install_dir : rootlibexecdir)
2216
2217 public_programs += executable(
2218 'portablectl',
2219 'src/portable/portablectl.c',
2220 include_directories : includes,
2221 link_with : [libshared],
2222 dependencies : [threads],
2223 install_rpath : rootlibexecdir,
2224 install : true,
2225 install_dir : rootbindir)
61d0578b
LP
2226endif
2227
d093b62c 2228if conf.get('ENABLE_USERDB') == 1
6164ec4c
ZJS
2229 executable(
2230 'systemd-userwork',
2231 systemd_userwork_sources,
2232 include_directories : includes,
2233 link_with : [libshared],
2234 dependencies : [threads],
2235 install_rpath : rootlibexecdir,
2236 install : true,
2237 install_dir : rootlibexecdir)
2238
2239 executable(
2240 'systemd-userdbd',
2241 systemd_userdbd_sources,
2242 include_directories : includes,
2243 link_with : [libshared],
2244 dependencies : [threads],
2245 install_rpath : rootlibexecdir,
2246 install : true,
2247 install_dir : rootlibexecdir)
2248
460e5af0 2249 public_programs += executable(
6164ec4c
ZJS
2250 'userdbctl',
2251 userdbctl_sources,
2252 include_directories : includes,
2253 link_with : [libshared],
2254 dependencies : [threads],
2255 install_rpath : rootlibexecdir,
2256 install : true,
2257 install_dir : rootbindir)
d093b62c
LP
2258endif
2259
70a5db58 2260if conf.get('ENABLE_HOMED') == 1
6164ec4c
ZJS
2261 executable(
2262 'systemd-homework',
2263 systemd_homework_sources,
2264 include_directories : includes,
2265 link_with : [libshared],
2266 dependencies : [threads,
2267 libcryptsetup,
2268 libblkid,
2269 libcrypt,
2270 libopenssl,
2271 libfdisk,
7b78db28
LP
2272 libp11kit,
2273 libfido2],
6164ec4c
ZJS
2274 install_rpath : rootlibexecdir,
2275 install : true,
2276 install_dir : rootlibexecdir)
2277
2278 executable(
2279 'systemd-homed',
2280 systemd_homed_sources,
2281 include_directories : includes,
2282 link_with : [libshared],
2283 dependencies : [threads,
2284 libcrypt,
679badd7 2285 libopenssl],
6164ec4c
ZJS
2286 install_rpath : rootlibexecdir,
2287 install : true,
2288 install_dir : rootlibexecdir)
2289
460e5af0 2290 public_programs += executable(
6164ec4c
ZJS
2291 'homectl',
2292 homectl_sources,
2293 include_directories : includes,
2294 link_with : [libshared],
2295 dependencies : [threads,
2296 libcrypt,
2297 libopenssl,
2298 libp11kit,
da3920c3
LP
2299 libfido2,
2300 libdl],
6164ec4c
ZJS
2301 install_rpath : rootlibexecdir,
2302 install : true,
2303 install_dir : rootbindir)
26cf9fb7
LP
2304
2305 if conf.get('HAVE_PAM') == 1
2306 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2307 pam_systemd = shared_library(
2308 'pam_systemd_home',
2309 pam_systemd_home_c,
2310 name_prefix : '',
2311 include_directories : includes,
2312 link_args : ['-shared',
2313 '-Wl,--version-script=' + version_script_arg],
2314 link_with : [libsystemd_static,
2315 libshared_static],
2316 dependencies : [threads,
2317 libpam,
2318 libpam_misc,
2319 libcrypt],
2320 link_depends : pam_systemd_home_sym,
2321 install : true,
2322 install_dir : pamlibdir)
2323 endif
70a5db58
LP
2324endif
2325
6589a569
NL
2326foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
2327 (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
ba7f4ae6
ZJS
2328 meson.add_install_script(meson_make_symlink,
2329 join_paths(rootbindir, 'systemctl'),
2330 join_paths(rootsbindir, alias))
2331endforeach
2332
63e2d171
NL
2333meson.add_install_script(meson_make_symlink,
2334 join_paths(rootbindir, 'udevadm'),
2335 join_paths(rootlibexecdir, 'systemd-udevd'))
2336
349cc4a5 2337if conf.get('ENABLE_BACKLIGHT') == 1
6164ec4c
ZJS
2338 executable(
2339 'systemd-backlight',
2340 'src/backlight/backlight.c',
2341 include_directories : includes,
2342 link_with : [libshared],
2343 install_rpath : rootlibexecdir,
2344 install : true,
2345 install_dir : rootlibexecdir)
5c23128d
ZJS
2346endif
2347
349cc4a5 2348if conf.get('ENABLE_RFKILL') == 1
6164ec4c
ZJS
2349 executable(
2350 'systemd-rfkill',
2351 'src/rfkill/rfkill.c',
2352 include_directories : includes,
2353 link_with : [libshared],
2354 install_rpath : rootlibexecdir,
2355 install : true,
2356 install_dir : rootlibexecdir)
2357endif
2358
2359executable(
2360 'systemd-system-update-generator',
2361 'src/system-update-generator/system-update-generator.c',
2362 include_directories : includes,
2363 link_with : [libshared],
2364 install_rpath : rootlibexecdir,
2365 install : true,
2366 install_dir : systemgeneratordir)
5c23128d 2367
349cc4a5 2368if conf.get('HAVE_LIBCRYPTSETUP') == 1
08669709 2369 systemd_cryptsetup_sources = files('''
08669709 2370 src/cryptsetup/cryptsetup-pkcs11.h
1e2f3230
LP
2371 src/cryptsetup/cryptsetup-keyfile.c
2372 src/cryptsetup/cryptsetup-keyfile.h
23769fb3 2373 src/cryptsetup/cryptsetup.c
08669709
LP
2374'''.split())
2375
2376 if conf.get('HAVE_P11KIT') == 1
2377 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2378 endif
2379
6164ec4c
ZJS
2380 executable(
2381 'systemd-cryptsetup',
2382 systemd_cryptsetup_sources,
2383 include_directories : includes,
2384 link_with : [libshared],
2385 dependencies : [libcryptsetup,
2386 libp11kit],
2387 install_rpath : rootlibexecdir,
2388 install : true,
2389 install_dir : rootlibexecdir)
2390
2391 executable(
2392 'systemd-cryptsetup-generator',
2393 'src/cryptsetup/cryptsetup-generator.c',
2394 include_directories : includes,
2395 link_with : [libshared],
6164ec4c
ZJS
2396 install_rpath : rootlibexecdir,
2397 install : true,
2398 install_dir : systemgeneratordir)
2399
2400 executable(
2401 'systemd-veritysetup',
2402 'src/veritysetup/veritysetup.c',
2403 include_directories : includes,
2404 link_with : [libshared],
2405 dependencies : [libcryptsetup],
2406 install_rpath : rootlibexecdir,
2407 install : true,
2408 install_dir : rootlibexecdir)
2409
2410 executable(
2411 'systemd-veritysetup-generator',
2412 'src/veritysetup/veritysetup-generator.c',
2413 include_directories : includes,
2414 link_with : [libshared],
6164ec4c
ZJS
2415 install_rpath : rootlibexecdir,
2416 install : true,
2417 install_dir : systemgeneratordir)
5c23128d
ZJS
2418endif
2419
349cc4a5 2420if conf.get('HAVE_SYSV_COMPAT') == 1
6164ec4c
ZJS
2421 executable(
2422 'systemd-sysv-generator',
2423 'src/sysv-generator/sysv-generator.c',
2424 include_directories : includes,
2425 link_with : [libshared],
2426 install_rpath : rootlibexecdir,
2427 install : true,
2428 install_dir : systemgeneratordir)
2429
2430 executable(
2431 'systemd-rc-local-generator',
2432 'src/rc-local-generator/rc-local-generator.c',
2433 include_directories : includes,
2434 link_with : [libshared],
2435 install_rpath : rootlibexecdir,
2436 install : true,
2437 install_dir : systemgeneratordir)
5c23128d
ZJS
2438endif
2439
8feca247
BB
2440if conf.get('ENABLE_XDG_AUTOSTART') == 1
2441 executable(
2442 'systemd-xdg-autostart-generator',
2443 'src/xdg-autostart-generator/xdg-autostart-generator.c',
2444 'src/xdg-autostart-generator/xdg-autostart-service.c',
2445 include_directories : includes,
2446 link_with : [libshared],
2447 install_rpath : rootlibexecdir,
2448 install : true,
2449 install_dir : usergeneratordir)
2450
2451 executable(
2452 'systemd-xdg-autostart-condition',
2453 'src/xdg-autostart-generator/xdg-autostart-condition.c',
2454 include_directories : includes,
2455 link_with : [libshared],
2456 install_rpath : rootlibexecdir,
2457 install : true,
2458 install_dir : rootlibexecdir)
2459endif
2460
349cc4a5 2461if conf.get('ENABLE_HOSTNAMED') == 1
6164ec4c
ZJS
2462 executable(
2463 'systemd-hostnamed',
2464 'src/hostname/hostnamed.c',
2465 include_directories : includes,
2466 link_with : [libshared],
2467 install_rpath : rootlibexecdir,
2468 install : true,
2469 install_dir : rootlibexecdir)
2470
2471 public_programs += executable(
2472 'hostnamectl',
2473 'src/hostname/hostnamectl.c',
2474 include_directories : includes,
2475 link_with : [libshared],
2476 install_rpath : rootlibexecdir,
2477 install : true)
5c23128d
ZJS
2478endif
2479
349cc4a5
ZJS
2480if conf.get('ENABLE_LOCALED') == 1
2481 if conf.get('HAVE_XKBCOMMON') == 1
37efbbd8
ZJS
2482 # logind will load libxkbcommon.so dynamically on its own
2483 deps = [libdl]
2484 else
2485 deps = []
2486 endif
2487
6164ec4c
ZJS
2488 executable(
2489 'systemd-localed',
2490 systemd_localed_sources,
2491 include_directories : includes,
2492 link_with : [libshared],
2493 dependencies : deps,
2494 install_rpath : rootlibexecdir,
2495 install : true,
2496 install_dir : rootlibexecdir)
2497
2498 public_programs += executable(
2499 'localectl',
2500 localectl_sources,
2501 include_directories : includes,
2502 link_with : [libshared],
2503 install_rpath : rootlibexecdir,
2504 install : true)
5c23128d
ZJS
2505endif
2506
349cc4a5 2507if conf.get('ENABLE_TIMEDATED') == 1
6164ec4c
ZJS
2508 executable(
2509 'systemd-timedated',
2510 'src/timedate/timedated.c',
2511 include_directories : includes,
2512 link_with : [libshared],
2513 install_rpath : rootlibexecdir,
2514 install : true,
2515 install_dir : rootlibexecdir)
6129ec85 2516endif
5c23128d 2517
6129ec85 2518if conf.get('ENABLE_TIMEDATECTL') == 1
6164ec4c
ZJS
2519 public_programs += executable(
2520 'timedatectl',
2521 'src/timedate/timedatectl.c',
2522 include_directories : includes,
2523 install_rpath : rootlibexecdir,
2524 link_with : [libshared],
2525 dependencies : [libm],
2526 install : true)
5c23128d
ZJS
2527endif
2528
349cc4a5 2529if conf.get('ENABLE_TIMESYNCD') == 1
fd74a13e
RS
2530 if get_option('link-timesyncd-shared')
2531 timesyncd_link_with = [libshared]
2532 else
2533 timesyncd_link_with = [libsystemd_static,
2534 libshared_static,
2535 libjournal_client,
2536 libbasic_gcrypt]
2537 endif
2538
6164ec4c
ZJS
2539 executable(
2540 'systemd-timesyncd',
2541 systemd_timesyncd_sources,
2542 include_directories : includes,
2543 link_with : [timesyncd_link_with],
2544 dependencies : [threads,
2545 libm],
2546 install_rpath : rootlibexecdir,
2547 install : true,
2548 install_dir : rootlibexecdir)
2549
2550 executable(
2551 'systemd-time-wait-sync',
2552 'src/time-wait-sync/time-wait-sync.c',
2553 include_directories : includes,
2554 link_with : [timesyncd_link_with],
2555 install_rpath : rootlibexecdir,
2556 install : true,
2557 install_dir : rootlibexecdir)
5c23128d
ZJS
2558endif
2559
349cc4a5 2560if conf.get('ENABLE_MACHINED') == 1
6164ec4c
ZJS
2561 executable(
2562 'systemd-machined',
2563 systemd_machined_sources,
2564 include_directories : includes,
2565 link_with : [libmachine_core,
2566 libshared],
2567 install_rpath : rootlibexecdir,
2568 install : true,
2569 install_dir : rootlibexecdir)
2570
2571 public_programs += executable(
2572 'machinectl',
2573 'src/machine/machinectl.c',
2574 include_directories : includes,
2575 link_with : [libshared],
2576 dependencies : [threads,
2577 libxz,
ef5924aa
NL
2578 liblz4,
2579 libzstd],
6164ec4c
ZJS
2580 install_rpath : rootlibexecdir,
2581 install : true,
2582 install_dir : rootbindir)
5c23128d
ZJS
2583endif
2584
349cc4a5 2585if conf.get('ENABLE_IMPORTD') == 1
6164ec4c
ZJS
2586 executable(
2587 'systemd-importd',
2588 systemd_importd_sources,
2589 include_directories : includes,
2590 link_with : [libshared],
2591 dependencies : [threads],
2592 install_rpath : rootlibexecdir,
2593 install : true,
2594 install_dir : rootlibexecdir)
2595
2596 systemd_pull = executable(
2597 'systemd-pull',
2598 systemd_pull_sources,
2599 include_directories : includes,
2600 link_with : [libshared],
2601 dependencies : [versiondep,
2602 libcurl,
2603 libz,
2604 libbzip2,
2605 libxz,
2606 libgcrypt],
2607 install_rpath : rootlibexecdir,
2608 install : true,
2609 install_dir : rootlibexecdir)
2610
2611 systemd_import = executable(
2612 'systemd-import',
2613 systemd_import_sources,
2614 include_directories : includes,
2615 link_with : [libshared],
2616 dependencies : [libcurl,
2617 libz,
2618 libbzip2,
2619 libxz],
2620 install_rpath : rootlibexecdir,
2621 install : true,
2622 install_dir : rootlibexecdir)
2623
2624 systemd_import_fs = executable(
2625 'systemd-import-fs',
2626 systemd_import_fs_sources,
2627 include_directories : includes,
2628 link_with : [libshared],
2629 install_rpath : rootlibexecdir,
2630 install : true,
2631 install_dir : rootlibexecdir)
2632
2633 systemd_export = executable(
2634 'systemd-export',
2635 systemd_export_sources,
2636 include_directories : includes,
2637 link_with : [libshared],
2638 dependencies : [libcurl,
2639 libz,
2640 libbzip2,
2641 libxz],
2642 install_rpath : rootlibexecdir,
2643 install : true,
2644 install_dir : rootlibexecdir)
1d7579c4
LP
2645
2646 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
37efbbd8
ZJS
2647endif
2648
349cc4a5 2649if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
6164ec4c
ZJS
2650 public_programs += executable(
2651 'systemd-journal-upload',
2652 systemd_journal_upload_sources,
2653 include_directories : includes,
2654 link_with : [libshared],
2655 dependencies : [versiondep,
2656 threads,
2657 libcurl,
2658 libgnutls,
2659 libxz,
ef5924aa
NL
2660 liblz4,
2661 libzstd],
6164ec4c
ZJS
2662 install_rpath : rootlibexecdir,
2663 install : true,
2664 install_dir : rootlibexecdir)
5c23128d
ZJS
2665endif
2666
349cc4a5 2667if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
6164ec4c
ZJS
2668 public_programs += executable(
2669 'systemd-journal-remote',
2670 systemd_journal_remote_sources,
2671 include_directories : includes,
2672 link_with : [libshared,
2673 libsystemd_journal_remote],
2674 dependencies : [threads,
2675 libmicrohttpd,
2676 libgnutls,
2677 libxz,
ef5924aa
NL
2678 liblz4,
2679 libzstd],
6164ec4c
ZJS
2680 install_rpath : rootlibexecdir,
2681 install : true,
2682 install_dir : rootlibexecdir)
2683
2684 public_programs += executable(
2685 'systemd-journal-gatewayd',
2686 systemd_journal_gatewayd_sources,
2687 include_directories : includes,
2688 link_with : [libshared],
2689 dependencies : [threads,
2690 libmicrohttpd,
2691 libgnutls,
2692 libxz,
ef5924aa
NL
2693 liblz4,
2694 libzstd],
6164ec4c
ZJS
2695 install_rpath : rootlibexecdir,
2696 install : true,
2697 install_dir : rootlibexecdir)
5c23128d
ZJS
2698endif
2699
349cc4a5 2700if conf.get('ENABLE_COREDUMP') == 1
6164ec4c
ZJS
2701 executable(
2702 'systemd-coredump',
2703 systemd_coredump_sources,
2704 include_directories : includes,
2705 link_with : [libshared],
2706 dependencies : [threads,
2707 libacl,
2708 libdw,
2709 libxz,
ef5924aa
NL
2710 liblz4,
2711 libzstd],
6164ec4c
ZJS
2712 install_rpath : rootlibexecdir,
2713 install : true,
2714 install_dir : rootlibexecdir)
2715
2716 public_programs += executable(
2717 'coredumpctl',
2718 coredumpctl_sources,
2719 include_directories : includes,
2720 link_with : [libshared],
2721 dependencies : [threads,
2722 libxz,
ef5924aa
NL
2723 liblz4,
2724 libzstd],
6164ec4c
ZJS
2725 install_rpath : rootlibexecdir,
2726 install : true)
5c23128d
ZJS
2727endif
2728
9b4abc69 2729if conf.get('ENABLE_PSTORE') == 1
6164ec4c
ZJS
2730 executable(
2731 'systemd-pstore',
2732 systemd_pstore_sources,
2733 include_directories : includes,
2734 link_with : [libshared],
2735 dependencies : [threads,
2736 libacl,
2737 libdw,
2738 libxz,
ef5924aa
NL
2739 liblz4,
2740 libzstd],
6164ec4c
ZJS
2741 install_rpath : rootlibexecdir,
2742 install : true,
2743 install_dir : rootlibexecdir)
9b4abc69
ED
2744endif
2745
9de5e321
AZ
2746if conf.get('ENABLE_OOMD') == 1
2747 executable('systemd-oomd',
2748 systemd_oomd_sources,
2749 include_directories : includes,
2750 link_with : [libshared],
2751 dependencies : [],
2752 install_rpath : rootlibexecdir,
2753 install : true,
2754 install_dir : rootlibexecdir)
5c616ecf
AZ
2755
2756 public_programs += executable(
2757 'oomctl',
2758 oomctl_sources,
2759 include_directories : includes,
2760 link_with : [libshared],
2761 dependencies : [],
2762 install_rpath : rootlibexecdir,
2763 install : true,
2764 install_dir : rootbindir)
9de5e321
AZ
2765endif
2766
349cc4a5 2767if conf.get('ENABLE_BINFMT') == 1
6164ec4c
ZJS
2768 public_programs += executable(
2769 'systemd-binfmt',
2770 'src/binfmt/binfmt.c',
2771 include_directories : includes,
2772 link_with : [libshared],
2773 install_rpath : rootlibexecdir,
2774 install : true,
2775 install_dir : rootlibexecdir)
37efbbd8
ZJS
2776
2777 meson.add_install_script('sh', '-c',
2778 mkdir_p.format(binfmtdir))
2779 meson.add_install_script('sh', '-c',
2780 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2781endif
2782
e594a3b1 2783if conf.get('ENABLE_REPART') == 1
6164ec4c
ZJS
2784 exe = executable(
2785 'systemd-repart',
2786 systemd_repart_sources,
2787 include_directories : includes,
2788 link_with : [libshared],
2789 dependencies : [threads,
6164ec4c
ZJS
2790 libblkid,
2791 libfdisk,
2792 libopenssl],
2793 install_rpath : rootlibexecdir,
2794 install : true,
2795 install_dir : rootbindir)
2d2d0a57 2796 public_programs += exe
e29e4d57
ZJS
2797
2798 if want_tests != 'false'
2799 test('test-repart',
2800 test_repart_sh,
2801 args : exe.full_path())
2802 endif
e594a3b1
LP
2803endif
2804
349cc4a5 2805if conf.get('ENABLE_VCONSOLE') == 1
6164ec4c
ZJS
2806 executable(
2807 'systemd-vconsole-setup',
2808 'src/vconsole/vconsole-setup.c',
2809 include_directories : includes,
2810 link_with : [libshared],
2811 install_rpath : rootlibexecdir,
2812 install : true,
2813 install_dir : rootlibexecdir)
5c23128d
ZJS
2814endif
2815
349cc4a5 2816if conf.get('ENABLE_RANDOMSEED') == 1
6164ec4c
ZJS
2817 executable(
2818 'systemd-random-seed',
2819 'src/random-seed/random-seed.c',
2820 include_directories : includes,
2821 link_with : [libshared],
2822 install_rpath : rootlibexecdir,
2823 install : true,
2824 install_dir : rootlibexecdir)
5c23128d
ZJS
2825endif
2826
349cc4a5 2827if conf.get('ENABLE_FIRSTBOOT') == 1
6164ec4c
ZJS
2828 executable(
2829 'systemd-firstboot',
2830 'src/firstboot/firstboot.c',
2831 include_directories : includes,
2832 link_with : [libshared],
2833 dependencies : [libcrypt],
2834 install_rpath : rootlibexecdir,
2835 install : true,
2836 install_dir : rootbindir)
2837endif
2838
2839executable(
2840 'systemd-remount-fs',
2841 'src/remount-fs/remount-fs.c',
2842 include_directories : includes,
2843 link_with : [libcore_shared,
2844 libshared],
2845 install_rpath : rootlibexecdir,
2846 install : true,
2847 install_dir : rootlibexecdir)
5c23128d 2848
6164ec4c
ZJS
2849executable(
2850 'systemd-machine-id-setup',
2851 'src/machine-id-setup/machine-id-setup-main.c',
2852 include_directories : includes,
2853 link_with : [libcore_shared,
2854 libshared],
2855 install_rpath : rootlibexecdir,
2856 install : true,
2857 install_dir : rootbindir)
5c23128d 2858
6164ec4c
ZJS
2859executable(
2860 'systemd-fsck',
2861 'src/fsck/fsck.c',
2862 include_directories : includes,
2863 link_with : [libshared],
2864 install_rpath : rootlibexecdir,
2865 install : true,
2866 install_dir : rootlibexecdir)
5c23128d 2867
80750adb
ZJS
2868executable('systemd-growfs',
2869 'src/partition/growfs.c',
2870 include_directories : includes,
2871 link_with : [libshared],
2872 install_rpath : rootlibexecdir,
2873 install : true,
2874 install_dir : rootlibexecdir)
2875
6164ec4c
ZJS
2876executable(
2877 'systemd-makefs',
2878 'src/partition/makefs.c',
2879 include_directories : includes,
2880 link_with : [libshared],
2881 install_rpath : rootlibexecdir,
2882 install : true,
2883 install_dir : rootlibexecdir)
b7f28ac5 2884
6164ec4c
ZJS
2885executable(
2886 'systemd-sleep',
2887 'src/sleep/sleep.c',
2888 include_directories : includes,
2889 link_with : [libshared],
2890 install_rpath : rootlibexecdir,
2891 install : true,
2892 install_dir : rootlibexecdir)
5c23128d 2893
d25e127d
YW
2894install_data('src/sleep/sleep.conf',
2895 install_dir : pkgsysconfdir)
2896
6164ec4c
ZJS
2897public_programs += executable(
2898 'systemd-sysctl',
2899 'src/sysctl/sysctl.c',
2900 include_directories : includes,
2901 link_with : [libshared],
2902 install_rpath : rootlibexecdir,
2903 install : true,
2904 install_dir : rootlibexecdir)
5c23128d 2905
6164ec4c
ZJS
2906executable(
2907 'systemd-ac-power',
2908 'src/ac-power/ac-power.c',
2909 include_directories : includes,
2910 link_with : [libshared],
2911 install_rpath : rootlibexecdir,
2912 install : true,
2913 install_dir : rootlibexecdir)
5c23128d 2914
6164ec4c
ZJS
2915public_programs += executable(
2916 'systemd-detect-virt',
2917 'src/detect-virt/detect-virt.c',
2918 include_directories : includes,
2919 link_with : [libshared],
2920 install_rpath : rootlibexecdir,
2921 install : true)
5c23128d 2922
6164ec4c
ZJS
2923public_programs += executable(
2924 'systemd-delta',
2925 'src/delta/delta.c',
2926 include_directories : includes,
2927 link_with : [libshared],
2928 install_rpath : rootlibexecdir,
2929 install : true)
5c23128d 2930
6164ec4c
ZJS
2931public_programs += executable(
2932 'systemd-escape',
2933 'src/escape/escape.c',
2934 include_directories : includes,
2935 link_with : [libshared],
2936 install_rpath : rootlibexecdir,
2937 install : true,
2938 install_dir : rootbindir)
2939
2940public_programs += executable(
2941 'systemd-notify',
2942 'src/notify/notify.c',
2943 include_directories : includes,
2944 link_with : [libshared],
2945 install_rpath : rootlibexecdir,
2946 install : true,
2947 install_dir : rootbindir)
2948
2949executable(
2950 'systemd-volatile-root',
2951 'src/volatile-root/volatile-root.c',
2952 include_directories : includes,
2953 link_with : [libshared],
2954 install_rpath : rootlibexecdir,
cdf7ad38 2955 install : conf.get('ENABLE_INITRD') == 1,
6164ec4c
ZJS
2956 install_dir : rootlibexecdir)
2957
2958executable(
2959 'systemd-cgroups-agent',
2960 'src/cgroups-agent/cgroups-agent.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-id128',
2969 'src/id128/id128.c',
2970 include_directories : includes,
2971 link_with : [libshared],
2972 install_rpath : rootlibexecdir,
2973 install : true)
2974
2975public_programs += executable(
2976 'systemd-path',
2977 'src/path/path.c',
2978 include_directories : includes,
2979 link_with : [libshared],
2980 install_rpath : rootlibexecdir,
2981 install : true)
2982
2983public_programs += executable(
2984 'systemd-ask-password',
2985 'src/ask-password/ask-password.c',
2986 include_directories : includes,
2987 link_with : [libshared],
2988 install_rpath : rootlibexecdir,
2989 install : true,
2990 install_dir : rootbindir)
2991
2992executable(
2993 'systemd-reply-password',
2994 'src/reply-password/reply-password.c',
2995 include_directories : includes,
2996 link_with : [libshared],
2997 install_rpath : rootlibexecdir,
2998 install : true,
2999 install_dir : rootlibexecdir)
3000
3001public_programs += executable(
3002 'systemd-tty-ask-password-agent',
3003 'src/tty-ask-password-agent/tty-ask-password-agent.c',
3004 include_directories : includes,
3005 link_with : [libshared],
3006 install_rpath : rootlibexecdir,
3007 install : true,
3008 install_dir : rootbindir)
3009
3010public_programs += executable(
3011 'systemd-cgls',
3012 'src/cgls/cgls.c',
3013 include_directories : includes,
3014 link_with : [libshared],
3015 install_rpath : rootlibexecdir,
3016 install : true)
3017
3018public_programs += executable(
3019 'systemd-cgtop',
3020 'src/cgtop/cgtop.c',
3021 include_directories : includes,
3022 link_with : [libshared],
3023 install_rpath : rootlibexecdir,
3024 install : true)
3025
3026executable(
3027 'systemd-initctl',
3028 'src/initctl/initctl.c',
3029 include_directories : includes,
3030 link_with : [libshared],
3031 install_rpath : rootlibexecdir,
6589a569 3032 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
6164ec4c 3033 install_dir : rootlibexecdir)
5c23128d 3034
6164ec4c
ZJS
3035public_programs += executable(
3036 'systemd-mount',
3037 'src/mount/mount-tool.c',
3038 include_directories : includes,
3039 link_with : [libshared],
3040 dependencies: [libmount],
3041 install_rpath : rootlibexecdir,
3042 install : true)
5c23128d 3043
7b76fce1 3044meson.add_install_script(meson_make_symlink,
e17e5ba9 3045 'systemd-mount', join_paths(bindir, 'systemd-umount'))
7b76fce1 3046
6164ec4c
ZJS
3047public_programs += executable(
3048 'systemd-run',
3049 'src/run/run.c',
3050 include_directories : includes,
3051 link_with : [libshared],
3052 install_rpath : rootlibexecdir,
3053 install : true)
3054
3055public_programs += executable(
3056 'systemd-stdio-bridge',
3057 'src/stdio-bridge/stdio-bridge.c',
3058 include_directories : includes,
3059 link_with : [libshared],
3060 dependencies : [versiondep],
3061 install_rpath : rootlibexecdir,
3062 install : true)
3063
3064public_programs += executable(
3065 'busctl',
3066 'src/busctl/busctl.c',
3067 'src/busctl/busctl-introspect.c',
3068 'src/busctl/busctl-introspect.h',
3069 include_directories : includes,
3070 link_with : [libshared],
3071 install_rpath : rootlibexecdir,
3072 install : true)
5c23128d 3073
bd7e6aa7
ZJS
3074if enable_sysusers
3075 exe = executable(
6164ec4c
ZJS
3076 'systemd-sysusers',
3077 'src/sysusers/sysusers.c',
3078 include_directories : includes,
3079 link_with : [libshared],
3080 install_rpath : rootlibexecdir,
3081 install : true,
3082 install_dir : rootbindir)
bd7e6aa7
ZJS
3083 public_programs += exe
3084
3085 if want_tests != 'false'
3086 test('test-sysusers',
3087 test_sysusers_sh,
3088 # https://github.com/mesonbuild/meson/issues/2681
3089 args : exe.full_path())
3090 endif
8ef8f3d5
FB
3091
3092 if have_standalone_binaries
bd7e6aa7 3093 exe = executable(
8ef8f3d5
FB
3094 'systemd-sysusers.standalone',
3095 'src/sysusers/sysusers.c',
3096 include_directories : includes,
3097 link_with : [libshared_static,
3098 libbasic,
3099 libbasic_gcrypt,
3100 libsystemd_static,
3101 libjournal_client],
3102 install : true,
3103 install_dir : rootbindir)
bd7e6aa7
ZJS
3104 public_programs += exe
3105
3106 if want_tests != 'false'
3107 test('test-sysusers.standalone',
3108 test_sysusers_sh,
3109 # https://github.com/mesonbuild/meson/issues/2681
3110 args : exe.full_path())
3111 endif
8ef8f3d5 3112 endif
5c23128d
ZJS
3113endif
3114
349cc4a5 3115if conf.get('ENABLE_TMPFILES') == 1
6164ec4c
ZJS
3116 exe = executable(
3117 'systemd-tmpfiles',
db64ba81 3118 systemd_tmpfiles_sources,
6164ec4c
ZJS
3119 include_directories : includes,
3120 link_with : [libshared],
3121 dependencies : [libacl],
3122 install_rpath : rootlibexecdir,
3123 install : true,
3124 install_dir : rootbindir)
5a8b1640 3125 public_programs += exe
d9daae55 3126
938be089
ZJS
3127 if want_tests != 'false'
3128 test('test-systemd-tmpfiles',
3129 test_systemd_tmpfiles_py,
3130 # https://github.com/mesonbuild/meson/issues/2681
3131 args : exe.full_path())
3132 endif
db64ba81
FB
3133
3134 if have_standalone_binaries
3135 public_programs += executable(
3136 'systemd-tmpfiles.standalone',
3137 systemd_tmpfiles_sources,
3138 include_directories : includes,
3139 link_with : [libshared_static,
3140 libbasic,
3141 libbasic_gcrypt,
3142 libsystemd_static,
3143 libjournal_client],
3144 dependencies : [libacl],
3145 install : true,
3146 install_dir : rootbindir)
3147 endif
5c23128d
ZJS
3148endif
3149
349cc4a5 3150if conf.get('ENABLE_HWDB') == 1
6164ec4c
ZJS
3151 public_programs += executable(
3152 'systemd-hwdb',
3153 'src/hwdb/hwdb.c',
3154 'src/libsystemd/sd-hwdb/hwdb-internal.h',
3155 include_directories : includes,
3156 link_with : [libudev_static],
3157 install_rpath : udev_rpath,
3158 install : true,
3159 install_dir : rootbindir)
37efbbd8
ZJS
3160endif
3161
349cc4a5 3162if conf.get('ENABLE_QUOTACHECK') == 1
6164ec4c
ZJS
3163 executable(
3164 'systemd-quotacheck',
3165 'src/quotacheck/quotacheck.c',
3166 include_directories : includes,
3167 link_with : [libshared],
3168 install_rpath : rootlibexecdir,
3169 install : true,
3170 install_dir : rootlibexecdir)
3171endif
3172
3173public_programs += executable(
3174 'systemd-socket-proxyd',
3175 'src/socket-proxy/socket-proxyd.c',
3176 include_directories : includes,
3177 link_with : [libshared],
3178 dependencies : [threads],
3179 install_rpath : rootlibexecdir,
3180 install : true,
3181 install_dir : rootlibexecdir)
5c23128d 3182
6164ec4c
ZJS
3183public_programs += executable(
3184 'udevadm',
3185 udevadm_sources,
3186 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
3187 include_directories : includes,
3188 link_with : [libudev_core,
3189 libsystemd_network,
3190 libudev_static],
3191 dependencies : [versiondep,
3192 threads,
3193 libkmod,
3194 libidn,
3195 libacl,
3196 libblkid],
3197 install_rpath : udev_rpath,
3198 install : true,
3199 install_dir : rootbindir)
3200
3201executable(
3202 'systemd-shutdown',
3203 systemd_shutdown_sources,
3204 include_directories : includes,
3205 link_with : [libcore_shared,
3206 libshared],
3207 dependencies : [libmount],
3208 install_rpath : rootlibexecdir,
3209 install : true,
3210 install_dir : rootlibexecdir)
3211
3212executable(
3213 'systemd-update-done',
3214 'src/update-done/update-done.c',
3215 include_directories : includes,
3216 link_with : [libshared],
3217 install_rpath : rootlibexecdir,
3218 install : true,
3219 install_dir : rootlibexecdir)
3220
3221executable(
3222 'systemd-update-utmp',
3223 'src/update-utmp/update-utmp.c',
3224 include_directories : includes,
3225 link_with : [libshared],
3226 dependencies : [libaudit],
3227 install_rpath : rootlibexecdir,
55678b9e 3228 install : (conf.get('ENABLE_UTMP') == 1),
6164ec4c 3229 install_dir : rootlibexecdir)
5c23128d 3230
349cc4a5 3231if conf.get('HAVE_KMOD') == 1
6164ec4c
ZJS
3232 executable(
3233 'systemd-modules-load',
3234 'src/modules-load/modules-load.c',
3235 include_directories : includes,
3236 link_with : [libshared],
3237 dependencies : [libkmod],
3238 install_rpath : rootlibexecdir,
3239 install : true,
3240 install_dir : rootlibexecdir)
94e75a54 3241
37efbbd8
ZJS
3242 meson.add_install_script('sh', '-c',
3243 mkdir_p.format(modulesloaddir))
3244 meson.add_install_script('sh', '-c',
3245 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
5c23128d
ZJS
3246endif
3247
6164ec4c
ZJS
3248public_programs += executable(
3249 'systemd-nspawn',
3250 systemd_nspawn_sources,
3251 include_directories : includes,
3252 link_with : [libcore_shared,
3253 libnspawn_core,
3254 libshared],
3255 dependencies : [libblkid,
3256 libseccomp],
3257 install_rpath : rootlibexecdir,
3258 install : true)
5c23128d 3259
349cc4a5 3260if conf.get('ENABLE_NETWORKD') == 1
6164ec4c
ZJS
3261 executable(
3262 'systemd-networkd',
3263 systemd_networkd_sources,
3264 include_directories : network_include_dir,
3265 link_with : [libnetworkd_core,
3266 libsystemd_network,
3267 libudev_static,
3268 networkd_link_with],
3269 dependencies : [threads],
3270 install_rpath : rootlibexecdir,
3271 install : true,
3272 install_dir : rootlibexecdir)
3273
3274 executable(
3275 'systemd-networkd-wait-online',
3276 systemd_networkd_wait_online_sources,
3277 include_directories : includes,
3278 link_with : [libnetworkd_core,
3279 networkd_link_with],
3280 install_rpath : rootlibexecdir,
3281 install : true,
3282 install_dir : rootlibexecdir)
3283
3284 public_programs += executable(
3285 'networkctl',
3286 networkctl_sources,
3287 include_directories : includes,
3288 link_with : [libsystemd_network,
3289 networkd_link_with],
3290 install_rpath : rootlibexecdir,
3291 install : true,
3292 install_dir : rootbindir)
3293
3294 exe = executable(
3295 'systemd-network-generator',
3296 network_generator_sources,
3297 include_directories : includes,
3298 link_with : [networkd_link_with],
3299 install_rpath : rootlibexecdir,
3300 install : true,
3301 install_dir : rootlibexecdir)
fbaa1137
ZJS
3302
3303 if want_tests != 'false'
3304 test('test-network-generator-conversion',
3305 test_network_generator_conversion_sh,
3306 # https://github.com/mesonbuild/meson/issues/2681
3307 args : exe.full_path())
3308 endif
dcfe072a 3309endif
e821f6a9 3310
6164ec4c
ZJS
3311executable(
3312 'systemd-sulogin-shell',
3313 ['src/sulogin-shell/sulogin-shell.c'],
3314 include_directories : includes,
3315 link_with : [libshared],
3316 install_rpath : rootlibexecdir,
3317 install : true,
3318 install_dir : rootlibexecdir)
e821f6a9 3319
69e96427
ZJS
3320############################################################
3321
e2d41370
FB
3322custom_target(
3323 'systemd-runtest.env',
3324 output : 'systemd-runtest.env',
3325 command : ['sh', '-c', '{ ' +
1485aacb 3326 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
81e06775 3327 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
e2d41370
FB
3328 '} >@OUTPUT@'],
3329 build_by_default : true)
3330
69e96427 3331foreach tuple : tests
37efbbd8
ZJS
3332 sources = tuple[0]
3333 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3334 dependencies = tuple[2]
3335 condition = tuple.length() >= 4 ? tuple[3] : ''
3336 type = tuple.length() >= 5 ? tuple[4] : ''
3337 defs = tuple.length() >= 6 ? tuple[5] : []
3338 incs = tuple.length() >= 7 ? tuple[6] : includes
3339 timeout = 30
3340
3341 name = sources[0].split('/')[-1].split('.')[0]
3342 if type.startswith('timeout=')
3343 timeout = type.split('=')[1].to_int()
3344 type = ''
3345 endif
3b2bdd62
ZJS
3346
3347 if condition == '' or conf.get(condition) == 1
37efbbd8
ZJS
3348 exe = executable(
3349 name,
3350 sources,
3351 include_directories : incs,
3352 link_with : link_with,
60722ad7
ZJS
3353 dependencies : [versiondep,
3354 dependencies],
37efbbd8 3355 c_args : defs,
3b2bdd62 3356 build_by_default : want_tests != 'false',
37efbbd8 3357 install_rpath : rootlibexecdir,
7cdd9783
MB
3358 install : install_tests,
3359 install_dir : join_paths(testsdir, type))
37efbbd8
ZJS
3360
3361 if type == 'manual'
3362 message('@0@ is a manual test'.format(name))
3363 elif type == 'unsafe' and want_tests != 'unsafe'
3364 message('@0@ is an unsafe test'.format(name))
3b2bdd62 3365 elif want_tests != 'false'
37efbbd8
ZJS
3366 test(name, exe,
3367 env : test_env,
3368 timeout : timeout)
3369 endif
3370 else
3371 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3372 endif
69e96427
ZJS
3373endforeach
3374
0632b4cd 3375exe = executable(
37efbbd8
ZJS
3376 'test-libsystemd-sym',
3377 test_libsystemd_sym_c,
3378 include_directories : includes,
3379 link_with : [libsystemd],
fd1939fb 3380 build_by_default : want_tests != 'false',
37efbbd8
ZJS
3381 install : install_tests,
3382 install_dir : testsdir)
938be089
ZJS
3383if want_tests != 'false'
3384 test('test-libsystemd-sym', exe)
3385endif
37ab1a25 3386
0632b4cd
ZJS
3387exe = executable(
3388 'test-libsystemd-static-sym',
3389 test_libsystemd_sym_c,
3390 include_directories : includes,
0632b4cd
ZJS
3391 link_with : [install_libsystemd_static],
3392 dependencies : [threads], # threads is already included in dependencies on the library,
3393 # but does not seem to get propagated. Add here as a work-around.
fd1939fb 3394 build_by_default : want_tests != 'false' and static_libsystemd_pic,
20f3d32d 3395 install : install_tests and static_libsystemd_pic,
0632b4cd 3396 install_dir : testsdir)
938be089 3397if want_tests != 'false' and static_libsystemd_pic
0632b4cd
ZJS
3398 test('test-libsystemd-static-sym', exe)
3399endif
37ab1a25 3400
0632b4cd 3401exe = executable(
37efbbd8
ZJS
3402 'test-libudev-sym',
3403 test_libudev_sym_c,
3404 include_directories : includes,
c1cd6743 3405 c_args : '-Wno-deprecated-declarations',
37efbbd8 3406 link_with : [libudev],
fd1939fb 3407 build_by_default : want_tests != 'false',
37efbbd8
ZJS
3408 install : install_tests,
3409 install_dir : testsdir)
938be089
ZJS
3410if want_tests != 'false'
3411 test('test-libudev-sym', exe)
3412endif
0632b4cd
ZJS
3413
3414exe = executable(
3415 'test-libudev-static-sym',
3416 test_libudev_sym_c,
3417 include_directories : includes,
c1cd6743 3418 c_args : '-Wno-deprecated-declarations',
0632b4cd 3419 link_with : [install_libudev_static],
fd1939fb 3420 build_by_default : want_tests != 'false' and static_libudev_pic,
20f3d32d 3421 install : install_tests and static_libudev_pic,
0632b4cd 3422 install_dir : testsdir)
938be089 3423if want_tests != 'false' and static_libudev_pic
0632b4cd
ZJS
3424 test('test-libudev-static-sym', exe)
3425endif
e0bec52f 3426
69e96427 3427############################################################
5c23128d 3428
7db7d5b7
JR
3429fuzzer_exes = []
3430
5996740a 3431if get_option('tests') != 'false'
6164ec4c
ZJS
3432 foreach tuple : fuzzers
3433 sources = tuple[0]
3434 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3435 dependencies = tuple[2]
3436 defs = tuple.length() >= 4 ? tuple[3] : []
3437 incs = tuple.length() >= 5 ? tuple[4] : includes
3438 link_args = []
3439
3440 if want_ossfuzz
9c5c4677 3441 dependencies += fuzzing_engine
6164ec4c
ZJS
3442 elif want_libfuzzer
3443 if fuzzing_engine.found()
3444 dependencies += fuzzing_engine
3445 else
3446 link_args += ['-fsanitize=fuzzer']
3447 endif
9c5c4677 3448 else
6164ec4c 3449 sources += 'src/fuzz/fuzz-main.c'
9c5c4677 3450 endif
7db7d5b7 3451
6164ec4c 3452 name = sources[0].split('/')[-1].split('.')[0]
7db7d5b7 3453
6164ec4c
ZJS
3454 fuzzer_exes += executable(
3455 name,
3456 sources,
3457 include_directories : [incs, include_directories('src/fuzz')],
3458 link_with : link_with,
3459 dependencies : dependencies,
3460 c_args : defs,
3461 link_args: link_args,
3462 install : false)
3463 endforeach
5996740a 3464endif
7db7d5b7 3465
6164ec4c
ZJS
3466run_target(
3467 'fuzzers',
63058f43 3468 depends : fuzzer_exes,
7db7d5b7
JR
3469 command : ['true'])
3470
3471############################################################
3472
5c23128d
ZJS
3473subdir('sysctl.d')
3474subdir('sysusers.d')
3475subdir('tmpfiles.d')
4f10b807
ZJS
3476subdir('hwdb.d')
3477subdir('units')
e783f957 3478subdir('presets')
5c23128d
ZJS
3479subdir('network')
3480subdir('man')
3481subdir('shell-completion/bash')
3482subdir('shell-completion/zsh')
9e825ebf
FB
3483subdir('docs/sysvinit')
3484subdir('docs/var-log')
5c23128d 3485
5c23128d
ZJS
3486install_subdir('factory/etc',
3487 install_dir : factorydir)
3488
5c23128d
ZJS
3489install_data('xorg/50-systemd-user.sh',
3490 install_dir : xinitrcdir)
582faeb4
DJL
3491install_data('modprobe.d/systemd.conf',
3492 install_dir : modprobedir)
f09eb768 3493install_data('LICENSE.GPL2',
5c23128d 3494 'LICENSE.LGPL2.1',
f09eb768
LP
3495 'NEWS',
3496 'README',
eea98402 3497 'docs/CODING_STYLE.md',
1d1cb168 3498 'docs/DISTRO_PORTING.md',
9e825ebf 3499 'docs/ENVIRONMENT.md',
5425f8a5 3500 'docs/HACKING.md',
9e825ebf 3501 'docs/TRANSIENT-SETTINGS.md',
b6dc0d7d 3502 'docs/TRANSLATORS.md',
9e825ebf 3503 'docs/UIDS-GIDS.md',
5c23128d
ZJS
3504 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3505 install_dir : docdir)
d68b342b 3506
94e75a54
ZJS
3507meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3508meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3509
d68b342b
ZJS
3510############################################################
3511
dd1e33c8 3512check_help = find_program('tools/check-help.sh')
005a29f2
ZJS
3513
3514foreach exec : public_programs
37efbbd8 3515 name = exec.full_path().split('/')[-1]
938be089
ZJS
3516 if want_tests != 'false'
3517 test('check-help-' + name,
dd1e33c8 3518 check_help,
c1cd6743 3519 args : exec.full_path())
938be089 3520 endif
005a29f2
ZJS
3521endforeach
3522
3523############################################################
3524
c6448ee3
ZJS
3525check_directives_sh = find_program('tools/check-directives.sh')
3526
3527if want_tests != 'false'
3528 test('check-directives',
3529 check_directives_sh,
3530 args : project_source_root)
3531endif
3532
3533############################################################
3534
52d4d1d3
ZJS
3535# Enable tests for all supported sanitizers
3536foreach tuple : sanitizers
3537 sanitizer = tuple[0]
3538 build = tuple[1]
b68dfb9e 3539
7a6397d2 3540 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
52d4d1d3
ZJS
3541 prev = ''
3542 foreach p : fuzz_regression_tests
3543 b = p.split('/')[-2]
3544 c = p.split('/')[-1]
3545
3546 name = '@0@:@1@'.format(b, sanitizer)
3547
3548 if name != prev
3549 if want_tests == 'false'
3550 message('Not compiling @0@ because tests is set to false'.format(name))
c56463fd 3551 elif slow_tests or fuzz_tests
52d4d1d3
ZJS
3552 exe = custom_target(
3553 name,
3554 output : name,
3555 depends : build,
3556 command : [env, 'ln', '-fs',
3557 join_paths(build.full_path(), b),
3558 '@OUTPUT@'],
3559 build_by_default : true)
3560 else
c56463fd 3561 message('Not compiling @0@ because slow-tests/fuzz-tests is set to false'.format(name))
52d4d1d3
ZJS
3562 endif
3563 endif
3564 prev = name
3565
c56463fd 3566 if want_tests != 'false' and (slow_tests or fuzz_tests)
52d4d1d3
ZJS
3567 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3568 env,
89767158
EV
3569 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
3570 timeout : 60,
52d4d1d3 3571 args : [exe.full_path(),
1485aacb 3572 join_paths(project_source_root, p)])
52d4d1d3
ZJS
3573 endif
3574 endforeach
b68dfb9e
ZJS
3575 endif
3576endforeach
3577
52d4d1d3 3578
b68dfb9e
ZJS
3579############################################################
3580
0700e8ba 3581if git.found()
37efbbd8
ZJS
3582 all_files = run_command(
3583 git,
1485aacb 3584 ['--git-dir=@0@/.git'.format(project_source_root),
37efbbd8
ZJS
3585 'ls-files',
3586 ':/*.[ch]'])
3587 all_files = files(all_files.stdout().split())
d68b342b 3588
e85a690b 3589 custom_target(
0700e8ba 3590 'tags',
e85a690b 3591 output : 'tags',
1485aacb 3592 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
2f09974f 3593 run_target(
0700e8ba 3594 'ctags',
1485aacb 3595 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
d68b342b 3596endif
177929c2
ZJS
3597
3598if git.found()
dd1e33c8 3599 git_contrib_sh = find_program('tools/git-contrib.sh')
a923e085 3600 run_target(
37efbbd8 3601 'git-contrib',
dd1e33c8 3602 command : [git_contrib_sh])
177929c2 3603endif
dd6ab3df
ZJS
3604
3605if git.found()
3606 git_head = run_command(
3607 git,
1485aacb 3608 ['--git-dir=@0@/.git'.format(project_source_root),
dd6ab3df
ZJS
3609 'rev-parse', 'HEAD']).stdout().strip()
3610 git_head_short = run_command(
3611 git,
1485aacb 3612 ['--git-dir=@0@/.git'.format(project_source_root),
dd6ab3df
ZJS
3613 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3614
3615 run_target(
3616 'git-snapshot',
3617 command : ['git', 'archive',
1485aacb 3618 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
dd6ab3df
ZJS
3619 git_head_short),
3620 '--prefix', 'systemd-@0@/'.format(git_head),
3621 'HEAD'])
3622endif
829257d1
ZJS
3623
3624############################################################
3625
dd1e33c8 3626check_api_docs_sh = find_program('tools/check-api-docs.sh')
51b13863
LP
3627run_target(
3628 'check-api-docs',
3629 depends : [man, libsystemd, libudev],
dd1e33c8 3630 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
51b13863
LP
3631
3632############################################################
7bc9ea51 3633watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
51b13863 3634
829257d1
ZJS
3635status = [
3636 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3637
4c8e5f44 3638 'build mode: @0@'.format(get_option('mode')),
2675413e 3639 'split /usr: @0@'.format(split_usr),
157baa87 3640 'split bin-sbin: @0@'.format(split_bin),
359b496f
YW
3641 'prefix directory: @0@'.format(prefixdir),
3642 'rootprefix directory: @0@'.format(rootprefixdir),
3643 'sysconf directory: @0@'.format(sysconfdir),
3644 'include directory: @0@'.format(includedir),
3645 'lib directory: @0@'.format(libdir),
3646 'rootlib directory: @0@'.format(rootlibdir),
829257d1
ZJS
3647 'SysV init scripts: @0@'.format(sysvinit_path),
3648 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
359b496f
YW
3649 'PAM modules directory: @0@'.format(pamlibdir),
3650 'PAM configuration directory: @0@'.format(pamconfdir),
3651 'RPM macros directory: @0@'.format(rpmmacrosdir),
3652 'modprobe.d directory: @0@'.format(modprobedir),
3653 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3654 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3655 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3656 'bash completions directory: @0@'.format(bashcompletiondir),
3657 'zsh completions directory: @0@'.format(zshcompletiondir),
829257d1 3658 'extra start script: @0@'.format(get_option('rc-local')),
829257d1
ZJS
3659 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3660 get_option('debug-tty')),
3661 'TTY GID: @0@'.format(tty_gid),
ac09340e 3662 'users GID: @0@'.format(substs.get('USERS_GID')),
fc1a5d1a
ZJS
3663 'system UIDs: <=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_UID_MAX'),
3664 conf.get('SYSTEM_ALLOC_UID_MIN')),
3665 'system GIDs: <=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_GID_MAX'),
3666 conf.get('SYSTEM_ALLOC_GID_MIN')),
3667 'dynamic UIDs: @0@–@1@'.format(dynamic_uid_min, dynamic_uid_max),
3668 'container UID bases: @0@–@1@'.format(container_uid_base_min, container_uid_base_max),
829257d1 3669 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
4e15a734 3670 'render group access mode: @0@'.format(get_option('group-render-mode')),
359b496f 3671 'certificate root directory: @0@'.format(get_option('certificate-root')),
829257d1 3672 'support URL: @0@'.format(support_url),
afde4574
LP
3673 'nobody user name: @0@'.format(nobody_user),
3674 'nobody group name: @0@'.format(nobody_group),
829257d1 3675 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
5248e7e1 3676 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
829257d1
ZJS
3677
3678 'default DNSSEC mode: @0@'.format(default_dnssec),
c9299be2 3679 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3614df05
ZJS
3680 'default mDNS mode: @0@'.format(default_mdns),
3681 'default LLMNR mode: @0@'.format(default_llmnr),
829257d1 3682 'default cgroup hierarchy: @0@'.format(default_hierarchy),
06da5c63 3683 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
8ca9e92c 3684 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
21d0dd5a 3685 'default locale: @0@'.format(default_locale),
5bc655cd 3686 'default user $PATH: @0@'.format(default_user_path_display),
7bc9ea51 3687 'systemd service watchdog: @0@'.format(watchdog_opt)]
829257d1
ZJS
3688
3689alt_dns_servers = '\n '.join(dns_servers.split(' '))
3690alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3691status += [
3692 'default DNS servers: @0@'.format(alt_dns_servers),
3693 'default NTP servers: @0@'.format(alt_ntp_servers)]
3694
3695alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3696 '@@0@'.format(time_epoch)).stdout().strip()
3697status += [
3698 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3699
19d8c9c9 3700status += [
abc8caf7
ZJS
3701 'static libsystemd: @0@'.format(static_libsystemd),
3702 'static libudev: @0@'.format(static_libudev)]
19d8c9c9 3703
829257d1
ZJS
3704# TODO:
3705# CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3706# CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3707# LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3708
349cc4a5 3709if conf.get('ENABLE_EFI') == 1
5a8b1640 3710 status += 'efi arch: @0@'.format(efi_arch)
829257d1
ZJS
3711
3712 if have_gnu_efi
3713 status += [
3714 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
c512dfb9 3715 'EFI CC @0@'.format(' '.join(efi_cc)),
ce4121c6
ZJS
3716 'EFI lds: @0@'.format(efi_lds),
3717 'EFI crt0: @0@'.format(efi_crt0),
359b496f 3718 'EFI include directory: @0@'.format(efi_incdir)]
829257d1
ZJS
3719 endif
3720endif
3721
3722found = []
3723missing = []
3724
3725foreach tuple : [
3726 ['libcryptsetup'],
3727 ['PAM'],
70a5db58 3728 ['pwquality'],
c757517d 3729 ['libfdisk'],
839fddbe 3730 ['p11kit'],
af4fbd46 3731 ['libfido2'],
829257d1
ZJS
3732 ['AUDIT'],
3733 ['IMA'],
3734 ['AppArmor'],
3735 ['SELinux'],
3736 ['SECCOMP'],
3737 ['SMACK'],
3738 ['zlib'],
3739 ['xz'],
ef5924aa 3740 ['zstd'],
829257d1
ZJS
3741 ['lz4'],
3742 ['bzip2'],
3743 ['ACL'],
3744 ['gcrypt'],
3745 ['qrencode'],
3746 ['microhttpd'],
3747 ['gnutls'],
096cbdce 3748 ['openssl'],
829257d1 3749 ['libcurl'],
d1bf5675 3750 ['idn'],
cdf7ad38 3751 ['initrd'],
53393c89 3752 ['compat-mutable-uid-boundaries'],
87057e24 3753 ['libidn2'],
829257d1
ZJS
3754 ['libidn'],
3755 ['libiptc'],
3756 ['elfutils'],
3757 ['binfmt'],
e594a3b1 3758 ['repart'],
829257d1
ZJS
3759 ['vconsole'],
3760 ['quotacheck'],
3761 ['tmpfiles'],
3762 ['environment.d'],
3763 ['sysusers'],
3764 ['firstboot'],
3765 ['randomseed'],
3766 ['backlight'],
3767 ['rfkill'],
8feca247 3768 ['xdg-autostart'],
829257d1
ZJS
3769 ['logind'],
3770 ['machined'],
61d0578b 3771 ['portabled'],
d093b62c 3772 ['userdb'],
70a5db58 3773 ['homed'],
829257d1
ZJS
3774 ['importd'],
3775 ['hostnamed'],
3776 ['timedated'],
3777 ['timesyncd'],
3778 ['localed'],
3779 ['networkd'],
a7456af5 3780 ['resolve'],
096cbdce
IT
3781 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3782 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
829257d1 3783 ['coredump'],
9b4abc69 3784 ['pstore'],
61ff7397 3785 ['oomd'],
829257d1
ZJS
3786 ['polkit'],
3787 ['legacy pkla', install_polkit_pkla],
3788 ['efi'],
3789 ['gnu-efi', have_gnu_efi],
3790 ['kmod'],
3791 ['xkbcommon'],
c4c978a0 3792 ['pcre2'],
829257d1
ZJS
3793 ['blkid'],
3794 ['dbus'],
3795 ['glib'],
6bd2bc8e
ZJS
3796 ['nss-myhostname'],
3797 ['nss-mymachines'],
3798 ['nss-resolve'],
3799 ['nss-systemd'],
829257d1
ZJS
3800 ['hwdb'],
3801 ['tpm'],
3802 ['man pages', want_man],
3803 ['html pages', want_html],
3804 ['man page indices', want_man and have_lxml],
829257d1
ZJS
3805 ['SysV compat'],
3806 ['utmp'],
3807 ['ldconfig'],
3808 ['hibernate'],
3809 ['adm group', get_option('adm-group')],
3810 ['wheel group', get_option('wheel-group')],
b14e1b43 3811 ['gshadow'],
829257d1
ZJS
3812 ['debug hashmap'],
3813 ['debug mmap cache'],
d6601495 3814 ['debug siphash'],
d18cb393 3815 ['valgrind', conf.get('VALGRIND') == 1],
fd5dec9a 3816 ['trace logging', conf.get('LOG_TRACE') == 1],
b6261be8 3817 ['install tests', install_tests],
19d8c9c9
LP
3818 ['link-udev-shared', get_option('link-udev-shared')],
3819 ['link-systemctl-shared', get_option('link-systemctl-shared')],
5ac8b50d 3820 ['link-networkd-shared', get_option('link-networkd-shared')],
fd74a13e 3821 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
f30bf4d9 3822 ['kernel-install', get_option('kernel-install')],
b3259a6e 3823 ['systemd-analyze', conf.get('ENABLE_ANALYZE') == 1],
829257d1
ZJS
3824]
3825
af4d7860
ZJS
3826 if tuple.length() >= 2
3827 cond = tuple[1]
3828 else
829257d1
ZJS
3829 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3830 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
349cc4a5 3831 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
829257d1
ZJS
3832 endif
3833 if cond
5a8b1640 3834 found += tuple[0]
829257d1 3835 else
5a8b1640 3836 missing += tuple[0]
829257d1
ZJS
3837 endif
3838endforeach
3839
3840status += [
9d39c1bf 3841 '',
829257d1 3842 'enabled features: @0@'.format(', '.join(found)),
9d39c1bf
ZJS
3843 '',
3844 'disabled features: @0@'.format(', '.join(missing)),
3845 '']
829257d1 3846message('\n '.join(status))
9a8e64b0
ZJS
3847
3848if rootprefixdir != rootprefix_default
8ea9fad7
YW
3849 warning('\n' +
3850 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3851 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3852 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
9a8e64b0 3853endif