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