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