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