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