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