]> git.ipfire.org Git - thirdparty/systemd.git/blame - meson.build
Move use_pool() to mempool.c and rename to mempool_enabled()
[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 783conf.set10('VALGRIND', get_option('valgrind'))
fd5dec9a 784conf.set10('LOG_TRACE', get_option('log-trace'))
d18cb393 785
5c23128d
ZJS
786#####################################################################
787
788threads = dependency('threads')
789librt = cc.find_library('rt')
790libm = cc.find_library('m')
791libdl = cc.find_library('dl')
792libcrypt = cc.find_library('crypt')
793
1800cc85
ZJS
794libcap = dependency('libcap', required : false)
795if not libcap.found()
796 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
797 libcap = cc.find_library('cap')
798endif
799
5c23128d 800libmount = dependency('mount',
c0b4b0f8 801 version : fuzzer_build ? '>= 0' : '>= 2.30')
5c23128d
ZJS
802
803want_seccomp = get_option('seccomp')
31e57a35 804if want_seccomp != 'false' and not fuzzer_build
37efbbd8 805 libseccomp = dependency('libseccomp',
9f0e9c01 806 version : '>= 2.3.1',
37efbbd8 807 required : want_seccomp == 'true')
349cc4a5 808 have = libseccomp.found()
5c23128d 809else
349cc4a5 810 have = false
37efbbd8 811 libseccomp = []
5c23128d 812endif
349cc4a5 813conf.set10('HAVE_SECCOMP', have)
5c23128d
ZJS
814
815want_selinux = get_option('selinux')
31e57a35 816if want_selinux != 'false' and not fuzzer_build
37efbbd8
ZJS
817 libselinux = dependency('libselinux',
818 version : '>= 2.1.9',
819 required : want_selinux == 'true')
349cc4a5 820 have = libselinux.found()
5c23128d 821else
349cc4a5 822 have = false
37efbbd8 823 libselinux = []
5c23128d 824endif
349cc4a5 825conf.set10('HAVE_SELINUX', have)
5c23128d
ZJS
826
827want_apparmor = get_option('apparmor')
31e57a35 828if want_apparmor != 'false' and not fuzzer_build
37efbbd8
ZJS
829 libapparmor = dependency('libapparmor',
830 required : want_apparmor == 'true')
349cc4a5 831 have = libapparmor.found()
5c23128d 832else
349cc4a5 833 have = false
37efbbd8 834 libapparmor = []
5c23128d 835endif
349cc4a5 836conf.set10('HAVE_APPARMOR', have)
5c23128d 837
5c23128d
ZJS
838smack_run_label = get_option('smack-run-label')
839if smack_run_label != ''
37efbbd8 840 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
5c23128d
ZJS
841endif
842
3ca0cb73
ZJS
843want_polkit = get_option('polkit')
844install_polkit = false
845install_polkit_pkla = false
31e57a35 846if want_polkit != 'false' and not fuzzer_build
37efbbd8 847 install_polkit = true
3ca0cb73 848
37efbbd8
ZJS
849 libpolkit = dependency('polkit-gobject-1',
850 required : false)
851 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
852 message('Old polkit detected, will install pkla files')
853 install_polkit_pkla = true
854 endif
3ca0cb73 855endif
349cc4a5 856conf.set10('ENABLE_POLKIT', install_polkit)
3ca0cb73 857
36f0387e 858want_acl = get_option('acl')
31e57a35 859if want_acl != 'false' and not fuzzer_build
36f0387e 860 libacl = cc.find_library('acl', required : want_acl == 'true')
349cc4a5 861 have = libacl.found()
36f0387e 862else
349cc4a5 863 have = false
36f0387e
ZJS
864 libacl = []
865endif
349cc4a5 866conf.set10('HAVE_ACL', have)
36f0387e 867
5c23128d 868want_audit = get_option('audit')
31e57a35 869if want_audit != 'false' and not fuzzer_build
37efbbd8 870 libaudit = dependency('audit', required : want_audit == 'true')
349cc4a5 871 have = libaudit.found()
5c23128d 872else
349cc4a5 873 have = false
37efbbd8 874 libaudit = []
5c23128d 875endif
349cc4a5 876conf.set10('HAVE_AUDIT', have)
5c23128d
ZJS
877
878want_blkid = get_option('blkid')
31e57a35 879if want_blkid != 'false' and not fuzzer_build
37efbbd8 880 libblkid = dependency('blkid', required : want_blkid == 'true')
349cc4a5 881 have = libblkid.found()
5c23128d 882else
349cc4a5 883 have = false
37efbbd8 884 libblkid = []
5c23128d 885endif
349cc4a5 886conf.set10('HAVE_BLKID', have)
5c23128d
ZJS
887
888want_kmod = get_option('kmod')
31e57a35 889if want_kmod != 'false' and not fuzzer_build
37efbbd8
ZJS
890 libkmod = dependency('libkmod',
891 version : '>= 15',
892 required : want_kmod == 'true')
349cc4a5 893 have = libkmod.found()
5c23128d 894else
349cc4a5 895 have = false
37efbbd8 896 libkmod = []
5c23128d 897endif
349cc4a5 898conf.set10('HAVE_KMOD', have)
5c23128d
ZJS
899
900want_pam = get_option('pam')
31e57a35 901if want_pam != 'false' and not fuzzer_build
37efbbd8
ZJS
902 libpam = cc.find_library('pam', required : want_pam == 'true')
903 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
349cc4a5 904 have = libpam.found() and libpam_misc.found()
5c23128d 905else
349cc4a5 906 have = false
37efbbd8
ZJS
907 libpam = []
908 libpam_misc = []
5c23128d 909endif
349cc4a5 910conf.set10('HAVE_PAM', have)
5c23128d
ZJS
911
912want_microhttpd = get_option('microhttpd')
31e57a35 913if want_microhttpd != 'false' and not fuzzer_build
37efbbd8
ZJS
914 libmicrohttpd = dependency('libmicrohttpd',
915 version : '>= 0.9.33',
916 required : want_microhttpd == 'true')
349cc4a5 917 have = libmicrohttpd.found()
5c23128d 918else
349cc4a5 919 have = false
37efbbd8 920 libmicrohttpd = []
5c23128d 921endif
349cc4a5 922conf.set10('HAVE_MICROHTTPD', have)
5c23128d
ZJS
923
924want_libcryptsetup = get_option('libcryptsetup')
31e57a35 925if want_libcryptsetup != 'false' and not fuzzer_build
37efbbd8
ZJS
926 libcryptsetup = dependency('libcryptsetup',
927 version : '>= 1.6.0',
928 required : want_libcryptsetup == 'true')
349cc4a5 929 have = libcryptsetup.found()
a9fc6406
DJL
930 have_sector = cc.has_member(
931 'struct crypt_params_plain',
932 'sector_size',
933 prefix : '#include <libcryptsetup.h>')
5c23128d 934else
349cc4a5 935 have = false
a9fc6406 936 have_sector = false
37efbbd8 937 libcryptsetup = []
5c23128d 938endif
349cc4a5 939conf.set10('HAVE_LIBCRYPTSETUP', have)
a9fc6406 940conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
5c23128d
ZJS
941
942want_libcurl = get_option('libcurl')
31e57a35 943if want_libcurl != 'false' and not fuzzer_build
37efbbd8
ZJS
944 libcurl = dependency('libcurl',
945 version : '>= 7.32.0',
946 required : want_libcurl == 'true')
349cc4a5 947 have = libcurl.found()
5c23128d 948else
349cc4a5 949 have = false
37efbbd8 950 libcurl = []
5c23128d 951endif
349cc4a5 952conf.set10('HAVE_LIBCURL', have)
5c23128d
ZJS
953
954want_libidn = get_option('libidn')
87057e24
ZJS
955want_libidn2 = get_option('libidn2')
956if want_libidn == 'true' and want_libidn2 == 'true'
957 error('libidn and libidn2 cannot be requested simultaneously')
958endif
959
31e57a35 960if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
7f7ab228
ZJS
961 libidn = dependency('libidn',
962 required : want_libidn == 'true')
349cc4a5 963 have = libidn.found()
87057e24 964else
349cc4a5 965 have = false
87057e24
ZJS
966 libidn = []
967endif
349cc4a5 968conf.set10('HAVE_LIBIDN', have)
31e57a35 969if not have and want_libidn2 != 'false' and not fuzzer_build
7f7ab228
ZJS
970 # libidn is used for both libidn and libidn2 objects
971 libidn = dependency('libidn2',
972 required : want_libidn2 == 'true')
349cc4a5
ZJS
973 have = libidn.found()
974else
975 have = false
5c23128d 976endif
349cc4a5 977conf.set10('HAVE_LIBIDN2', have)
5c23128d
ZJS
978
979want_libiptc = get_option('libiptc')
31e57a35 980if want_libiptc != 'false' and not fuzzer_build
37efbbd8
ZJS
981 libiptc = dependency('libiptc',
982 required : want_libiptc == 'true')
349cc4a5 983 have = libiptc.found()
5c23128d 984else
349cc4a5 985 have = false
37efbbd8 986 libiptc = []
5c23128d 987endif
349cc4a5 988conf.set10('HAVE_LIBIPTC', have)
5c23128d
ZJS
989
990want_qrencode = get_option('qrencode')
31e57a35 991if want_qrencode != 'false' and not fuzzer_build
37efbbd8
ZJS
992 libqrencode = dependency('libqrencode',
993 required : want_qrencode == 'true')
349cc4a5 994 have = libqrencode.found()
5c23128d 995else
349cc4a5 996 have = false
37efbbd8 997 libqrencode = []
5c23128d 998endif
349cc4a5 999conf.set10('HAVE_QRENCODE', have)
5c23128d 1000
a44fb601 1001want_gcrypt = get_option('gcrypt')
31e57a35 1002if want_gcrypt != 'false' and not fuzzer_build
a44fb601
ZJS
1003 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1004 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
349cc4a5 1005 have = libgcrypt.found() and libgpg_error.found()
a44fb601 1006else
349cc4a5
ZJS
1007 have = false
1008endif
1009if not have
1010 # link to neither of the libs if one is not found
a44fb601
ZJS
1011 libgcrypt = []
1012 libgpg_error = []
1013endif
349cc4a5 1014conf.set10('HAVE_GCRYPT', have)
a44fb601 1015
5c23128d 1016want_gnutls = get_option('gnutls')
31e57a35 1017if want_gnutls != 'false' and not fuzzer_build
37efbbd8
ZJS
1018 libgnutls = dependency('gnutls',
1019 version : '>= 3.1.4',
1020 required : want_gnutls == 'true')
349cc4a5 1021 have = libgnutls.found()
5c23128d 1022else
349cc4a5 1023 have = false
37efbbd8 1024 libgnutls = []
5c23128d 1025endif
349cc4a5 1026conf.set10('HAVE_GNUTLS', have)
5c23128d 1027
096cbdce
IT
1028want_openssl = get_option('openssl')
1029if want_openssl != 'false' and not fuzzer_build
1030 libopenssl = dependency('openssl',
1031 version : '>= 1.1.0',
1032 required : want_openssl == 'true')
1033 have = libopenssl.found()
1034else
1035 have = false
1036 libopenssl = []
1037endif
1038conf.set10('HAVE_OPENSSL', have)
1039
5c23128d 1040want_elfutils = get_option('elfutils')
31e57a35 1041if want_elfutils != 'false' and not fuzzer_build
37efbbd8
ZJS
1042 libdw = dependency('libdw',
1043 required : want_elfutils == 'true')
349cc4a5 1044 have = libdw.found()
5c23128d 1045else
349cc4a5 1046 have = false
37efbbd8 1047 libdw = []
5c23128d 1048endif
349cc4a5 1049conf.set10('HAVE_ELFUTILS', have)
5c23128d
ZJS
1050
1051want_zlib = get_option('zlib')
31e57a35 1052if want_zlib != 'false' and not fuzzer_build
37efbbd8
ZJS
1053 libz = dependency('zlib',
1054 required : want_zlib == 'true')
349cc4a5 1055 have = libz.found()
5c23128d 1056else
349cc4a5 1057 have = false
37efbbd8 1058 libz = []
5c23128d 1059endif
349cc4a5 1060conf.set10('HAVE_ZLIB', have)
5c23128d
ZJS
1061
1062want_bzip2 = get_option('bzip2')
31e57a35 1063if want_bzip2 != 'false' and not fuzzer_build
37efbbd8
ZJS
1064 libbzip2 = cc.find_library('bz2',
1065 required : want_bzip2 == 'true')
349cc4a5 1066 have = libbzip2.found()
5c23128d 1067else
349cc4a5 1068 have = false
37efbbd8 1069 libbzip2 = []
5c23128d 1070endif
349cc4a5 1071conf.set10('HAVE_BZIP2', have)
5c23128d
ZJS
1072
1073want_xz = get_option('xz')
31e57a35 1074if want_xz != 'false' and not fuzzer_build
37efbbd8
ZJS
1075 libxz = dependency('liblzma',
1076 required : want_xz == 'true')
349cc4a5 1077 have = libxz.found()
5c23128d 1078else
349cc4a5 1079 have = false
37efbbd8 1080 libxz = []
5c23128d 1081endif
349cc4a5 1082conf.set10('HAVE_XZ', have)
5c23128d
ZJS
1083
1084want_lz4 = get_option('lz4')
31e57a35 1085if want_lz4 != 'false' and not fuzzer_build
37efbbd8
ZJS
1086 liblz4 = dependency('liblz4',
1087 required : want_lz4 == 'true')
349cc4a5 1088 have = liblz4.found()
5c23128d 1089else
349cc4a5 1090 have = false
37efbbd8 1091 liblz4 = []
5c23128d 1092endif
349cc4a5 1093conf.set10('HAVE_LZ4', have)
5c23128d 1094
a44fb601 1095want_xkbcommon = get_option('xkbcommon')
31e57a35 1096if want_xkbcommon != 'false' and not fuzzer_build
a44fb601
ZJS
1097 libxkbcommon = dependency('xkbcommon',
1098 version : '>= 0.3.0',
1099 required : want_xkbcommon == 'true')
349cc4a5 1100 have = libxkbcommon.found()
a44fb601 1101else
349cc4a5 1102 have = false
a44fb601
ZJS
1103 libxkbcommon = []
1104endif
349cc4a5 1105conf.set10('HAVE_XKBCOMMON', have)
a44fb601 1106
c4c978a0
ZJS
1107want_pcre2 = get_option('pcre2')
1108if want_pcre2 != 'false'
1109 libpcre2 = dependency('libpcre2-8',
1110 required : want_pcre2 == 'true')
1111 have = libpcre2.found()
1112else
1113 have = false
1114 libpcre2 = []
1115endif
1116conf.set10('HAVE_PCRE2', have)
1117
69e96427 1118want_glib = get_option('glib')
31e57a35 1119if want_glib != 'false' and not fuzzer_build
37efbbd8
ZJS
1120 libglib = dependency('glib-2.0',
1121 version : '>= 2.22.0',
1122 required : want_glib == 'true')
1123 libgobject = dependency('gobject-2.0',
1124 version : '>= 2.22.0',
1125 required : want_glib == 'true')
1126 libgio = dependency('gio-2.0',
1127 required : want_glib == 'true')
2c201c21 1128 have = libglib.found() and libgobject.found() and libgio.found()
69e96427 1129else
349cc4a5 1130 have = false
37efbbd8
ZJS
1131 libglib = []
1132 libgobject = []
1133 libgio = []
69e96427 1134endif
349cc4a5 1135conf.set10('HAVE_GLIB', have)
69e96427
ZJS
1136
1137want_dbus = get_option('dbus')
31e57a35 1138if want_dbus != 'false' and not fuzzer_build
37efbbd8
ZJS
1139 libdbus = dependency('dbus-1',
1140 version : '>= 1.3.2',
1141 required : want_dbus == 'true')
349cc4a5 1142 have = libdbus.found()
69e96427 1143else
349cc4a5 1144 have = false
37efbbd8 1145 libdbus = []
69e96427 1146endif
349cc4a5 1147conf.set10('HAVE_DBUS', have)
69e96427 1148
42303dcb 1149default_dnssec = get_option('default-dnssec')
31e57a35 1150if fuzzer_build
b4081f3e
JR
1151 default_dnssec = 'no'
1152endif
349cc4a5 1153if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
42303dcb
YW
1154 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1155 default_dnssec = 'no'
1156endif
1157conf.set('DEFAULT_DNSSEC_MODE',
1158 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1159substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1160
56ddbf10
YW
1161dns_over_tls = get_option('dns-over-tls')
1162if dns_over_tls != 'false'
096cbdce
IT
1163 if dns_over_tls == 'openssl'
1164 have_gnutls = false
1165 else
1166 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1167 if dns_over_tls == 'gnutls' and not have_gnutls
1168 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1169 endif
56ddbf10 1170 endif
096cbdce
IT
1171 if dns_over_tls == 'gnutls' or have_gnutls
1172 have_openssl = false
1173 else
1174 have_openssl = conf.get('HAVE_OPENSSL') == 1
1175 if dns_over_tls != 'auto' and not have_openssl
1176 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1177 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1178 endif
1179 endif
1180 have = have_gnutls or have_openssl
56ddbf10 1181else
096cbdce 1182 have = have_gnutls = have_openssl = false
56ddbf10
YW
1183endif
1184conf.set10('ENABLE_DNS_OVER_TLS', have)
096cbdce
IT
1185conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1186conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
56ddbf10 1187
c9299be2 1188default_dns_over_tls = get_option('default-dns-over-tls')
5d67a7ae 1189if fuzzer_build
c9299be2 1190 default_dns_over_tls = 'no'
5d67a7ae 1191endif
56ddbf10
YW
1192if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1193 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 1194 default_dns_over_tls = 'no'
5d67a7ae 1195endif
c9299be2
IT
1196conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1197 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1198substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
5d67a7ae 1199
5c23128d 1200want_importd = get_option('importd')
4390be30 1201if want_importd != 'false'
349cc4a5
ZJS
1202 have = (conf.get('HAVE_LIBCURL') == 1 and
1203 conf.get('HAVE_ZLIB') == 1 and
349cc4a5
ZJS
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',
56d50ab1 1383 version : libsystemd_version,
37efbbd8
ZJS
1384 include_directories : includes,
1385 link_args : ['-shared',
1386 '-Wl,--version-script=' + libsystemd_sym_path],
34e221a5
ZJS
1387 link_with : [libbasic,
1388 libbasic_gcrypt],
5e3cec87
ZJS
1389 link_whole : [libsystemd_static,
1390 libjournal_client],
37efbbd8
ZJS
1391 dependencies : [threads,
1392 librt,
1393 libxz,
1394 liblz4],
1395 link_depends : libsystemd_sym,
1396 install : true,
1397 install_dir : rootlibdir)
5c23128d 1398
70848ecf
DC
1399static_libsystemd = get_option('static-libsystemd')
1400static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1401
1402install_libsystemd_static = static_library(
1403 'systemd',
1404 libsystemd_sources,
1405 journal_client_sources,
975464e0
ZJS
1406 basic_sources,
1407 basic_gcrypt_sources,
70848ecf 1408 include_directories : includes,
70848ecf
DC
1409 build_by_default : static_libsystemd != 'false',
1410 install : static_libsystemd != 'false',
1411 install_dir : rootlibdir,
1412 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1413 dependencies : [threads,
1414 librt,
1415 libxz,
1416 liblz4,
975464e0
ZJS
1417 libcap,
1418 libblkid,
1419 libmount,
1420 libselinux,
70848ecf
DC
1421 libgcrypt],
1422 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1423
5c23128d
ZJS
1424############################################################
1425
83b6af36
ZJS
1426# binaries that have --help and are intended for use by humans,
1427# usually, but not always, installed in /bin.
1428public_programs = []
1429
1430subdir('src/libudev')
1431subdir('src/shared')
1432subdir('src/core')
1433subdir('src/udev')
1434subdir('src/network')
1435
1436subdir('src/analyze')
1437subdir('src/journal-remote')
1438subdir('src/coredump')
1439subdir('src/hostname')
1440subdir('src/import')
1441subdir('src/kernel-install')
1442subdir('src/locale')
1443subdir('src/machine')
61d0578b 1444subdir('src/portable')
83b6af36
ZJS
1445subdir('src/nspawn')
1446subdir('src/resolve')
1447subdir('src/timedate')
1448subdir('src/timesync')
1449subdir('src/vconsole')
83b6af36
ZJS
1450subdir('src/boot/efi')
1451
1452subdir('src/test')
7db7d5b7 1453subdir('src/fuzz')
6b97bf22 1454subdir('rules')
83b6af36
ZJS
1455subdir('test')
1456
1457############################################################
1458
1459# only static linking apart from libdl, to make sure that the
1460# module is linked to all libraries that it uses.
1461test_dlopen = executable(
37efbbd8
ZJS
1462 'test-dlopen',
1463 test_dlopen_c,
1464 include_directories : includes,
1465 link_with : [libbasic],
fd1939fb
YW
1466 dependencies : [libdl],
1467 build_by_default : want_tests != 'false')
83b6af36 1468
08540a95 1469foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
e7e11bbf 1470 ['systemd', 'ENABLE_NSS_SYSTEMD'],
08540a95
YW
1471 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1472 ['resolve', 'ENABLE_NSS_RESOLVE']]
5c23128d 1473
349cc4a5 1474 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
37efbbd8
ZJS
1475 if condition
1476 module = tuple[0]
37efbbd8
ZJS
1477
1478 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
243e5cec 1479 version_script_arg = join_paths(meson.source_root(), sym)
37efbbd8
ZJS
1480
1481 nss = shared_library(
1482 'nss_' + module,
1483 'src/nss-@0@/nss-@0@.c'.format(module),
1484 version : '2',
1485 include_directories : includes,
b4b36f44
LP
1486 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1487 link_args : ['-Wl,-z,nodelete',
1488 '-shared',
37efbbd8
ZJS
1489 '-Wl,--version-script=' + version_script_arg,
1490 '-Wl,--undefined'],
37e4d7a8 1491 link_with : [libsystemd_static,
37efbbd8
ZJS
1492 libbasic],
1493 dependencies : [threads,
5486a31d 1494 librt],
37efbbd8
ZJS
1495 link_depends : sym,
1496 install : true,
1497 install_dir : rootlibdir)
1498
1499 # We cannot use shared_module because it does not support version suffix.
1500 # Unfortunately shared_library insists on creating the symlink…
1501 meson.add_install_script('sh', '-c',
1502 'rm $DESTDIR@0@/libnss_@1@.so'
1503 .format(rootlibdir, module))
1504
938be089
ZJS
1505 if want_tests != 'false'
1506 test('dlopen-nss_' + module,
1507 test_dlopen,
1508 # path to dlopen must include a slash
1509 args : nss.full_path())
1510 endif
37efbbd8 1511 endif
5c23128d
ZJS
1512endforeach
1513
1514############################################################
1515
5c23128d
ZJS
1516executable('systemd',
1517 systemd_sources,
1518 include_directories : includes,
1519 link_with : [libcore,
34ce0a52 1520 libshared],
5c23128d
ZJS
1521 dependencies : [threads,
1522 librt,
1523 libseccomp,
1524 libselinux,
f4ee10a2
ZJS
1525 libmount,
1526 libblkid],
421f0012 1527 install_rpath : rootlibexecdir,
5c23128d
ZJS
1528 install : true,
1529 install_dir : rootlibexecdir)
1530
ba7f4ae6
ZJS
1531meson.add_install_script(meson_make_symlink,
1532 join_paths(rootlibexecdir, 'systemd'),
1533 join_paths(rootsbindir, 'init'))
1534
005a29f2
ZJS
1535exe = executable('systemd-analyze',
1536 systemd_analyze_sources,
1537 include_directories : includes,
1538 link_with : [libcore,
005a29f2
ZJS
1539 libshared],
1540 dependencies : [threads,
1541 librt,
1542 libseccomp,
1543 libselinux,
1544 libmount,
1545 libblkid],
1546 install_rpath : rootlibexecdir,
1547 install : true)
5a8b1640 1548public_programs += exe
5c23128d
ZJS
1549
1550executable('systemd-journald',
1551 systemd_journald_sources,
1552 include_directories : includes,
aac26058 1553 link_with : [libjournal_core,
34ce0a52 1554 libshared],
5c23128d
ZJS
1555 dependencies : [threads,
1556 libxz,
aac26058
ZJS
1557 liblz4,
1558 libselinux],
421f0012 1559 install_rpath : rootlibexecdir,
5c23128d
ZJS
1560 install : true,
1561 install_dir : rootlibexecdir)
1562
005a29f2
ZJS
1563exe = executable('systemd-cat',
1564 systemd_cat_sources,
1565 include_directories : includes,
1566 link_with : [libjournal_core,
34ce0a52 1567 libshared],
005a29f2
ZJS
1568 dependencies : [threads],
1569 install_rpath : rootlibexecdir,
1570 install : true)
5a8b1640 1571public_programs += exe
005a29f2
ZJS
1572
1573exe = executable('journalctl',
1574 journalctl_sources,
1575 include_directories : includes,
34ce0a52 1576 link_with : [libshared],
005a29f2
ZJS
1577 dependencies : [threads,
1578 libqrencode,
1579 libxz,
6becf48c
ZJS
1580 liblz4,
1581 libpcre2],
005a29f2
ZJS
1582 install_rpath : rootlibexecdir,
1583 install : true,
1584 install_dir : rootbindir)
5a8b1640 1585public_programs += exe
5c23128d
ZJS
1586
1587executable('systemd-getty-generator',
1588 'src/getty-generator/getty-generator.c',
5c23128d 1589 include_directories : includes,
b2fc5836
ZJS
1590 link_with : [libshared],
1591 install_rpath : rootlibexecdir,
1592 install : true,
1593 install_dir : systemgeneratordir)
5c23128d
ZJS
1594
1595executable('systemd-debug-generator',
1596 'src/debug-generator/debug-generator.c',
5c23128d 1597 include_directories : includes,
b2fc5836
ZJS
1598 link_with : [libshared],
1599 install_rpath : rootlibexecdir,
1600 install : true,
1601 install_dir : systemgeneratordir)
5c23128d
ZJS
1602
1603executable('systemd-fstab-generator',
1604 'src/fstab-generator/fstab-generator.c',
1605 'src/core/mount-setup.c',
5c23128d 1606 include_directories : includes,
b2fc5836
ZJS
1607 link_with : [libshared],
1608 install_rpath : rootlibexecdir,
1609 install : true,
1610 install_dir : systemgeneratordir)
5c23128d 1611
349cc4a5 1612if conf.get('ENABLE_ENVIRONMENT_D') == 1
37efbbd8
ZJS
1613 executable('30-systemd-environment-d-generator',
1614 'src/environment-d-generator/environment-d-generator.c',
1615 include_directories : includes,
1616 link_with : [libshared],
1617 install_rpath : rootlibexecdir,
1618 install : true,
1619 install_dir : userenvgeneratordir)
7b76fce1 1620
37efbbd8
ZJS
1621 meson.add_install_script(meson_make_symlink,
1622 join_paths(sysconfdir, 'environment'),
1623 join_paths(environmentdir, '99-environment.conf'))
5c23128d
ZJS
1624endif
1625
349cc4a5 1626if conf.get('ENABLE_HIBERNATE') == 1
37efbbd8
ZJS
1627 executable('systemd-hibernate-resume-generator',
1628 'src/hibernate-resume/hibernate-resume-generator.c',
1629 include_directories : includes,
1630 link_with : [libshared],
1631 install_rpath : rootlibexecdir,
1632 install : true,
1633 install_dir : systemgeneratordir)
5c23128d 1634
37efbbd8
ZJS
1635 executable('systemd-hibernate-resume',
1636 'src/hibernate-resume/hibernate-resume.c',
005a29f2
ZJS
1637 include_directories : includes,
1638 link_with : [libshared],
1639 install_rpath : rootlibexecdir,
1640 install : true,
1641 install_dir : rootlibexecdir)
37efbbd8
ZJS
1642endif
1643
349cc4a5 1644if conf.get('HAVE_BLKID') == 1
37efbbd8
ZJS
1645 executable('systemd-gpt-auto-generator',
1646 'src/gpt-auto-generator/gpt-auto-generator.c',
1647 'src/basic/blkid-util.h',
1648 include_directories : includes,
34ce0a52 1649 link_with : [libshared],
37efbbd8
ZJS
1650 dependencies : libblkid,
1651 install_rpath : rootlibexecdir,
1652 install : true,
1653 install_dir : systemgeneratordir)
1654
1655 exe = executable('systemd-dissect',
1656 'src/dissect/dissect.c',
1657 include_directories : includes,
1658 link_with : [libshared],
1659 install_rpath : rootlibexecdir,
1660 install : true,
1661 install_dir : rootlibexecdir)
5a8b1640 1662 public_programs += exe
5c23128d
ZJS
1663endif
1664
1ec57f33 1665if conf.get('ENABLE_RESOLVE') == 1
37efbbd8
ZJS
1666 executable('systemd-resolved',
1667 systemd_resolved_sources,
005a29f2 1668 include_directories : includes,
34e221a5 1669 link_with : [libshared,
568a4ff8
ZJS
1670 libbasic_gcrypt,
1671 libsystemd_resolve_core],
56ddbf10 1672 dependencies : systemd_resolved_dependencies,
005a29f2 1673 install_rpath : rootlibexecdir,
37efbbd8
ZJS
1674 install : true,
1675 install_dir : rootlibexecdir)
1676
c2e84cab
YW
1677 exe = executable('resolvectl',
1678 resolvectl_sources,
37efbbd8 1679 include_directories : includes,
34e221a5 1680 link_with : [libshared,
568a4ff8
ZJS
1681 libbasic_gcrypt,
1682 libsystemd_resolve_core],
37efbbd8 1683 dependencies : [threads,
76c87410 1684 libgpg_error,
37efbbd8
ZJS
1685 libm,
1686 libidn],
1687 install_rpath : rootlibexecdir,
1688 install : true)
5a8b1640 1689 public_programs += exe
088c1363
LP
1690
1691 meson.add_install_script(meson_make_symlink,
c2e84cab 1692 join_paths(bindir, 'resolvectl'),
088c1363 1693 join_paths(rootsbindir, 'resolvconf'))
c2e84cab
YW
1694
1695 meson.add_install_script(meson_make_symlink,
1696 join_paths(bindir, 'resolvectl'),
1697 join_paths(bindir, 'systemd-resolve'))
5c23128d
ZJS
1698endif
1699
349cc4a5 1700if conf.get('ENABLE_LOGIND') == 1
37efbbd8
ZJS
1701 executable('systemd-logind',
1702 systemd_logind_sources,
005a29f2 1703 include_directories : includes,
37efbbd8 1704 link_with : [liblogind_core,
34ce0a52 1705 libshared],
005a29f2 1706 dependencies : [threads,
37efbbd8 1707 libacl],
005a29f2
ZJS
1708 install_rpath : rootlibexecdir,
1709 install : true,
37efbbd8
ZJS
1710 install_dir : rootlibexecdir)
1711
1712 exe = executable('loginctl',
1713 loginctl_sources,
1714 include_directories : includes,
34ce0a52 1715 link_with : [libshared],
37efbbd8
ZJS
1716 dependencies : [threads,
1717 liblz4,
1718 libxz],
1719 install_rpath : rootlibexecdir,
1720 install : true,
1721 install_dir : rootbindir)
5a8b1640 1722 public_programs += exe
37efbbd8
ZJS
1723
1724 exe = executable('systemd-inhibit',
1725 'src/login/inhibit.c',
1726 include_directories : includes,
1727 link_with : [libshared],
1728 install_rpath : rootlibexecdir,
1729 install : true,
1730 install_dir : rootbindir)
5a8b1640 1731 public_programs += exe
37efbbd8 1732
349cc4a5 1733 if conf.get('HAVE_PAM') == 1
243e5cec 1734 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
37efbbd8
ZJS
1735 pam_systemd = shared_library(
1736 'pam_systemd',
1737 pam_systemd_c,
1738 name_prefix : '',
1739 include_directories : includes,
1740 link_args : ['-shared',
1741 '-Wl,--version-script=' + version_script_arg],
37e4d7a8 1742 link_with : [libsystemd_static,
37efbbd8
ZJS
1743 libshared_static],
1744 dependencies : [threads,
1745 libpam,
1746 libpam_misc],
1747 link_depends : pam_systemd_sym,
1748 install : true,
1749 install_dir : pamlibdir)
1750
938be089
ZJS
1751 if want_tests != 'false'
1752 test('dlopen-pam_systemd',
1753 test_dlopen,
1754 # path to dlopen must include a slash
c1cd6743 1755 args : pam_systemd.full_path())
938be089 1756 endif
37efbbd8
ZJS
1757 endif
1758endif
005a29f2 1759
a9f0f5e5
ZJS
1760executable('systemd-user-runtime-dir',
1761 user_runtime_dir_sources,
1762 include_directories : includes,
1763 link_with : [libshared, liblogind_core],
1764 install_rpath : rootlibexecdir,
1765 install : true,
1766 install_dir : rootlibexecdir)
1767
349cc4a5 1768if conf.get('HAVE_PAM') == 1
37efbbd8
ZJS
1769 executable('systemd-user-sessions',
1770 'src/user-sessions/user-sessions.c',
005a29f2 1771 include_directories : includes,
aac26058 1772 link_with : [libshared],
005a29f2
ZJS
1773 install_rpath : rootlibexecdir,
1774 install : true,
37efbbd8 1775 install_dir : rootlibexecdir)
5c23128d
ZJS
1776endif
1777
349cc4a5 1778if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
37efbbd8
ZJS
1779 exe = executable('bootctl',
1780 'src/boot/bootctl.c',
1781 include_directories : includes,
1782 link_with : [libshared],
1783 dependencies : [libblkid],
1784 install_rpath : rootlibexecdir,
1785 install : true)
5a8b1640 1786 public_programs += exe
005a29f2
ZJS
1787endif
1788
1789exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1790 include_directories : includes,
1791 link_with : [libshared],
1792 dependencies : [threads],
1793 install_rpath : rootlibexecdir,
1794 install : true)
5a8b1640 1795public_programs += exe
005a29f2 1796
f3794366
FS
1797
1798if get_option('link-systemctl-shared')
1799 systemctl_link_with = [libshared]
1800else
1801 systemctl_link_with = [libsystemd_static,
1802 libshared_static,
1803 libjournal_client,
1804 libbasic_gcrypt]
1805endif
1806
005a29f2
ZJS
1807exe = executable('systemctl', 'src/systemctl/systemctl.c',
1808 include_directories : includes,
f3794366 1809 link_with : systemctl_link_with,
005a29f2
ZJS
1810 dependencies : [threads,
1811 libcap,
1812 libselinux,
1813 libxz,
1814 liblz4],
1815 install_rpath : rootlibexecdir,
1816 install : true,
1817 install_dir : rootbindir)
5a8b1640 1818public_programs += exe
5c23128d 1819
61d0578b
LP
1820if conf.get('ENABLE_PORTABLED') == 1
1821 executable('systemd-portabled',
1822 systemd_portabled_sources,
1823 include_directories : includes,
1824 link_with : [libshared],
1825 dependencies : [threads],
1826 install_rpath : rootlibexecdir,
1827 install : true,
1828 install_dir : rootlibexecdir)
1829
1830 exe = executable('portablectl', 'src/portable/portablectl.c',
1831 include_directories : includes,
1832 link_with : [libshared],
1833 dependencies : [threads],
1834 install_rpath : rootlibexecdir,
1835 install : true,
1836 install_dir : rootlibexecdir)
5a8b1640 1837 public_programs += exe
61d0578b
LP
1838endif
1839
ba7f4ae6
ZJS
1840foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1841 meson.add_install_script(meson_make_symlink,
1842 join_paths(rootbindir, 'systemctl'),
1843 join_paths(rootsbindir, alias))
1844endforeach
1845
349cc4a5 1846if conf.get('ENABLE_BACKLIGHT') == 1
37efbbd8
ZJS
1847 executable('systemd-backlight',
1848 'src/backlight/backlight.c',
1849 include_directories : includes,
34ce0a52 1850 link_with : [libshared],
37efbbd8
ZJS
1851 install_rpath : rootlibexecdir,
1852 install : true,
1853 install_dir : rootlibexecdir)
5c23128d
ZJS
1854endif
1855
349cc4a5 1856if conf.get('ENABLE_RFKILL') == 1
37efbbd8
ZJS
1857 executable('systemd-rfkill',
1858 'src/rfkill/rfkill.c',
1859 include_directories : includes,
34ce0a52 1860 link_with : [libshared],
37efbbd8
ZJS
1861 install_rpath : rootlibexecdir,
1862 install : true,
1863 install_dir : rootlibexecdir)
5c23128d
ZJS
1864endif
1865
1866executable('systemd-system-update-generator',
1867 'src/system-update-generator/system-update-generator.c',
1868 include_directories : includes,
1869 link_with : [libshared],
b2fc5836 1870 install_rpath : rootlibexecdir,
5c23128d
ZJS
1871 install : true,
1872 install_dir : systemgeneratordir)
1873
349cc4a5 1874if conf.get('HAVE_LIBCRYPTSETUP') == 1
37efbbd8
ZJS
1875 executable('systemd-cryptsetup',
1876 'src/cryptsetup/cryptsetup.c',
1877 include_directories : includes,
1878 link_with : [libshared],
1879 dependencies : [libcryptsetup],
1880 install_rpath : rootlibexecdir,
1881 install : true,
1882 install_dir : rootlibexecdir)
1883
1884 executable('systemd-cryptsetup-generator',
1885 'src/cryptsetup/cryptsetup-generator.c',
1886 include_directories : includes,
1887 link_with : [libshared],
1888 dependencies : [libcryptsetup],
1889 install_rpath : rootlibexecdir,
1890 install : true,
1891 install_dir : systemgeneratordir)
1892
1893 executable('systemd-veritysetup',
1894 'src/veritysetup/veritysetup.c',
1895 include_directories : includes,
1896 link_with : [libshared],
1897 dependencies : [libcryptsetup],
1898 install_rpath : rootlibexecdir,
1899 install : true,
1900 install_dir : rootlibexecdir)
1901
1902 executable('systemd-veritysetup-generator',
1903 'src/veritysetup/veritysetup-generator.c',
1904 include_directories : includes,
1905 link_with : [libshared],
1906 dependencies : [libcryptsetup],
1907 install_rpath : rootlibexecdir,
1908 install : true,
1909 install_dir : systemgeneratordir)
5c23128d
ZJS
1910endif
1911
349cc4a5 1912if conf.get('HAVE_SYSV_COMPAT') == 1
37efbbd8
ZJS
1913 executable('systemd-sysv-generator',
1914 'src/sysv-generator/sysv-generator.c',
1915 include_directories : includes,
1916 link_with : [libshared],
1917 install_rpath : rootlibexecdir,
1918 install : true,
1919 install_dir : systemgeneratordir)
1920
1921 executable('systemd-rc-local-generator',
1922 'src/rc-local-generator/rc-local-generator.c',
1923 include_directories : includes,
1924 link_with : [libshared],
1925 install_rpath : rootlibexecdir,
1926 install : true,
1927 install_dir : systemgeneratordir)
5c23128d
ZJS
1928endif
1929
349cc4a5 1930if conf.get('ENABLE_HOSTNAMED') == 1
37efbbd8
ZJS
1931 executable('systemd-hostnamed',
1932 'src/hostname/hostnamed.c',
005a29f2 1933 include_directories : includes,
aac26058 1934 link_with : [libshared],
005a29f2 1935 install_rpath : rootlibexecdir,
37efbbd8
ZJS
1936 install : true,
1937 install_dir : rootlibexecdir)
1938
1939 exe = executable('hostnamectl',
1940 'src/hostname/hostnamectl.c',
1941 include_directories : includes,
1942 link_with : [libshared],
1943 install_rpath : rootlibexecdir,
1944 install : true)
5a8b1640 1945 public_programs += exe
5c23128d
ZJS
1946endif
1947
349cc4a5
ZJS
1948if conf.get('ENABLE_LOCALED') == 1
1949 if conf.get('HAVE_XKBCOMMON') == 1
37efbbd8
ZJS
1950 # logind will load libxkbcommon.so dynamically on its own
1951 deps = [libdl]
1952 else
1953 deps = []
1954 endif
1955
1956 executable('systemd-localed',
1957 systemd_localed_sources,
005a29f2 1958 include_directories : includes,
aac26058 1959 link_with : [libshared],
37efbbd8 1960 dependencies : deps,
005a29f2 1961 install_rpath : rootlibexecdir,
37efbbd8
ZJS
1962 install : true,
1963 install_dir : rootlibexecdir)
1964
1965 exe = executable('localectl',
1966 localectl_sources,
1967 include_directories : includes,
1968 link_with : [libshared],
1969 install_rpath : rootlibexecdir,
1970 install : true)
5a8b1640 1971 public_programs += exe
5c23128d
ZJS
1972endif
1973
349cc4a5 1974if conf.get('ENABLE_TIMEDATED') == 1
37efbbd8
ZJS
1975 executable('systemd-timedated',
1976 'src/timedate/timedated.c',
005a29f2 1977 include_directories : includes,
aac26058 1978 link_with : [libshared],
37efbbd8
ZJS
1979 install_rpath : rootlibexecdir,
1980 install : true,
1981 install_dir : rootlibexecdir)
6129ec85 1982endif
5c23128d 1983
6129ec85 1984if conf.get('ENABLE_TIMEDATECTL') == 1
37efbbd8
ZJS
1985 exe = executable('timedatectl',
1986 'src/timedate/timedatectl.c',
1987 include_directories : includes,
1988 install_rpath : rootlibexecdir,
1989 link_with : [libshared],
6129ec85 1990 dependencies : [libm],
37efbbd8 1991 install : true)
5a8b1640 1992 public_programs += exe
5c23128d
ZJS
1993endif
1994
349cc4a5 1995if conf.get('ENABLE_TIMESYNCD') == 1
37efbbd8
ZJS
1996 executable('systemd-timesyncd',
1997 systemd_timesyncd_sources,
005a29f2 1998 include_directories : includes,
aac26058 1999 link_with : [libshared],
005a29f2 2000 dependencies : [threads,
37efbbd8 2001 libm],
005a29f2
ZJS
2002 install_rpath : rootlibexecdir,
2003 install : true,
37efbbd8 2004 install_dir : rootlibexecdir)
5c3376ef
PB
2005
2006 executable('systemd-time-wait-sync',
2007 'src/time-wait-sync/time-wait-sync.c',
2008 include_directories : includes,
2009 link_with : [libshared],
2010 install_rpath : rootlibexecdir,
2011 install : true,
2012 install_dir : rootlibexecdir)
5c23128d
ZJS
2013endif
2014
349cc4a5 2015if conf.get('ENABLE_MACHINED') == 1
37efbbd8
ZJS
2016 executable('systemd-machined',
2017 systemd_machined_sources,
2018 include_directories : includes,
2019 link_with : [libmachine_core,
2020 libshared],
2021 install_rpath : rootlibexecdir,
2022 install : true,
2023 install_dir : rootlibexecdir)
2024
2025 exe = executable('machinectl',
2026 'src/machine/machinectl.c',
2027 include_directories : includes,
2028 link_with : [libshared],
2029 dependencies : [threads,
2030 libxz,
2031 liblz4],
2032 install_rpath : rootlibexecdir,
2033 install : true,
2034 install_dir : rootbindir)
5a8b1640 2035 public_programs += exe
5c23128d
ZJS
2036endif
2037
349cc4a5 2038if conf.get('ENABLE_IMPORTD') == 1
37efbbd8
ZJS
2039 executable('systemd-importd',
2040 systemd_importd_sources,
005a29f2 2041 include_directories : includes,
aac26058 2042 link_with : [libshared],
37efbbd8 2043 dependencies : [threads],
005a29f2
ZJS
2044 install_rpath : rootlibexecdir,
2045 install : true,
2046 install_dir : rootlibexecdir)
37efbbd8
ZJS
2047
2048 systemd_pull = executable('systemd-pull',
2049 systemd_pull_sources,
2050 include_directories : includes,
2051 link_with : [libshared],
2052 dependencies : [libcurl,
2053 libz,
2054 libbzip2,
2055 libxz,
2056 libgcrypt],
2057 install_rpath : rootlibexecdir,
2058 install : true,
2059 install_dir : rootlibexecdir)
2060
2061 systemd_import = executable('systemd-import',
2062 systemd_import_sources,
2063 include_directories : includes,
2064 link_with : [libshared],
2065 dependencies : [libcurl,
2066 libz,
2067 libbzip2,
2068 libxz],
2069 install_rpath : rootlibexecdir,
2070 install : true,
2071 install_dir : rootlibexecdir)
2072
2073 systemd_export = executable('systemd-export',
2074 systemd_export_sources,
2075 include_directories : includes,
2076 link_with : [libshared],
2077 dependencies : [libcurl,
2078 libz,
2079 libbzip2,
2080 libxz],
2081 install_rpath : rootlibexecdir,
2082 install : true,
2083 install_dir : rootlibexecdir)
2084 public_programs += [systemd_pull, systemd_import, systemd_export]
2085endif
2086
349cc4a5 2087if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
37efbbd8
ZJS
2088 exe = executable('systemd-journal-upload',
2089 systemd_journal_upload_sources,
2090 include_directories : includes,
2091 link_with : [libshared],
2092 dependencies : [threads,
2093 libcurl,
2094 libgnutls,
2095 libxz,
2096 liblz4],
2097 install_rpath : rootlibexecdir,
2098 install : true,
2099 install_dir : rootlibexecdir)
5a8b1640 2100 public_programs += exe
5c23128d
ZJS
2101endif
2102
349cc4a5 2103if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
37efbbd8
ZJS
2104 s_j_remote = executable('systemd-journal-remote',
2105 systemd_journal_remote_sources,
2106 include_directories : includes,
c064d8db
ZJS
2107 link_with : [libshared,
2108 libsystemd_journal_remote],
37efbbd8
ZJS
2109 dependencies : [threads,
2110 libmicrohttpd,
2111 libgnutls,
2112 libxz,
2113 liblz4],
2114 install_rpath : rootlibexecdir,
2115 install : true,
2116 install_dir : rootlibexecdir)
2117
2118 s_j_gatewayd = executable('systemd-journal-gatewayd',
2119 systemd_journal_gatewayd_sources,
2120 include_directories : includes,
2121 link_with : [libshared],
2122 dependencies : [threads,
2123 libmicrohttpd,
2124 libgnutls,
2125 libxz,
2126 liblz4],
2127 install_rpath : rootlibexecdir,
2128 install : true,
2129 install_dir : rootlibexecdir)
2130 public_programs += [s_j_remote, s_j_gatewayd]
5c23128d
ZJS
2131endif
2132
349cc4a5 2133if conf.get('ENABLE_COREDUMP') == 1
37efbbd8
ZJS
2134 executable('systemd-coredump',
2135 systemd_coredump_sources,
005a29f2 2136 include_directories : includes,
aac26058 2137 link_with : [libshared],
005a29f2 2138 dependencies : [threads,
37efbbd8
ZJS
2139 libacl,
2140 libdw,
005a29f2
ZJS
2141 libxz,
2142 liblz4],
2143 install_rpath : rootlibexecdir,
37efbbd8
ZJS
2144 install : true,
2145 install_dir : rootlibexecdir)
2146
2147 exe = executable('coredumpctl',
2148 coredumpctl_sources,
2149 include_directories : includes,
2150 link_with : [libshared],
2151 dependencies : [threads,
2152 libxz,
2153 liblz4],
2154 install_rpath : rootlibexecdir,
2155 install : true)
5a8b1640 2156 public_programs += exe
5c23128d
ZJS
2157endif
2158
349cc4a5 2159if conf.get('ENABLE_BINFMT') == 1
37efbbd8
ZJS
2160 exe = executable('systemd-binfmt',
2161 'src/binfmt/binfmt.c',
2162 include_directories : includes,
2163 link_with : [libshared],
2164 install_rpath : rootlibexecdir,
2165 install : true,
2166 install_dir : rootlibexecdir)
5a8b1640 2167 public_programs += exe
37efbbd8
ZJS
2168
2169 meson.add_install_script('sh', '-c',
2170 mkdir_p.format(binfmtdir))
2171 meson.add_install_script('sh', '-c',
2172 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2173endif
2174
349cc4a5 2175if conf.get('ENABLE_VCONSOLE') == 1
37efbbd8
ZJS
2176 executable('systemd-vconsole-setup',
2177 'src/vconsole/vconsole-setup.c',
005a29f2
ZJS
2178 include_directories : includes,
2179 link_with : [libshared],
2180 install_rpath : rootlibexecdir,
2181 install : true,
2182 install_dir : rootlibexecdir)
5c23128d
ZJS
2183endif
2184
349cc4a5 2185if conf.get('ENABLE_RANDOMSEED') == 1
37efbbd8
ZJS
2186 executable('systemd-random-seed',
2187 'src/random-seed/random-seed.c',
2188 include_directories : includes,
2189 link_with : [libshared],
2190 install_rpath : rootlibexecdir,
2191 install : true,
2192 install_dir : rootlibexecdir)
5c23128d
ZJS
2193endif
2194
349cc4a5 2195if conf.get('ENABLE_FIRSTBOOT') == 1
37efbbd8
ZJS
2196 executable('systemd-firstboot',
2197 'src/firstboot/firstboot.c',
2198 include_directories : includes,
2199 link_with : [libshared],
2200 dependencies : [libcrypt],
2201 install_rpath : rootlibexecdir,
2202 install : true,
2203 install_dir : rootbindir)
5c23128d
ZJS
2204endif
2205
2206executable('systemd-remount-fs',
2207 'src/remount-fs/remount-fs.c',
2208 'src/core/mount-setup.c',
2209 'src/core/mount-setup.h',
2210 include_directories : includes,
2211 link_with : [libshared],
b2fc5836 2212 install_rpath : rootlibexecdir,
5c23128d
ZJS
2213 install : true,
2214 install_dir : rootlibexecdir)
2215
2216executable('systemd-machine-id-setup',
2217 'src/machine-id-setup/machine-id-setup-main.c',
2218 'src/core/machine-id-setup.c',
2219 'src/core/machine-id-setup.h',
2220 include_directories : includes,
aac26058 2221 link_with : [libshared],
b2fc5836 2222 install_rpath : rootlibexecdir,
5c23128d
ZJS
2223 install : true,
2224 install_dir : rootbindir)
2225
2226executable('systemd-fsck',
2227 'src/fsck/fsck.c',
2228 include_directories : includes,
aac26058 2229 link_with : [libshared],
421f0012 2230 install_rpath : rootlibexecdir,
5c23128d
ZJS
2231 install : true,
2232 install_dir : rootlibexecdir)
2233
80750adb
ZJS
2234executable('systemd-growfs',
2235 'src/partition/growfs.c',
2236 include_directories : includes,
2237 link_with : [libshared],
c34b75a1 2238 dependencies : [libcryptsetup],
80750adb
ZJS
2239 install_rpath : rootlibexecdir,
2240 install : true,
2241 install_dir : rootlibexecdir)
2242
b7f28ac5
ZJS
2243executable('systemd-makefs',
2244 'src/partition/makefs.c',
2245 include_directories : includes,
2246 link_with : [libshared],
2247 install_rpath : rootlibexecdir,
2248 install : true,
2249 install_dir : rootlibexecdir)
2250
5c23128d
ZJS
2251executable('systemd-sleep',
2252 'src/sleep/sleep.c',
2253 include_directories : includes,
2254 link_with : [libshared],
421f0012 2255 install_rpath : rootlibexecdir,
5c23128d
ZJS
2256 install : true,
2257 install_dir : rootlibexecdir)
2258
005a29f2
ZJS
2259exe = executable('systemd-sysctl',
2260 'src/sysctl/sysctl.c',
2261 include_directories : includes,
2262 link_with : [libshared],
2263 install_rpath : rootlibexecdir,
2264 install : true,
2265 install_dir : rootlibexecdir)
5a8b1640 2266public_programs += exe
5c23128d
ZJS
2267
2268executable('systemd-ac-power',
2269 'src/ac-power/ac-power.c',
2270 include_directories : includes,
2271 link_with : [libshared],
421f0012 2272 install_rpath : rootlibexecdir,
5c23128d
ZJS
2273 install : true,
2274 install_dir : rootlibexecdir)
2275
005a29f2
ZJS
2276exe = executable('systemd-detect-virt',
2277 'src/detect-virt/detect-virt.c',
2278 include_directories : includes,
2279 link_with : [libshared],
2280 install_rpath : rootlibexecdir,
2281 install : true)
5a8b1640 2282public_programs += exe
005a29f2
ZJS
2283
2284exe = executable('systemd-delta',
2285 'src/delta/delta.c',
2286 include_directories : includes,
2287 link_with : [libshared],
2288 install_rpath : rootlibexecdir,
2289 install : true)
5a8b1640 2290public_programs += exe
005a29f2
ZJS
2291
2292exe = executable('systemd-escape',
2293 'src/escape/escape.c',
2294 include_directories : includes,
2295 link_with : [libshared],
2296 install_rpath : rootlibexecdir,
2297 install : true,
2298 install_dir : rootbindir)
5a8b1640 2299public_programs += exe
005a29f2
ZJS
2300
2301exe = executable('systemd-notify',
2302 'src/notify/notify.c',
2303 include_directories : includes,
2304 link_with : [libshared],
2305 install_rpath : rootlibexecdir,
2306 install : true,
2307 install_dir : rootbindir)
5a8b1640 2308public_programs += exe
5c23128d
ZJS
2309
2310executable('systemd-volatile-root',
2311 'src/volatile-root/volatile-root.c',
2312 include_directories : includes,
2313 link_with : [libshared],
421f0012 2314 install_rpath : rootlibexecdir,
5c23128d
ZJS
2315 install : true,
2316 install_dir : rootlibexecdir)
2317
2318executable('systemd-cgroups-agent',
2319 'src/cgroups-agent/cgroups-agent.c',
2320 include_directories : includes,
2321 link_with : [libshared],
421f0012 2322 install_rpath : rootlibexecdir,
5c23128d
ZJS
2323 install : true,
2324 install_dir : rootlibexecdir)
2325
0d1d512f
ZJS
2326exe = executable('systemd-id128',
2327 'src/id128/id128.c',
2328 include_directories : includes,
2329 link_with : [libshared],
2330 install_rpath : rootlibexecdir,
2331 install : true)
2332public_programs += exe
2333
005a29f2
ZJS
2334exe = executable('systemd-path',
2335 'src/path/path.c',
2336 include_directories : includes,
aac26058 2337 link_with : [libshared],
005a29f2
ZJS
2338 install_rpath : rootlibexecdir,
2339 install : true)
5a8b1640 2340public_programs += exe
005a29f2
ZJS
2341
2342exe = executable('systemd-ask-password',
2343 'src/ask-password/ask-password.c',
2344 include_directories : includes,
aac26058 2345 link_with : [libshared],
005a29f2
ZJS
2346 install_rpath : rootlibexecdir,
2347 install : true,
2348 install_dir : rootbindir)
5a8b1640 2349public_programs += exe
5c23128d
ZJS
2350
2351executable('systemd-reply-password',
2352 'src/reply-password/reply-password.c',
2353 include_directories : includes,
aac26058 2354 link_with : [libshared],
421f0012 2355 install_rpath : rootlibexecdir,
5c23128d
ZJS
2356 install : true,
2357 install_dir : rootlibexecdir)
2358
005a29f2
ZJS
2359exe = executable('systemd-tty-ask-password-agent',
2360 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2361 include_directories : includes,
aac26058 2362 link_with : [libshared],
005a29f2
ZJS
2363 install_rpath : rootlibexecdir,
2364 install : true,
2365 install_dir : rootbindir)
5a8b1640 2366public_programs += exe
005a29f2
ZJS
2367
2368exe = executable('systemd-cgls',
2369 'src/cgls/cgls.c',
2370 include_directories : includes,
aac26058 2371 link_with : [libshared],
005a29f2
ZJS
2372 install_rpath : rootlibexecdir,
2373 install : true)
5a8b1640 2374public_programs += exe
005a29f2
ZJS
2375
2376exe = executable('systemd-cgtop',
2377 'src/cgtop/cgtop.c',
2378 include_directories : includes,
aac26058 2379 link_with : [libshared],
005a29f2
ZJS
2380 install_rpath : rootlibexecdir,
2381 install : true)
5a8b1640 2382public_programs += exe
5c23128d
ZJS
2383
2384executable('systemd-initctl',
2385 'src/initctl/initctl.c',
2386 include_directories : includes,
aac26058 2387 link_with : [libshared],
421f0012 2388 install_rpath : rootlibexecdir,
5c23128d
ZJS
2389 install : true,
2390 install_dir : rootlibexecdir)
2391
005a29f2
ZJS
2392exe = executable('systemd-mount',
2393 'src/mount/mount-tool.c',
2394 include_directories : includes,
34ce0a52 2395 link_with : [libshared],
005a29f2
ZJS
2396 install_rpath : rootlibexecdir,
2397 install : true)
5a8b1640 2398public_programs += exe
5c23128d 2399
7b76fce1 2400meson.add_install_script(meson_make_symlink,
e17e5ba9 2401 'systemd-mount', join_paths(bindir, 'systemd-umount'))
7b76fce1 2402
005a29f2
ZJS
2403exe = executable('systemd-run',
2404 'src/run/run.c',
2405 include_directories : includes,
aac26058 2406 link_with : [libshared],
005a29f2
ZJS
2407 install_rpath : rootlibexecdir,
2408 install : true)
5a8b1640 2409public_programs += exe
005a29f2
ZJS
2410
2411exe = executable('systemd-stdio-bridge',
2412 'src/stdio-bridge/stdio-bridge.c',
2413 include_directories : includes,
aac26058 2414 link_with : [libshared],
005a29f2
ZJS
2415 install_rpath : rootlibexecdir,
2416 install : true)
5a8b1640 2417public_programs += exe
005a29f2
ZJS
2418
2419exe = executable('busctl',
2420 'src/busctl/busctl.c',
2421 'src/busctl/busctl-introspect.c',
2422 'src/busctl/busctl-introspect.h',
2423 include_directories : includes,
aac26058 2424 link_with : [libshared],
005a29f2
ZJS
2425 install_rpath : rootlibexecdir,
2426 install : true)
5a8b1640 2427public_programs += exe
5c23128d 2428
349cc4a5 2429if conf.get('ENABLE_SYSUSERS') == 1
37efbbd8
ZJS
2430 exe = executable('systemd-sysusers',
2431 'src/sysusers/sysusers.c',
2432 include_directories : includes,
2433 link_with : [libshared],
2434 install_rpath : rootlibexecdir,
2435 install : true,
2436 install_dir : rootbindir)
5a8b1640 2437 public_programs += exe
5c23128d
ZJS
2438endif
2439
349cc4a5 2440if conf.get('ENABLE_TMPFILES') == 1
37efbbd8
ZJS
2441 exe = executable('systemd-tmpfiles',
2442 'src/tmpfiles/tmpfiles.c',
2443 include_directories : includes,
2444 link_with : [libshared],
2445 dependencies : [libacl],
2446 install_rpath : rootlibexecdir,
2447 install : true,
2448 install_dir : rootbindir)
5a8b1640 2449 public_programs += exe
d9daae55 2450
938be089
ZJS
2451 if want_tests != 'false'
2452 test('test-systemd-tmpfiles',
2453 test_systemd_tmpfiles_py,
2454 # https://github.com/mesonbuild/meson/issues/2681
2455 args : exe.full_path())
2456 endif
5c23128d
ZJS
2457endif
2458
349cc4a5 2459if conf.get('ENABLE_HWDB') == 1
37efbbd8
ZJS
2460 exe = executable('systemd-hwdb',
2461 'src/hwdb/hwdb.c',
2462 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2463 include_directories : includes,
0c06b506 2464 link_with : [libudev_static],
0da6f396 2465 install_rpath : udev_rpath,
37efbbd8
ZJS
2466 install : true,
2467 install_dir : rootbindir)
5a8b1640 2468 public_programs += exe
37efbbd8
ZJS
2469endif
2470
349cc4a5 2471if conf.get('ENABLE_QUOTACHECK') == 1
37efbbd8
ZJS
2472 executable('systemd-quotacheck',
2473 'src/quotacheck/quotacheck.c',
005a29f2 2474 include_directories : includes,
aac26058 2475 link_with : [libshared],
005a29f2
ZJS
2476 install_rpath : rootlibexecdir,
2477 install : true,
37efbbd8 2478 install_dir : rootlibexecdir)
5c23128d
ZJS
2479endif
2480
005a29f2
ZJS
2481exe = executable('systemd-socket-proxyd',
2482 'src/socket-proxy/socket-proxyd.c',
2483 include_directories : includes,
aac26058 2484 link_with : [libshared],
005a29f2
ZJS
2485 dependencies : [threads],
2486 install_rpath : rootlibexecdir,
2487 install : true,
2488 install_dir : rootlibexecdir)
5a8b1640 2489public_programs += exe
005a29f2
ZJS
2490
2491exe = executable('systemd-udevd',
2492 systemd_udevd_sources,
2493 include_directories : includes,
c1cd6743 2494 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
005a29f2 2495 link_with : [libudev_core,
005a29f2 2496 libsystemd_network,
0c06b506 2497 libudev_static],
3a30f21f
ZJS
2498 dependencies : [threads,
2499 libkmod,
005a29f2 2500 libidn,
aac26058
ZJS
2501 libacl,
2502 libblkid],
1aec3ed9 2503 install_rpath : udev_rpath,
005a29f2
ZJS
2504 install : true,
2505 install_dir : rootlibexecdir)
5a8b1640 2506public_programs += exe
005a29f2
ZJS
2507
2508exe = executable('udevadm',
2509 udevadm_sources,
c1cd6743 2510 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
005a29f2
ZJS
2511 include_directories : includes,
2512 link_with : [libudev_core,
005a29f2 2513 libsystemd_network,
0c06b506 2514 libudev_static],
3a30f21f
ZJS
2515 dependencies : [threads,
2516 libkmod,
005a29f2 2517 libidn,
aac26058
ZJS
2518 libacl,
2519 libblkid],
1aec3ed9 2520 install_rpath : udev_rpath,
005a29f2
ZJS
2521 install : true,
2522 install_dir : rootbindir)
5a8b1640 2523public_programs += exe
5c23128d
ZJS
2524
2525executable('systemd-shutdown',
2526 systemd_shutdown_sources,
2527 include_directories : includes,
34ce0a52 2528 link_with : [libshared],
95b862b0 2529 dependencies : [libmount],
421f0012 2530 install_rpath : rootlibexecdir,
5c23128d
ZJS
2531 install : true,
2532 install_dir : rootlibexecdir)
2533
2534executable('systemd-update-done',
2535 'src/update-done/update-done.c',
2536 include_directories : includes,
2537 link_with : [libshared],
421f0012 2538 install_rpath : rootlibexecdir,
5c23128d
ZJS
2539 install : true,
2540 install_dir : rootlibexecdir)
2541
2542executable('systemd-update-utmp',
2543 'src/update-utmp/update-utmp.c',
2544 include_directories : includes,
aac26058 2545 link_with : [libshared],
5c23128d 2546 dependencies : [libaudit],
421f0012 2547 install_rpath : rootlibexecdir,
5c23128d
ZJS
2548 install : true,
2549 install_dir : rootlibexecdir)
2550
349cc4a5 2551if conf.get('HAVE_KMOD') == 1
37efbbd8
ZJS
2552 executable('systemd-modules-load',
2553 'src/modules-load/modules-load.c',
2554 include_directories : includes,
2555 link_with : [libshared],
2556 dependencies : [libkmod],
2557 install_rpath : rootlibexecdir,
2558 install : true,
2559 install_dir : rootlibexecdir)
94e75a54 2560
37efbbd8
ZJS
2561 meson.add_install_script('sh', '-c',
2562 mkdir_p.format(modulesloaddir))
2563 meson.add_install_script('sh', '-c',
2564 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
5c23128d
ZJS
2565endif
2566
005a29f2
ZJS
2567exe = executable('systemd-nspawn',
2568 systemd_nspawn_sources,
2569 'src/core/mount-setup.c', # FIXME: use a variable?
2570 'src/core/mount-setup.h',
2571 'src/core/loopback-setup.c',
2572 'src/core/loopback-setup.h',
97d90615
ZJS
2573 include_directories : includes,
2574 link_with : [libnspawn_core,
2575 libshared],
2576 dependencies : [libblkid],
005a29f2
ZJS
2577 install_rpath : rootlibexecdir,
2578 install : true)
5a8b1640 2579public_programs += exe
5c23128d 2580
349cc4a5 2581if conf.get('ENABLE_NETWORKD') == 1
37efbbd8
ZJS
2582 executable('systemd-networkd',
2583 systemd_networkd_sources,
2584 include_directories : includes,
2585 link_with : [libnetworkd_core,
37efbbd8 2586 libsystemd_network,
0c06b506 2587 libudev_static,
37efbbd8 2588 libshared],
4b57a272 2589 dependencies : [threads],
37efbbd8
ZJS
2590 install_rpath : rootlibexecdir,
2591 install : true,
2592 install_dir : rootlibexecdir)
2593
2594 executable('systemd-networkd-wait-online',
2595 systemd_networkd_wait_online_sources,
2596 include_directories : includes,
2597 link_with : [libnetworkd_core,
2598 libshared],
2599 install_rpath : rootlibexecdir,
2600 install : true,
2601 install_dir : rootlibexecdir)
5c23128d 2602
dcfe072a
FS
2603 exe = executable('networkctl',
2604 networkctl_sources,
2605 include_directories : includes,
2606 link_with : [libsystemd_network,
aac26058 2607 libshared],
dcfe072a
FS
2608 install_rpath : rootlibexecdir,
2609 install : true,
2610 install_dir : rootbindir)
5a8b1640 2611 public_programs += exe
dcfe072a 2612endif
e821f6a9
ZJS
2613
2614executable('systemd-sulogin-shell',
2615 ['src/sulogin-shell/sulogin-shell.c'],
2616 include_directories : includes,
2617 link_with : [libshared],
2618 install_rpath : rootlibexecdir,
2619 install : true,
2620 install_dir : rootlibexecdir)
2621
69e96427
ZJS
2622############################################################
2623
e2d41370
FB
2624custom_target(
2625 'systemd-runtest.env',
2626 output : 'systemd-runtest.env',
2627 command : ['sh', '-c', '{ ' +
2628 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
49cdae63 2629 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
e2d41370
FB
2630 '} >@OUTPUT@'],
2631 build_by_default : true)
2632
69e96427 2633foreach tuple : tests
37efbbd8
ZJS
2634 sources = tuple[0]
2635 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2636 dependencies = tuple[2]
2637 condition = tuple.length() >= 4 ? tuple[3] : ''
2638 type = tuple.length() >= 5 ? tuple[4] : ''
2639 defs = tuple.length() >= 6 ? tuple[5] : []
2640 incs = tuple.length() >= 7 ? tuple[6] : includes
2641 timeout = 30
2642
2643 name = sources[0].split('/')[-1].split('.')[0]
2644 if type.startswith('timeout=')
2645 timeout = type.split('=')[1].to_int()
2646 type = ''
2647 endif
3b2bdd62
ZJS
2648
2649 if condition == '' or conf.get(condition) == 1
37efbbd8
ZJS
2650 exe = executable(
2651 name,
2652 sources,
2653 include_directories : incs,
2654 link_with : link_with,
2655 dependencies : dependencies,
2656 c_args : defs,
3b2bdd62 2657 build_by_default : want_tests != 'false',
37efbbd8 2658 install_rpath : rootlibexecdir,
7cdd9783
MB
2659 install : install_tests,
2660 install_dir : join_paths(testsdir, type))
37efbbd8
ZJS
2661
2662 if type == 'manual'
2663 message('@0@ is a manual test'.format(name))
2664 elif type == 'unsafe' and want_tests != 'unsafe'
2665 message('@0@ is an unsafe test'.format(name))
3b2bdd62 2666 elif want_tests != 'false'
37efbbd8
ZJS
2667 test(name, exe,
2668 env : test_env,
2669 timeout : timeout)
2670 endif
2671 else
2672 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2673 endif
69e96427
ZJS
2674endforeach
2675
0632b4cd 2676exe = executable(
37efbbd8
ZJS
2677 'test-libsystemd-sym',
2678 test_libsystemd_sym_c,
2679 include_directories : includes,
2680 link_with : [libsystemd],
fd1939fb 2681 build_by_default : want_tests != 'false',
37efbbd8
ZJS
2682 install : install_tests,
2683 install_dir : testsdir)
938be089
ZJS
2684if want_tests != 'false'
2685 test('test-libsystemd-sym', exe)
2686endif
37ab1a25 2687
0632b4cd
ZJS
2688exe = executable(
2689 'test-libsystemd-static-sym',
2690 test_libsystemd_sym_c,
2691 include_directories : includes,
0632b4cd
ZJS
2692 link_with : [install_libsystemd_static],
2693 dependencies : [threads], # threads is already included in dependencies on the library,
2694 # but does not seem to get propagated. Add here as a work-around.
fd1939fb 2695 build_by_default : want_tests != 'false' and static_libsystemd_pic,
20f3d32d 2696 install : install_tests and static_libsystemd_pic,
0632b4cd 2697 install_dir : testsdir)
938be089 2698if want_tests != 'false' and static_libsystemd_pic
0632b4cd
ZJS
2699 test('test-libsystemd-static-sym', exe)
2700endif
37ab1a25 2701
0632b4cd 2702exe = executable(
37efbbd8
ZJS
2703 'test-libudev-sym',
2704 test_libudev_sym_c,
2705 include_directories : includes,
c1cd6743 2706 c_args : '-Wno-deprecated-declarations',
37efbbd8 2707 link_with : [libudev],
fd1939fb 2708 build_by_default : want_tests != 'false',
37efbbd8
ZJS
2709 install : install_tests,
2710 install_dir : testsdir)
938be089
ZJS
2711if want_tests != 'false'
2712 test('test-libudev-sym', exe)
2713endif
0632b4cd
ZJS
2714
2715exe = executable(
2716 'test-libudev-static-sym',
2717 test_libudev_sym_c,
2718 include_directories : includes,
c1cd6743 2719 c_args : '-Wno-deprecated-declarations',
0632b4cd 2720 link_with : [install_libudev_static],
fd1939fb 2721 build_by_default : want_tests != 'false' and static_libudev_pic,
20f3d32d 2722 install : install_tests and static_libudev_pic,
0632b4cd 2723 install_dir : testsdir)
938be089 2724if want_tests != 'false' and static_libudev_pic
0632b4cd
ZJS
2725 test('test-libudev-static-sym', exe)
2726endif
e0bec52f 2727
69e96427 2728############################################################
5c23128d 2729
7db7d5b7
JR
2730fuzzer_exes = []
2731
2732foreach tuple : fuzzers
2733 sources = tuple[0]
2734 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2735 dependencies = tuple[2]
2736 defs = tuple.length() >= 4 ? tuple[3] : []
2737 incs = tuple.length() >= 5 ? tuple[4] : includes
2738
31e57a35 2739 if fuzzer_build
7db7d5b7
JR
2740 dependencies += fuzzing_engine
2741 else
2742 sources += 'src/fuzz/fuzz-main.c'
2743 endif
2744
2745 name = sources[0].split('/')[-1].split('.')[0]
2746
2747 fuzzer_exes += executable(
2748 name,
2749 sources,
2750 include_directories : [incs, include_directories('src/fuzz')],
2751 link_with : link_with,
2752 dependencies : dependencies,
2753 c_args : defs,
2754 install : false)
2755endforeach
2756
2757run_target('fuzzers',
2758 depends : fuzzer_exes,
2759 command : ['true'])
2760
2761############################################################
2762
5c23128d
ZJS
2763make_directive_index_py = find_program('tools/make-directive-index.py')
2764make_man_index_py = find_program('tools/make-man-index.py')
b184e8fe 2765xml_helper_py = find_program('tools/xml_helper.py')
abba22c5 2766hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
5c23128d
ZJS
2767
2768subdir('units')
2769subdir('sysctl.d')
2770subdir('sysusers.d')
2771subdir('tmpfiles.d')
e783f957 2772subdir('presets')
5c23128d
ZJS
2773subdir('hwdb')
2774subdir('network')
2775subdir('man')
2776subdir('shell-completion/bash')
2777subdir('shell-completion/zsh')
9e825ebf
FB
2778subdir('docs/sysvinit')
2779subdir('docs/var-log')
5c23128d 2780
5c23128d
ZJS
2781install_subdir('factory/etc',
2782 install_dir : factorydir)
2783
5c23128d
ZJS
2784install_data('xorg/50-systemd-user.sh',
2785 install_dir : xinitrcdir)
582faeb4
DJL
2786install_data('modprobe.d/systemd.conf',
2787 install_dir : modprobedir)
f09eb768 2788install_data('LICENSE.GPL2',
5c23128d 2789 'LICENSE.LGPL2.1',
f09eb768
LP
2790 'NEWS',
2791 'README',
9e825ebf 2792 'docs/CODING_STYLE',
1d1cb168 2793 'docs/DISTRO_PORTING.md',
9e825ebf
FB
2794 'docs/ENVIRONMENT.md',
2795 'docs/HACKING',
2796 'docs/TRANSIENT-SETTINGS.md',
b6dc0d7d 2797 'docs/TRANSLATORS.md',
9e825ebf 2798 'docs/UIDS-GIDS.md',
5c23128d
ZJS
2799 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2800 install_dir : docdir)
d68b342b 2801
94e75a54
ZJS
2802meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2803meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2804
d68b342b
ZJS
2805############################################################
2806
005a29f2
ZJS
2807meson_check_help = find_program('tools/meson-check-help.sh')
2808
2809foreach exec : public_programs
37efbbd8 2810 name = exec.full_path().split('/')[-1]
938be089
ZJS
2811 if want_tests != 'false'
2812 test('check-help-' + name,
2813 meson_check_help,
c1cd6743 2814 args : exec.full_path())
938be089 2815 endif
005a29f2
ZJS
2816endforeach
2817
2818############################################################
2819
52d4d1d3
ZJS
2820# Enable tests for all supported sanitizers
2821foreach tuple : sanitizers
2822 sanitizer = tuple[0]
2823 build = tuple[1]
b68dfb9e 2824
7a6397d2 2825 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
52d4d1d3
ZJS
2826 prev = ''
2827 foreach p : fuzz_regression_tests
2828 b = p.split('/')[-2]
2829 c = p.split('/')[-1]
2830
2831 name = '@0@:@1@'.format(b, sanitizer)
2832
2833 if name != prev
2834 if want_tests == 'false'
2835 message('Not compiling @0@ because tests is set to false'.format(name))
2836 elif slow_tests
2837 exe = custom_target(
2838 name,
2839 output : name,
2840 depends : build,
2841 command : [env, 'ln', '-fs',
2842 join_paths(build.full_path(), b),
2843 '@OUTPUT@'],
2844 build_by_default : true)
2845 else
2846 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2847 endif
2848 endif
2849 prev = name
2850
2851 if want_tests != 'false' and slow_tests
2852 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2853 env,
2854 args : [exe.full_path(),
e6bad674 2855 join_paths(meson.source_root(), p)])
52d4d1d3
ZJS
2856 endif
2857 endforeach
b68dfb9e
ZJS
2858 endif
2859endforeach
2860
52d4d1d3 2861
b68dfb9e
ZJS
2862############################################################
2863
0700e8ba 2864if git.found()
37efbbd8
ZJS
2865 all_files = run_command(
2866 git,
243e5cec 2867 ['--git-dir=@0@/.git'.format(meson.source_root()),
37efbbd8
ZJS
2868 'ls-files',
2869 ':/*.[ch]'])
2870 all_files = files(all_files.stdout().split())
d68b342b 2871
e85a690b 2872 custom_target(
0700e8ba 2873 'tags',
e85a690b 2874 output : 'tags',
243e5cec 2875 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
2f09974f 2876 run_target(
0700e8ba 2877 'ctags',
243e5cec 2878 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
d68b342b 2879endif
177929c2
ZJS
2880
2881if git.found()
37efbbd8 2882 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
a923e085 2883 run_target(
37efbbd8 2884 'git-contrib',
37efbbd8 2885 command : [meson_git_contrib_sh])
177929c2 2886endif
dd6ab3df
ZJS
2887
2888if git.found()
2889 git_head = run_command(
2890 git,
243e5cec 2891 ['--git-dir=@0@/.git'.format(meson.source_root()),
dd6ab3df
ZJS
2892 'rev-parse', 'HEAD']).stdout().strip()
2893 git_head_short = run_command(
2894 git,
243e5cec 2895 ['--git-dir=@0@/.git'.format(meson.source_root()),
dd6ab3df
ZJS
2896 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2897
2898 run_target(
2899 'git-snapshot',
2900 command : ['git', 'archive',
243e5cec 2901 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
dd6ab3df
ZJS
2902 git_head_short),
2903 '--prefix', 'systemd-@0@/'.format(git_head),
2904 'HEAD'])
2905endif
829257d1
ZJS
2906
2907############################################################
2908
51b13863
LP
2909meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2910run_target(
2911 'check-api-docs',
2912 depends : [man, libsystemd, libudev],
2913 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2914
0bc7a22d
LP
2915run_target(
2916 'make-index-md',
2917 command : ['sh', '@0@/tools/make-index-md.sh'.format(meson.source_root()), meson.source_root()])
2918
51b13863
LP
2919############################################################
2920
829257d1
ZJS
2921status = [
2922 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2923
2675413e 2924 'split /usr: @0@'.format(split_usr),
157baa87 2925 'split bin-sbin: @0@'.format(split_bin),
359b496f
YW
2926 'prefix directory: @0@'.format(prefixdir),
2927 'rootprefix directory: @0@'.format(rootprefixdir),
2928 'sysconf directory: @0@'.format(sysconfdir),
2929 'include directory: @0@'.format(includedir),
2930 'lib directory: @0@'.format(libdir),
2931 'rootlib directory: @0@'.format(rootlibdir),
829257d1
ZJS
2932 'SysV init scripts: @0@'.format(sysvinit_path),
2933 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
359b496f
YW
2934 'PAM modules directory: @0@'.format(pamlibdir),
2935 'PAM configuration directory: @0@'.format(pamconfdir),
2936 'RPM macros directory: @0@'.format(rpmmacrosdir),
2937 'modprobe.d directory: @0@'.format(modprobedir),
2938 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2939 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2940 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2941 'bash completions directory: @0@'.format(bashcompletiondir),
2942 'zsh completions directory: @0@'.format(zshcompletiondir),
829257d1
ZJS
2943 'extra start script: @0@'.format(get_option('rc-local')),
2944 'extra stop script: @0@'.format(get_option('halt-local')),
2945 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2946 get_option('debug-tty')),
2947 'TTY GID: @0@'.format(tty_gid),
ac09340e 2948 'users GID: @0@'.format(substs.get('USERS_GID')),
829257d1
ZJS
2949 'maximum system UID: @0@'.format(system_uid_max),
2950 'maximum system GID: @0@'.format(system_gid_max),
87d5e4f2
LP
2951 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2952 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2953 'minimum container UID base: @0@'.format(container_uid_base_min),
2954 'maximum container UID base: @0@'.format(container_uid_base_max),
829257d1 2955 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
4e15a734 2956 'render group access mode: @0@'.format(get_option('group-render-mode')),
359b496f 2957 'certificate root directory: @0@'.format(get_option('certificate-root')),
829257d1 2958 'support URL: @0@'.format(support_url),
afde4574
LP
2959 'nobody user name: @0@'.format(nobody_user),
2960 'nobody group name: @0@'.format(nobody_group),
829257d1 2961 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
5248e7e1 2962 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
829257d1
ZJS
2963
2964 'default DNSSEC mode: @0@'.format(default_dnssec),
c9299be2 2965 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
829257d1
ZJS
2966 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2967 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2968
2969alt_dns_servers = '\n '.join(dns_servers.split(' '))
2970alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2971status += [
2972 'default DNS servers: @0@'.format(alt_dns_servers),
2973 'default NTP servers: @0@'.format(alt_ntp_servers)]
2974
2975alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2976 '@@0@'.format(time_epoch)).stdout().strip()
2977status += [
2978 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2979
19d8c9c9
LP
2980status += [
2981 'static libsystemd: @0@'.format(get_option('static-libsystemd')),
2982 'static libudev: @0@'.format(get_option('static-libudev'))]
2983
829257d1
ZJS
2984# TODO:
2985# CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2986# CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2987# LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2988
349cc4a5 2989if conf.get('ENABLE_EFI') == 1
5a8b1640 2990 status += 'efi arch: @0@'.format(efi_arch)
829257d1
ZJS
2991
2992 if have_gnu_efi
2993 status += [
2994 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2995 'EFI CC @0@'.format(efi_cc),
359b496f
YW
2996 'EFI lib directory: @0@'.format(efi_libdir),
2997 'EFI lds directory: @0@'.format(efi_ldsdir),
2998 'EFI include directory: @0@'.format(efi_incdir)]
829257d1
ZJS
2999 endif
3000endif
3001
3002found = []
3003missing = []
3004
3005foreach tuple : [
3006 ['libcryptsetup'],
3007 ['PAM'],
3008 ['AUDIT'],
3009 ['IMA'],
3010 ['AppArmor'],
3011 ['SELinux'],
3012 ['SECCOMP'],
3013 ['SMACK'],
3014 ['zlib'],
3015 ['xz'],
3016 ['lz4'],
3017 ['bzip2'],
3018 ['ACL'],
3019 ['gcrypt'],
3020 ['qrencode'],
3021 ['microhttpd'],
3022 ['gnutls'],
096cbdce 3023 ['openssl'],
829257d1 3024 ['libcurl'],
d1bf5675 3025 ['idn'],
87057e24 3026 ['libidn2'],
829257d1
ZJS
3027 ['libidn'],
3028 ['libiptc'],
3029 ['elfutils'],
3030 ['binfmt'],
3031 ['vconsole'],
3032 ['quotacheck'],
3033 ['tmpfiles'],
3034 ['environment.d'],
3035 ['sysusers'],
3036 ['firstboot'],
3037 ['randomseed'],
3038 ['backlight'],
3039 ['rfkill'],
3040 ['logind'],
3041 ['machined'],
61d0578b 3042 ['portabled'],
829257d1
ZJS
3043 ['importd'],
3044 ['hostnamed'],
3045 ['timedated'],
3046 ['timesyncd'],
3047 ['localed'],
3048 ['networkd'],
a7456af5 3049 ['resolve'],
096cbdce
IT
3050 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3051 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
829257d1
ZJS
3052 ['coredump'],
3053 ['polkit'],
3054 ['legacy pkla', install_polkit_pkla],
3055 ['efi'],
3056 ['gnu-efi', have_gnu_efi],
3057 ['kmod'],
3058 ['xkbcommon'],
c4c978a0 3059 ['pcre2'],
829257d1
ZJS
3060 ['blkid'],
3061 ['dbus'],
3062 ['glib'],
6bd2bc8e
ZJS
3063 ['nss-myhostname'],
3064 ['nss-mymachines'],
3065 ['nss-resolve'],
3066 ['nss-systemd'],
829257d1
ZJS
3067 ['hwdb'],
3068 ['tpm'],
3069 ['man pages', want_man],
3070 ['html pages', want_html],
3071 ['man page indices', want_man and have_lxml],
829257d1
ZJS
3072 ['SysV compat'],
3073 ['utmp'],
3074 ['ldconfig'],
3075 ['hibernate'],
3076 ['adm group', get_option('adm-group')],
3077 ['wheel group', get_option('wheel-group')],
b14e1b43 3078 ['gshadow'],
829257d1
ZJS
3079 ['debug hashmap'],
3080 ['debug mmap cache'],
d18cb393 3081 ['valgrind', conf.get('VALGRIND') == 1],
fd5dec9a 3082 ['trace logging', conf.get('LOG_TRACE') == 1],
19d8c9c9
LP
3083 ['link-udev-shared', get_option('link-udev-shared')],
3084 ['link-systemctl-shared', get_option('link-systemctl-shared')],
829257d1
ZJS
3085]
3086
af4d7860
ZJS
3087 if tuple.length() >= 2
3088 cond = tuple[1]
3089 else
829257d1
ZJS
3090 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3091 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
349cc4a5 3092 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
829257d1
ZJS
3093 endif
3094 if cond
5a8b1640 3095 found += tuple[0]
829257d1 3096 else
5a8b1640 3097 missing += tuple[0]
829257d1
ZJS
3098 endif
3099endforeach
3100
3101status += [
9d39c1bf 3102 '',
829257d1 3103 'enabled features: @0@'.format(', '.join(found)),
9d39c1bf
ZJS
3104 '',
3105 'disabled features: @0@'.format(', '.join(missing)),
3106 '']
829257d1 3107message('\n '.join(status))
9a8e64b0
ZJS
3108
3109if rootprefixdir != rootprefix_default
8ea9fad7
YW
3110 warning('\n' +
3111 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3112 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3113 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
9a8e64b0 3114endif