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