]> git.ipfire.org Git - thirdparty/systemd.git/blame - meson.build
meson: disable "slow tests" too when tests are generally disabled
[thirdparty/systemd.git] / meson.build
CommitLineData
3a726fcd 1# SPDX-License-Identifier: LGPL-2.1+
3a726fcd 2
5c23128d 3project('systemd', 'c',
de7436b0 4 version : '239',
5c23128d
ZJS
5 license : 'LGPLv2+',
6 default_options: [
37efbbd8
ZJS
7 'c_std=gnu99',
8 'prefix=/usr',
9 'sysconfdir=/etc',
10 'localstatedir=/var',
5c23128d 11 ],
7a6397d2 12 meson_version : '>= 0.46',
5c23128d
ZJS
13 )
14
de7436b0
LP
15libsystemd_version = '0.23.0'
16libudev_version = '1.6.11'
56d50ab1 17
348b4437 18# We need the same data in two different formats, ugh!
5c23128d
ZJS
19# Also, for hysterical reasons, we use different variable
20# names, sometimes. Not all variables are included in every
21# set. Ugh, ugh, ugh!
22conf = configuration_data()
23conf.set_quoted('PACKAGE_STRING', meson.project_name() + ' ' + meson.project_version())
24conf.set_quoted('PACKAGE_VERSION', meson.project_version())
25
26substs = configuration_data()
27substs.set('PACKAGE_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
28substs.set('PACKAGE_VERSION', meson.project_version())
29
5c23128d
ZJS
30#####################################################################
31
003c8879
ZJS
32# Try to install the git pre-commit hook
33git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
34if git_hook.returncode() == 0
35 message(git_hook.stdout().strip())
36endif
37
38#####################################################################
39
2675413e
ZJS
40if get_option('split-usr') == 'auto'
41 split_usr = run_command('test', '-L', '/bin').returncode() != 0
42else
43 split_usr = get_option('split-usr') == 'true'
44endif
671f0f8d
ZJS
45conf.set10('HAVE_SPLIT_USR', split_usr,
46 description : '/usr/bin and /bin directories are separate')
9a8e64b0 47
157baa87
ZJS
48if get_option('split-bin') == 'auto'
49 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
50else
51 split_bin = get_option('split-bin') == 'true'
52endif
671f0f8d
ZJS
53conf.set10('HAVE_SPLIT_BIN', split_bin,
54 description : 'bin and sbin directories are separate')
157baa87 55
74344a17 56rootprefixdir = get_option('rootprefix')
74344a17
ZJS
57# Unusual rootprefixdir values are used by some distros
58# (see https://github.com/systemd/systemd/pull/7461).
ba7f4ae6 59rootprefix_default = split_usr ? '/' : '/usr'
9a8e64b0
ZJS
60if rootprefixdir == ''
61 rootprefixdir = rootprefix_default
74344a17 62endif
5c23128d
ZJS
63
64sysvinit_path = get_option('sysvinit-path')
65sysvrcnd_path = get_option('sysvrcnd-path')
348b4437 66conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
349cc4a5 67 description : 'SysV init scripts and rcN.d links are supported')
5c23128d
ZJS
68
69# join_paths ignore the preceding arguments if an absolute component is
70# encountered, so this should canonicalize various paths when they are
71# absolute or relative.
72prefixdir = get_option('prefix')
73if not prefixdir.startswith('/')
37efbbd8 74 error('Prefix is not absolute: "@0@"'.format(prefixdir))
5c23128d
ZJS
75endif
76bindir = join_paths(prefixdir, get_option('bindir'))
77libdir = join_paths(prefixdir, get_option('libdir'))
78sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
79includedir = join_paths(prefixdir, get_option('includedir'))
80datadir = join_paths(prefixdir, get_option('datadir'))
81localstatedir = join_paths('/', get_option('localstatedir'))
82
83rootbindir = join_paths(rootprefixdir, 'bin')
157baa87 84rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
5c23128d
ZJS
85rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
86
87rootlibdir = get_option('rootlibdir')
88if rootlibdir == ''
37efbbd8 89 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
5c23128d
ZJS
90endif
91
92# Dirs of external packages
a95696e3
BM
93pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
94pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
e17e5ba9
MB
95polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
96polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
97polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
98varlogdir = join_paths(localstatedir, 'log')
99xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
8a38aac3
YW
100rpmmacrosdir = get_option('rpmmacrosdir')
101if rpmmacrosdir != 'no'
102 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
103endif
02fa054d 104modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
5c23128d
ZJS
105
106# Our own paths
e17e5ba9
MB
107pkgdatadir = join_paths(datadir, 'systemd')
108environmentdir = join_paths(prefixdir, 'lib/environment.d')
109pkgsysconfdir = join_paths(sysconfdir, 'systemd')
110userunitdir = join_paths(prefixdir, 'lib/systemd/user')
111userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
112tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
113sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
114sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
115binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
116modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
117networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
118pkgincludedir = join_paths(includedir, 'systemd')
119systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
120usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
121systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
122userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
123systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
124systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
125systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
126systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
127udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
128udevhomedir = udevlibexecdir
129udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
130udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
131catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
132kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
133factorydir = join_paths(datadir, 'factory')
e17e5ba9
MB
134bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
135testsdir = join_paths(prefixdir, 'lib/systemd/tests')
136systemdstatedir = join_paths(localstatedir, 'lib/systemd')
137catalogstatedir = join_paths(systemdstatedir, 'catalog')
138randomseeddir = join_paths(localstatedir, 'lib/systemd')
61d0578b 139profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
5c23128d 140
75aaade1
TB
141docdir = get_option('docdir')
142if docdir == ''
143 docdir = join_paths(datadir, 'doc/systemd')
144endif
145
5c23128d
ZJS
146dbuspolicydir = get_option('dbuspolicydir')
147if dbuspolicydir == ''
37efbbd8 148 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
5c23128d
ZJS
149endif
150
151dbussessionservicedir = get_option('dbussessionservicedir')
152if dbussessionservicedir == ''
37efbbd8 153 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
5c23128d
ZJS
154endif
155
156dbussystemservicedir = get_option('dbussystemservicedir')
157if dbussystemservicedir == ''
37efbbd8 158 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
5c23128d
ZJS
159endif
160
161pamlibdir = get_option('pamlibdir')
162if pamlibdir == ''
37efbbd8 163 pamlibdir = join_paths(rootlibdir, 'security')
5c23128d
ZJS
164endif
165
166pamconfdir = get_option('pamconfdir')
167if pamconfdir == ''
37efbbd8 168 pamconfdir = join_paths(sysconfdir, 'pam.d')
5c23128d
ZJS
169endif
170
444d5863
ZJS
171memory_accounting_default = get_option('memory-accounting-default')
172
5c23128d 173conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
e17e5ba9 174conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
5c23128d
ZJS
175conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
176conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
177conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
2a4c156d
ZJS
178conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
179conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
96164a39 180
f7c5427c 181conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
96164a39 182
e17e5ba9 183conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
5c23128d
ZJS
184conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
185conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
e17e5ba9
MB
186conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
187conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
188conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
189conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
da495a03 190conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
7f2806d5 191conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
e17e5ba9
MB
192conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
193conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
194conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
195conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
196conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
74344a17 197conf.set_quoted('ROOTPREFIX', rootprefixdir)
3131bfe3 198conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
e17e5ba9
MB
199conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
200conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
5c23128d
ZJS
201conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
202conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
203conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
204conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
205conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
206conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
e17e5ba9
MB
207conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
208conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
e2d41370 209conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
49cdae63 210conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
5c23128d 211conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
e17e5ba9 212conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
5c23128d
ZJS
213conf.set_quoted('LIBDIR', libdir)
214conf.set_quoted('ROOTLIBDIR', rootlibdir)
215conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
216conf.set_quoted('BOOTLIBDIR', bootlibdir)
e17e5ba9
MB
217conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
218conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
219conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
220conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
221conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
222conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
444d5863 223conf.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'true' : 'false')
7f672e86 224conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
5c23128d 225
5c23128d 226substs.set('prefix', prefixdir)
3131bfe3
ZJS
227substs.set('exec_prefix', prefixdir)
228substs.set('libdir', libdir)
229substs.set('rootlibdir', rootlibdir)
230substs.set('includedir', includedir)
5c23128d 231substs.set('pkgsysconfdir', pkgsysconfdir)
3131bfe3
ZJS
232substs.set('bindir', bindir)
233substs.set('rootbindir', rootbindir)
5c23128d
ZJS
234substs.set('rootlibexecdir', rootlibexecdir)
235substs.set('systemunitdir', systemunitdir)
236substs.set('userunitdir', userunitdir)
237substs.set('systempresetdir', systempresetdir)
238substs.set('userpresetdir', userpresetdir)
239substs.set('udevhwdbdir', udevhwdbdir)
240substs.set('udevrulesdir', udevrulesdir)
3131bfe3 241substs.set('udevlibexecdir', udevlibexecdir)
424e80b4 242substs.set('environmentdir', environmentdir)
5c23128d
ZJS
243substs.set('catalogdir', catalogdir)
244substs.set('tmpfilesdir', tmpfilesdir)
245substs.set('sysusersdir', sysusersdir)
246substs.set('sysctldir', sysctldir)
247substs.set('binfmtdir', binfmtdir)
248substs.set('modulesloaddir', modulesloaddir)
424e80b4 249substs.set('modprobedir', modprobedir)
5c23128d
ZJS
250substs.set('systemgeneratordir', systemgeneratordir)
251substs.set('usergeneratordir', usergeneratordir)
252substs.set('systemenvgeneratordir', systemenvgeneratordir)
253substs.set('userenvgeneratordir', userenvgeneratordir)
254substs.set('systemshutdowndir', systemshutdowndir)
255substs.set('systemsleepdir', systemsleepdir)
2a4c156d
ZJS
256substs.set('VARLOGDIR', varlogdir)
257substs.set('CERTIFICATEROOT', get_option('certificate-root'))
e17e5ba9
MB
258substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
259substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
2a4c156d
ZJS
260substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
261substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
262substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
263substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
444d5863 264substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
5c23128d
ZJS
265
266#####################################################################
267
268cc = meson.get_compiler('c')
269pkgconfig = import('pkgconfig')
6e2afb1c 270check_compilation_sh = find_program('tools/meson-check-compilation.sh')
b68dfb9e 271meson_build_sh = find_program('tools/meson-build.sh')
5c23128d 272
d3da291e
ZJS
273want_tests = get_option('tests')
274slow_tests = want_tests != 'false' and get_option('slow-tests')
275install_tests = get_option('install-tests')
276
277if want_tests != 'false'
08318a2c
AD
278 cxx = find_program('c++', required : false)
279 if cxx.found()
280 # Used only for tests
281 add_languages('cpp')
282 endif
94e2523b
ZJS
283endif
284
31e57a35
JR
285want_ossfuzz = get_option('oss-fuzz')
286want_libfuzzer = get_option('llvm-fuzz')
287fuzzer_build = want_ossfuzz or want_libfuzzer
288if want_ossfuzz and want_libfuzzer
289 error('only one of oss-fuzz and llvm-fuzz can be specified')
290endif
291if want_libfuzzer
292 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
293endif
294if want_ossfuzz
7db7d5b7
JR
295 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
296endif
297
30a4ddff
YW
298possible_cc_flags = [
299 '-Wextra',
300 '-Werror=undef',
301 '-Wlogical-op',
302 '-Wmissing-include-dirs',
303 '-Wold-style-definition',
304 '-Wpointer-arith',
305 '-Winit-self',
30a4ddff
YW
306 '-Wfloat-equal',
307 '-Wsuggest-attribute=noreturn',
308 '-Werror=missing-prototypes',
309 '-Werror=implicit-function-declaration',
310 '-Werror=missing-declarations',
311 '-Werror=return-type',
312 '-Werror=incompatible-pointer-types',
313 '-Werror=format=2',
314 '-Wstrict-prototypes',
315 '-Wredundant-decls',
316 '-Wmissing-noreturn',
317 '-Wimplicit-fallthrough=5',
318 '-Wshadow',
319 '-Wendif-labels',
320 '-Wstrict-aliasing=2',
321 '-Wwrite-strings',
322 '-Werror=overflow',
b05ecb8c 323 '-Werror=shift-count-overflow',
d28b67d4 324 '-Werror=shift-overflow=2',
30a4ddff
YW
325 '-Wdate-time',
326 '-Wnested-externs',
bf7efeb1
FB
327
328 # negative arguments are correctly detected starting with meson 0.46.
329 '-Wno-unused-parameter',
330 '-Wno-missing-field-initializers',
331 '-Wno-unused-result',
332 '-Wno-format-signedness',
333
334 # work-around for gcc 7.1 turning this on on its own.
335 '-Wno-error=nonnull',
336
337 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
338 # optimizations enabled, producing essentially false positives.
339 '-Wno-maybe-uninitialized',
340
30a4ddff
YW
341 '-ffast-math',
342 '-fno-common',
343 '-fdiagnostics-show-option',
344 '-fno-strict-aliasing',
345 '-fvisibility=hidden',
346 '-fstack-protector',
347 '-fstack-protector-strong',
348 '--param=ssp-buffer-size=4',
349]
350
351# --as-needed and --no-undefined are provided by meson by default,
352# run mesonconf to see what is enabled
353possible_link_flags = [
354 '-Wl,-z,relro',
355 '-Wl,-z,now',
356]
5c23128d 357
7db7d5b7
JR
358# the oss-fuzz fuzzers are not built with -fPIE, so don't
359# enable it when we are linking against them
31e57a35 360if not fuzzer_build
30a4ddff
YW
361 possible_cc_flags += '-fPIE'
362 possible_link_flags += '-pie'
7db7d5b7
JR
363endif
364
30a4ddff
YW
365if cc.get_id() == 'clang'
366 possible_cc_flags += [
367 '-Wno-typedef-redefinition',
368 '-Wno-gnu-variable-sized-type-not-at-end',
369 ]
370endif
371
372if get_option('buildtype') != 'debug'
373 possible_cc_flags += [
374 '-ffunction-sections',
375 '-fdata-sections',
376 ]
377
378 possible_link_flags += '-Wl,--gc-sections'
379endif
380
381add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
7a6397d2 382add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
30a4ddff 383
9e70f2f8 384if cc.compiles('''
5c23128d
ZJS
385 #include <time.h>
386 #include <inttypes.h>
387 typedef uint64_t usec_t;
388 usec_t now(clockid_t clock);
389 int main(void) {
390 struct timespec now;
391 return 0;
392 }
9e70f2f8 393''', name : '-Werror=shadow with local shadowing')
37efbbd8 394 add_project_arguments('-Werror=shadow', language : 'c')
5c23128d
ZJS
395endif
396
9cc0e6e9
ZJS
397cpp = ' '.join(cc.cmd_array()) + ' -E'
398
5c23128d
ZJS
399#####################################################################
400# compilation result tests
401
2c201c21
ZJS
402conf.set('_GNU_SOURCE', true)
403conf.set('__SANE_USERSPACE_TYPES__', true)
5c23128d
ZJS
404
405conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
406conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
407conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
408conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
409conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
410conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
411conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
412
413decl_headers = '''
414#include <uchar.h>
415#include <linux/ethtool.h>
bce67bbe 416#include <linux/fib_rules.h>
4c2e1b39 417#include <sys/stat.h>
5c23128d 418'''
5c23128d
ZJS
419
420foreach decl : ['char16_t',
421 'char32_t',
5c23128d 422 'struct ethtool_link_settings',
bce67bbe 423 'struct fib_rule_uid_range',
4c2e1b39 424 'struct statx',
5c23128d 425 ]
2c201c21
ZJS
426
427 # We get -1 if the size cannot be determined
9c869d08
ZJS
428 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
429
430 if decl == 'struct statx'
431 if have
432 want_linux_stat_h = false
433 else
434 have = cc.sizeof(decl,
435 prefix : decl_headers + '#include <linux/stat.h>',
436 args : '-D_GNU_SOURCE') > 0
437 want_linux_stat_h = have
438 endif
439 endif
440
349cc4a5 441 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
5c23128d
ZJS
442endforeach
443
9c869d08 444conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
75720bff 445
5c23128d
ZJS
446foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
447 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
448 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
449 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
d384826f 450 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
5c23128d
ZJS
451 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
452 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
453 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
454 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
455 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
9dfed8dd 456 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
5c23128d
ZJS
457 # if_tunnel.h is buggy and cannot be included on its own
458 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
459 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
460 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
461 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
462 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
463 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
464 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
d384826f 465 ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
5c23128d
ZJS
466 ['NDA_IFINDEX', 'linux/neighbour.h'],
467 ['IFA_FLAGS', 'linux/if_addr.h'],
bce67bbe 468 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
5c23128d 469 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
d6df583c 470 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
53cb501a
SS
471 ['FOU_ATTR_REMCSUM_NOPARTIAL', 'linux/fou.h'],
472 ['FOU_CMD_GET', 'linux/fou.h'],
473 ['FOU_ENCAP_GUE', 'linux/fou.h'],
5c23128d 474 ]
37efbbd8
ZJS
475 prefix = decl.length() > 2 ? decl[2] : ''
476 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
4b9545f1 477 conf.set10('HAVE_' + decl[0], have)
5c23128d
ZJS
478endforeach
479
5c23128d 480foreach ident : ['secure_getenv', '__secure_getenv']
349cc4a5 481 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
5c23128d
ZJS
482endforeach
483
484foreach ident : [
85db59b7 485 ['memfd_create', '''#include <sys/mman.h>'''],
7b961e40
LP
486 ['gettid', '''#include <sys/types.h>
487 #include <unistd.h>'''],
3c042add
LP
488 ['pivot_root', '''#include <stdlib.h>
489 #include <unistd.h>'''], # no known header declares pivot_root
85db59b7 490 ['name_to_handle_at', '''#include <sys/types.h>
37efbbd8
ZJS
491 #include <sys/stat.h>
492 #include <fcntl.h>'''],
85db59b7 493 ['setns', '''#include <sched.h>'''],
2acfd0ff
LP
494 ['renameat2', '''#include <stdio.h>
495 #include <fcntl.h>'''],
37efbbd8
ZJS
496 ['kcmp', '''#include <linux/kcmp.h>'''],
497 ['keyctl', '''#include <sys/types.h>
498 #include <keyutils.h>'''],
85db59b7 499 ['copy_file_range', '''#include <sys/syscall.h>
37efbbd8 500 #include <unistd.h>'''],
71e5200f
DM
501 ['bpf', '''#include <sys/syscall.h>
502 #include <unistd.h>'''],
4c2e1b39
LP
503 ['statx', '''#include <sys/types.h>
504 #include <sys/stat.h>
505 #include <unistd.h>'''],
aa484f35
ZJS
506 ['explicit_bzero' , '''#include <string.h>'''],
507 ['reallocarray', '''#include <malloc.h>'''],
37efbbd8
ZJS
508]
509
85db59b7 510 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
4b9545f1 511 conf.set10('HAVE_' + ident[0].to_upper(), have)
5c23128d
ZJS
512endforeach
513
85db59b7 514if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
349cc4a5 515 conf.set10('USE_SYS_RANDOM_H', true)
4b9545f1 516 conf.set10('HAVE_GETRANDOM', true)
4984c8be
ZJS
517else
518 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
349cc4a5 519 conf.set10('USE_SYS_RANDOM_H', false)
4b9545f1 520 conf.set10('HAVE_GETRANDOM', have)
4984c8be
ZJS
521endif
522
5c23128d
ZJS
523#####################################################################
524
525sed = find_program('sed')
5c23128d 526awk = find_program('awk')
d730e2d1 527m4 = find_program('m4')
5c23128d 528stat = find_program('stat')
d68b342b 529git = find_program('git', required : false)
b68dfb9e 530env = find_program('env')
b1ffacb6 531perl = find_program('perl', required : false)
5c23128d 532
7b76fce1 533meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
94e75a54 534mkdir_p = 'mkdir -p $DESTDIR/@0@'
d83f4f50
ZJS
535test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
536splash_bmp = files('test/splash.bmp')
94e75a54 537
5c23128d
ZJS
538# if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
539# /usr/sbin, /sbin, and fall back to the default from middle column.
2fa645f1 540progs = [['quotaon', '/usr/sbin/quotaon' ],
5c23128d 541 ['quotacheck', '/usr/sbin/quotacheck' ],
5c23128d
ZJS
542 ['kmod', '/usr/bin/kmod' ],
543 ['kexec', '/usr/sbin/kexec' ],
544 ['sulogin', '/usr/sbin/sulogin' ],
545 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
546 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
547 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
548 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
549 ]
550foreach prog : progs
37efbbd8
ZJS
551 path = get_option(prog[0] + '-path')
552 if path != ''
553 message('Using @1@ for @0@'.format(prog[0], path))
554 else
555 exe = find_program(prog[0],
556 '/usr/sbin/' + prog[0],
557 '/sbin/' + prog[0],
558 required: false)
559 path = exe.found() ? exe.path() : prog[1]
560 endif
561 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
562 conf.set_quoted(name, path)
563 substs.set(name, path)
5c23128d
ZJS
564endforeach
565
2fa645f1
MG
566conf.set_quoted('TELINIT', get_option('telinit-path'))
567
1276a9f6 568if run_command('ln', '--relative', '--help').returncode() != 0
cd001016 569 error('ln does not support --relative (added in coreutils 8.16)')
1276a9f6 570endif
5c23128d
ZJS
571
572############################################################
573
574gperf = find_program('gperf')
575
576gperf_test_format = '''
577#include <string.h>
578const char * in_word_set(const char *, @0@);
579@1@
580'''
581gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
582gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
583gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
584if cc.compiles(gperf_test)
37efbbd8 585 gperf_len_type = 'size_t'
5c23128d 586else
37efbbd8
ZJS
587 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
588 if cc.compiles(gperf_test)
589 gperf_len_type = 'unsigned'
590 else
591 error('unable to determine gperf len type')
592 endif
5c23128d
ZJS
593endif
594message('gperf len type is @0@'.format(gperf_len_type))
37efbbd8
ZJS
595conf.set('GPERF_LEN_TYPE', gperf_len_type,
596 description : 'The type of gperf "len" parameter')
5c23128d
ZJS
597
598############################################################
599
600if not cc.has_header('sys/capability.h')
37efbbd8 601 error('POSIX caps headers not found')
5c23128d 602endif
9f555bba
BE
603foreach header : ['crypt.h',
604 'linux/btrfs.h',
5c23128d
ZJS
605 'linux/memfd.h',
606 'linux/vm_sockets.h',
af8786b1 607 'sys/auxv.h',
5c23128d
ZJS
608 'valgrind/memcheck.h',
609 'valgrind/valgrind.h',
610 ]
2c201c21 611
349cc4a5
ZJS
612 conf.set10('HAVE_' + header.underscorify().to_upper(),
613 cc.has_header(header))
5c23128d
ZJS
614endforeach
615
616############################################################
617
618conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
5248e7e1
ZJS
619conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
620gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
5c23128d
ZJS
621
622default_hierarchy = get_option('default-hierarchy')
623conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
624 description : 'default cgroup hierarchy as string')
625if default_hierarchy == 'legacy'
37efbbd8 626 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
5c23128d 627elif default_hierarchy == 'hybrid'
37efbbd8 628 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
5c23128d 629else
37efbbd8 630 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
5c23128d
ZJS
631endif
632
633time_epoch = get_option('time-epoch')
ac09340e 634if time_epoch == -1
37efbbd8 635 NEWS = files('NEWS')
ac09340e 636 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
5c23128d 637endif
5c23128d
ZJS
638conf.set('TIME_EPOCH', time_epoch)
639
640system_uid_max = get_option('system-uid-max')
ac09340e 641if system_uid_max == -1
37efbbd8
ZJS
642 system_uid_max = run_command(
643 awk,
2f62cf35
CMOF
644 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
645 '/etc/login.defs').stdout().strip()
646 if system_uid_max == ''
ac09340e
YW
647 system_uid_max = 999
648 else
649 system_uid_max = system_uid_max.to_int()
2f62cf35 650 endif
5c23128d 651endif
5c23128d
ZJS
652conf.set('SYSTEM_UID_MAX', system_uid_max)
653substs.set('systemuidmax', system_uid_max)
5c23128d 654
5c23128d 655system_gid_max = get_option('system-gid-max')
ac09340e 656if system_gid_max == -1
37efbbd8
ZJS
657 system_gid_max = run_command(
658 awk,
2f62cf35
CMOF
659 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
660 '/etc/login.defs').stdout().strip()
661 if system_gid_max == ''
ac09340e
YW
662 system_gid_max = 999
663 else
664 system_gid_max = system_gid_max.to_int()
2f62cf35 665 endif
5c23128d 666endif
5c23128d
ZJS
667conf.set('SYSTEM_GID_MAX', system_gid_max)
668substs.set('systemgidmax', system_gid_max)
5c23128d 669
ac09340e
YW
670dynamic_uid_min = get_option('dynamic-uid-min')
671dynamic_uid_max = get_option('dynamic-uid-max')
87d5e4f2
LP
672conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
673conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
674substs.set('dynamicuidmin', dynamic_uid_min)
675substs.set('dynamicuidmax', dynamic_uid_max)
676
ac09340e
YW
677container_uid_base_min = get_option('container-uid-base-min')
678container_uid_base_max = get_option('container-uid-base-max')
87d5e4f2
LP
679conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
680conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
681substs.set('containeruidbasemin', container_uid_base_min)
682substs.set('containeruidbasemax', container_uid_base_max)
683
afde4574
LP
684nobody_user = get_option('nobody-user')
685nobody_group = get_option('nobody-group')
686
2484bff3
CQ
687if not meson.is_cross_build()
688 getent_result = run_command('getent', 'passwd', '65534')
689 if getent_result.returncode() == 0
690 name = getent_result.stdout().split(':')[0]
691 if name != nobody_user
692 warning('\n' +
693 '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) +
694 'Your build will result in an user table setup that is incompatible with the local system.')
695 endif
afde4574 696 endif
2484bff3
CQ
697 id_result = run_command('id', '-u', nobody_user)
698 if id_result.returncode() == 0
699 id = id_result.stdout().to_int()
700 if id != 65534
701 warning('\n' +
702 '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) +
703 'Your build will result in an user table setup that is incompatible with the local system.')
704 endif
afde4574 705 endif
afde4574 706
2484bff3
CQ
707 getent_result = run_command('getent', 'group', '65534')
708 if getent_result.returncode() == 0
709 name = getent_result.stdout().split(':')[0]
710 if name != nobody_group
711 warning('\n' +
712 '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) +
713 'Your build will result in an group table setup that is incompatible with the local system.')
714 endif
afde4574 715 endif
2484bff3
CQ
716 id_result = run_command('id', '-g', nobody_group)
717 if id_result.returncode() == 0
718 id = id_result.stdout().to_int()
719 if id != 65534
720 warning('\n' +
721 '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) +
722 'Your build will result in an group table setup that is incompatible with the local system.')
723 endif
afde4574
LP
724 endif
725endif
8374cc62 726if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
8ea9fad7
YW
727 warning('\n' +
728 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
729 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
8374cc62 730endif
afde4574
LP
731
732conf.set_quoted('NOBODY_USER_NAME', nobody_user)
733conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
60712021
YW
734substs.set('NOBODY_USER_NAME', nobody_user)
735substs.set('NOBODY_GROUP_NAME', nobody_group)
87d5e4f2 736
5c23128d
ZJS
737tty_gid = get_option('tty-gid')
738conf.set('TTY_GID', tty_gid)
2a4c156d 739substs.set('TTY_GID', tty_gid)
5c23128d 740
84786b8e 741# Ensure provided GID argument is numeric, otherwise fallback to default assignment
ac09340e
YW
742users_gid = get_option('users-gid')
743substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
84786b8e 744
348b4437
YW
745conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
746conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
5c23128d 747
ace5e311
MB
748dev_kvm_mode = get_option('dev-kvm-mode')
749substs.set('DEV_KVM_MODE', dev_kvm_mode)
750conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
4e15a734 751substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
5c23128d 752
2a4c156d
ZJS
753kill_user_processes = get_option('default-kill-user-processes')
754conf.set10('KILL_USER_PROCESSES', kill_user_processes)
c7f7e859 755conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
2a4c156d 756substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
5c23128d 757
829257d1
ZJS
758dns_servers = get_option('dns-servers')
759conf.set_quoted('DNS_SERVERS', dns_servers)
760substs.set('DNS_SERVERS', dns_servers)
5c23128d 761
829257d1
ZJS
762ntp_servers = get_option('ntp-servers')
763conf.set_quoted('NTP_SERVERS', ntp_servers)
764substs.set('NTP_SERVERS', ntp_servers)
5c23128d
ZJS
765
766conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
767
3131bfe3
ZJS
768substs.set('SUSHELL', get_option('debug-shell'))
769substs.set('DEBUGTTY', get_option('debug-tty'))
770
349cc4a5
ZJS
771enable_debug_hashmap = false
772enable_debug_mmap_cache = false
8f6b442a 773foreach name : get_option('debug-extra')
ad7aa760
YW
774 if name == 'hashmap'
775 enable_debug_hashmap = true
776 elif name == 'mmap-cache'
777 enable_debug_mmap_cache = true
778 else
779 message('unknown debug option "@0@", ignoring'.format(name))
780 endif
781endforeach
349cc4a5
ZJS
782conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
783conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
671677da 784
d18cb393
ZJS
785conf.set10('VALGRIND', get_option('valgrind'))
786
5c23128d
ZJS
787#####################################################################
788
789threads = dependency('threads')
790librt = cc.find_library('rt')
791libm = cc.find_library('m')
792libdl = cc.find_library('dl')
793libcrypt = cc.find_library('crypt')
794
1800cc85
ZJS
795libcap = dependency('libcap', required : false)
796if not libcap.found()
797 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
798 libcap = cc.find_library('cap')
799endif
800
5c23128d 801libmount = dependency('mount',
c0b4b0f8 802 version : fuzzer_build ? '>= 0' : '>= 2.30')
5c23128d
ZJS
803
804want_seccomp = get_option('seccomp')
31e57a35 805if want_seccomp != 'false' and not fuzzer_build
37efbbd8 806 libseccomp = dependency('libseccomp',
9f0e9c01 807 version : '>= 2.3.1',
37efbbd8 808 required : want_seccomp == 'true')
349cc4a5 809 have = libseccomp.found()
5c23128d 810else
349cc4a5 811 have = false
37efbbd8 812 libseccomp = []
5c23128d 813endif
349cc4a5 814conf.set10('HAVE_SECCOMP', have)
5c23128d
ZJS
815
816want_selinux = get_option('selinux')
31e57a35 817if want_selinux != 'false' and not fuzzer_build
37efbbd8
ZJS
818 libselinux = dependency('libselinux',
819 version : '>= 2.1.9',
820 required : want_selinux == 'true')
349cc4a5 821 have = libselinux.found()
5c23128d 822else
349cc4a5 823 have = false
37efbbd8 824 libselinux = []
5c23128d 825endif
349cc4a5 826conf.set10('HAVE_SELINUX', have)
5c23128d
ZJS
827
828want_apparmor = get_option('apparmor')
31e57a35 829if want_apparmor != 'false' and not fuzzer_build
37efbbd8
ZJS
830 libapparmor = dependency('libapparmor',
831 required : want_apparmor == 'true')
349cc4a5 832 have = libapparmor.found()
5c23128d 833else
349cc4a5 834 have = false
37efbbd8 835 libapparmor = []
5c23128d 836endif
349cc4a5 837conf.set10('HAVE_APPARMOR', have)
5c23128d 838
5c23128d
ZJS
839smack_run_label = get_option('smack-run-label')
840if smack_run_label != ''
37efbbd8 841 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
5c23128d
ZJS
842endif
843
3ca0cb73
ZJS
844want_polkit = get_option('polkit')
845install_polkit = false
846install_polkit_pkla = false
31e57a35 847if want_polkit != 'false' and not fuzzer_build
37efbbd8 848 install_polkit = true
3ca0cb73 849
37efbbd8
ZJS
850 libpolkit = dependency('polkit-gobject-1',
851 required : false)
852 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
853 message('Old polkit detected, will install pkla files')
854 install_polkit_pkla = true
855 endif
3ca0cb73 856endif
349cc4a5 857conf.set10('ENABLE_POLKIT', install_polkit)
3ca0cb73 858
36f0387e 859want_acl = get_option('acl')
31e57a35 860if want_acl != 'false' and not fuzzer_build
36f0387e 861 libacl = cc.find_library('acl', required : want_acl == 'true')
349cc4a5 862 have = libacl.found()
36f0387e 863else
349cc4a5 864 have = false
36f0387e
ZJS
865 libacl = []
866endif
349cc4a5 867conf.set10('HAVE_ACL', have)
36f0387e 868
5c23128d 869want_audit = get_option('audit')
31e57a35 870if want_audit != 'false' and not fuzzer_build
37efbbd8 871 libaudit = dependency('audit', required : want_audit == 'true')
349cc4a5 872 have = libaudit.found()
5c23128d 873else
349cc4a5 874 have = false
37efbbd8 875 libaudit = []
5c23128d 876endif
349cc4a5 877conf.set10('HAVE_AUDIT', have)
5c23128d
ZJS
878
879want_blkid = get_option('blkid')
31e57a35 880if want_blkid != 'false' and not fuzzer_build
37efbbd8 881 libblkid = dependency('blkid', required : want_blkid == 'true')
349cc4a5 882 have = libblkid.found()
5c23128d 883else
349cc4a5 884 have = false
37efbbd8 885 libblkid = []
5c23128d 886endif
349cc4a5 887conf.set10('HAVE_BLKID', have)
5c23128d
ZJS
888
889want_kmod = get_option('kmod')
31e57a35 890if want_kmod != 'false' and not fuzzer_build
37efbbd8
ZJS
891 libkmod = dependency('libkmod',
892 version : '>= 15',
893 required : want_kmod == 'true')
349cc4a5 894 have = libkmod.found()
5c23128d 895else
349cc4a5 896 have = false
37efbbd8 897 libkmod = []
5c23128d 898endif
349cc4a5 899conf.set10('HAVE_KMOD', have)
5c23128d
ZJS
900
901want_pam = get_option('pam')
31e57a35 902if want_pam != 'false' and not fuzzer_build
37efbbd8
ZJS
903 libpam = cc.find_library('pam', required : want_pam == 'true')
904 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
349cc4a5 905 have = libpam.found() and libpam_misc.found()
5c23128d 906else
349cc4a5 907 have = false
37efbbd8
ZJS
908 libpam = []
909 libpam_misc = []
5c23128d 910endif
349cc4a5 911conf.set10('HAVE_PAM', have)
5c23128d
ZJS
912
913want_microhttpd = get_option('microhttpd')
31e57a35 914if want_microhttpd != 'false' and not fuzzer_build
37efbbd8
ZJS
915 libmicrohttpd = dependency('libmicrohttpd',
916 version : '>= 0.9.33',
917 required : want_microhttpd == 'true')
349cc4a5 918 have = libmicrohttpd.found()
5c23128d 919else
349cc4a5 920 have = false
37efbbd8 921 libmicrohttpd = []
5c23128d 922endif
349cc4a5 923conf.set10('HAVE_MICROHTTPD', have)
5c23128d
ZJS
924
925want_libcryptsetup = get_option('libcryptsetup')
31e57a35 926if want_libcryptsetup != 'false' and not fuzzer_build
37efbbd8
ZJS
927 libcryptsetup = dependency('libcryptsetup',
928 version : '>= 1.6.0',
929 required : want_libcryptsetup == 'true')
349cc4a5 930 have = libcryptsetup.found()
a9fc6406
DJL
931 have_sector = cc.has_member(
932 'struct crypt_params_plain',
933 'sector_size',
934 prefix : '#include <libcryptsetup.h>')
5c23128d 935else
349cc4a5 936 have = false
a9fc6406 937 have_sector = false
37efbbd8 938 libcryptsetup = []
5c23128d 939endif
349cc4a5 940conf.set10('HAVE_LIBCRYPTSETUP', have)
a9fc6406 941conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
5c23128d
ZJS
942
943want_libcurl = get_option('libcurl')
31e57a35 944if want_libcurl != 'false' and not fuzzer_build
37efbbd8
ZJS
945 libcurl = dependency('libcurl',
946 version : '>= 7.32.0',
947 required : want_libcurl == 'true')
349cc4a5 948 have = libcurl.found()
5c23128d 949else
349cc4a5 950 have = false
37efbbd8 951 libcurl = []
5c23128d 952endif
349cc4a5 953conf.set10('HAVE_LIBCURL', have)
5c23128d
ZJS
954
955want_libidn = get_option('libidn')
87057e24
ZJS
956want_libidn2 = get_option('libidn2')
957if want_libidn == 'true' and want_libidn2 == 'true'
958 error('libidn and libidn2 cannot be requested simultaneously')
959endif
960
31e57a35 961if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
7f7ab228
ZJS
962 libidn = dependency('libidn',
963 required : want_libidn == 'true')
349cc4a5 964 have = libidn.found()
87057e24 965else
349cc4a5 966 have = false
87057e24
ZJS
967 libidn = []
968endif
349cc4a5 969conf.set10('HAVE_LIBIDN', have)
31e57a35 970if not have and want_libidn2 != 'false' and not fuzzer_build
7f7ab228
ZJS
971 # libidn is used for both libidn and libidn2 objects
972 libidn = dependency('libidn2',
973 required : want_libidn2 == 'true')
349cc4a5
ZJS
974 have = libidn.found()
975else
976 have = false
5c23128d 977endif
349cc4a5 978conf.set10('HAVE_LIBIDN2', have)
5c23128d
ZJS
979
980want_libiptc = get_option('libiptc')
31e57a35 981if want_libiptc != 'false' and not fuzzer_build
37efbbd8
ZJS
982 libiptc = dependency('libiptc',
983 required : want_libiptc == 'true')
349cc4a5 984 have = libiptc.found()
5c23128d 985else
349cc4a5 986 have = false
37efbbd8 987 libiptc = []
5c23128d 988endif
349cc4a5 989conf.set10('HAVE_LIBIPTC', have)
5c23128d
ZJS
990
991want_qrencode = get_option('qrencode')
31e57a35 992if want_qrencode != 'false' and not fuzzer_build
37efbbd8
ZJS
993 libqrencode = dependency('libqrencode',
994 required : want_qrencode == 'true')
349cc4a5 995 have = libqrencode.found()
5c23128d 996else
349cc4a5 997 have = false
37efbbd8 998 libqrencode = []
5c23128d 999endif
349cc4a5 1000conf.set10('HAVE_QRENCODE', have)
5c23128d 1001
a44fb601 1002want_gcrypt = get_option('gcrypt')
31e57a35 1003if want_gcrypt != 'false' and not fuzzer_build
a44fb601
ZJS
1004 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1005 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
349cc4a5 1006 have = libgcrypt.found() and libgpg_error.found()
a44fb601 1007else
349cc4a5
ZJS
1008 have = false
1009endif
1010if not have
1011 # link to neither of the libs if one is not found
a44fb601
ZJS
1012 libgcrypt = []
1013 libgpg_error = []
1014endif
349cc4a5 1015conf.set10('HAVE_GCRYPT', have)
a44fb601 1016
5c23128d 1017want_gnutls = get_option('gnutls')
31e57a35 1018if want_gnutls != 'false' and not fuzzer_build
37efbbd8
ZJS
1019 libgnutls = dependency('gnutls',
1020 version : '>= 3.1.4',
1021 required : want_gnutls == 'true')
349cc4a5 1022 have = libgnutls.found()
5c23128d 1023else
349cc4a5 1024 have = false
37efbbd8 1025 libgnutls = []
5c23128d 1026endif
349cc4a5 1027conf.set10('HAVE_GNUTLS', have)
5c23128d 1028
096cbdce
IT
1029want_openssl = get_option('openssl')
1030if want_openssl != 'false' and not fuzzer_build
1031 libopenssl = dependency('openssl',
1032 version : '>= 1.1.0',
1033 required : want_openssl == 'true')
1034 have = libopenssl.found()
1035else
1036 have = false
1037 libopenssl = []
1038endif
1039conf.set10('HAVE_OPENSSL', have)
1040
5c23128d 1041want_elfutils = get_option('elfutils')
31e57a35 1042if want_elfutils != 'false' and not fuzzer_build
37efbbd8
ZJS
1043 libdw = dependency('libdw',
1044 required : want_elfutils == 'true')
349cc4a5 1045 have = libdw.found()
5c23128d 1046else
349cc4a5 1047 have = false
37efbbd8 1048 libdw = []
5c23128d 1049endif
349cc4a5 1050conf.set10('HAVE_ELFUTILS', have)
5c23128d
ZJS
1051
1052want_zlib = get_option('zlib')
31e57a35 1053if want_zlib != 'false' and not fuzzer_build
37efbbd8
ZJS
1054 libz = dependency('zlib',
1055 required : want_zlib == 'true')
349cc4a5 1056 have = libz.found()
5c23128d 1057else
349cc4a5 1058 have = false
37efbbd8 1059 libz = []
5c23128d 1060endif
349cc4a5 1061conf.set10('HAVE_ZLIB', have)
5c23128d
ZJS
1062
1063want_bzip2 = get_option('bzip2')
31e57a35 1064if want_bzip2 != 'false' and not fuzzer_build
37efbbd8
ZJS
1065 libbzip2 = cc.find_library('bz2',
1066 required : want_bzip2 == 'true')
349cc4a5 1067 have = libbzip2.found()
5c23128d 1068else
349cc4a5 1069 have = false
37efbbd8 1070 libbzip2 = []
5c23128d 1071endif
349cc4a5 1072conf.set10('HAVE_BZIP2', have)
5c23128d
ZJS
1073
1074want_xz = get_option('xz')
31e57a35 1075if want_xz != 'false' and not fuzzer_build
37efbbd8
ZJS
1076 libxz = dependency('liblzma',
1077 required : want_xz == 'true')
349cc4a5 1078 have = libxz.found()
5c23128d 1079else
349cc4a5 1080 have = false
37efbbd8 1081 libxz = []
5c23128d 1082endif
349cc4a5 1083conf.set10('HAVE_XZ', have)
5c23128d
ZJS
1084
1085want_lz4 = get_option('lz4')
31e57a35 1086if want_lz4 != 'false' and not fuzzer_build
37efbbd8
ZJS
1087 liblz4 = dependency('liblz4',
1088 required : want_lz4 == 'true')
349cc4a5 1089 have = liblz4.found()
5c23128d 1090else
349cc4a5 1091 have = false
37efbbd8 1092 liblz4 = []
5c23128d 1093endif
349cc4a5 1094conf.set10('HAVE_LZ4', have)
5c23128d 1095
a44fb601 1096want_xkbcommon = get_option('xkbcommon')
31e57a35 1097if want_xkbcommon != 'false' and not fuzzer_build
a44fb601
ZJS
1098 libxkbcommon = dependency('xkbcommon',
1099 version : '>= 0.3.0',
1100 required : want_xkbcommon == 'true')
349cc4a5 1101 have = libxkbcommon.found()
a44fb601 1102else
349cc4a5 1103 have = false
a44fb601
ZJS
1104 libxkbcommon = []
1105endif
349cc4a5 1106conf.set10('HAVE_XKBCOMMON', have)
a44fb601 1107
c4c978a0
ZJS
1108want_pcre2 = get_option('pcre2')
1109if want_pcre2 != 'false'
1110 libpcre2 = dependency('libpcre2-8',
1111 required : want_pcre2 == 'true')
1112 have = libpcre2.found()
1113else
1114 have = false
1115 libpcre2 = []
1116endif
1117conf.set10('HAVE_PCRE2', have)
1118
69e96427 1119want_glib = get_option('glib')
31e57a35 1120if want_glib != 'false' and not fuzzer_build
37efbbd8
ZJS
1121 libglib = dependency('glib-2.0',
1122 version : '>= 2.22.0',
1123 required : want_glib == 'true')
1124 libgobject = dependency('gobject-2.0',
1125 version : '>= 2.22.0',
1126 required : want_glib == 'true')
1127 libgio = dependency('gio-2.0',
1128 required : want_glib == 'true')
2c201c21 1129 have = libglib.found() and libgobject.found() and libgio.found()
69e96427 1130else
349cc4a5 1131 have = false
37efbbd8
ZJS
1132 libglib = []
1133 libgobject = []
1134 libgio = []
69e96427 1135endif
349cc4a5 1136conf.set10('HAVE_GLIB', have)
69e96427
ZJS
1137
1138want_dbus = get_option('dbus')
31e57a35 1139if want_dbus != 'false' and not fuzzer_build
37efbbd8
ZJS
1140 libdbus = dependency('dbus-1',
1141 version : '>= 1.3.2',
1142 required : want_dbus == 'true')
349cc4a5 1143 have = libdbus.found()
69e96427 1144else
349cc4a5 1145 have = false
37efbbd8 1146 libdbus = []
69e96427 1147endif
349cc4a5 1148conf.set10('HAVE_DBUS', have)
69e96427 1149
42303dcb 1150default_dnssec = get_option('default-dnssec')
31e57a35 1151if fuzzer_build
b4081f3e
JR
1152 default_dnssec = 'no'
1153endif
349cc4a5 1154if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
42303dcb
YW
1155 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1156 default_dnssec = 'no'
1157endif
1158conf.set('DEFAULT_DNSSEC_MODE',
1159 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1160substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1161
56ddbf10
YW
1162dns_over_tls = get_option('dns-over-tls')
1163if dns_over_tls != 'false'
096cbdce
IT
1164 if dns_over_tls == 'openssl'
1165 have_gnutls = false
1166 else
1167 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1168 if dns_over_tls == 'gnutls' and not have_gnutls
1169 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1170 endif
56ddbf10 1171 endif
096cbdce
IT
1172 if dns_over_tls == 'gnutls' or have_gnutls
1173 have_openssl = false
1174 else
1175 have_openssl = conf.get('HAVE_OPENSSL') == 1
1176 if dns_over_tls != 'auto' and not have_openssl
1177 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1178 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1179 endif
1180 endif
1181 have = have_gnutls or have_openssl
56ddbf10 1182else
096cbdce 1183 have = have_gnutls = have_openssl = false
56ddbf10
YW
1184endif
1185conf.set10('ENABLE_DNS_OVER_TLS', have)
096cbdce
IT
1186conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1187conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
56ddbf10 1188
c9299be2 1189default_dns_over_tls = get_option('default-dns-over-tls')
5d67a7ae 1190if fuzzer_build
c9299be2 1191 default_dns_over_tls = 'no'
5d67a7ae 1192endif
56ddbf10
YW
1193if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1194 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
c9299be2 1195 default_dns_over_tls = 'no'
5d67a7ae 1196endif
c9299be2
IT
1197conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1198 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1199substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
5d67a7ae 1200
5c23128d 1201want_importd = get_option('importd')
4390be30 1202if want_importd != 'false'
349cc4a5
ZJS
1203 have = (conf.get('HAVE_LIBCURL') == 1 and
1204 conf.get('HAVE_ZLIB') == 1 and
1205 conf.get('HAVE_BZIP2') == 1 and
1206 conf.get('HAVE_XZ') == 1 and
1207 conf.get('HAVE_GCRYPT') == 1)
1208 if want_importd == 'true' and not have
37efbbd8
ZJS
1209 error('importd support was requested, but dependencies are not available')
1210 endif
349cc4a5
ZJS
1211else
1212 have = false
5c23128d 1213endif
349cc4a5 1214conf.set10('ENABLE_IMPORTD', have)
5c23128d
ZJS
1215
1216want_remote = get_option('remote')
4390be30 1217if want_remote != 'false'
349cc4a5
ZJS
1218 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1219 conf.get('HAVE_LIBCURL') == 1]
37efbbd8
ZJS
1220 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1221 # it's possible to build one without the other. Complain only if
1222 # support was explictly requested. The auxiliary files like sysusers
1223 # config should be installed when any of the programs are built.
1224 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1225 error('remote support was requested, but dependencies are not available')
1226 endif
349cc4a5
ZJS
1227 have = have_deps[0] or have_deps[1]
1228else
1229 have = false
5c23128d 1230endif
349cc4a5 1231conf.set10('ENABLE_REMOTE', have)
5c23128d 1232
a9149d87
ZJS
1233foreach term : ['utmp',
1234 'hibernate',
1235 'environment-d',
1236 'binfmt',
1237 'coredump',
1238 'resolve',
1239 'logind',
1240 'hostnamed',
1241 'localed',
1242 'machined',
61d0578b 1243 'portabled',
a9149d87
ZJS
1244 'networkd',
1245 'timedated',
1246 'timesyncd',
a9149d87
ZJS
1247 'firstboot',
1248 'randomseed',
1249 'backlight',
1250 'vconsole',
1251 'quotacheck',
1252 'sysusers',
1253 'tmpfiles',
1254 'hwdb',
1255 'rfkill',
1256 'ldconfig',
1257 'efi',
1258 'tpm',
1259 'ima',
1260 'smack',
1261 'gshadow',
1262 'idn',
08540a95 1263 'nss-myhostname',
a9149d87
ZJS
1264 'nss-systemd']
1265 have = get_option(term)
1266 name = 'ENABLE_' + term.underscorify().to_upper()
1267 conf.set10(name, have)
5c23128d
ZJS
1268endforeach
1269
08540a95
YW
1270foreach tuple : [['nss-mymachines', 'machined'],
1271 ['nss-resolve', 'resolve']]
1272 want = get_option(tuple[0])
1273 if want != 'false'
1274 have = get_option(tuple[1])
1275 if want == 'true' and not have
1276 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1277 endif
1278 else
1279 have = false
1280 endif
1281 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1282 conf.set10(name, have)
1283endforeach
1284
1285enable_nss = false
1286foreach term : ['ENABLE_NSS_MYHOSTNAME',
1287 'ENABLE_NSS_MYMACHINES',
1288 'ENABLE_NSS_RESOLVE',
1289 'ENABLE_NSS_SYSTEMD']
1290 if conf.get(term) == 1
1291 enable_nss = true
1292 endif
1293endforeach
1294conf.set10('ENABLE_NSS', enable_nss)
1295
348b4437 1296conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
6129ec85 1297
69e96427 1298tests = []
7db7d5b7 1299fuzzers = []
69e96427 1300
b68dfb9e 1301conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
00d82c81 1302
5c23128d
ZJS
1303#####################################################################
1304
1305if get_option('efi')
37efbbd8 1306 efi_arch = host_machine.cpu_family()
b710072d 1307
6800fe7f 1308 if efi_arch == 'x86'
37efbbd8 1309 EFI_MACHINE_TYPE_NAME = 'ia32'
6800fe7f 1310 gnu_efi_arch = 'ia32'
37efbbd8
ZJS
1311 elif efi_arch == 'x86_64'
1312 EFI_MACHINE_TYPE_NAME = 'x64'
6800fe7f 1313 gnu_efi_arch = 'x86_64'
37efbbd8
ZJS
1314 elif efi_arch == 'arm'
1315 EFI_MACHINE_TYPE_NAME = 'arm'
6800fe7f 1316 gnu_efi_arch = 'arm'
37efbbd8
ZJS
1317 elif efi_arch == 'aarch64'
1318 EFI_MACHINE_TYPE_NAME = 'aa64'
6800fe7f 1319 gnu_efi_arch = 'aarch64'
37efbbd8
ZJS
1320 else
1321 EFI_MACHINE_TYPE_NAME = ''
6800fe7f 1322 gnu_efi_arch = ''
37efbbd8 1323 endif
5c23128d 1324
349cc4a5 1325 have = true
37efbbd8 1326 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
80c6fce8 1327
ac09340e 1328 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
349cc4a5
ZJS
1329else
1330 have = false
5c23128d 1331endif
349cc4a5 1332conf.set10('ENABLE_EFI', have)
5c23128d
ZJS
1333
1334#####################################################################
1335
1336config_h = configure_file(
37efbbd8
ZJS
1337 output : 'config.h',
1338 configuration : conf)
5c23128d 1339
348b4437
YW
1340meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1341
5c23128d
ZJS
1342includes = include_directories('src/basic',
1343 'src/shared',
1344 'src/systemd',
1345 'src/journal',
a38f7fec 1346 'src/journal-remote',
97d90615 1347 'src/nspawn',
5c23128d
ZJS
1348 'src/resolve',
1349 'src/timesync',
5c3376ef 1350 'src/time-wait-sync',
5c23128d
ZJS
1351 'src/login',
1352 'src/udev',
1353 'src/libudev',
1354 'src/core',
1355 'src/libsystemd/sd-bus',
1356 'src/libsystemd/sd-device',
1357 'src/libsystemd/sd-hwdb',
1358 'src/libsystemd/sd-id128',
1359 'src/libsystemd/sd-netlink',
1360 'src/libsystemd/sd-network',
1361 'src/libsystemd-network',
2d4ceca8 1362 '.')
5c23128d
ZJS
1363
1364add_project_arguments('-include', 'config.h', language : 'c')
1365
5c23128d
ZJS
1366subdir('po')
1367subdir('catalog')
1368subdir('src/systemd')
1369subdir('src/basic')
1370subdir('src/libsystemd')
1371subdir('src/libsystemd-network')
5c23128d 1372subdir('src/journal')
5c23128d 1373subdir('src/login')
5c23128d
ZJS
1374
1375libjournal_core = static_library(
37efbbd8
ZJS
1376 'journal-core',
1377 libjournal_core_sources,
1378 journald_gperf_c,
1379 include_directories : includes,
1380 install : false)
5c23128d 1381
37ab1a25 1382libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
5c23128d 1383libsystemd = shared_library(
37efbbd8 1384 'systemd',
7f1ea2cc 1385 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
56d50ab1 1386 version : libsystemd_version,
37efbbd8
ZJS
1387 include_directories : includes,
1388 link_args : ['-shared',
1389 '-Wl,--version-script=' + libsystemd_sym_path],
34e221a5
ZJS
1390 link_with : [libbasic,
1391 libbasic_gcrypt],
5e3cec87
ZJS
1392 link_whole : [libsystemd_static,
1393 libjournal_client],
37efbbd8
ZJS
1394 dependencies : [threads,
1395 librt,
1396 libxz,
1397 liblz4],
1398 link_depends : libsystemd_sym,
1399 install : true,
1400 install_dir : rootlibdir)
5c23128d 1401
70848ecf
DC
1402static_libsystemd = get_option('static-libsystemd')
1403static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1404
1405install_libsystemd_static = static_library(
1406 'systemd',
1407 libsystemd_sources,
1408 journal_client_sources,
975464e0
ZJS
1409 basic_sources,
1410 basic_gcrypt_sources,
70848ecf 1411 include_directories : includes,
70848ecf
DC
1412 build_by_default : static_libsystemd != 'false',
1413 install : static_libsystemd != 'false',
1414 install_dir : rootlibdir,
1415 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1416 dependencies : [threads,
1417 librt,
1418 libxz,
1419 liblz4,
975464e0
ZJS
1420 libcap,
1421 libblkid,
1422 libmount,
1423 libselinux,
70848ecf
DC
1424 libgcrypt],
1425 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1426
5c23128d
ZJS
1427############################################################
1428
83b6af36
ZJS
1429# binaries that have --help and are intended for use by humans,
1430# usually, but not always, installed in /bin.
1431public_programs = []
1432
1433subdir('src/libudev')
1434subdir('src/shared')
1435subdir('src/core')
1436subdir('src/udev')
1437subdir('src/network')
1438
1439subdir('src/analyze')
1440subdir('src/journal-remote')
1441subdir('src/coredump')
1442subdir('src/hostname')
1443subdir('src/import')
1444subdir('src/kernel-install')
1445subdir('src/locale')
1446subdir('src/machine')
61d0578b 1447subdir('src/portable')
83b6af36
ZJS
1448subdir('src/nspawn')
1449subdir('src/resolve')
1450subdir('src/timedate')
1451subdir('src/timesync')
1452subdir('src/vconsole')
83b6af36
ZJS
1453subdir('src/boot/efi')
1454
1455subdir('src/test')
7db7d5b7 1456subdir('src/fuzz')
6b97bf22 1457subdir('rules')
83b6af36
ZJS
1458subdir('test')
1459
1460############################################################
1461
1462# only static linking apart from libdl, to make sure that the
1463# module is linked to all libraries that it uses.
1464test_dlopen = executable(
37efbbd8
ZJS
1465 'test-dlopen',
1466 test_dlopen_c,
1467 include_directories : includes,
1468 link_with : [libbasic],
1469 dependencies : [libdl])
83b6af36 1470
08540a95 1471foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
e7e11bbf 1472 ['systemd', 'ENABLE_NSS_SYSTEMD'],
08540a95
YW
1473 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1474 ['resolve', 'ENABLE_NSS_RESOLVE']]
5c23128d 1475
349cc4a5 1476 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
37efbbd8
ZJS
1477 if condition
1478 module = tuple[0]
37efbbd8
ZJS
1479
1480 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1481 version_script_arg = join_paths(meson.current_source_dir(), sym)
1482
1483 nss = shared_library(
1484 'nss_' + module,
1485 'src/nss-@0@/nss-@0@.c'.format(module),
1486 version : '2',
1487 include_directories : includes,
b4b36f44
LP
1488 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1489 link_args : ['-Wl,-z,nodelete',
1490 '-shared',
37efbbd8
ZJS
1491 '-Wl,--version-script=' + version_script_arg,
1492 '-Wl,--undefined'],
37e4d7a8 1493 link_with : [libsystemd_static,
37efbbd8
ZJS
1494 libbasic],
1495 dependencies : [threads,
5486a31d 1496 librt],
37efbbd8
ZJS
1497 link_depends : sym,
1498 install : true,
1499 install_dir : rootlibdir)
1500
1501 # We cannot use shared_module because it does not support version suffix.
1502 # Unfortunately shared_library insists on creating the symlink…
1503 meson.add_install_script('sh', '-c',
1504 'rm $DESTDIR@0@/libnss_@1@.so'
1505 .format(rootlibdir, module))
1506
1507 test('dlopen-nss_' + module,
1508 test_dlopen,
1509 args : [nss.full_path()]) # path to dlopen must include a slash
1510 endif
5c23128d
ZJS
1511endforeach
1512
1513############################################################
1514
5c23128d
ZJS
1515executable('systemd',
1516 systemd_sources,
1517 include_directories : includes,
1518 link_with : [libcore,
34ce0a52 1519 libshared],
5c23128d
ZJS
1520 dependencies : [threads,
1521 librt,
1522 libseccomp,
1523 libselinux,
f4ee10a2
ZJS
1524 libmount,
1525 libblkid],
421f0012 1526 install_rpath : rootlibexecdir,
5c23128d
ZJS
1527 install : true,
1528 install_dir : rootlibexecdir)
1529
ba7f4ae6
ZJS
1530meson.add_install_script(meson_make_symlink,
1531 join_paths(rootlibexecdir, 'systemd'),
1532 join_paths(rootsbindir, 'init'))
1533
005a29f2
ZJS
1534exe = executable('systemd-analyze',
1535 systemd_analyze_sources,
1536 include_directories : includes,
1537 link_with : [libcore,
005a29f2
ZJS
1538 libshared],
1539 dependencies : [threads,
1540 librt,
1541 libseccomp,
1542 libselinux,
1543 libmount,
1544 libblkid],
1545 install_rpath : rootlibexecdir,
1546 install : true)
5a8b1640 1547public_programs += exe
5c23128d
ZJS
1548
1549executable('systemd-journald',
1550 systemd_journald_sources,
1551 include_directories : includes,
aac26058 1552 link_with : [libjournal_core,
34ce0a52 1553 libshared],
5c23128d
ZJS
1554 dependencies : [threads,
1555 libxz,
aac26058
ZJS
1556 liblz4,
1557 libselinux],
421f0012 1558 install_rpath : rootlibexecdir,
5c23128d
ZJS
1559 install : true,
1560 install_dir : rootlibexecdir)
1561
005a29f2
ZJS
1562exe = executable('systemd-cat',
1563 systemd_cat_sources,
1564 include_directories : includes,
1565 link_with : [libjournal_core,
34ce0a52 1566 libshared],
005a29f2
ZJS
1567 dependencies : [threads],
1568 install_rpath : rootlibexecdir,
1569 install : true)
5a8b1640 1570public_programs += exe
005a29f2
ZJS
1571
1572exe = executable('journalctl',
1573 journalctl_sources,
1574 include_directories : includes,
34ce0a52 1575 link_with : [libshared],
005a29f2
ZJS
1576 dependencies : [threads,
1577 libqrencode,
1578 libxz,
6becf48c
ZJS
1579 liblz4,
1580 libpcre2],
005a29f2
ZJS
1581 install_rpath : rootlibexecdir,
1582 install : true,
1583 install_dir : rootbindir)
5a8b1640 1584public_programs += exe
5c23128d
ZJS
1585
1586executable('systemd-getty-generator',
1587 'src/getty-generator/getty-generator.c',
5c23128d 1588 include_directories : includes,
b2fc5836
ZJS
1589 link_with : [libshared],
1590 install_rpath : rootlibexecdir,
1591 install : true,
1592 install_dir : systemgeneratordir)
5c23128d
ZJS
1593
1594executable('systemd-debug-generator',
1595 'src/debug-generator/debug-generator.c',
5c23128d 1596 include_directories : includes,
b2fc5836
ZJS
1597 link_with : [libshared],
1598 install_rpath : rootlibexecdir,
1599 install : true,
1600 install_dir : systemgeneratordir)
5c23128d
ZJS
1601
1602executable('systemd-fstab-generator',
1603 'src/fstab-generator/fstab-generator.c',
1604 'src/core/mount-setup.c',
5c23128d 1605 include_directories : includes,
b2fc5836
ZJS
1606 link_with : [libshared],
1607 install_rpath : rootlibexecdir,
1608 install : true,
1609 install_dir : systemgeneratordir)
5c23128d 1610
349cc4a5 1611if conf.get('ENABLE_ENVIRONMENT_D') == 1
37efbbd8
ZJS
1612 executable('30-systemd-environment-d-generator',
1613 'src/environment-d-generator/environment-d-generator.c',
1614 include_directories : includes,
1615 link_with : [libshared],
1616 install_rpath : rootlibexecdir,
1617 install : true,
1618 install_dir : userenvgeneratordir)
7b76fce1 1619
37efbbd8
ZJS
1620 meson.add_install_script(meson_make_symlink,
1621 join_paths(sysconfdir, 'environment'),
1622 join_paths(environmentdir, '99-environment.conf'))
5c23128d
ZJS
1623endif
1624
349cc4a5 1625if conf.get('ENABLE_HIBERNATE') == 1
37efbbd8
ZJS
1626 executable('systemd-hibernate-resume-generator',
1627 'src/hibernate-resume/hibernate-resume-generator.c',
1628 include_directories : includes,
1629 link_with : [libshared],
1630 install_rpath : rootlibexecdir,
1631 install : true,
1632 install_dir : systemgeneratordir)
5c23128d 1633
37efbbd8
ZJS
1634 executable('systemd-hibernate-resume',
1635 'src/hibernate-resume/hibernate-resume.c',
005a29f2
ZJS
1636 include_directories : includes,
1637 link_with : [libshared],
1638 install_rpath : rootlibexecdir,
1639 install : true,
1640 install_dir : rootlibexecdir)
37efbbd8
ZJS
1641endif
1642
349cc4a5 1643if conf.get('HAVE_BLKID') == 1
37efbbd8
ZJS
1644 executable('systemd-gpt-auto-generator',
1645 'src/gpt-auto-generator/gpt-auto-generator.c',
1646 'src/basic/blkid-util.h',
1647 include_directories : includes,
34ce0a52 1648 link_with : [libshared],
37efbbd8
ZJS
1649 dependencies : libblkid,
1650 install_rpath : rootlibexecdir,
1651 install : true,
1652 install_dir : systemgeneratordir)
1653
1654 exe = executable('systemd-dissect',
1655 'src/dissect/dissect.c',
1656 include_directories : includes,
1657 link_with : [libshared],
1658 install_rpath : rootlibexecdir,
1659 install : true,
1660 install_dir : rootlibexecdir)
5a8b1640 1661 public_programs += exe
5c23128d
ZJS
1662endif
1663
1ec57f33 1664if conf.get('ENABLE_RESOLVE') == 1
37efbbd8
ZJS
1665 executable('systemd-resolved',
1666 systemd_resolved_sources,
005a29f2 1667 include_directories : includes,
34e221a5 1668 link_with : [libshared,
568a4ff8
ZJS
1669 libbasic_gcrypt,
1670 libsystemd_resolve_core],
56ddbf10 1671 dependencies : systemd_resolved_dependencies,
005a29f2 1672 install_rpath : rootlibexecdir,
37efbbd8
ZJS
1673 install : true,
1674 install_dir : rootlibexecdir)
1675
c2e84cab
YW
1676 exe = executable('resolvectl',
1677 resolvectl_sources,
37efbbd8 1678 include_directories : includes,
34e221a5 1679 link_with : [libshared,
568a4ff8
ZJS
1680 libbasic_gcrypt,
1681 libsystemd_resolve_core],
37efbbd8 1682 dependencies : [threads,
76c87410 1683 libgpg_error,
37efbbd8
ZJS
1684 libm,
1685 libidn],
1686 install_rpath : rootlibexecdir,
1687 install : true)
5a8b1640 1688 public_programs += exe
088c1363
LP
1689
1690 meson.add_install_script(meson_make_symlink,
c2e84cab 1691 join_paths(bindir, 'resolvectl'),
088c1363 1692 join_paths(rootsbindir, 'resolvconf'))
c2e84cab
YW
1693
1694 meson.add_install_script(meson_make_symlink,
1695 join_paths(bindir, 'resolvectl'),
1696 join_paths(bindir, 'systemd-resolve'))
5c23128d
ZJS
1697endif
1698
349cc4a5 1699if conf.get('ENABLE_LOGIND') == 1
37efbbd8
ZJS
1700 executable('systemd-logind',
1701 systemd_logind_sources,
005a29f2 1702 include_directories : includes,
37efbbd8 1703 link_with : [liblogind_core,
34ce0a52 1704 libshared],
005a29f2 1705 dependencies : [threads,
37efbbd8 1706 libacl],
005a29f2
ZJS
1707 install_rpath : rootlibexecdir,
1708 install : true,
37efbbd8
ZJS
1709 install_dir : rootlibexecdir)
1710
1711 exe = executable('loginctl',
1712 loginctl_sources,
1713 include_directories : includes,
34ce0a52 1714 link_with : [libshared],
37efbbd8
ZJS
1715 dependencies : [threads,
1716 liblz4,
1717 libxz],
1718 install_rpath : rootlibexecdir,
1719 install : true,
1720 install_dir : rootbindir)
5a8b1640 1721 public_programs += exe
37efbbd8
ZJS
1722
1723 exe = executable('systemd-inhibit',
1724 'src/login/inhibit.c',
1725 include_directories : includes,
1726 link_with : [libshared],
1727 install_rpath : rootlibexecdir,
1728 install : true,
1729 install_dir : rootbindir)
5a8b1640 1730 public_programs += exe
37efbbd8 1731
349cc4a5 1732 if conf.get('HAVE_PAM') == 1
37efbbd8
ZJS
1733 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1734 pam_systemd = shared_library(
1735 'pam_systemd',
1736 pam_systemd_c,
1737 name_prefix : '',
1738 include_directories : includes,
1739 link_args : ['-shared',
1740 '-Wl,--version-script=' + version_script_arg],
37e4d7a8 1741 link_with : [libsystemd_static,
37efbbd8
ZJS
1742 libshared_static],
1743 dependencies : [threads,
1744 libpam,
1745 libpam_misc],
1746 link_depends : pam_systemd_sym,
1747 install : true,
1748 install_dir : pamlibdir)
1749
1750 test('dlopen-pam_systemd',
1751 test_dlopen,
1752 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1753 endif
1754endif
005a29f2 1755
a9f0f5e5
ZJS
1756executable('systemd-user-runtime-dir',
1757 user_runtime_dir_sources,
1758 include_directories : includes,
1759 link_with : [libshared, liblogind_core],
1760 install_rpath : rootlibexecdir,
1761 install : true,
1762 install_dir : rootlibexecdir)
1763
349cc4a5 1764if conf.get('HAVE_PAM') == 1
37efbbd8
ZJS
1765 executable('systemd-user-sessions',
1766 'src/user-sessions/user-sessions.c',
005a29f2 1767 include_directories : includes,
aac26058 1768 link_with : [libshared],
005a29f2
ZJS
1769 install_rpath : rootlibexecdir,
1770 install : true,
37efbbd8 1771 install_dir : rootlibexecdir)
5c23128d
ZJS
1772endif
1773
349cc4a5 1774if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
37efbbd8
ZJS
1775 exe = executable('bootctl',
1776 'src/boot/bootctl.c',
1777 include_directories : includes,
1778 link_with : [libshared],
1779 dependencies : [libblkid],
1780 install_rpath : rootlibexecdir,
1781 install : true)
5a8b1640 1782 public_programs += exe
005a29f2
ZJS
1783endif
1784
1785exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1786 include_directories : includes,
1787 link_with : [libshared],
1788 dependencies : [threads],
1789 install_rpath : rootlibexecdir,
1790 install : true)
5a8b1640 1791public_programs += exe
005a29f2 1792
f3794366
FS
1793
1794if get_option('link-systemctl-shared')
1795 systemctl_link_with = [libshared]
1796else
1797 systemctl_link_with = [libsystemd_static,
1798 libshared_static,
1799 libjournal_client,
1800 libbasic_gcrypt]
1801endif
1802
005a29f2
ZJS
1803exe = executable('systemctl', 'src/systemctl/systemctl.c',
1804 include_directories : includes,
f3794366 1805 link_with : systemctl_link_with,
005a29f2
ZJS
1806 dependencies : [threads,
1807 libcap,
1808 libselinux,
1809 libxz,
1810 liblz4],
1811 install_rpath : rootlibexecdir,
1812 install : true,
1813 install_dir : rootbindir)
5a8b1640 1814public_programs += exe
5c23128d 1815
61d0578b
LP
1816if conf.get('ENABLE_PORTABLED') == 1
1817 executable('systemd-portabled',
1818 systemd_portabled_sources,
1819 include_directories : includes,
1820 link_with : [libshared],
1821 dependencies : [threads],
1822 install_rpath : rootlibexecdir,
1823 install : true,
1824 install_dir : rootlibexecdir)
1825
1826 exe = executable('portablectl', 'src/portable/portablectl.c',
1827 include_directories : includes,
1828 link_with : [libshared],
1829 dependencies : [threads],
1830 install_rpath : rootlibexecdir,
1831 install : true,
1832 install_dir : rootlibexecdir)
5a8b1640 1833 public_programs += exe
61d0578b
LP
1834endif
1835
ba7f4ae6
ZJS
1836foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1837 meson.add_install_script(meson_make_symlink,
1838 join_paths(rootbindir, 'systemctl'),
1839 join_paths(rootsbindir, alias))
1840endforeach
1841
349cc4a5 1842if conf.get('ENABLE_BACKLIGHT') == 1
37efbbd8
ZJS
1843 executable('systemd-backlight',
1844 'src/backlight/backlight.c',
1845 include_directories : includes,
34ce0a52 1846 link_with : [libshared],
37efbbd8
ZJS
1847 install_rpath : rootlibexecdir,
1848 install : true,
1849 install_dir : rootlibexecdir)
5c23128d
ZJS
1850endif
1851
349cc4a5 1852if conf.get('ENABLE_RFKILL') == 1
37efbbd8
ZJS
1853 executable('systemd-rfkill',
1854 'src/rfkill/rfkill.c',
1855 include_directories : includes,
34ce0a52 1856 link_with : [libshared],
37efbbd8
ZJS
1857 install_rpath : rootlibexecdir,
1858 install : true,
1859 install_dir : rootlibexecdir)
5c23128d
ZJS
1860endif
1861
1862executable('systemd-system-update-generator',
1863 'src/system-update-generator/system-update-generator.c',
1864 include_directories : includes,
1865 link_with : [libshared],
b2fc5836 1866 install_rpath : rootlibexecdir,
5c23128d
ZJS
1867 install : true,
1868 install_dir : systemgeneratordir)
1869
349cc4a5 1870if conf.get('HAVE_LIBCRYPTSETUP') == 1
37efbbd8
ZJS
1871 executable('systemd-cryptsetup',
1872 'src/cryptsetup/cryptsetup.c',
1873 include_directories : includes,
1874 link_with : [libshared],
1875 dependencies : [libcryptsetup],
1876 install_rpath : rootlibexecdir,
1877 install : true,
1878 install_dir : rootlibexecdir)
1879
1880 executable('systemd-cryptsetup-generator',
1881 'src/cryptsetup/cryptsetup-generator.c',
1882 include_directories : includes,
1883 link_with : [libshared],
1884 dependencies : [libcryptsetup],
1885 install_rpath : rootlibexecdir,
1886 install : true,
1887 install_dir : systemgeneratordir)
1888
1889 executable('systemd-veritysetup',
1890 'src/veritysetup/veritysetup.c',
1891 include_directories : includes,
1892 link_with : [libshared],
1893 dependencies : [libcryptsetup],
1894 install_rpath : rootlibexecdir,
1895 install : true,
1896 install_dir : rootlibexecdir)
1897
1898 executable('systemd-veritysetup-generator',
1899 'src/veritysetup/veritysetup-generator.c',
1900 include_directories : includes,
1901 link_with : [libshared],
1902 dependencies : [libcryptsetup],
1903 install_rpath : rootlibexecdir,
1904 install : true,
1905 install_dir : systemgeneratordir)
5c23128d
ZJS
1906endif
1907
349cc4a5 1908if conf.get('HAVE_SYSV_COMPAT') == 1
37efbbd8
ZJS
1909 executable('systemd-sysv-generator',
1910 'src/sysv-generator/sysv-generator.c',
1911 include_directories : includes,
1912 link_with : [libshared],
1913 install_rpath : rootlibexecdir,
1914 install : true,
1915 install_dir : systemgeneratordir)
1916
1917 executable('systemd-rc-local-generator',
1918 'src/rc-local-generator/rc-local-generator.c',
1919 include_directories : includes,
1920 link_with : [libshared],
1921 install_rpath : rootlibexecdir,
1922 install : true,
1923 install_dir : systemgeneratordir)
5c23128d
ZJS
1924endif
1925
349cc4a5 1926if conf.get('ENABLE_HOSTNAMED') == 1
37efbbd8
ZJS
1927 executable('systemd-hostnamed',
1928 'src/hostname/hostnamed.c',
005a29f2 1929 include_directories : includes,
aac26058 1930 link_with : [libshared],
005a29f2 1931 install_rpath : rootlibexecdir,
37efbbd8
ZJS
1932 install : true,
1933 install_dir : rootlibexecdir)
1934
1935 exe = executable('hostnamectl',
1936 'src/hostname/hostnamectl.c',
1937 include_directories : includes,
1938 link_with : [libshared],
1939 install_rpath : rootlibexecdir,
1940 install : true)
5a8b1640 1941 public_programs += exe
5c23128d
ZJS
1942endif
1943
349cc4a5
ZJS
1944if conf.get('ENABLE_LOCALED') == 1
1945 if conf.get('HAVE_XKBCOMMON') == 1
37efbbd8
ZJS
1946 # logind will load libxkbcommon.so dynamically on its own
1947 deps = [libdl]
1948 else
1949 deps = []
1950 endif
1951
1952 executable('systemd-localed',
1953 systemd_localed_sources,
005a29f2 1954 include_directories : includes,
aac26058 1955 link_with : [libshared],
37efbbd8 1956 dependencies : deps,
005a29f2 1957 install_rpath : rootlibexecdir,
37efbbd8
ZJS
1958 install : true,
1959 install_dir : rootlibexecdir)
1960
1961 exe = executable('localectl',
1962 localectl_sources,
1963 include_directories : includes,
1964 link_with : [libshared],
1965 install_rpath : rootlibexecdir,
1966 install : true)
5a8b1640 1967 public_programs += exe
5c23128d
ZJS
1968endif
1969
349cc4a5 1970if conf.get('ENABLE_TIMEDATED') == 1
37efbbd8
ZJS
1971 executable('systemd-timedated',
1972 'src/timedate/timedated.c',
005a29f2 1973 include_directories : includes,
aac26058 1974 link_with : [libshared],
37efbbd8
ZJS
1975 install_rpath : rootlibexecdir,
1976 install : true,
1977 install_dir : rootlibexecdir)
6129ec85 1978endif
5c23128d 1979
6129ec85 1980if conf.get('ENABLE_TIMEDATECTL') == 1
37efbbd8
ZJS
1981 exe = executable('timedatectl',
1982 'src/timedate/timedatectl.c',
1983 include_directories : includes,
1984 install_rpath : rootlibexecdir,
1985 link_with : [libshared],
6129ec85 1986 dependencies : [libm],
37efbbd8 1987 install : true)
5a8b1640 1988 public_programs += exe
5c23128d
ZJS
1989endif
1990
349cc4a5 1991if conf.get('ENABLE_TIMESYNCD') == 1
37efbbd8
ZJS
1992 executable('systemd-timesyncd',
1993 systemd_timesyncd_sources,
005a29f2 1994 include_directories : includes,
aac26058 1995 link_with : [libshared],
005a29f2 1996 dependencies : [threads,
37efbbd8 1997 libm],
005a29f2
ZJS
1998 install_rpath : rootlibexecdir,
1999 install : true,
37efbbd8 2000 install_dir : rootlibexecdir)
5c3376ef
PB
2001
2002 executable('systemd-time-wait-sync',
2003 'src/time-wait-sync/time-wait-sync.c',
2004 include_directories : includes,
2005 link_with : [libshared],
2006 install_rpath : rootlibexecdir,
2007 install : true,
2008 install_dir : rootlibexecdir)
5c23128d
ZJS
2009endif
2010
349cc4a5 2011if conf.get('ENABLE_MACHINED') == 1
37efbbd8
ZJS
2012 executable('systemd-machined',
2013 systemd_machined_sources,
2014 include_directories : includes,
2015 link_with : [libmachine_core,
2016 libshared],
2017 install_rpath : rootlibexecdir,
2018 install : true,
2019 install_dir : rootlibexecdir)
2020
2021 exe = executable('machinectl',
2022 'src/machine/machinectl.c',
2023 include_directories : includes,
2024 link_with : [libshared],
2025 dependencies : [threads,
2026 libxz,
2027 liblz4],
2028 install_rpath : rootlibexecdir,
2029 install : true,
2030 install_dir : rootbindir)
5a8b1640 2031 public_programs += exe
5c23128d
ZJS
2032endif
2033
349cc4a5 2034if conf.get('ENABLE_IMPORTD') == 1
37efbbd8
ZJS
2035 executable('systemd-importd',
2036 systemd_importd_sources,
005a29f2 2037 include_directories : includes,
aac26058 2038 link_with : [libshared],
37efbbd8 2039 dependencies : [threads],
005a29f2
ZJS
2040 install_rpath : rootlibexecdir,
2041 install : true,
2042 install_dir : rootlibexecdir)
37efbbd8
ZJS
2043
2044 systemd_pull = executable('systemd-pull',
2045 systemd_pull_sources,
2046 include_directories : includes,
2047 link_with : [libshared],
2048 dependencies : [libcurl,
2049 libz,
2050 libbzip2,
2051 libxz,
2052 libgcrypt],
2053 install_rpath : rootlibexecdir,
2054 install : true,
2055 install_dir : rootlibexecdir)
2056
2057 systemd_import = executable('systemd-import',
2058 systemd_import_sources,
2059 include_directories : includes,
2060 link_with : [libshared],
2061 dependencies : [libcurl,
2062 libz,
2063 libbzip2,
2064 libxz],
2065 install_rpath : rootlibexecdir,
2066 install : true,
2067 install_dir : rootlibexecdir)
2068
2069 systemd_export = executable('systemd-export',
2070 systemd_export_sources,
2071 include_directories : includes,
2072 link_with : [libshared],
2073 dependencies : [libcurl,
2074 libz,
2075 libbzip2,
2076 libxz],
2077 install_rpath : rootlibexecdir,
2078 install : true,
2079 install_dir : rootlibexecdir)
2080 public_programs += [systemd_pull, systemd_import, systemd_export]
2081endif
2082
349cc4a5 2083if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
37efbbd8
ZJS
2084 exe = executable('systemd-journal-upload',
2085 systemd_journal_upload_sources,
2086 include_directories : includes,
2087 link_with : [libshared],
2088 dependencies : [threads,
2089 libcurl,
2090 libgnutls,
2091 libxz,
2092 liblz4],
2093 install_rpath : rootlibexecdir,
2094 install : true,
2095 install_dir : rootlibexecdir)
5a8b1640 2096 public_programs += exe
5c23128d
ZJS
2097endif
2098
349cc4a5 2099if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
37efbbd8
ZJS
2100 s_j_remote = executable('systemd-journal-remote',
2101 systemd_journal_remote_sources,
2102 include_directories : includes,
c064d8db
ZJS
2103 link_with : [libshared,
2104 libsystemd_journal_remote],
37efbbd8
ZJS
2105 dependencies : [threads,
2106 libmicrohttpd,
2107 libgnutls,
2108 libxz,
2109 liblz4],
2110 install_rpath : rootlibexecdir,
2111 install : true,
2112 install_dir : rootlibexecdir)
2113
2114 s_j_gatewayd = executable('systemd-journal-gatewayd',
2115 systemd_journal_gatewayd_sources,
2116 include_directories : includes,
2117 link_with : [libshared],
2118 dependencies : [threads,
2119 libmicrohttpd,
2120 libgnutls,
2121 libxz,
2122 liblz4],
2123 install_rpath : rootlibexecdir,
2124 install : true,
2125 install_dir : rootlibexecdir)
2126 public_programs += [s_j_remote, s_j_gatewayd]
5c23128d
ZJS
2127endif
2128
349cc4a5 2129if conf.get('ENABLE_COREDUMP') == 1
37efbbd8
ZJS
2130 executable('systemd-coredump',
2131 systemd_coredump_sources,
005a29f2 2132 include_directories : includes,
aac26058 2133 link_with : [libshared],
005a29f2 2134 dependencies : [threads,
37efbbd8
ZJS
2135 libacl,
2136 libdw,
005a29f2
ZJS
2137 libxz,
2138 liblz4],
2139 install_rpath : rootlibexecdir,
37efbbd8
ZJS
2140 install : true,
2141 install_dir : rootlibexecdir)
2142
2143 exe = executable('coredumpctl',
2144 coredumpctl_sources,
2145 include_directories : includes,
2146 link_with : [libshared],
2147 dependencies : [threads,
2148 libxz,
2149 liblz4],
2150 install_rpath : rootlibexecdir,
2151 install : true)
5a8b1640 2152 public_programs += exe
5c23128d
ZJS
2153endif
2154
349cc4a5 2155if conf.get('ENABLE_BINFMT') == 1
37efbbd8
ZJS
2156 exe = executable('systemd-binfmt',
2157 'src/binfmt/binfmt.c',
2158 include_directories : includes,
2159 link_with : [libshared],
2160 install_rpath : rootlibexecdir,
2161 install : true,
2162 install_dir : rootlibexecdir)
5a8b1640 2163 public_programs += exe
37efbbd8
ZJS
2164
2165 meson.add_install_script('sh', '-c',
2166 mkdir_p.format(binfmtdir))
2167 meson.add_install_script('sh', '-c',
2168 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2169endif
2170
349cc4a5 2171if conf.get('ENABLE_VCONSOLE') == 1
37efbbd8
ZJS
2172 executable('systemd-vconsole-setup',
2173 'src/vconsole/vconsole-setup.c',
005a29f2
ZJS
2174 include_directories : includes,
2175 link_with : [libshared],
2176 install_rpath : rootlibexecdir,
2177 install : true,
2178 install_dir : rootlibexecdir)
5c23128d
ZJS
2179endif
2180
349cc4a5 2181if conf.get('ENABLE_RANDOMSEED') == 1
37efbbd8
ZJS
2182 executable('systemd-random-seed',
2183 'src/random-seed/random-seed.c',
2184 include_directories : includes,
2185 link_with : [libshared],
2186 install_rpath : rootlibexecdir,
2187 install : true,
2188 install_dir : rootlibexecdir)
5c23128d
ZJS
2189endif
2190
349cc4a5 2191if conf.get('ENABLE_FIRSTBOOT') == 1
37efbbd8
ZJS
2192 executable('systemd-firstboot',
2193 'src/firstboot/firstboot.c',
2194 include_directories : includes,
2195 link_with : [libshared],
2196 dependencies : [libcrypt],
2197 install_rpath : rootlibexecdir,
2198 install : true,
2199 install_dir : rootbindir)
5c23128d
ZJS
2200endif
2201
2202executable('systemd-remount-fs',
2203 'src/remount-fs/remount-fs.c',
2204 'src/core/mount-setup.c',
2205 'src/core/mount-setup.h',
2206 include_directories : includes,
2207 link_with : [libshared],
b2fc5836 2208 install_rpath : rootlibexecdir,
5c23128d
ZJS
2209 install : true,
2210 install_dir : rootlibexecdir)
2211
2212executable('systemd-machine-id-setup',
2213 'src/machine-id-setup/machine-id-setup-main.c',
2214 'src/core/machine-id-setup.c',
2215 'src/core/machine-id-setup.h',
2216 include_directories : includes,
aac26058 2217 link_with : [libshared],
b2fc5836 2218 install_rpath : rootlibexecdir,
5c23128d
ZJS
2219 install : true,
2220 install_dir : rootbindir)
2221
2222executable('systemd-fsck',
2223 'src/fsck/fsck.c',
2224 include_directories : includes,
aac26058 2225 link_with : [libshared],
421f0012 2226 install_rpath : rootlibexecdir,
5c23128d
ZJS
2227 install : true,
2228 install_dir : rootlibexecdir)
2229
80750adb
ZJS
2230executable('systemd-growfs',
2231 'src/partition/growfs.c',
2232 include_directories : includes,
2233 link_with : [libshared],
c34b75a1 2234 dependencies : [libcryptsetup],
80750adb
ZJS
2235 install_rpath : rootlibexecdir,
2236 install : true,
2237 install_dir : rootlibexecdir)
2238
b7f28ac5
ZJS
2239executable('systemd-makefs',
2240 'src/partition/makefs.c',
2241 include_directories : includes,
2242 link_with : [libshared],
2243 install_rpath : rootlibexecdir,
2244 install : true,
2245 install_dir : rootlibexecdir)
2246
5c23128d
ZJS
2247executable('systemd-sleep',
2248 'src/sleep/sleep.c',
2249 include_directories : includes,
2250 link_with : [libshared],
421f0012 2251 install_rpath : rootlibexecdir,
5c23128d
ZJS
2252 install : true,
2253 install_dir : rootlibexecdir)
2254
005a29f2
ZJS
2255exe = executable('systemd-sysctl',
2256 'src/sysctl/sysctl.c',
2257 include_directories : includes,
2258 link_with : [libshared],
2259 install_rpath : rootlibexecdir,
2260 install : true,
2261 install_dir : rootlibexecdir)
5a8b1640 2262public_programs += exe
5c23128d
ZJS
2263
2264executable('systemd-ac-power',
2265 'src/ac-power/ac-power.c',
2266 include_directories : includes,
2267 link_with : [libshared],
421f0012 2268 install_rpath : rootlibexecdir,
5c23128d
ZJS
2269 install : true,
2270 install_dir : rootlibexecdir)
2271
005a29f2
ZJS
2272exe = executable('systemd-detect-virt',
2273 'src/detect-virt/detect-virt.c',
2274 include_directories : includes,
2275 link_with : [libshared],
2276 install_rpath : rootlibexecdir,
2277 install : true)
5a8b1640 2278public_programs += exe
005a29f2
ZJS
2279
2280exe = executable('systemd-delta',
2281 'src/delta/delta.c',
2282 include_directories : includes,
2283 link_with : [libshared],
2284 install_rpath : rootlibexecdir,
2285 install : true)
5a8b1640 2286public_programs += exe
005a29f2
ZJS
2287
2288exe = executable('systemd-escape',
2289 'src/escape/escape.c',
2290 include_directories : includes,
2291 link_with : [libshared],
2292 install_rpath : rootlibexecdir,
2293 install : true,
2294 install_dir : rootbindir)
5a8b1640 2295public_programs += exe
005a29f2
ZJS
2296
2297exe = executable('systemd-notify',
2298 'src/notify/notify.c',
2299 include_directories : includes,
2300 link_with : [libshared],
2301 install_rpath : rootlibexecdir,
2302 install : true,
2303 install_dir : rootbindir)
5a8b1640 2304public_programs += exe
5c23128d
ZJS
2305
2306executable('systemd-volatile-root',
2307 'src/volatile-root/volatile-root.c',
2308 include_directories : includes,
2309 link_with : [libshared],
421f0012 2310 install_rpath : rootlibexecdir,
5c23128d
ZJS
2311 install : true,
2312 install_dir : rootlibexecdir)
2313
2314executable('systemd-cgroups-agent',
2315 'src/cgroups-agent/cgroups-agent.c',
2316 include_directories : includes,
2317 link_with : [libshared],
421f0012 2318 install_rpath : rootlibexecdir,
5c23128d
ZJS
2319 install : true,
2320 install_dir : rootlibexecdir)
2321
005a29f2
ZJS
2322exe = executable('systemd-path',
2323 'src/path/path.c',
2324 include_directories : includes,
aac26058 2325 link_with : [libshared],
005a29f2
ZJS
2326 install_rpath : rootlibexecdir,
2327 install : true)
5a8b1640 2328public_programs += exe
005a29f2
ZJS
2329
2330exe = executable('systemd-ask-password',
2331 'src/ask-password/ask-password.c',
2332 include_directories : includes,
aac26058 2333 link_with : [libshared],
005a29f2
ZJS
2334 install_rpath : rootlibexecdir,
2335 install : true,
2336 install_dir : rootbindir)
5a8b1640 2337public_programs += exe
5c23128d
ZJS
2338
2339executable('systemd-reply-password',
2340 'src/reply-password/reply-password.c',
2341 include_directories : includes,
aac26058 2342 link_with : [libshared],
421f0012 2343 install_rpath : rootlibexecdir,
5c23128d
ZJS
2344 install : true,
2345 install_dir : rootlibexecdir)
2346
005a29f2
ZJS
2347exe = executable('systemd-tty-ask-password-agent',
2348 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2349 include_directories : includes,
aac26058 2350 link_with : [libshared],
005a29f2
ZJS
2351 install_rpath : rootlibexecdir,
2352 install : true,
2353 install_dir : rootbindir)
5a8b1640 2354public_programs += exe
005a29f2
ZJS
2355
2356exe = executable('systemd-cgls',
2357 'src/cgls/cgls.c',
2358 include_directories : includes,
aac26058 2359 link_with : [libshared],
005a29f2
ZJS
2360 install_rpath : rootlibexecdir,
2361 install : true)
5a8b1640 2362public_programs += exe
005a29f2
ZJS
2363
2364exe = executable('systemd-cgtop',
2365 'src/cgtop/cgtop.c',
2366 include_directories : includes,
aac26058 2367 link_with : [libshared],
005a29f2
ZJS
2368 install_rpath : rootlibexecdir,
2369 install : true)
5a8b1640 2370public_programs += exe
5c23128d
ZJS
2371
2372executable('systemd-initctl',
2373 'src/initctl/initctl.c',
2374 include_directories : includes,
aac26058 2375 link_with : [libshared],
421f0012 2376 install_rpath : rootlibexecdir,
5c23128d
ZJS
2377 install : true,
2378 install_dir : rootlibexecdir)
2379
005a29f2
ZJS
2380exe = executable('systemd-mount',
2381 'src/mount/mount-tool.c',
2382 include_directories : includes,
34ce0a52 2383 link_with : [libshared],
005a29f2
ZJS
2384 install_rpath : rootlibexecdir,
2385 install : true)
5a8b1640 2386public_programs += exe
5c23128d 2387
7b76fce1 2388meson.add_install_script(meson_make_symlink,
e17e5ba9 2389 'systemd-mount', join_paths(bindir, 'systemd-umount'))
7b76fce1 2390
005a29f2
ZJS
2391exe = executable('systemd-run',
2392 'src/run/run.c',
2393 include_directories : includes,
aac26058 2394 link_with : [libshared],
005a29f2
ZJS
2395 install_rpath : rootlibexecdir,
2396 install : true)
5a8b1640 2397public_programs += exe
005a29f2
ZJS
2398
2399exe = executable('systemd-stdio-bridge',
2400 'src/stdio-bridge/stdio-bridge.c',
2401 include_directories : includes,
aac26058 2402 link_with : [libshared],
005a29f2
ZJS
2403 install_rpath : rootlibexecdir,
2404 install : true)
5a8b1640 2405public_programs += exe
005a29f2
ZJS
2406
2407exe = executable('busctl',
2408 'src/busctl/busctl.c',
2409 'src/busctl/busctl-introspect.c',
2410 'src/busctl/busctl-introspect.h',
2411 include_directories : includes,
aac26058 2412 link_with : [libshared],
005a29f2
ZJS
2413 install_rpath : rootlibexecdir,
2414 install : true)
5a8b1640 2415public_programs += exe
5c23128d 2416
349cc4a5 2417if conf.get('ENABLE_SYSUSERS') == 1
37efbbd8
ZJS
2418 exe = executable('systemd-sysusers',
2419 'src/sysusers/sysusers.c',
2420 include_directories : includes,
2421 link_with : [libshared],
2422 install_rpath : rootlibexecdir,
2423 install : true,
2424 install_dir : rootbindir)
5a8b1640 2425 public_programs += exe
5c23128d
ZJS
2426endif
2427
349cc4a5 2428if conf.get('ENABLE_TMPFILES') == 1
37efbbd8
ZJS
2429 exe = executable('systemd-tmpfiles',
2430 'src/tmpfiles/tmpfiles.c',
2431 include_directories : includes,
2432 link_with : [libshared],
2433 dependencies : [libacl],
2434 install_rpath : rootlibexecdir,
2435 install : true,
2436 install_dir : rootbindir)
5a8b1640 2437 public_programs += exe
d9daae55
ZJS
2438
2439 test('test-systemd-tmpfiles',
2440 test_systemd_tmpfiles_py,
2441 args : exe.full_path())
2442 # https://github.com/mesonbuild/meson/issues/2681
5c23128d
ZJS
2443endif
2444
349cc4a5 2445if conf.get('ENABLE_HWDB') == 1
37efbbd8
ZJS
2446 exe = executable('systemd-hwdb',
2447 'src/hwdb/hwdb.c',
2448 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2449 include_directories : includes,
0c06b506 2450 link_with : [libudev_static],
0da6f396 2451 install_rpath : udev_rpath,
37efbbd8
ZJS
2452 install : true,
2453 install_dir : rootbindir)
5a8b1640 2454 public_programs += exe
37efbbd8
ZJS
2455endif
2456
349cc4a5 2457if conf.get('ENABLE_QUOTACHECK') == 1
37efbbd8
ZJS
2458 executable('systemd-quotacheck',
2459 'src/quotacheck/quotacheck.c',
005a29f2 2460 include_directories : includes,
aac26058 2461 link_with : [libshared],
005a29f2
ZJS
2462 install_rpath : rootlibexecdir,
2463 install : true,
37efbbd8 2464 install_dir : rootlibexecdir)
5c23128d
ZJS
2465endif
2466
005a29f2
ZJS
2467exe = executable('systemd-socket-proxyd',
2468 'src/socket-proxy/socket-proxyd.c',
2469 include_directories : includes,
aac26058 2470 link_with : [libshared],
005a29f2
ZJS
2471 dependencies : [threads],
2472 install_rpath : rootlibexecdir,
2473 install : true,
2474 install_dir : rootlibexecdir)
5a8b1640 2475public_programs += exe
005a29f2
ZJS
2476
2477exe = executable('systemd-udevd',
2478 systemd_udevd_sources,
2479 include_directories : includes,
5c72049f 2480 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
005a29f2 2481 link_with : [libudev_core,
005a29f2 2482 libsystemd_network,
0c06b506 2483 libudev_static],
3a30f21f
ZJS
2484 dependencies : [threads,
2485 libkmod,
005a29f2 2486 libidn,
aac26058
ZJS
2487 libacl,
2488 libblkid],
1aec3ed9 2489 install_rpath : udev_rpath,
005a29f2
ZJS
2490 install : true,
2491 install_dir : rootlibexecdir)
5a8b1640 2492public_programs += exe
005a29f2
ZJS
2493
2494exe = executable('udevadm',
2495 udevadm_sources,
6671e818 2496 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
005a29f2
ZJS
2497 include_directories : includes,
2498 link_with : [libudev_core,
005a29f2 2499 libsystemd_network,
0c06b506 2500 libudev_static],
3a30f21f
ZJS
2501 dependencies : [threads,
2502 libkmod,
005a29f2 2503 libidn,
aac26058
ZJS
2504 libacl,
2505 libblkid],
1aec3ed9 2506 install_rpath : udev_rpath,
005a29f2
ZJS
2507 install : true,
2508 install_dir : rootbindir)
5a8b1640 2509public_programs += exe
5c23128d
ZJS
2510
2511executable('systemd-shutdown',
2512 systemd_shutdown_sources,
2513 include_directories : includes,
34ce0a52 2514 link_with : [libshared],
95b862b0 2515 dependencies : [libmount],
421f0012 2516 install_rpath : rootlibexecdir,
5c23128d
ZJS
2517 install : true,
2518 install_dir : rootlibexecdir)
2519
2520executable('systemd-update-done',
2521 'src/update-done/update-done.c',
2522 include_directories : includes,
2523 link_with : [libshared],
421f0012 2524 install_rpath : rootlibexecdir,
5c23128d
ZJS
2525 install : true,
2526 install_dir : rootlibexecdir)
2527
2528executable('systemd-update-utmp',
2529 'src/update-utmp/update-utmp.c',
2530 include_directories : includes,
aac26058 2531 link_with : [libshared],
5c23128d 2532 dependencies : [libaudit],
421f0012 2533 install_rpath : rootlibexecdir,
5c23128d
ZJS
2534 install : true,
2535 install_dir : rootlibexecdir)
2536
349cc4a5 2537if conf.get('HAVE_KMOD') == 1
37efbbd8
ZJS
2538 executable('systemd-modules-load',
2539 'src/modules-load/modules-load.c',
2540 include_directories : includes,
2541 link_with : [libshared],
2542 dependencies : [libkmod],
2543 install_rpath : rootlibexecdir,
2544 install : true,
2545 install_dir : rootlibexecdir)
94e75a54 2546
37efbbd8
ZJS
2547 meson.add_install_script('sh', '-c',
2548 mkdir_p.format(modulesloaddir))
2549 meson.add_install_script('sh', '-c',
2550 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
5c23128d
ZJS
2551endif
2552
005a29f2
ZJS
2553exe = executable('systemd-nspawn',
2554 systemd_nspawn_sources,
2555 'src/core/mount-setup.c', # FIXME: use a variable?
2556 'src/core/mount-setup.h',
2557 'src/core/loopback-setup.c',
2558 'src/core/loopback-setup.h',
97d90615
ZJS
2559 include_directories : includes,
2560 link_with : [libnspawn_core,
2561 libshared],
2562 dependencies : [libblkid],
005a29f2
ZJS
2563 install_rpath : rootlibexecdir,
2564 install : true)
5a8b1640 2565public_programs += exe
5c23128d 2566
349cc4a5 2567if conf.get('ENABLE_NETWORKD') == 1
37efbbd8
ZJS
2568 executable('systemd-networkd',
2569 systemd_networkd_sources,
2570 include_directories : includes,
2571 link_with : [libnetworkd_core,
37efbbd8 2572 libsystemd_network,
0c06b506 2573 libudev_static,
37efbbd8 2574 libshared],
4b57a272 2575 dependencies : [threads],
37efbbd8
ZJS
2576 install_rpath : rootlibexecdir,
2577 install : true,
2578 install_dir : rootlibexecdir)
2579
2580 executable('systemd-networkd-wait-online',
2581 systemd_networkd_wait_online_sources,
2582 include_directories : includes,
2583 link_with : [libnetworkd_core,
2584 libshared],
2585 install_rpath : rootlibexecdir,
2586 install : true,
2587 install_dir : rootlibexecdir)
5c23128d 2588
dcfe072a
FS
2589 exe = executable('networkctl',
2590 networkctl_sources,
2591 include_directories : includes,
2592 link_with : [libsystemd_network,
aac26058 2593 libshared],
dcfe072a
FS
2594 install_rpath : rootlibexecdir,
2595 install : true,
2596 install_dir : rootbindir)
5a8b1640 2597 public_programs += exe
dcfe072a 2598endif
e821f6a9
ZJS
2599
2600executable('systemd-sulogin-shell',
2601 ['src/sulogin-shell/sulogin-shell.c'],
2602 include_directories : includes,
2603 link_with : [libshared],
2604 install_rpath : rootlibexecdir,
2605 install : true,
2606 install_dir : rootlibexecdir)
2607
69e96427
ZJS
2608############################################################
2609
e2d41370
FB
2610custom_target(
2611 'systemd-runtest.env',
2612 output : 'systemd-runtest.env',
2613 command : ['sh', '-c', '{ ' +
2614 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
49cdae63 2615 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
e2d41370
FB
2616 '} >@OUTPUT@'],
2617 build_by_default : true)
2618
69e96427 2619foreach tuple : tests
37efbbd8
ZJS
2620 sources = tuple[0]
2621 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2622 dependencies = tuple[2]
2623 condition = tuple.length() >= 4 ? tuple[3] : ''
2624 type = tuple.length() >= 5 ? tuple[4] : ''
2625 defs = tuple.length() >= 6 ? tuple[5] : []
2626 incs = tuple.length() >= 7 ? tuple[6] : includes
2627 timeout = 30
2628
2629 name = sources[0].split('/')[-1].split('.')[0]
2630 if type.startswith('timeout=')
2631 timeout = type.split('=')[1].to_int()
2632 type = ''
2633 endif
08318a2c
AD
2634 if want_tests == 'false'
2635 message('Not compiling @0@ because tests is set to false'.format(name))
2636 elif condition == '' or conf.get(condition) == 1
37efbbd8
ZJS
2637 exe = executable(
2638 name,
2639 sources,
2640 include_directories : incs,
2641 link_with : link_with,
2642 dependencies : dependencies,
2643 c_args : defs,
2644 install_rpath : rootlibexecdir,
7cdd9783
MB
2645 install : install_tests,
2646 install_dir : join_paths(testsdir, type))
37efbbd8
ZJS
2647
2648 if type == 'manual'
2649 message('@0@ is a manual test'.format(name))
2650 elif type == 'unsafe' and want_tests != 'unsafe'
2651 message('@0@ is an unsafe test'.format(name))
2652 else
2653 test(name, exe,
2654 env : test_env,
2655 timeout : timeout)
2656 endif
2657 else
2658 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2659 endif
69e96427
ZJS
2660endforeach
2661
0632b4cd 2662exe = executable(
37efbbd8
ZJS
2663 'test-libsystemd-sym',
2664 test_libsystemd_sym_c,
2665 include_directories : includes,
2666 link_with : [libsystemd],
2667 install : install_tests,
2668 install_dir : testsdir)
0632b4cd 2669test('test-libsystemd-sym', exe)
37ab1a25 2670
0632b4cd
ZJS
2671exe = executable(
2672 'test-libsystemd-static-sym',
2673 test_libsystemd_sym_c,
2674 include_directories : includes,
0632b4cd
ZJS
2675 link_with : [install_libsystemd_static],
2676 dependencies : [threads], # threads is already included in dependencies on the library,
2677 # but does not seem to get propagated. Add here as a work-around.
20f3d32d
DC
2678 build_by_default : static_libsystemd_pic,
2679 install : install_tests and static_libsystemd_pic,
0632b4cd 2680 install_dir : testsdir)
20f3d32d 2681if static_libsystemd_pic
0632b4cd
ZJS
2682 test('test-libsystemd-static-sym', exe)
2683endif
37ab1a25 2684
0632b4cd 2685exe = executable(
37efbbd8
ZJS
2686 'test-libudev-sym',
2687 test_libudev_sym_c,
2688 include_directories : includes,
2689 c_args : ['-Wno-deprecated-declarations'],
2690 link_with : [libudev],
2691 install : install_tests,
2692 install_dir : testsdir)
0632b4cd
ZJS
2693test('test-libudev-sym', exe)
2694
2695exe = executable(
2696 'test-libudev-static-sym',
2697 test_libudev_sym_c,
2698 include_directories : includes,
20f3d32d 2699 c_args : ['-Wno-deprecated-declarations'],
0632b4cd 2700 link_with : [install_libudev_static],
20f3d32d
DC
2701 build_by_default : static_libudev_pic,
2702 install : install_tests and static_libudev_pic,
0632b4cd 2703 install_dir : testsdir)
20f3d32d 2704if static_libudev_pic
0632b4cd
ZJS
2705 test('test-libudev-static-sym', exe)
2706endif
e0bec52f 2707
69e96427 2708############################################################
5c23128d 2709
7db7d5b7
JR
2710fuzzer_exes = []
2711
2712foreach tuple : fuzzers
2713 sources = tuple[0]
2714 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2715 dependencies = tuple[2]
2716 defs = tuple.length() >= 4 ? tuple[3] : []
2717 incs = tuple.length() >= 5 ? tuple[4] : includes
2718
31e57a35 2719 if fuzzer_build
7db7d5b7
JR
2720 dependencies += fuzzing_engine
2721 else
2722 sources += 'src/fuzz/fuzz-main.c'
2723 endif
2724
2725 name = sources[0].split('/')[-1].split('.')[0]
2726
2727 fuzzer_exes += executable(
2728 name,
2729 sources,
2730 include_directories : [incs, include_directories('src/fuzz')],
2731 link_with : link_with,
2732 dependencies : dependencies,
2733 c_args : defs,
2734 install : false)
2735endforeach
2736
2737run_target('fuzzers',
2738 depends : fuzzer_exes,
2739 command : ['true'])
2740
2741############################################################
2742
5c23128d
ZJS
2743make_directive_index_py = find_program('tools/make-directive-index.py')
2744make_man_index_py = find_program('tools/make-man-index.py')
b184e8fe 2745xml_helper_py = find_program('tools/xml_helper.py')
abba22c5 2746hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
5c23128d
ZJS
2747
2748subdir('units')
2749subdir('sysctl.d')
2750subdir('sysusers.d')
2751subdir('tmpfiles.d')
e783f957 2752subdir('presets')
5c23128d
ZJS
2753subdir('hwdb')
2754subdir('network')
2755subdir('man')
2756subdir('shell-completion/bash')
2757subdir('shell-completion/zsh')
9e825ebf
FB
2758subdir('docs/sysvinit')
2759subdir('docs/var-log')
5c23128d
ZJS
2760
2761# FIXME: figure out if the warning is true:
2762# https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2763install_subdir('factory/etc',
2764 install_dir : factorydir)
2765
2766
2767install_data('xorg/50-systemd-user.sh',
2768 install_dir : xinitrcdir)
582faeb4
DJL
2769install_data('modprobe.d/systemd.conf',
2770 install_dir : modprobedir)
f09eb768 2771install_data('LICENSE.GPL2',
5c23128d 2772 'LICENSE.LGPL2.1',
f09eb768
LP
2773 'NEWS',
2774 'README',
9e825ebf 2775 'docs/CODING_STYLE',
1d1cb168 2776 'docs/DISTRO_PORTING.md',
9e825ebf
FB
2777 'docs/ENVIRONMENT.md',
2778 'docs/HACKING',
2779 'docs/TRANSIENT-SETTINGS.md',
b6dc0d7d 2780 'docs/TRANSLATORS.md',
9e825ebf 2781 'docs/UIDS-GIDS.md',
5c23128d
ZJS
2782 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2783 install_dir : docdir)
d68b342b 2784
94e75a54
ZJS
2785meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2786meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2787
d68b342b
ZJS
2788############################################################
2789
005a29f2
ZJS
2790meson_check_help = find_program('tools/meson-check-help.sh')
2791
2792foreach exec : public_programs
37efbbd8
ZJS
2793 name = exec.full_path().split('/')[-1]
2794 test('check-help-' + name,
2795 meson_check_help,
2796 args : [exec.full_path()])
005a29f2
ZJS
2797endforeach
2798
2799############################################################
2800
52d4d1d3
ZJS
2801# Enable tests for all supported sanitizers
2802foreach tuple : sanitizers
2803 sanitizer = tuple[0]
2804 build = tuple[1]
b68dfb9e 2805
7a6397d2 2806 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
52d4d1d3
ZJS
2807 prev = ''
2808 foreach p : fuzz_regression_tests
2809 b = p.split('/')[-2]
2810 c = p.split('/')[-1]
2811
2812 name = '@0@:@1@'.format(b, sanitizer)
2813
2814 if name != prev
2815 if want_tests == 'false'
2816 message('Not compiling @0@ because tests is set to false'.format(name))
2817 elif slow_tests
2818 exe = custom_target(
2819 name,
2820 output : name,
2821 depends : build,
2822 command : [env, 'ln', '-fs',
2823 join_paths(build.full_path(), b),
2824 '@OUTPUT@'],
2825 build_by_default : true)
2826 else
2827 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2828 endif
2829 endif
2830 prev = name
2831
2832 if want_tests != 'false' and slow_tests
2833 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2834 env,
2835 args : [exe.full_path(),
2836 join_paths(meson.source_root(),
2837 'test/fuzz-regressions',
2838 p)])
2839 endif
2840 endforeach
b68dfb9e
ZJS
2841 endif
2842endforeach
2843
52d4d1d3 2844
b68dfb9e
ZJS
2845############################################################
2846
0700e8ba 2847if git.found()
37efbbd8
ZJS
2848 all_files = run_command(
2849 git,
450b60ba 2850 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
37efbbd8
ZJS
2851 'ls-files',
2852 ':/*.[ch]'])
2853 all_files = files(all_files.stdout().split())
d68b342b 2854
e85a690b 2855 custom_target(
0700e8ba 2856 'tags',
e85a690b 2857 output : 'tags',
25a82102 2858 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2f09974f 2859 run_target(
0700e8ba 2860 'ctags',
25a82102 2861 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
d68b342b 2862endif
177929c2
ZJS
2863
2864if git.found()
37efbbd8 2865 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
a923e085 2866 run_target(
37efbbd8 2867 'git-contrib',
37efbbd8 2868 command : [meson_git_contrib_sh])
177929c2 2869endif
dd6ab3df
ZJS
2870
2871if git.found()
2872 git_head = run_command(
2873 git,
450b60ba 2874 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
dd6ab3df
ZJS
2875 'rev-parse', 'HEAD']).stdout().strip()
2876 git_head_short = run_command(
2877 git,
450b60ba 2878 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
dd6ab3df
ZJS
2879 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2880
2881 run_target(
2882 'git-snapshot',
2883 command : ['git', 'archive',
450b60ba 2884 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
dd6ab3df
ZJS
2885 git_head_short),
2886 '--prefix', 'systemd-@0@/'.format(git_head),
2887 'HEAD'])
2888endif
829257d1
ZJS
2889
2890############################################################
2891
51b13863
LP
2892meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2893run_target(
2894 'check-api-docs',
2895 depends : [man, libsystemd, libudev],
2896 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2897
2898############################################################
2899
829257d1
ZJS
2900status = [
2901 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2902
2675413e 2903 'split /usr: @0@'.format(split_usr),
157baa87 2904 'split bin-sbin: @0@'.format(split_bin),
359b496f
YW
2905 'prefix directory: @0@'.format(prefixdir),
2906 'rootprefix directory: @0@'.format(rootprefixdir),
2907 'sysconf directory: @0@'.format(sysconfdir),
2908 'include directory: @0@'.format(includedir),
2909 'lib directory: @0@'.format(libdir),
2910 'rootlib directory: @0@'.format(rootlibdir),
829257d1
ZJS
2911 'SysV init scripts: @0@'.format(sysvinit_path),
2912 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
359b496f
YW
2913 'PAM modules directory: @0@'.format(pamlibdir),
2914 'PAM configuration directory: @0@'.format(pamconfdir),
2915 'RPM macros directory: @0@'.format(rpmmacrosdir),
2916 'modprobe.d directory: @0@'.format(modprobedir),
2917 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2918 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2919 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2920 'bash completions directory: @0@'.format(bashcompletiondir),
2921 'zsh completions directory: @0@'.format(zshcompletiondir),
829257d1
ZJS
2922 'extra start script: @0@'.format(get_option('rc-local')),
2923 'extra stop script: @0@'.format(get_option('halt-local')),
2924 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2925 get_option('debug-tty')),
2926 'TTY GID: @0@'.format(tty_gid),
ac09340e 2927 'users GID: @0@'.format(substs.get('USERS_GID')),
829257d1
ZJS
2928 'maximum system UID: @0@'.format(system_uid_max),
2929 'maximum system GID: @0@'.format(system_gid_max),
87d5e4f2
LP
2930 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2931 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2932 'minimum container UID base: @0@'.format(container_uid_base_min),
2933 'maximum container UID base: @0@'.format(container_uid_base_max),
829257d1 2934 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
4e15a734 2935 'render group access mode: @0@'.format(get_option('group-render-mode')),
359b496f 2936 'certificate root directory: @0@'.format(get_option('certificate-root')),
829257d1 2937 'support URL: @0@'.format(support_url),
afde4574
LP
2938 'nobody user name: @0@'.format(nobody_user),
2939 'nobody group name: @0@'.format(nobody_group),
829257d1 2940 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
5248e7e1 2941 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
829257d1
ZJS
2942
2943 'default DNSSEC mode: @0@'.format(default_dnssec),
c9299be2 2944 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
829257d1
ZJS
2945 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2946 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2947
2948alt_dns_servers = '\n '.join(dns_servers.split(' '))
2949alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2950status += [
2951 'default DNS servers: @0@'.format(alt_dns_servers),
2952 'default NTP servers: @0@'.format(alt_ntp_servers)]
2953
2954alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2955 '@@0@'.format(time_epoch)).stdout().strip()
2956status += [
2957 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2958
2959# TODO:
2960# CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2961# CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2962# LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2963
349cc4a5 2964if conf.get('ENABLE_EFI') == 1
5a8b1640 2965 status += 'efi arch: @0@'.format(efi_arch)
829257d1
ZJS
2966
2967 if have_gnu_efi
2968 status += [
2969 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2970 'EFI CC @0@'.format(efi_cc),
359b496f
YW
2971 'EFI lib directory: @0@'.format(efi_libdir),
2972 'EFI lds directory: @0@'.format(efi_ldsdir),
2973 'EFI include directory: @0@'.format(efi_incdir)]
829257d1
ZJS
2974 endif
2975endif
2976
2977found = []
2978missing = []
2979
2980foreach tuple : [
2981 ['libcryptsetup'],
2982 ['PAM'],
2983 ['AUDIT'],
2984 ['IMA'],
2985 ['AppArmor'],
2986 ['SELinux'],
2987 ['SECCOMP'],
2988 ['SMACK'],
2989 ['zlib'],
2990 ['xz'],
2991 ['lz4'],
2992 ['bzip2'],
2993 ['ACL'],
2994 ['gcrypt'],
2995 ['qrencode'],
2996 ['microhttpd'],
2997 ['gnutls'],
096cbdce 2998 ['openssl'],
829257d1 2999 ['libcurl'],
d1bf5675 3000 ['idn'],
87057e24 3001 ['libidn2'],
829257d1
ZJS
3002 ['libidn'],
3003 ['libiptc'],
3004 ['elfutils'],
3005 ['binfmt'],
3006 ['vconsole'],
3007 ['quotacheck'],
3008 ['tmpfiles'],
3009 ['environment.d'],
3010 ['sysusers'],
3011 ['firstboot'],
3012 ['randomseed'],
3013 ['backlight'],
3014 ['rfkill'],
3015 ['logind'],
3016 ['machined'],
61d0578b 3017 ['portabled'],
829257d1
ZJS
3018 ['importd'],
3019 ['hostnamed'],
3020 ['timedated'],
3021 ['timesyncd'],
3022 ['localed'],
3023 ['networkd'],
a7456af5 3024 ['resolve'],
096cbdce
IT
3025 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3026 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
829257d1
ZJS
3027 ['coredump'],
3028 ['polkit'],
3029 ['legacy pkla', install_polkit_pkla],
3030 ['efi'],
3031 ['gnu-efi', have_gnu_efi],
3032 ['kmod'],
3033 ['xkbcommon'],
c4c978a0 3034 ['pcre2'],
829257d1
ZJS
3035 ['blkid'],
3036 ['dbus'],
3037 ['glib'],
08540a95
YW
3038 ['nss-myhostname', conf.get('ENABLE_NSS_MYHOSTNAME') == 1],
3039 ['nss-mymachines', conf.get('ENABLE_NSS_MYMACHINES') == 1],
3040 ['nss-resolve', conf.get('ENABLE_NSS_RESOLVE') == 1],
3041 ['nss-systemd', conf.get('ENABLE_NSS_SYSTEMD') == 1],
829257d1
ZJS
3042 ['hwdb'],
3043 ['tpm'],
3044 ['man pages', want_man],
3045 ['html pages', want_html],
3046 ['man page indices', want_man and have_lxml],
829257d1
ZJS
3047 ['SysV compat'],
3048 ['utmp'],
3049 ['ldconfig'],
3050 ['hibernate'],
3051 ['adm group', get_option('adm-group')],
3052 ['wheel group', get_option('wheel-group')],
b14e1b43 3053 ['gshadow'],
829257d1
ZJS
3054 ['debug hashmap'],
3055 ['debug mmap cache'],
d18cb393 3056 ['valgrind', conf.get('VALGRIND') == 1],
829257d1
ZJS
3057]
3058
af4d7860
ZJS
3059 if tuple.length() >= 2
3060 cond = tuple[1]
3061 else
829257d1
ZJS
3062 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3063 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
349cc4a5 3064 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
829257d1
ZJS
3065 endif
3066 if cond
5a8b1640 3067 found += tuple[0]
829257d1 3068 else
5a8b1640 3069 missing += tuple[0]
829257d1
ZJS
3070 endif
3071endforeach
3072
3073status += [
9d39c1bf 3074 '',
829257d1 3075 'enabled features: @0@'.format(', '.join(found)),
9d39c1bf
ZJS
3076 '',
3077 'disabled features: @0@'.format(', '.join(missing)),
3078 '']
829257d1 3079message('\n '.join(status))
9a8e64b0
ZJS
3080
3081if rootprefixdir != rootprefix_default
8ea9fad7
YW
3082 warning('\n' +
3083 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3084 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3085 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
9a8e64b0 3086endif