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