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