]> git.ipfire.org Git - thirdparty/systemd.git/blame - meson.build
docs: move markdown docs from .github/ to docs/
[thirdparty/systemd.git] / meson.build
CommitLineData
3a726fcd 1# SPDX-License-Identifier: LGPL-2.1+
3a726fcd 2
5c23128d 3project('systemd', 'c',
de7436b0 4 version : '239',
5c23128d
ZJS
5 license : 'LGPLv2+',
6 default_options: [
37efbbd8
ZJS
7 'c_std=gnu99',
8 'prefix=/usr',
9 'sysconfdir=/etc',
10 'localstatedir=/var',
5c23128d 11 ],
7a6397d2 12 meson_version : '>= 0.46',
5c23128d
ZJS
13 )
14
de7436b0
LP
15libsystemd_version = '0.23.0'
16libudev_version = '1.6.11'
56d50ab1 17
348b4437 18# We need the same data in two different formats, ugh!
5c23128d
ZJS
19# Also, for hysterical reasons, we use different variable
20# names, sometimes. Not all variables are included in every
21# set. Ugh, ugh, ugh!
22conf = configuration_data()
23conf.set_quoted('PACKAGE_STRING', meson.project_name() + ' ' + meson.project_version())
24conf.set_quoted('PACKAGE_VERSION', meson.project_version())
25
26substs = configuration_data()
27substs.set('PACKAGE_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
28substs.set('PACKAGE_VERSION', meson.project_version())
29
5c23128d
ZJS
30#####################################################################
31
003c8879
ZJS
32# Try to install the git pre-commit hook
33git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
34if git_hook.returncode() == 0
35 message(git_hook.stdout().strip())
36endif
37
38#####################################################################
39
2675413e
ZJS
40if get_option('split-usr') == 'auto'
41 split_usr = run_command('test', '-L', '/bin').returncode() != 0
42else
43 split_usr = get_option('split-usr') == 'true'
44endif
671f0f8d
ZJS
45conf.set10('HAVE_SPLIT_USR', split_usr,
46 description : '/usr/bin and /bin directories are separate')
9a8e64b0 47
157baa87
ZJS
48if get_option('split-bin') == 'auto'
49 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
50else
51 split_bin = get_option('split-bin') == 'true'
52endif
671f0f8d
ZJS
53conf.set10('HAVE_SPLIT_BIN', split_bin,
54 description : 'bin and sbin directories are separate')
157baa87 55
74344a17 56rootprefixdir = get_option('rootprefix')
74344a17
ZJS
57# Unusual rootprefixdir values are used by some distros
58# (see https://github.com/systemd/systemd/pull/7461).
ba7f4ae6 59rootprefix_default = split_usr ? '/' : '/usr'
9a8e64b0
ZJS
60if rootprefixdir == ''
61 rootprefixdir = rootprefix_default
74344a17 62endif
5c23128d
ZJS
63
64sysvinit_path = get_option('sysvinit-path')
65sysvrcnd_path = get_option('sysvrcnd-path')
348b4437 66conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
349cc4a5 67 description : 'SysV init scripts and rcN.d links are supported')
5c23128d
ZJS
68
69# join_paths ignore the preceding arguments if an absolute component is
70# encountered, so this should canonicalize various paths when they are
71# absolute or relative.
72prefixdir = get_option('prefix')
73if not prefixdir.startswith('/')
37efbbd8 74 error('Prefix is not absolute: "@0@"'.format(prefixdir))
5c23128d
ZJS
75endif
76bindir = join_paths(prefixdir, get_option('bindir'))
77libdir = join_paths(prefixdir, get_option('libdir'))
78sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
79includedir = join_paths(prefixdir, get_option('includedir'))
80datadir = join_paths(prefixdir, get_option('datadir'))
81localstatedir = join_paths('/', get_option('localstatedir'))
82
83rootbindir = join_paths(rootprefixdir, 'bin')
157baa87 84rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
5c23128d
ZJS
85rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
86
87rootlibdir = get_option('rootlibdir')
88if rootlibdir == ''
37efbbd8 89 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
5c23128d
ZJS
90endif
91
92# Dirs of external packages
a95696e3
BM
93pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
94pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
e17e5ba9
MB
95polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
96polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
97polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
98varlogdir = join_paths(localstatedir, 'log')
99xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
8a38aac3
YW
100rpmmacrosdir = get_option('rpmmacrosdir')
101if rpmmacrosdir != 'no'
102 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
103endif
02fa054d 104modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
5c23128d
ZJS
105
106# Our own paths
e17e5ba9
MB
107pkgdatadir = join_paths(datadir, 'systemd')
108environmentdir = join_paths(prefixdir, 'lib/environment.d')
109pkgsysconfdir = join_paths(sysconfdir, 'systemd')
110userunitdir = join_paths(prefixdir, 'lib/systemd/user')
111userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
112tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
113sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
114sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
115binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
116modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
117networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
118pkgincludedir = join_paths(includedir, 'systemd')
119systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
120usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
121systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
122userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
123systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
124systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
125systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
126systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
127udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
128udevhomedir = udevlibexecdir
129udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
130udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
131catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
132kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
133factorydir = join_paths(datadir, 'factory')
e17e5ba9
MB
134bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
135testsdir = join_paths(prefixdir, 'lib/systemd/tests')
136systemdstatedir = join_paths(localstatedir, 'lib/systemd')
137catalogstatedir = join_paths(systemdstatedir, 'catalog')
138randomseeddir = join_paths(localstatedir, 'lib/systemd')
61d0578b 139profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
5c23128d 140
75aaade1
TB
141docdir = get_option('docdir')
142if docdir == ''
143 docdir = join_paths(datadir, 'doc/systemd')
144endif
145
5c23128d
ZJS
146dbuspolicydir = get_option('dbuspolicydir')
147if dbuspolicydir == ''
37efbbd8 148 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
5c23128d
ZJS
149endif
150
151dbussessionservicedir = get_option('dbussessionservicedir')
152if dbussessionservicedir == ''
37efbbd8 153 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
5c23128d
ZJS
154endif
155
156dbussystemservicedir = get_option('dbussystemservicedir')
157if dbussystemservicedir == ''
37efbbd8 158 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
5c23128d
ZJS
159endif
160
161pamlibdir = get_option('pamlibdir')
162if pamlibdir == ''
37efbbd8 163 pamlibdir = join_paths(rootlibdir, 'security')
5c23128d
ZJS
164endif
165
166pamconfdir = get_option('pamconfdir')
167if pamconfdir == ''
37efbbd8 168 pamconfdir = join_paths(sysconfdir, 'pam.d')
5c23128d
ZJS
169endif
170
444d5863
ZJS
171memory_accounting_default = get_option('memory-accounting-default')
172
5c23128d 173conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
e17e5ba9 174conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
5c23128d
ZJS
175conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
176conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
177conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
2a4c156d
ZJS
178conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
179conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
96164a39 180
f7c5427c 181conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
96164a39 182
e17e5ba9 183conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
5c23128d
ZJS
184conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
185conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
e17e5ba9
MB
186conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
187conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
188conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
189conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
da495a03 190conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
7f2806d5 191conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
e17e5ba9
MB
192conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
193conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
194conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
195conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
196conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
74344a17 197conf.set_quoted('ROOTPREFIX', rootprefixdir)
3131bfe3 198conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
e17e5ba9
MB
199conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
200conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
5c23128d
ZJS
201conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
202conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
203conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
204conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
205conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
206conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
e17e5ba9
MB
207conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
208conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
5c23128d 209conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
e17e5ba9 210conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
5c23128d
ZJS
211conf.set_quoted('LIBDIR', libdir)
212conf.set_quoted('ROOTLIBDIR', rootlibdir)
213conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
214conf.set_quoted('BOOTLIBDIR', bootlibdir)
e17e5ba9
MB
215conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
216conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
217conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
218conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
219conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
220conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
444d5863 221conf.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'true' : 'false')
7f672e86 222conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
5c23128d
ZJS
223
224conf.set_quoted('ABS_BUILD_DIR', meson.build_root())
225conf.set_quoted('ABS_SRC_DIR', meson.source_root())
226
227substs.set('prefix', prefixdir)
3131bfe3
ZJS
228substs.set('exec_prefix', prefixdir)
229substs.set('libdir', libdir)
230substs.set('rootlibdir', rootlibdir)
231substs.set('includedir', includedir)
5c23128d 232substs.set('pkgsysconfdir', pkgsysconfdir)
3131bfe3
ZJS
233substs.set('bindir', bindir)
234substs.set('rootbindir', rootbindir)
5c23128d
ZJS
235substs.set('rootlibexecdir', rootlibexecdir)
236substs.set('systemunitdir', systemunitdir)
237substs.set('userunitdir', userunitdir)
238substs.set('systempresetdir', systempresetdir)
239substs.set('userpresetdir', userpresetdir)
240substs.set('udevhwdbdir', udevhwdbdir)
241substs.set('udevrulesdir', udevrulesdir)
3131bfe3 242substs.set('udevlibexecdir', udevlibexecdir)
424e80b4 243substs.set('environmentdir', environmentdir)
5c23128d
ZJS
244substs.set('catalogdir', catalogdir)
245substs.set('tmpfilesdir', tmpfilesdir)
246substs.set('sysusersdir', sysusersdir)
247substs.set('sysctldir', sysctldir)
248substs.set('binfmtdir', binfmtdir)
249substs.set('modulesloaddir', modulesloaddir)
424e80b4 250substs.set('modprobedir', modprobedir)
5c23128d
ZJS
251substs.set('systemgeneratordir', systemgeneratordir)
252substs.set('usergeneratordir', usergeneratordir)
253substs.set('systemenvgeneratordir', systemenvgeneratordir)
254substs.set('userenvgeneratordir', userenvgeneratordir)
255substs.set('systemshutdowndir', systemshutdowndir)
256substs.set('systemsleepdir', systemsleepdir)
2a4c156d
ZJS
257substs.set('VARLOGDIR', varlogdir)
258substs.set('CERTIFICATEROOT', get_option('certificate-root'))
e17e5ba9
MB
259substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
260substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
2a4c156d
ZJS
261substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
262substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
263substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
264substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
444d5863 265substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
5c23128d
ZJS
266
267#####################################################################
268
269cc = meson.get_compiler('c')
270pkgconfig = import('pkgconfig')
6e2afb1c 271check_compilation_sh = find_program('tools/meson-check-compilation.sh')
b68dfb9e 272meson_build_sh = find_program('tools/meson-build.sh')
5c23128d 273
08318a2c
AD
274if get_option('tests') != 'false'
275 cxx = find_program('c++', required : false)
276 if cxx.found()
277 # Used only for tests
278 add_languages('cpp')
279 endif
94e2523b
ZJS
280endif
281
31e57a35
JR
282want_ossfuzz = get_option('oss-fuzz')
283want_libfuzzer = get_option('llvm-fuzz')
284fuzzer_build = want_ossfuzz or want_libfuzzer
285if want_ossfuzz and want_libfuzzer
286 error('only one of oss-fuzz and llvm-fuzz can be specified')
287endif
288if want_libfuzzer
289 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
290endif
291if want_ossfuzz
7db7d5b7
JR
292 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
293endif
294
30a4ddff
YW
295possible_cc_flags = [
296 '-Wextra',
297 '-Werror=undef',
298 '-Wlogical-op',
299 '-Wmissing-include-dirs',
300 '-Wold-style-definition',
301 '-Wpointer-arith',
302 '-Winit-self',
30a4ddff
YW
303 '-Wfloat-equal',
304 '-Wsuggest-attribute=noreturn',
305 '-Werror=missing-prototypes',
306 '-Werror=implicit-function-declaration',
307 '-Werror=missing-declarations',
308 '-Werror=return-type',
309 '-Werror=incompatible-pointer-types',
310 '-Werror=format=2',
311 '-Wstrict-prototypes',
312 '-Wredundant-decls',
313 '-Wmissing-noreturn',
314 '-Wimplicit-fallthrough=5',
315 '-Wshadow',
316 '-Wendif-labels',
317 '-Wstrict-aliasing=2',
318 '-Wwrite-strings',
319 '-Werror=overflow',
b05ecb8c 320 '-Werror=shift-count-overflow',
d28b67d4 321 '-Werror=shift-overflow=2',
30a4ddff
YW
322 '-Wdate-time',
323 '-Wnested-externs',
324 '-ffast-math',
325 '-fno-common',
326 '-fdiagnostics-show-option',
327 '-fno-strict-aliasing',
328 '-fvisibility=hidden',
329 '-fstack-protector',
330 '-fstack-protector-strong',
331 '--param=ssp-buffer-size=4',
332]
333
334# --as-needed and --no-undefined are provided by meson by default,
335# run mesonconf to see what is enabled
336possible_link_flags = [
337 '-Wl,-z,relro',
338 '-Wl,-z,now',
339]
5c23128d 340
7db7d5b7
JR
341# the oss-fuzz fuzzers are not built with -fPIE, so don't
342# enable it when we are linking against them
31e57a35 343if not fuzzer_build
30a4ddff
YW
344 possible_cc_flags += '-fPIE'
345 possible_link_flags += '-pie'
7db7d5b7
JR
346endif
347
30a4ddff
YW
348if cc.get_id() == 'clang'
349 possible_cc_flags += [
350 '-Wno-typedef-redefinition',
351 '-Wno-gnu-variable-sized-type-not-at-end',
352 ]
353endif
354
355if get_option('buildtype') != 'debug'
356 possible_cc_flags += [
357 '-ffunction-sections',
358 '-fdata-sections',
359 ]
360
361 possible_link_flags += '-Wl,--gc-sections'
362endif
363
364add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
7a6397d2 365add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
30a4ddff 366
2c5434ad 367# "negative" arguments: gcc on purpose does not return an error for "-Wno-"
d40f5cc4 368# arguments, just emits a warning. So test for the "positive" version instead.
2c5434ad
ZJS
369foreach arg : ['unused-parameter',
370 'missing-field-initializers',
371 'unused-result',
fb1b5882
ZJS
372 'format-signedness',
373 'error=nonnull', # work-around for gcc 7.1 turning this on on its own
8794164f
FB
374
375 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
376 # optimizations enabled, producing essentially false positives.
377 'maybe-uninitialized',
fb1b5882 378 ]
2c5434ad
ZJS
379 if cc.has_argument('-W' + arg)
380 add_project_arguments('-Wno-' + arg, language : 'c')
381 endif
382endforeach
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 1298want_tests = get_option('tests')
572baca1 1299install_tests = get_option('install-tests')
b68dfb9e 1300slow_tests = get_option('slow-tests')
69e96427 1301tests = []
7db7d5b7 1302fuzzers = []
69e96427 1303
b68dfb9e 1304conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
00d82c81 1305
5c23128d
ZJS
1306#####################################################################
1307
1308if get_option('efi')
37efbbd8 1309 efi_arch = host_machine.cpu_family()
b710072d 1310
6800fe7f 1311 if efi_arch == 'x86'
37efbbd8 1312 EFI_MACHINE_TYPE_NAME = 'ia32'
6800fe7f 1313 gnu_efi_arch = 'ia32'
37efbbd8
ZJS
1314 elif efi_arch == 'x86_64'
1315 EFI_MACHINE_TYPE_NAME = 'x64'
6800fe7f 1316 gnu_efi_arch = 'x86_64'
37efbbd8
ZJS
1317 elif efi_arch == 'arm'
1318 EFI_MACHINE_TYPE_NAME = 'arm'
6800fe7f 1319 gnu_efi_arch = 'arm'
37efbbd8
ZJS
1320 elif efi_arch == 'aarch64'
1321 EFI_MACHINE_TYPE_NAME = 'aa64'
6800fe7f 1322 gnu_efi_arch = 'aarch64'
37efbbd8
ZJS
1323 else
1324 EFI_MACHINE_TYPE_NAME = ''
6800fe7f 1325 gnu_efi_arch = ''
37efbbd8 1326 endif
5c23128d 1327
349cc4a5 1328 have = true
37efbbd8 1329 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
80c6fce8 1330
ac09340e 1331 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
349cc4a5
ZJS
1332else
1333 have = false
5c23128d 1334endif
349cc4a5 1335conf.set10('ENABLE_EFI', have)
5c23128d
ZJS
1336
1337#####################################################################
1338
1339config_h = configure_file(
37efbbd8
ZJS
1340 output : 'config.h',
1341 configuration : conf)
5c23128d 1342
348b4437
YW
1343meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1344
5c23128d
ZJS
1345includes = include_directories('src/basic',
1346 'src/shared',
1347 'src/systemd',
1348 'src/journal',
a38f7fec 1349 'src/journal-remote',
97d90615 1350 'src/nspawn',
5c23128d
ZJS
1351 'src/resolve',
1352 'src/timesync',
5c3376ef 1353 'src/time-wait-sync',
5c23128d
ZJS
1354 'src/login',
1355 'src/udev',
1356 'src/libudev',
1357 'src/core',
1358 'src/libsystemd/sd-bus',
1359 'src/libsystemd/sd-device',
1360 'src/libsystemd/sd-hwdb',
1361 'src/libsystemd/sd-id128',
1362 'src/libsystemd/sd-netlink',
1363 'src/libsystemd/sd-network',
1364 'src/libsystemd-network',
2d4ceca8 1365 '.')
5c23128d
ZJS
1366
1367add_project_arguments('-include', 'config.h', language : 'c')
1368
5c23128d
ZJS
1369subdir('po')
1370subdir('catalog')
1371subdir('src/systemd')
1372subdir('src/basic')
1373subdir('src/libsystemd')
1374subdir('src/libsystemd-network')
5c23128d 1375subdir('src/journal')
5c23128d 1376subdir('src/login')
5c23128d
ZJS
1377
1378libjournal_core = static_library(
37efbbd8
ZJS
1379 'journal-core',
1380 libjournal_core_sources,
1381 journald_gperf_c,
1382 include_directories : includes,
1383 install : false)
5c23128d 1384
37ab1a25 1385libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
5c23128d 1386libsystemd = shared_library(
37efbbd8 1387 'systemd',
7f1ea2cc 1388 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
56d50ab1 1389 version : libsystemd_version,
37efbbd8
ZJS
1390 include_directories : includes,
1391 link_args : ['-shared',
1392 '-Wl,--version-script=' + libsystemd_sym_path],
34e221a5
ZJS
1393 link_with : [libbasic,
1394 libbasic_gcrypt],
5e3cec87
ZJS
1395 link_whole : [libsystemd_static,
1396 libjournal_client],
37efbbd8
ZJS
1397 dependencies : [threads,
1398 librt,
1399 libxz,
1400 liblz4],
1401 link_depends : libsystemd_sym,
1402 install : true,
1403 install_dir : rootlibdir)
5c23128d 1404
70848ecf
DC
1405static_libsystemd = get_option('static-libsystemd')
1406static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1407
1408install_libsystemd_static = static_library(
1409 'systemd',
1410 libsystemd_sources,
1411 journal_client_sources,
975464e0
ZJS
1412 basic_sources,
1413 basic_gcrypt_sources,
70848ecf 1414 include_directories : includes,
70848ecf
DC
1415 build_by_default : static_libsystemd != 'false',
1416 install : static_libsystemd != 'false',
1417 install_dir : rootlibdir,
1418 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1419 dependencies : [threads,
1420 librt,
1421 libxz,
1422 liblz4,
975464e0
ZJS
1423 libcap,
1424 libblkid,
1425 libmount,
1426 libselinux,
70848ecf
DC
1427 libgcrypt],
1428 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1429
5c23128d
ZJS
1430############################################################
1431
83b6af36
ZJS
1432# binaries that have --help and are intended for use by humans,
1433# usually, but not always, installed in /bin.
1434public_programs = []
1435
1436subdir('src/libudev')
1437subdir('src/shared')
1438subdir('src/core')
1439subdir('src/udev')
1440subdir('src/network')
1441
1442subdir('src/analyze')
1443subdir('src/journal-remote')
1444subdir('src/coredump')
1445subdir('src/hostname')
1446subdir('src/import')
1447subdir('src/kernel-install')
1448subdir('src/locale')
1449subdir('src/machine')
61d0578b 1450subdir('src/portable')
83b6af36
ZJS
1451subdir('src/nspawn')
1452subdir('src/resolve')
1453subdir('src/timedate')
1454subdir('src/timesync')
1455subdir('src/vconsole')
83b6af36
ZJS
1456subdir('src/boot/efi')
1457
1458subdir('src/test')
7db7d5b7 1459subdir('src/fuzz')
6b97bf22 1460subdir('rules')
83b6af36
ZJS
1461subdir('test')
1462
1463############################################################
1464
1465# only static linking apart from libdl, to make sure that the
1466# module is linked to all libraries that it uses.
1467test_dlopen = executable(
37efbbd8
ZJS
1468 'test-dlopen',
1469 test_dlopen_c,
1470 include_directories : includes,
1471 link_with : [libbasic],
1472 dependencies : [libdl])
83b6af36 1473
08540a95 1474foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
e7e11bbf 1475 ['systemd', 'ENABLE_NSS_SYSTEMD'],
08540a95
YW
1476 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1477 ['resolve', 'ENABLE_NSS_RESOLVE']]
5c23128d 1478
349cc4a5 1479 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
37efbbd8
ZJS
1480 if condition
1481 module = tuple[0]
37efbbd8
ZJS
1482
1483 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1484 version_script_arg = join_paths(meson.current_source_dir(), sym)
1485
1486 nss = shared_library(
1487 'nss_' + module,
1488 'src/nss-@0@/nss-@0@.c'.format(module),
1489 version : '2',
1490 include_directories : includes,
b4b36f44
LP
1491 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1492 link_args : ['-Wl,-z,nodelete',
1493 '-shared',
37efbbd8
ZJS
1494 '-Wl,--version-script=' + version_script_arg,
1495 '-Wl,--undefined'],
37e4d7a8 1496 link_with : [libsystemd_static,
37efbbd8
ZJS
1497 libbasic],
1498 dependencies : [threads,
5486a31d 1499 librt],
37efbbd8
ZJS
1500 link_depends : sym,
1501 install : true,
1502 install_dir : rootlibdir)
1503
1504 # We cannot use shared_module because it does not support version suffix.
1505 # Unfortunately shared_library insists on creating the symlink…
1506 meson.add_install_script('sh', '-c',
1507 'rm $DESTDIR@0@/libnss_@1@.so'
1508 .format(rootlibdir, module))
1509
1510 test('dlopen-nss_' + module,
1511 test_dlopen,
1512 args : [nss.full_path()]) # path to dlopen must include a slash
1513 endif
5c23128d
ZJS
1514endforeach
1515
1516############################################################
1517
5c23128d
ZJS
1518executable('systemd',
1519 systemd_sources,
1520 include_directories : includes,
1521 link_with : [libcore,
34ce0a52 1522 libshared],
5c23128d
ZJS
1523 dependencies : [threads,
1524 librt,
1525 libseccomp,
1526 libselinux,
f4ee10a2
ZJS
1527 libmount,
1528 libblkid],
421f0012 1529 install_rpath : rootlibexecdir,
5c23128d
ZJS
1530 install : true,
1531 install_dir : rootlibexecdir)
1532
ba7f4ae6
ZJS
1533meson.add_install_script(meson_make_symlink,
1534 join_paths(rootlibexecdir, 'systemd'),
1535 join_paths(rootsbindir, 'init'))
1536
005a29f2
ZJS
1537exe = executable('systemd-analyze',
1538 systemd_analyze_sources,
1539 include_directories : includes,
1540 link_with : [libcore,
005a29f2
ZJS
1541 libshared],
1542 dependencies : [threads,
1543 librt,
1544 libseccomp,
1545 libselinux,
1546 libmount,
1547 libblkid],
1548 install_rpath : rootlibexecdir,
1549 install : true)
5a8b1640 1550public_programs += exe
5c23128d
ZJS
1551
1552executable('systemd-journald',
1553 systemd_journald_sources,
1554 include_directories : includes,
aac26058 1555 link_with : [libjournal_core,
34ce0a52 1556 libshared],
5c23128d
ZJS
1557 dependencies : [threads,
1558 libxz,
aac26058
ZJS
1559 liblz4,
1560 libselinux],
421f0012 1561 install_rpath : rootlibexecdir,
5c23128d
ZJS
1562 install : true,
1563 install_dir : rootlibexecdir)
1564
005a29f2
ZJS
1565exe = executable('systemd-cat',
1566 systemd_cat_sources,
1567 include_directories : includes,
1568 link_with : [libjournal_core,
34ce0a52 1569 libshared],
005a29f2
ZJS
1570 dependencies : [threads],
1571 install_rpath : rootlibexecdir,
1572 install : true)
5a8b1640 1573public_programs += exe
005a29f2
ZJS
1574
1575exe = executable('journalctl',
1576 journalctl_sources,
1577 include_directories : includes,
34ce0a52 1578 link_with : [libshared],
005a29f2
ZJS
1579 dependencies : [threads,
1580 libqrencode,
1581 libxz,
6becf48c
ZJS
1582 liblz4,
1583 libpcre2],
005a29f2
ZJS
1584 install_rpath : rootlibexecdir,
1585 install : true,
1586 install_dir : rootbindir)
5a8b1640 1587public_programs += exe
5c23128d
ZJS
1588
1589executable('systemd-getty-generator',
1590 'src/getty-generator/getty-generator.c',
5c23128d 1591 include_directories : includes,
b2fc5836
ZJS
1592 link_with : [libshared],
1593 install_rpath : rootlibexecdir,
1594 install : true,
1595 install_dir : systemgeneratordir)
5c23128d
ZJS
1596
1597executable('systemd-debug-generator',
1598 'src/debug-generator/debug-generator.c',
5c23128d 1599 include_directories : includes,
b2fc5836
ZJS
1600 link_with : [libshared],
1601 install_rpath : rootlibexecdir,
1602 install : true,
1603 install_dir : systemgeneratordir)
5c23128d
ZJS
1604
1605executable('systemd-fstab-generator',
1606 'src/fstab-generator/fstab-generator.c',
1607 'src/core/mount-setup.c',
5c23128d 1608 include_directories : includes,
b2fc5836
ZJS
1609 link_with : [libshared],
1610 install_rpath : rootlibexecdir,
1611 install : true,
1612 install_dir : systemgeneratordir)
5c23128d 1613
349cc4a5 1614if conf.get('ENABLE_ENVIRONMENT_D') == 1
37efbbd8
ZJS
1615 executable('30-systemd-environment-d-generator',
1616 'src/environment-d-generator/environment-d-generator.c',
1617 include_directories : includes,
1618 link_with : [libshared],
1619 install_rpath : rootlibexecdir,
1620 install : true,
1621 install_dir : userenvgeneratordir)
7b76fce1 1622
37efbbd8
ZJS
1623 meson.add_install_script(meson_make_symlink,
1624 join_paths(sysconfdir, 'environment'),
1625 join_paths(environmentdir, '99-environment.conf'))
5c23128d
ZJS
1626endif
1627
349cc4a5 1628if conf.get('ENABLE_HIBERNATE') == 1
37efbbd8
ZJS
1629 executable('systemd-hibernate-resume-generator',
1630 'src/hibernate-resume/hibernate-resume-generator.c',
1631 include_directories : includes,
1632 link_with : [libshared],
1633 install_rpath : rootlibexecdir,
1634 install : true,
1635 install_dir : systemgeneratordir)
5c23128d 1636
37efbbd8
ZJS
1637 executable('systemd-hibernate-resume',
1638 'src/hibernate-resume/hibernate-resume.c',
005a29f2
ZJS
1639 include_directories : includes,
1640 link_with : [libshared],
1641 install_rpath : rootlibexecdir,
1642 install : true,
1643 install_dir : rootlibexecdir)
37efbbd8
ZJS
1644endif
1645
349cc4a5 1646if conf.get('HAVE_BLKID') == 1
37efbbd8
ZJS
1647 executable('systemd-gpt-auto-generator',
1648 'src/gpt-auto-generator/gpt-auto-generator.c',
1649 'src/basic/blkid-util.h',
1650 include_directories : includes,
34ce0a52 1651 link_with : [libshared],
37efbbd8
ZJS
1652 dependencies : libblkid,
1653 install_rpath : rootlibexecdir,
1654 install : true,
1655 install_dir : systemgeneratordir)
1656
1657 exe = executable('systemd-dissect',
1658 'src/dissect/dissect.c',
1659 include_directories : includes,
1660 link_with : [libshared],
1661 install_rpath : rootlibexecdir,
1662 install : true,
1663 install_dir : rootlibexecdir)
5a8b1640 1664 public_programs += exe
5c23128d
ZJS
1665endif
1666
1ec57f33 1667if conf.get('ENABLE_RESOLVE') == 1
37efbbd8
ZJS
1668 executable('systemd-resolved',
1669 systemd_resolved_sources,
005a29f2 1670 include_directories : includes,
34e221a5 1671 link_with : [libshared,
568a4ff8
ZJS
1672 libbasic_gcrypt,
1673 libsystemd_resolve_core],
56ddbf10 1674 dependencies : systemd_resolved_dependencies,
005a29f2 1675 install_rpath : rootlibexecdir,
37efbbd8
ZJS
1676 install : true,
1677 install_dir : rootlibexecdir)
1678
c2e84cab
YW
1679 exe = executable('resolvectl',
1680 resolvectl_sources,
37efbbd8 1681 include_directories : includes,
34e221a5 1682 link_with : [libshared,
568a4ff8
ZJS
1683 libbasic_gcrypt,
1684 libsystemd_resolve_core],
37efbbd8 1685 dependencies : [threads,
76c87410 1686 libgpg_error,
37efbbd8
ZJS
1687 libm,
1688 libidn],
1689 install_rpath : rootlibexecdir,
1690 install : true)
5a8b1640 1691 public_programs += exe
088c1363
LP
1692
1693 meson.add_install_script(meson_make_symlink,
c2e84cab 1694 join_paths(bindir, 'resolvectl'),
088c1363 1695 join_paths(rootsbindir, 'resolvconf'))
c2e84cab
YW
1696
1697 meson.add_install_script(meson_make_symlink,
1698 join_paths(bindir, 'resolvectl'),
1699 join_paths(bindir, 'systemd-resolve'))
5c23128d
ZJS
1700endif
1701
349cc4a5 1702if conf.get('ENABLE_LOGIND') == 1
37efbbd8
ZJS
1703 executable('systemd-logind',
1704 systemd_logind_sources,
005a29f2 1705 include_directories : includes,
37efbbd8 1706 link_with : [liblogind_core,
34ce0a52 1707 libshared],
005a29f2 1708 dependencies : [threads,
37efbbd8 1709 libacl],
005a29f2
ZJS
1710 install_rpath : rootlibexecdir,
1711 install : true,
37efbbd8
ZJS
1712 install_dir : rootlibexecdir)
1713
1714 exe = executable('loginctl',
1715 loginctl_sources,
1716 include_directories : includes,
34ce0a52 1717 link_with : [libshared],
37efbbd8
ZJS
1718 dependencies : [threads,
1719 liblz4,
1720 libxz],
1721 install_rpath : rootlibexecdir,
1722 install : true,
1723 install_dir : rootbindir)
5a8b1640 1724 public_programs += exe
37efbbd8
ZJS
1725
1726 exe = executable('systemd-inhibit',
1727 'src/login/inhibit.c',
1728 include_directories : includes,
1729 link_with : [libshared],
1730 install_rpath : rootlibexecdir,
1731 install : true,
1732 install_dir : rootbindir)
5a8b1640 1733 public_programs += exe
37efbbd8 1734
349cc4a5 1735 if conf.get('HAVE_PAM') == 1
37efbbd8
ZJS
1736 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1737 pam_systemd = shared_library(
1738 'pam_systemd',
1739 pam_systemd_c,
1740 name_prefix : '',
1741 include_directories : includes,
1742 link_args : ['-shared',
1743 '-Wl,--version-script=' + version_script_arg],
37e4d7a8 1744 link_with : [libsystemd_static,
37efbbd8
ZJS
1745 libshared_static],
1746 dependencies : [threads,
1747 libpam,
1748 libpam_misc],
1749 link_depends : pam_systemd_sym,
1750 install : true,
1751 install_dir : pamlibdir)
1752
1753 test('dlopen-pam_systemd',
1754 test_dlopen,
1755 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1756 endif
1757endif
005a29f2 1758
a9f0f5e5
ZJS
1759executable('systemd-user-runtime-dir',
1760 user_runtime_dir_sources,
1761 include_directories : includes,
1762 link_with : [libshared, liblogind_core],
1763 install_rpath : rootlibexecdir,
1764 install : true,
1765 install_dir : rootlibexecdir)
1766
349cc4a5 1767if conf.get('HAVE_PAM') == 1
37efbbd8
ZJS
1768 executable('systemd-user-sessions',
1769 'src/user-sessions/user-sessions.c',
005a29f2 1770 include_directories : includes,
aac26058 1771 link_with : [libshared],
005a29f2
ZJS
1772 install_rpath : rootlibexecdir,
1773 install : true,
37efbbd8 1774 install_dir : rootlibexecdir)
5c23128d
ZJS
1775endif
1776
349cc4a5 1777if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
37efbbd8
ZJS
1778 exe = executable('bootctl',
1779 'src/boot/bootctl.c',
1780 include_directories : includes,
1781 link_with : [libshared],
1782 dependencies : [libblkid],
1783 install_rpath : rootlibexecdir,
1784 install : true)
5a8b1640 1785 public_programs += exe
005a29f2
ZJS
1786endif
1787
1788exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1789 include_directories : includes,
1790 link_with : [libshared],
1791 dependencies : [threads],
1792 install_rpath : rootlibexecdir,
1793 install : true)
5a8b1640 1794public_programs += exe
005a29f2 1795
f3794366
FS
1796
1797if get_option('link-systemctl-shared')
1798 systemctl_link_with = [libshared]
1799else
1800 systemctl_link_with = [libsystemd_static,
1801 libshared_static,
1802 libjournal_client,
1803 libbasic_gcrypt]
1804endif
1805
005a29f2
ZJS
1806exe = executable('systemctl', 'src/systemctl/systemctl.c',
1807 include_directories : includes,
f3794366 1808 link_with : systemctl_link_with,
005a29f2
ZJS
1809 dependencies : [threads,
1810 libcap,
1811 libselinux,
1812 libxz,
1813 liblz4],
1814 install_rpath : rootlibexecdir,
1815 install : true,
1816 install_dir : rootbindir)
5a8b1640 1817public_programs += exe
5c23128d 1818
61d0578b
LP
1819if conf.get('ENABLE_PORTABLED') == 1
1820 executable('systemd-portabled',
1821 systemd_portabled_sources,
1822 include_directories : includes,
1823 link_with : [libshared],
1824 dependencies : [threads],
1825 install_rpath : rootlibexecdir,
1826 install : true,
1827 install_dir : rootlibexecdir)
1828
1829 exe = executable('portablectl', 'src/portable/portablectl.c',
1830 include_directories : includes,
1831 link_with : [libshared],
1832 dependencies : [threads],
1833 install_rpath : rootlibexecdir,
1834 install : true,
1835 install_dir : rootlibexecdir)
5a8b1640 1836 public_programs += exe
61d0578b
LP
1837endif
1838
ba7f4ae6
ZJS
1839foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1840 meson.add_install_script(meson_make_symlink,
1841 join_paths(rootbindir, 'systemctl'),
1842 join_paths(rootsbindir, alias))
1843endforeach
1844
349cc4a5 1845if conf.get('ENABLE_BACKLIGHT') == 1
37efbbd8
ZJS
1846 executable('systemd-backlight',
1847 'src/backlight/backlight.c',
1848 include_directories : includes,
34ce0a52 1849 link_with : [libshared],
37efbbd8
ZJS
1850 install_rpath : rootlibexecdir,
1851 install : true,
1852 install_dir : rootlibexecdir)
5c23128d
ZJS
1853endif
1854
349cc4a5 1855if conf.get('ENABLE_RFKILL') == 1
37efbbd8
ZJS
1856 executable('systemd-rfkill',
1857 'src/rfkill/rfkill.c',
1858 include_directories : includes,
34ce0a52 1859 link_with : [libshared],
37efbbd8
ZJS
1860 install_rpath : rootlibexecdir,
1861 install : true,
1862 install_dir : rootlibexecdir)
5c23128d
ZJS
1863endif
1864
1865executable('systemd-system-update-generator',
1866 'src/system-update-generator/system-update-generator.c',
1867 include_directories : includes,
1868 link_with : [libshared],
b2fc5836 1869 install_rpath : rootlibexecdir,
5c23128d
ZJS
1870 install : true,
1871 install_dir : systemgeneratordir)
1872
349cc4a5 1873if conf.get('HAVE_LIBCRYPTSETUP') == 1
37efbbd8
ZJS
1874 executable('systemd-cryptsetup',
1875 'src/cryptsetup/cryptsetup.c',
1876 include_directories : includes,
1877 link_with : [libshared],
1878 dependencies : [libcryptsetup],
1879 install_rpath : rootlibexecdir,
1880 install : true,
1881 install_dir : rootlibexecdir)
1882
1883 executable('systemd-cryptsetup-generator',
1884 'src/cryptsetup/cryptsetup-generator.c',
1885 include_directories : includes,
1886 link_with : [libshared],
1887 dependencies : [libcryptsetup],
1888 install_rpath : rootlibexecdir,
1889 install : true,
1890 install_dir : systemgeneratordir)
1891
1892 executable('systemd-veritysetup',
1893 'src/veritysetup/veritysetup.c',
1894 include_directories : includes,
1895 link_with : [libshared],
1896 dependencies : [libcryptsetup],
1897 install_rpath : rootlibexecdir,
1898 install : true,
1899 install_dir : rootlibexecdir)
1900
1901 executable('systemd-veritysetup-generator',
1902 'src/veritysetup/veritysetup-generator.c',
1903 include_directories : includes,
1904 link_with : [libshared],
1905 dependencies : [libcryptsetup],
1906 install_rpath : rootlibexecdir,
1907 install : true,
1908 install_dir : systemgeneratordir)
5c23128d
ZJS
1909endif
1910
349cc4a5 1911if conf.get('HAVE_SYSV_COMPAT') == 1
37efbbd8
ZJS
1912 executable('systemd-sysv-generator',
1913 'src/sysv-generator/sysv-generator.c',
1914 include_directories : includes,
1915 link_with : [libshared],
1916 install_rpath : rootlibexecdir,
1917 install : true,
1918 install_dir : systemgeneratordir)
1919
1920 executable('systemd-rc-local-generator',
1921 'src/rc-local-generator/rc-local-generator.c',
1922 include_directories : includes,
1923 link_with : [libshared],
1924 install_rpath : rootlibexecdir,
1925 install : true,
1926 install_dir : systemgeneratordir)
5c23128d
ZJS
1927endif
1928
349cc4a5 1929if conf.get('ENABLE_HOSTNAMED') == 1
37efbbd8
ZJS
1930 executable('systemd-hostnamed',
1931 'src/hostname/hostnamed.c',
005a29f2 1932 include_directories : includes,
aac26058 1933 link_with : [libshared],
005a29f2 1934 install_rpath : rootlibexecdir,
37efbbd8
ZJS
1935 install : true,
1936 install_dir : rootlibexecdir)
1937
1938 exe = executable('hostnamectl',
1939 'src/hostname/hostnamectl.c',
1940 include_directories : includes,
1941 link_with : [libshared],
1942 install_rpath : rootlibexecdir,
1943 install : true)
5a8b1640 1944 public_programs += exe
5c23128d
ZJS
1945endif
1946
349cc4a5
ZJS
1947if conf.get('ENABLE_LOCALED') == 1
1948 if conf.get('HAVE_XKBCOMMON') == 1
37efbbd8
ZJS
1949 # logind will load libxkbcommon.so dynamically on its own
1950 deps = [libdl]
1951 else
1952 deps = []
1953 endif
1954
1955 executable('systemd-localed',
1956 systemd_localed_sources,
005a29f2 1957 include_directories : includes,
aac26058 1958 link_with : [libshared],
37efbbd8 1959 dependencies : deps,
005a29f2 1960 install_rpath : rootlibexecdir,
37efbbd8
ZJS
1961 install : true,
1962 install_dir : rootlibexecdir)
1963
1964 exe = executable('localectl',
1965 localectl_sources,
1966 include_directories : includes,
1967 link_with : [libshared],
1968 install_rpath : rootlibexecdir,
1969 install : true)
5a8b1640 1970 public_programs += exe
5c23128d
ZJS
1971endif
1972
349cc4a5 1973if conf.get('ENABLE_TIMEDATED') == 1
37efbbd8
ZJS
1974 executable('systemd-timedated',
1975 'src/timedate/timedated.c',
005a29f2 1976 include_directories : includes,
aac26058 1977 link_with : [libshared],
37efbbd8
ZJS
1978 install_rpath : rootlibexecdir,
1979 install : true,
1980 install_dir : rootlibexecdir)
6129ec85 1981endif
5c23128d 1982
6129ec85 1983if conf.get('ENABLE_TIMEDATECTL') == 1
37efbbd8
ZJS
1984 exe = executable('timedatectl',
1985 'src/timedate/timedatectl.c',
1986 include_directories : includes,
1987 install_rpath : rootlibexecdir,
1988 link_with : [libshared],
6129ec85 1989 dependencies : [libm],
37efbbd8 1990 install : true)
5a8b1640 1991 public_programs += exe
5c23128d
ZJS
1992endif
1993
349cc4a5 1994if conf.get('ENABLE_TIMESYNCD') == 1
37efbbd8
ZJS
1995 executable('systemd-timesyncd',
1996 systemd_timesyncd_sources,
005a29f2 1997 include_directories : includes,
aac26058 1998 link_with : [libshared],
005a29f2 1999 dependencies : [threads,
37efbbd8 2000 libm],
005a29f2
ZJS
2001 install_rpath : rootlibexecdir,
2002 install : true,
37efbbd8 2003 install_dir : rootlibexecdir)
5c3376ef
PB
2004
2005 executable('systemd-time-wait-sync',
2006 'src/time-wait-sync/time-wait-sync.c',
2007 include_directories : includes,
2008 link_with : [libshared],
2009 install_rpath : rootlibexecdir,
2010 install : true,
2011 install_dir : rootlibexecdir)
5c23128d
ZJS
2012endif
2013
349cc4a5 2014if conf.get('ENABLE_MACHINED') == 1
37efbbd8
ZJS
2015 executable('systemd-machined',
2016 systemd_machined_sources,
2017 include_directories : includes,
2018 link_with : [libmachine_core,
2019 libshared],
2020 install_rpath : rootlibexecdir,
2021 install : true,
2022 install_dir : rootlibexecdir)
2023
2024 exe = executable('machinectl',
2025 'src/machine/machinectl.c',
2026 include_directories : includes,
2027 link_with : [libshared],
2028 dependencies : [threads,
2029 libxz,
2030 liblz4],
2031 install_rpath : rootlibexecdir,
2032 install : true,
2033 install_dir : rootbindir)
5a8b1640 2034 public_programs += exe
5c23128d
ZJS
2035endif
2036
349cc4a5 2037if conf.get('ENABLE_IMPORTD') == 1
37efbbd8
ZJS
2038 executable('systemd-importd',
2039 systemd_importd_sources,
005a29f2 2040 include_directories : includes,
aac26058 2041 link_with : [libshared],
37efbbd8 2042 dependencies : [threads],
005a29f2
ZJS
2043 install_rpath : rootlibexecdir,
2044 install : true,
2045 install_dir : rootlibexecdir)
37efbbd8
ZJS
2046
2047 systemd_pull = executable('systemd-pull',
2048 systemd_pull_sources,
2049 include_directories : includes,
2050 link_with : [libshared],
2051 dependencies : [libcurl,
2052 libz,
2053 libbzip2,
2054 libxz,
2055 libgcrypt],
2056 install_rpath : rootlibexecdir,
2057 install : true,
2058 install_dir : rootlibexecdir)
2059
2060 systemd_import = executable('systemd-import',
2061 systemd_import_sources,
2062 include_directories : includes,
2063 link_with : [libshared],
2064 dependencies : [libcurl,
2065 libz,
2066 libbzip2,
2067 libxz],
2068 install_rpath : rootlibexecdir,
2069 install : true,
2070 install_dir : rootlibexecdir)
2071
2072 systemd_export = executable('systemd-export',
2073 systemd_export_sources,
2074 include_directories : includes,
2075 link_with : [libshared],
2076 dependencies : [libcurl,
2077 libz,
2078 libbzip2,
2079 libxz],
2080 install_rpath : rootlibexecdir,
2081 install : true,
2082 install_dir : rootlibexecdir)
2083 public_programs += [systemd_pull, systemd_import, systemd_export]
2084endif
2085
349cc4a5 2086if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
37efbbd8
ZJS
2087 exe = executable('systemd-journal-upload',
2088 systemd_journal_upload_sources,
2089 include_directories : includes,
2090 link_with : [libshared],
2091 dependencies : [threads,
2092 libcurl,
2093 libgnutls,
2094 libxz,
2095 liblz4],
2096 install_rpath : rootlibexecdir,
2097 install : true,
2098 install_dir : rootlibexecdir)
5a8b1640 2099 public_programs += exe
5c23128d
ZJS
2100endif
2101
349cc4a5 2102if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
37efbbd8
ZJS
2103 s_j_remote = executable('systemd-journal-remote',
2104 systemd_journal_remote_sources,
2105 include_directories : includes,
c064d8db
ZJS
2106 link_with : [libshared,
2107 libsystemd_journal_remote],
37efbbd8
ZJS
2108 dependencies : [threads,
2109 libmicrohttpd,
2110 libgnutls,
2111 libxz,
2112 liblz4],
2113 install_rpath : rootlibexecdir,
2114 install : true,
2115 install_dir : rootlibexecdir)
2116
2117 s_j_gatewayd = executable('systemd-journal-gatewayd',
2118 systemd_journal_gatewayd_sources,
2119 include_directories : includes,
2120 link_with : [libshared],
2121 dependencies : [threads,
2122 libmicrohttpd,
2123 libgnutls,
2124 libxz,
2125 liblz4],
2126 install_rpath : rootlibexecdir,
2127 install : true,
2128 install_dir : rootlibexecdir)
2129 public_programs += [s_j_remote, s_j_gatewayd]
5c23128d
ZJS
2130endif
2131
349cc4a5 2132if conf.get('ENABLE_COREDUMP') == 1
37efbbd8
ZJS
2133 executable('systemd-coredump',
2134 systemd_coredump_sources,
005a29f2 2135 include_directories : includes,
aac26058 2136 link_with : [libshared],
005a29f2 2137 dependencies : [threads,
37efbbd8
ZJS
2138 libacl,
2139 libdw,
005a29f2
ZJS
2140 libxz,
2141 liblz4],
2142 install_rpath : rootlibexecdir,
37efbbd8
ZJS
2143 install : true,
2144 install_dir : rootlibexecdir)
2145
2146 exe = executable('coredumpctl',
2147 coredumpctl_sources,
2148 include_directories : includes,
2149 link_with : [libshared],
2150 dependencies : [threads,
2151 libxz,
2152 liblz4],
2153 install_rpath : rootlibexecdir,
2154 install : true)
5a8b1640 2155 public_programs += exe
5c23128d
ZJS
2156endif
2157
349cc4a5 2158if conf.get('ENABLE_BINFMT') == 1
37efbbd8
ZJS
2159 exe = executable('systemd-binfmt',
2160 'src/binfmt/binfmt.c',
2161 include_directories : includes,
2162 link_with : [libshared],
2163 install_rpath : rootlibexecdir,
2164 install : true,
2165 install_dir : rootlibexecdir)
5a8b1640 2166 public_programs += exe
37efbbd8
ZJS
2167
2168 meson.add_install_script('sh', '-c',
2169 mkdir_p.format(binfmtdir))
2170 meson.add_install_script('sh', '-c',
2171 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2172endif
2173
349cc4a5 2174if conf.get('ENABLE_VCONSOLE') == 1
37efbbd8
ZJS
2175 executable('systemd-vconsole-setup',
2176 'src/vconsole/vconsole-setup.c',
005a29f2
ZJS
2177 include_directories : includes,
2178 link_with : [libshared],
2179 install_rpath : rootlibexecdir,
2180 install : true,
2181 install_dir : rootlibexecdir)
5c23128d
ZJS
2182endif
2183
349cc4a5 2184if conf.get('ENABLE_RANDOMSEED') == 1
37efbbd8
ZJS
2185 executable('systemd-random-seed',
2186 'src/random-seed/random-seed.c',
2187 include_directories : includes,
2188 link_with : [libshared],
2189 install_rpath : rootlibexecdir,
2190 install : true,
2191 install_dir : rootlibexecdir)
5c23128d
ZJS
2192endif
2193
349cc4a5 2194if conf.get('ENABLE_FIRSTBOOT') == 1
37efbbd8
ZJS
2195 executable('systemd-firstboot',
2196 'src/firstboot/firstboot.c',
2197 include_directories : includes,
2198 link_with : [libshared],
2199 dependencies : [libcrypt],
2200 install_rpath : rootlibexecdir,
2201 install : true,
2202 install_dir : rootbindir)
5c23128d
ZJS
2203endif
2204
2205executable('systemd-remount-fs',
2206 'src/remount-fs/remount-fs.c',
2207 'src/core/mount-setup.c',
2208 'src/core/mount-setup.h',
2209 include_directories : includes,
2210 link_with : [libshared],
b2fc5836 2211 install_rpath : rootlibexecdir,
5c23128d
ZJS
2212 install : true,
2213 install_dir : rootlibexecdir)
2214
2215executable('systemd-machine-id-setup',
2216 'src/machine-id-setup/machine-id-setup-main.c',
2217 'src/core/machine-id-setup.c',
2218 'src/core/machine-id-setup.h',
2219 include_directories : includes,
aac26058 2220 link_with : [libshared],
b2fc5836 2221 install_rpath : rootlibexecdir,
5c23128d
ZJS
2222 install : true,
2223 install_dir : rootbindir)
2224
2225executable('systemd-fsck',
2226 'src/fsck/fsck.c',
2227 include_directories : includes,
aac26058 2228 link_with : [libshared],
421f0012 2229 install_rpath : rootlibexecdir,
5c23128d
ZJS
2230 install : true,
2231 install_dir : rootlibexecdir)
2232
80750adb
ZJS
2233executable('systemd-growfs',
2234 'src/partition/growfs.c',
2235 include_directories : includes,
2236 link_with : [libshared],
c34b75a1 2237 dependencies : [libcryptsetup],
80750adb
ZJS
2238 install_rpath : rootlibexecdir,
2239 install : true,
2240 install_dir : rootlibexecdir)
2241
b7f28ac5
ZJS
2242executable('systemd-makefs',
2243 'src/partition/makefs.c',
2244 include_directories : includes,
2245 link_with : [libshared],
2246 install_rpath : rootlibexecdir,
2247 install : true,
2248 install_dir : rootlibexecdir)
2249
5c23128d
ZJS
2250executable('systemd-sleep',
2251 'src/sleep/sleep.c',
2252 include_directories : includes,
2253 link_with : [libshared],
421f0012 2254 install_rpath : rootlibexecdir,
5c23128d
ZJS
2255 install : true,
2256 install_dir : rootlibexecdir)
2257
005a29f2
ZJS
2258exe = executable('systemd-sysctl',
2259 'src/sysctl/sysctl.c',
2260 include_directories : includes,
2261 link_with : [libshared],
2262 install_rpath : rootlibexecdir,
2263 install : true,
2264 install_dir : rootlibexecdir)
5a8b1640 2265public_programs += exe
5c23128d
ZJS
2266
2267executable('systemd-ac-power',
2268 'src/ac-power/ac-power.c',
2269 include_directories : includes,
2270 link_with : [libshared],
421f0012 2271 install_rpath : rootlibexecdir,
5c23128d
ZJS
2272 install : true,
2273 install_dir : rootlibexecdir)
2274
005a29f2
ZJS
2275exe = executable('systemd-detect-virt',
2276 'src/detect-virt/detect-virt.c',
2277 include_directories : includes,
2278 link_with : [libshared],
2279 install_rpath : rootlibexecdir,
2280 install : true)
5a8b1640 2281public_programs += exe
005a29f2
ZJS
2282
2283exe = executable('systemd-delta',
2284 'src/delta/delta.c',
2285 include_directories : includes,
2286 link_with : [libshared],
2287 install_rpath : rootlibexecdir,
2288 install : true)
5a8b1640 2289public_programs += exe
005a29f2
ZJS
2290
2291exe = executable('systemd-escape',
2292 'src/escape/escape.c',
2293 include_directories : includes,
2294 link_with : [libshared],
2295 install_rpath : rootlibexecdir,
2296 install : true,
2297 install_dir : rootbindir)
5a8b1640 2298public_programs += exe
005a29f2
ZJS
2299
2300exe = executable('systemd-notify',
2301 'src/notify/notify.c',
2302 include_directories : includes,
2303 link_with : [libshared],
2304 install_rpath : rootlibexecdir,
2305 install : true,
2306 install_dir : rootbindir)
5a8b1640 2307public_programs += exe
5c23128d
ZJS
2308
2309executable('systemd-volatile-root',
2310 'src/volatile-root/volatile-root.c',
2311 include_directories : includes,
2312 link_with : [libshared],
421f0012 2313 install_rpath : rootlibexecdir,
5c23128d
ZJS
2314 install : true,
2315 install_dir : rootlibexecdir)
2316
2317executable('systemd-cgroups-agent',
2318 'src/cgroups-agent/cgroups-agent.c',
2319 include_directories : includes,
2320 link_with : [libshared],
421f0012 2321 install_rpath : rootlibexecdir,
5c23128d
ZJS
2322 install : true,
2323 install_dir : rootlibexecdir)
2324
005a29f2
ZJS
2325exe = executable('systemd-path',
2326 'src/path/path.c',
2327 include_directories : includes,
aac26058 2328 link_with : [libshared],
005a29f2
ZJS
2329 install_rpath : rootlibexecdir,
2330 install : true)
5a8b1640 2331public_programs += exe
005a29f2
ZJS
2332
2333exe = executable('systemd-ask-password',
2334 'src/ask-password/ask-password.c',
2335 include_directories : includes,
aac26058 2336 link_with : [libshared],
005a29f2
ZJS
2337 install_rpath : rootlibexecdir,
2338 install : true,
2339 install_dir : rootbindir)
5a8b1640 2340public_programs += exe
5c23128d
ZJS
2341
2342executable('systemd-reply-password',
2343 'src/reply-password/reply-password.c',
2344 include_directories : includes,
aac26058 2345 link_with : [libshared],
421f0012 2346 install_rpath : rootlibexecdir,
5c23128d
ZJS
2347 install : true,
2348 install_dir : rootlibexecdir)
2349
005a29f2
ZJS
2350exe = executable('systemd-tty-ask-password-agent',
2351 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2352 include_directories : includes,
aac26058 2353 link_with : [libshared],
005a29f2
ZJS
2354 install_rpath : rootlibexecdir,
2355 install : true,
2356 install_dir : rootbindir)
5a8b1640 2357public_programs += exe
005a29f2
ZJS
2358
2359exe = executable('systemd-cgls',
2360 'src/cgls/cgls.c',
2361 include_directories : includes,
aac26058 2362 link_with : [libshared],
005a29f2
ZJS
2363 install_rpath : rootlibexecdir,
2364 install : true)
5a8b1640 2365public_programs += exe
005a29f2
ZJS
2366
2367exe = executable('systemd-cgtop',
2368 'src/cgtop/cgtop.c',
2369 include_directories : includes,
aac26058 2370 link_with : [libshared],
005a29f2
ZJS
2371 install_rpath : rootlibexecdir,
2372 install : true)
5a8b1640 2373public_programs += exe
5c23128d
ZJS
2374
2375executable('systemd-initctl',
2376 'src/initctl/initctl.c',
2377 include_directories : includes,
aac26058 2378 link_with : [libshared],
421f0012 2379 install_rpath : rootlibexecdir,
5c23128d
ZJS
2380 install : true,
2381 install_dir : rootlibexecdir)
2382
005a29f2
ZJS
2383exe = executable('systemd-mount',
2384 'src/mount/mount-tool.c',
2385 include_directories : includes,
34ce0a52 2386 link_with : [libshared],
005a29f2
ZJS
2387 install_rpath : rootlibexecdir,
2388 install : true)
5a8b1640 2389public_programs += exe
5c23128d 2390
7b76fce1 2391meson.add_install_script(meson_make_symlink,
e17e5ba9 2392 'systemd-mount', join_paths(bindir, 'systemd-umount'))
7b76fce1 2393
005a29f2
ZJS
2394exe = executable('systemd-run',
2395 'src/run/run.c',
2396 include_directories : includes,
aac26058 2397 link_with : [libshared],
005a29f2
ZJS
2398 install_rpath : rootlibexecdir,
2399 install : true)
5a8b1640 2400public_programs += exe
005a29f2
ZJS
2401
2402exe = executable('systemd-stdio-bridge',
2403 'src/stdio-bridge/stdio-bridge.c',
2404 include_directories : includes,
aac26058 2405 link_with : [libshared],
005a29f2
ZJS
2406 install_rpath : rootlibexecdir,
2407 install : true)
5a8b1640 2408public_programs += exe
005a29f2
ZJS
2409
2410exe = executable('busctl',
2411 'src/busctl/busctl.c',
2412 'src/busctl/busctl-introspect.c',
2413 'src/busctl/busctl-introspect.h',
2414 include_directories : includes,
aac26058 2415 link_with : [libshared],
005a29f2
ZJS
2416 install_rpath : rootlibexecdir,
2417 install : true)
5a8b1640 2418public_programs += exe
5c23128d 2419
349cc4a5 2420if conf.get('ENABLE_SYSUSERS') == 1
37efbbd8
ZJS
2421 exe = executable('systemd-sysusers',
2422 'src/sysusers/sysusers.c',
2423 include_directories : includes,
2424 link_with : [libshared],
2425 install_rpath : rootlibexecdir,
2426 install : true,
2427 install_dir : rootbindir)
5a8b1640 2428 public_programs += exe
5c23128d
ZJS
2429endif
2430
349cc4a5 2431if conf.get('ENABLE_TMPFILES') == 1
37efbbd8
ZJS
2432 exe = executable('systemd-tmpfiles',
2433 'src/tmpfiles/tmpfiles.c',
2434 include_directories : includes,
2435 link_with : [libshared],
2436 dependencies : [libacl],
2437 install_rpath : rootlibexecdir,
2438 install : true,
2439 install_dir : rootbindir)
5a8b1640 2440 public_programs += exe
d9daae55
ZJS
2441
2442 test('test-systemd-tmpfiles',
2443 test_systemd_tmpfiles_py,
2444 args : exe.full_path())
2445 # https://github.com/mesonbuild/meson/issues/2681
5c23128d
ZJS
2446endif
2447
349cc4a5 2448if conf.get('ENABLE_HWDB') == 1
37efbbd8
ZJS
2449 exe = executable('systemd-hwdb',
2450 'src/hwdb/hwdb.c',
2451 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2452 include_directories : includes,
0c06b506 2453 link_with : [libudev_static],
0da6f396 2454 install_rpath : udev_rpath,
37efbbd8
ZJS
2455 install : true,
2456 install_dir : rootbindir)
5a8b1640 2457 public_programs += exe
37efbbd8
ZJS
2458endif
2459
349cc4a5 2460if conf.get('ENABLE_QUOTACHECK') == 1
37efbbd8
ZJS
2461 executable('systemd-quotacheck',
2462 'src/quotacheck/quotacheck.c',
005a29f2 2463 include_directories : includes,
aac26058 2464 link_with : [libshared],
005a29f2
ZJS
2465 install_rpath : rootlibexecdir,
2466 install : true,
37efbbd8 2467 install_dir : rootlibexecdir)
5c23128d
ZJS
2468endif
2469
005a29f2
ZJS
2470exe = executable('systemd-socket-proxyd',
2471 'src/socket-proxy/socket-proxyd.c',
2472 include_directories : includes,
aac26058 2473 link_with : [libshared],
005a29f2
ZJS
2474 dependencies : [threads],
2475 install_rpath : rootlibexecdir,
2476 install : true,
2477 install_dir : rootlibexecdir)
5a8b1640 2478public_programs += exe
005a29f2
ZJS
2479
2480exe = executable('systemd-udevd',
2481 systemd_udevd_sources,
2482 include_directories : includes,
5c72049f 2483 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
005a29f2 2484 link_with : [libudev_core,
005a29f2 2485 libsystemd_network,
0c06b506 2486 libudev_static],
3a30f21f
ZJS
2487 dependencies : [threads,
2488 libkmod,
005a29f2 2489 libidn,
aac26058
ZJS
2490 libacl,
2491 libblkid],
1aec3ed9 2492 install_rpath : udev_rpath,
005a29f2
ZJS
2493 install : true,
2494 install_dir : rootlibexecdir)
5a8b1640 2495public_programs += exe
005a29f2
ZJS
2496
2497exe = executable('udevadm',
2498 udevadm_sources,
6671e818 2499 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
005a29f2
ZJS
2500 include_directories : includes,
2501 link_with : [libudev_core,
005a29f2 2502 libsystemd_network,
0c06b506 2503 libudev_static],
3a30f21f
ZJS
2504 dependencies : [threads,
2505 libkmod,
005a29f2 2506 libidn,
aac26058
ZJS
2507 libacl,
2508 libblkid],
1aec3ed9 2509 install_rpath : udev_rpath,
005a29f2
ZJS
2510 install : true,
2511 install_dir : rootbindir)
5a8b1640 2512public_programs += exe
5c23128d
ZJS
2513
2514executable('systemd-shutdown',
2515 systemd_shutdown_sources,
2516 include_directories : includes,
34ce0a52 2517 link_with : [libshared],
95b862b0 2518 dependencies : [libmount],
421f0012 2519 install_rpath : rootlibexecdir,
5c23128d
ZJS
2520 install : true,
2521 install_dir : rootlibexecdir)
2522
2523executable('systemd-update-done',
2524 'src/update-done/update-done.c',
2525 include_directories : includes,
2526 link_with : [libshared],
421f0012 2527 install_rpath : rootlibexecdir,
5c23128d
ZJS
2528 install : true,
2529 install_dir : rootlibexecdir)
2530
2531executable('systemd-update-utmp',
2532 'src/update-utmp/update-utmp.c',
2533 include_directories : includes,
aac26058 2534 link_with : [libshared],
5c23128d 2535 dependencies : [libaudit],
421f0012 2536 install_rpath : rootlibexecdir,
5c23128d
ZJS
2537 install : true,
2538 install_dir : rootlibexecdir)
2539
349cc4a5 2540if conf.get('HAVE_KMOD') == 1
37efbbd8
ZJS
2541 executable('systemd-modules-load',
2542 'src/modules-load/modules-load.c',
2543 include_directories : includes,
2544 link_with : [libshared],
2545 dependencies : [libkmod],
2546 install_rpath : rootlibexecdir,
2547 install : true,
2548 install_dir : rootlibexecdir)
94e75a54 2549
37efbbd8
ZJS
2550 meson.add_install_script('sh', '-c',
2551 mkdir_p.format(modulesloaddir))
2552 meson.add_install_script('sh', '-c',
2553 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
5c23128d
ZJS
2554endif
2555
005a29f2
ZJS
2556exe = executable('systemd-nspawn',
2557 systemd_nspawn_sources,
2558 'src/core/mount-setup.c', # FIXME: use a variable?
2559 'src/core/mount-setup.h',
2560 'src/core/loopback-setup.c',
2561 'src/core/loopback-setup.h',
97d90615
ZJS
2562 include_directories : includes,
2563 link_with : [libnspawn_core,
2564 libshared],
2565 dependencies : [libblkid],
005a29f2
ZJS
2566 install_rpath : rootlibexecdir,
2567 install : true)
5a8b1640 2568public_programs += exe
5c23128d 2569
349cc4a5 2570if conf.get('ENABLE_NETWORKD') == 1
37efbbd8
ZJS
2571 executable('systemd-networkd',
2572 systemd_networkd_sources,
2573 include_directories : includes,
2574 link_with : [libnetworkd_core,
37efbbd8 2575 libsystemd_network,
0c06b506 2576 libudev_static,
37efbbd8 2577 libshared],
4b57a272 2578 dependencies : [threads],
37efbbd8
ZJS
2579 install_rpath : rootlibexecdir,
2580 install : true,
2581 install_dir : rootlibexecdir)
2582
2583 executable('systemd-networkd-wait-online',
2584 systemd_networkd_wait_online_sources,
2585 include_directories : includes,
2586 link_with : [libnetworkd_core,
2587 libshared],
2588 install_rpath : rootlibexecdir,
2589 install : true,
2590 install_dir : rootlibexecdir)
5c23128d 2591
dcfe072a
FS
2592 exe = executable('networkctl',
2593 networkctl_sources,
2594 include_directories : includes,
2595 link_with : [libsystemd_network,
aac26058 2596 libshared],
dcfe072a
FS
2597 install_rpath : rootlibexecdir,
2598 install : true,
2599 install_dir : rootbindir)
5a8b1640 2600 public_programs += exe
dcfe072a 2601endif
e821f6a9
ZJS
2602
2603executable('systemd-sulogin-shell',
2604 ['src/sulogin-shell/sulogin-shell.c'],
2605 include_directories : includes,
2606 link_with : [libshared],
2607 install_rpath : rootlibexecdir,
2608 install : true,
2609 install_dir : rootlibexecdir)
2610
69e96427
ZJS
2611############################################################
2612
2613foreach tuple : tests
37efbbd8
ZJS
2614 sources = tuple[0]
2615 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2616 dependencies = tuple[2]
2617 condition = tuple.length() >= 4 ? tuple[3] : ''
2618 type = tuple.length() >= 5 ? tuple[4] : ''
2619 defs = tuple.length() >= 6 ? tuple[5] : []
2620 incs = tuple.length() >= 7 ? tuple[6] : includes
2621 timeout = 30
2622
2623 name = sources[0].split('/')[-1].split('.')[0]
2624 if type.startswith('timeout=')
2625 timeout = type.split('=')[1].to_int()
2626 type = ''
2627 endif
08318a2c
AD
2628 if want_tests == 'false'
2629 message('Not compiling @0@ because tests is set to false'.format(name))
2630 elif condition == '' or conf.get(condition) == 1
37efbbd8
ZJS
2631 exe = executable(
2632 name,
2633 sources,
2634 include_directories : incs,
2635 link_with : link_with,
2636 dependencies : dependencies,
2637 c_args : defs,
2638 install_rpath : rootlibexecdir,
7cdd9783
MB
2639 install : install_tests,
2640 install_dir : join_paths(testsdir, type))
37efbbd8
ZJS
2641
2642 if type == 'manual'
2643 message('@0@ is a manual test'.format(name))
2644 elif type == 'unsafe' and want_tests != 'unsafe'
2645 message('@0@ is an unsafe test'.format(name))
2646 else
2647 test(name, exe,
2648 env : test_env,
2649 timeout : timeout)
2650 endif
2651 else
2652 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2653 endif
69e96427
ZJS
2654endforeach
2655
0632b4cd 2656exe = executable(
37efbbd8
ZJS
2657 'test-libsystemd-sym',
2658 test_libsystemd_sym_c,
2659 include_directories : includes,
2660 link_with : [libsystemd],
2661 install : install_tests,
2662 install_dir : testsdir)
0632b4cd 2663test('test-libsystemd-sym', exe)
37ab1a25 2664
0632b4cd
ZJS
2665exe = executable(
2666 'test-libsystemd-static-sym',
2667 test_libsystemd_sym_c,
2668 include_directories : includes,
0632b4cd
ZJS
2669 link_with : [install_libsystemd_static],
2670 dependencies : [threads], # threads is already included in dependencies on the library,
2671 # but does not seem to get propagated. Add here as a work-around.
20f3d32d
DC
2672 build_by_default : static_libsystemd_pic,
2673 install : install_tests and static_libsystemd_pic,
0632b4cd 2674 install_dir : testsdir)
20f3d32d 2675if static_libsystemd_pic
0632b4cd
ZJS
2676 test('test-libsystemd-static-sym', exe)
2677endif
37ab1a25 2678
0632b4cd 2679exe = executable(
37efbbd8
ZJS
2680 'test-libudev-sym',
2681 test_libudev_sym_c,
2682 include_directories : includes,
2683 c_args : ['-Wno-deprecated-declarations'],
2684 link_with : [libudev],
2685 install : install_tests,
2686 install_dir : testsdir)
0632b4cd
ZJS
2687test('test-libudev-sym', exe)
2688
2689exe = executable(
2690 'test-libudev-static-sym',
2691 test_libudev_sym_c,
2692 include_directories : includes,
20f3d32d 2693 c_args : ['-Wno-deprecated-declarations'],
0632b4cd 2694 link_with : [install_libudev_static],
20f3d32d
DC
2695 build_by_default : static_libudev_pic,
2696 install : install_tests and static_libudev_pic,
0632b4cd 2697 install_dir : testsdir)
20f3d32d 2698if static_libudev_pic
0632b4cd
ZJS
2699 test('test-libudev-static-sym', exe)
2700endif
e0bec52f 2701
69e96427 2702############################################################
5c23128d 2703
7db7d5b7
JR
2704fuzzer_exes = []
2705
2706foreach tuple : fuzzers
2707 sources = tuple[0]
2708 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2709 dependencies = tuple[2]
2710 defs = tuple.length() >= 4 ? tuple[3] : []
2711 incs = tuple.length() >= 5 ? tuple[4] : includes
2712
31e57a35 2713 if fuzzer_build
7db7d5b7
JR
2714 dependencies += fuzzing_engine
2715 else
2716 sources += 'src/fuzz/fuzz-main.c'
2717 endif
2718
2719 name = sources[0].split('/')[-1].split('.')[0]
2720
2721 fuzzer_exes += executable(
2722 name,
2723 sources,
2724 include_directories : [incs, include_directories('src/fuzz')],
2725 link_with : link_with,
2726 dependencies : dependencies,
2727 c_args : defs,
2728 install : false)
2729endforeach
2730
2731run_target('fuzzers',
2732 depends : fuzzer_exes,
2733 command : ['true'])
2734
2735############################################################
2736
5c23128d
ZJS
2737make_directive_index_py = find_program('tools/make-directive-index.py')
2738make_man_index_py = find_program('tools/make-man-index.py')
b184e8fe 2739xml_helper_py = find_program('tools/xml_helper.py')
abba22c5 2740hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
5c23128d
ZJS
2741
2742subdir('units')
2743subdir('sysctl.d')
2744subdir('sysusers.d')
2745subdir('tmpfiles.d')
e783f957 2746subdir('presets')
5c23128d
ZJS
2747subdir('hwdb')
2748subdir('network')
2749subdir('man')
2750subdir('shell-completion/bash')
2751subdir('shell-completion/zsh')
9e825ebf
FB
2752subdir('docs/sysvinit')
2753subdir('docs/var-log')
5c23128d
ZJS
2754
2755# FIXME: figure out if the warning is true:
2756# https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2757install_subdir('factory/etc',
2758 install_dir : factorydir)
2759
2760
2761install_data('xorg/50-systemd-user.sh',
2762 install_dir : xinitrcdir)
582faeb4
DJL
2763install_data('modprobe.d/systemd.conf',
2764 install_dir : modprobedir)
f09eb768 2765install_data('LICENSE.GPL2',
5c23128d 2766 'LICENSE.LGPL2.1',
f09eb768
LP
2767 'NEWS',
2768 'README',
9e825ebf
FB
2769 'docs/CODING_STYLE',
2770 'docs/DISTRO_PORTING',
2771 'docs/ENVIRONMENT.md',
2772 'docs/HACKING',
2773 'docs/TRANSIENT-SETTINGS.md',
2774 'docs/TRANSLATORS',
2775 'docs/UIDS-GIDS.md',
5c23128d
ZJS
2776 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2777 install_dir : docdir)
d68b342b 2778
94e75a54
ZJS
2779meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2780meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2781
d68b342b
ZJS
2782############################################################
2783
005a29f2
ZJS
2784meson_check_help = find_program('tools/meson-check-help.sh')
2785
2786foreach exec : public_programs
37efbbd8
ZJS
2787 name = exec.full_path().split('/')[-1]
2788 test('check-help-' + name,
2789 meson_check_help,
2790 args : [exec.full_path()])
005a29f2
ZJS
2791endforeach
2792
2793############################################################
2794
52d4d1d3
ZJS
2795# Enable tests for all supported sanitizers
2796foreach tuple : sanitizers
2797 sanitizer = tuple[0]
2798 build = tuple[1]
b68dfb9e 2799
7a6397d2 2800 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
52d4d1d3
ZJS
2801 prev = ''
2802 foreach p : fuzz_regression_tests
2803 b = p.split('/')[-2]
2804 c = p.split('/')[-1]
2805
2806 name = '@0@:@1@'.format(b, sanitizer)
2807
2808 if name != prev
2809 if want_tests == 'false'
2810 message('Not compiling @0@ because tests is set to false'.format(name))
2811 elif slow_tests
2812 exe = custom_target(
2813 name,
2814 output : name,
2815 depends : build,
2816 command : [env, 'ln', '-fs',
2817 join_paths(build.full_path(), b),
2818 '@OUTPUT@'],
2819 build_by_default : true)
2820 else
2821 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2822 endif
2823 endif
2824 prev = name
2825
2826 if want_tests != 'false' and slow_tests
2827 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2828 env,
2829 args : [exe.full_path(),
2830 join_paths(meson.source_root(),
2831 'test/fuzz-regressions',
2832 p)])
2833 endif
2834 endforeach
b68dfb9e
ZJS
2835 endif
2836endforeach
2837
52d4d1d3 2838
b68dfb9e
ZJS
2839############################################################
2840
0700e8ba 2841if git.found()
37efbbd8
ZJS
2842 all_files = run_command(
2843 git,
450b60ba 2844 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
37efbbd8
ZJS
2845 'ls-files',
2846 ':/*.[ch]'])
2847 all_files = files(all_files.stdout().split())
d68b342b 2848
e85a690b 2849 custom_target(
0700e8ba 2850 'tags',
e85a690b 2851 output : 'tags',
25a82102 2852 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2f09974f 2853 run_target(
0700e8ba 2854 'ctags',
25a82102 2855 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
d68b342b 2856endif
177929c2
ZJS
2857
2858if git.found()
37efbbd8 2859 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
a923e085 2860 run_target(
37efbbd8 2861 'git-contrib',
37efbbd8 2862 command : [meson_git_contrib_sh])
177929c2 2863endif
dd6ab3df
ZJS
2864
2865if git.found()
2866 git_head = run_command(
2867 git,
450b60ba 2868 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
dd6ab3df
ZJS
2869 'rev-parse', 'HEAD']).stdout().strip()
2870 git_head_short = run_command(
2871 git,
450b60ba 2872 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
dd6ab3df
ZJS
2873 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2874
2875 run_target(
2876 'git-snapshot',
2877 command : ['git', 'archive',
450b60ba 2878 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
dd6ab3df
ZJS
2879 git_head_short),
2880 '--prefix', 'systemd-@0@/'.format(git_head),
2881 'HEAD'])
2882endif
829257d1
ZJS
2883
2884############################################################
2885
51b13863
LP
2886meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2887run_target(
2888 'check-api-docs',
2889 depends : [man, libsystemd, libudev],
2890 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2891
2892############################################################
2893
829257d1
ZJS
2894status = [
2895 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2896
2675413e 2897 'split /usr: @0@'.format(split_usr),
157baa87 2898 'split bin-sbin: @0@'.format(split_bin),
359b496f
YW
2899 'prefix directory: @0@'.format(prefixdir),
2900 'rootprefix directory: @0@'.format(rootprefixdir),
2901 'sysconf directory: @0@'.format(sysconfdir),
2902 'include directory: @0@'.format(includedir),
2903 'lib directory: @0@'.format(libdir),
2904 'rootlib directory: @0@'.format(rootlibdir),
829257d1
ZJS
2905 'SysV init scripts: @0@'.format(sysvinit_path),
2906 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
359b496f
YW
2907 'PAM modules directory: @0@'.format(pamlibdir),
2908 'PAM configuration directory: @0@'.format(pamconfdir),
2909 'RPM macros directory: @0@'.format(rpmmacrosdir),
2910 'modprobe.d directory: @0@'.format(modprobedir),
2911 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2912 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2913 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2914 'bash completions directory: @0@'.format(bashcompletiondir),
2915 'zsh completions directory: @0@'.format(zshcompletiondir),
829257d1
ZJS
2916 'extra start script: @0@'.format(get_option('rc-local')),
2917 'extra stop script: @0@'.format(get_option('halt-local')),
2918 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2919 get_option('debug-tty')),
2920 'TTY GID: @0@'.format(tty_gid),
ac09340e 2921 'users GID: @0@'.format(substs.get('USERS_GID')),
829257d1
ZJS
2922 'maximum system UID: @0@'.format(system_uid_max),
2923 'maximum system GID: @0@'.format(system_gid_max),
87d5e4f2
LP
2924 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2925 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2926 'minimum container UID base: @0@'.format(container_uid_base_min),
2927 'maximum container UID base: @0@'.format(container_uid_base_max),
829257d1 2928 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
4e15a734 2929 'render group access mode: @0@'.format(get_option('group-render-mode')),
359b496f 2930 'certificate root directory: @0@'.format(get_option('certificate-root')),
829257d1 2931 'support URL: @0@'.format(support_url),
afde4574
LP
2932 'nobody user name: @0@'.format(nobody_user),
2933 'nobody group name: @0@'.format(nobody_group),
829257d1 2934 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
5248e7e1 2935 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
829257d1
ZJS
2936
2937 'default DNSSEC mode: @0@'.format(default_dnssec),
c9299be2 2938 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
829257d1
ZJS
2939 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2940 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2941
2942alt_dns_servers = '\n '.join(dns_servers.split(' '))
2943alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2944status += [
2945 'default DNS servers: @0@'.format(alt_dns_servers),
2946 'default NTP servers: @0@'.format(alt_ntp_servers)]
2947
2948alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2949 '@@0@'.format(time_epoch)).stdout().strip()
2950status += [
2951 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2952
2953# TODO:
2954# CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2955# CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2956# LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2957
349cc4a5 2958if conf.get('ENABLE_EFI') == 1
5a8b1640 2959 status += 'efi arch: @0@'.format(efi_arch)
829257d1
ZJS
2960
2961 if have_gnu_efi
2962 status += [
2963 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2964 'EFI CC @0@'.format(efi_cc),
359b496f
YW
2965 'EFI lib directory: @0@'.format(efi_libdir),
2966 'EFI lds directory: @0@'.format(efi_ldsdir),
2967 'EFI include directory: @0@'.format(efi_incdir)]
829257d1
ZJS
2968 endif
2969endif
2970
2971found = []
2972missing = []
2973
2974foreach tuple : [
2975 ['libcryptsetup'],
2976 ['PAM'],
2977 ['AUDIT'],
2978 ['IMA'],
2979 ['AppArmor'],
2980 ['SELinux'],
2981 ['SECCOMP'],
2982 ['SMACK'],
2983 ['zlib'],
2984 ['xz'],
2985 ['lz4'],
2986 ['bzip2'],
2987 ['ACL'],
2988 ['gcrypt'],
2989 ['qrencode'],
2990 ['microhttpd'],
2991 ['gnutls'],
096cbdce 2992 ['openssl'],
829257d1 2993 ['libcurl'],
d1bf5675 2994 ['idn'],
87057e24 2995 ['libidn2'],
829257d1
ZJS
2996 ['libidn'],
2997 ['libiptc'],
2998 ['elfutils'],
2999 ['binfmt'],
3000 ['vconsole'],
3001 ['quotacheck'],
3002 ['tmpfiles'],
3003 ['environment.d'],
3004 ['sysusers'],
3005 ['firstboot'],
3006 ['randomseed'],
3007 ['backlight'],
3008 ['rfkill'],
3009 ['logind'],
3010 ['machined'],
61d0578b 3011 ['portabled'],
829257d1
ZJS
3012 ['importd'],
3013 ['hostnamed'],
3014 ['timedated'],
3015 ['timesyncd'],
3016 ['localed'],
3017 ['networkd'],
a7456af5 3018 ['resolve'],
096cbdce
IT
3019 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3020 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
829257d1
ZJS
3021 ['coredump'],
3022 ['polkit'],
3023 ['legacy pkla', install_polkit_pkla],
3024 ['efi'],
3025 ['gnu-efi', have_gnu_efi],
3026 ['kmod'],
3027 ['xkbcommon'],
c4c978a0 3028 ['pcre2'],
829257d1
ZJS
3029 ['blkid'],
3030 ['dbus'],
3031 ['glib'],
08540a95
YW
3032 ['nss-myhostname', conf.get('ENABLE_NSS_MYHOSTNAME') == 1],
3033 ['nss-mymachines', conf.get('ENABLE_NSS_MYMACHINES') == 1],
3034 ['nss-resolve', conf.get('ENABLE_NSS_RESOLVE') == 1],
3035 ['nss-systemd', conf.get('ENABLE_NSS_SYSTEMD') == 1],
829257d1
ZJS
3036 ['hwdb'],
3037 ['tpm'],
3038 ['man pages', want_man],
3039 ['html pages', want_html],
3040 ['man page indices', want_man and have_lxml],
829257d1
ZJS
3041 ['SysV compat'],
3042 ['utmp'],
3043 ['ldconfig'],
3044 ['hibernate'],
3045 ['adm group', get_option('adm-group')],
3046 ['wheel group', get_option('wheel-group')],
b14e1b43 3047 ['gshadow'],
829257d1
ZJS
3048 ['debug hashmap'],
3049 ['debug mmap cache'],
d18cb393 3050 ['valgrind', conf.get('VALGRIND') == 1],
829257d1
ZJS
3051]
3052
af4d7860
ZJS
3053 if tuple.length() >= 2
3054 cond = tuple[1]
3055 else
829257d1
ZJS
3056 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3057 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
349cc4a5 3058 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
829257d1
ZJS
3059 endif
3060 if cond
5a8b1640 3061 found += tuple[0]
829257d1 3062 else
5a8b1640 3063 missing += tuple[0]
829257d1
ZJS
3064 endif
3065endforeach
3066
3067status += [
9d39c1bf 3068 '',
829257d1 3069 'enabled features: @0@'.format(', '.join(found)),
9d39c1bf
ZJS
3070 '',
3071 'disabled features: @0@'.format(', '.join(missing)),
3072 '']
829257d1 3073message('\n '.join(status))
9a8e64b0
ZJS
3074
3075if rootprefixdir != rootprefix_default
8ea9fad7
YW
3076 warning('\n' +
3077 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3078 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3079 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
9a8e64b0 3080endif