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