]> git.ipfire.org Git - thirdparty/systemd.git/blame - meson.build
NEWS: document that the BLS is now part of our tree
[thirdparty/systemd.git] / meson.build
CommitLineData
3a726fcd 1# SPDX-License-Identifier: LGPL-2.1+
3a726fcd 2
5c23128d 3project('systemd', 'c',
ad6a0853 4 version : '238',
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
ad6a0853
ZJS
15libsystemd_version = '0.22.0'
16libudev_version = '1.6.10'
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
c9299be2 1138default_dns_over_tls = get_option('default-dns-over-tls')
5d67a7ae 1139if fuzzer_build
c9299be2 1140 default_dns_over_tls = 'no'
5d67a7ae 1141endif
c9299be2
IT
1142if default_dns_over_tls != 'no' and conf.get('HAVE_GNUTLS') == 0
1143 message('default-dns-over-tls cannot be set to strict or opportunistic when gnutls is disabled. Setting default-dns-over-tls to no.')
1144 default_dns_over_tls = 'no'
5d67a7ae 1145endif
c9299be2
IT
1146conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1147 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1148substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
5d67a7ae 1149
5c23128d 1150want_importd = get_option('importd')
4390be30 1151if want_importd != 'false'
349cc4a5
ZJS
1152 have = (conf.get('HAVE_LIBCURL') == 1 and
1153 conf.get('HAVE_ZLIB') == 1 and
1154 conf.get('HAVE_BZIP2') == 1 and
1155 conf.get('HAVE_XZ') == 1 and
1156 conf.get('HAVE_GCRYPT') == 1)
1157 if want_importd == 'true' and not have
37efbbd8
ZJS
1158 error('importd support was requested, but dependencies are not available')
1159 endif
349cc4a5
ZJS
1160else
1161 have = false
5c23128d 1162endif
349cc4a5 1163conf.set10('ENABLE_IMPORTD', have)
5c23128d
ZJS
1164
1165want_remote = get_option('remote')
4390be30 1166if want_remote != 'false'
349cc4a5
ZJS
1167 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1168 conf.get('HAVE_LIBCURL') == 1]
37efbbd8
ZJS
1169 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1170 # it's possible to build one without the other. Complain only if
1171 # support was explictly requested. The auxiliary files like sysusers
1172 # config should be installed when any of the programs are built.
1173 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1174 error('remote support was requested, but dependencies are not available')
1175 endif
349cc4a5
ZJS
1176 have = have_deps[0] or have_deps[1]
1177else
1178 have = false
5c23128d 1179endif
349cc4a5 1180conf.set10('ENABLE_REMOTE', have)
5c23128d 1181
a9149d87
ZJS
1182foreach term : ['utmp',
1183 'hibernate',
1184 'environment-d',
1185 'binfmt',
1186 'coredump',
1187 'resolve',
1188 'logind',
1189 'hostnamed',
1190 'localed',
1191 'machined',
61d0578b 1192 'portabled',
a9149d87
ZJS
1193 'networkd',
1194 'timedated',
1195 'timesyncd',
1196 'myhostname',
1197 'firstboot',
1198 'randomseed',
1199 'backlight',
1200 'vconsole',
1201 'quotacheck',
1202 'sysusers',
1203 'tmpfiles',
1204 'hwdb',
1205 'rfkill',
1206 'ldconfig',
1207 'efi',
1208 'tpm',
1209 'ima',
1210 'smack',
1211 'gshadow',
1212 'idn',
1213 'nss-systemd']
1214 have = get_option(term)
1215 name = 'ENABLE_' + term.underscorify().to_upper()
1216 conf.set10(name, have)
5c23128d
ZJS
1217endforeach
1218
348b4437 1219conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
6129ec85 1220
69e96427 1221want_tests = get_option('tests')
572baca1 1222install_tests = get_option('install-tests')
b68dfb9e 1223slow_tests = get_option('slow-tests')
69e96427 1224tests = []
7db7d5b7 1225fuzzers = []
69e96427 1226
b68dfb9e 1227conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
00d82c81 1228
5c23128d
ZJS
1229#####################################################################
1230
1231if get_option('efi')
37efbbd8 1232 efi_arch = host_machine.cpu_family()
b710072d 1233
6800fe7f 1234 if efi_arch == 'x86'
37efbbd8 1235 EFI_MACHINE_TYPE_NAME = 'ia32'
6800fe7f 1236 gnu_efi_arch = 'ia32'
37efbbd8
ZJS
1237 elif efi_arch == 'x86_64'
1238 EFI_MACHINE_TYPE_NAME = 'x64'
6800fe7f 1239 gnu_efi_arch = 'x86_64'
37efbbd8
ZJS
1240 elif efi_arch == 'arm'
1241 EFI_MACHINE_TYPE_NAME = 'arm'
6800fe7f 1242 gnu_efi_arch = 'arm'
37efbbd8
ZJS
1243 elif efi_arch == 'aarch64'
1244 EFI_MACHINE_TYPE_NAME = 'aa64'
6800fe7f 1245 gnu_efi_arch = 'aarch64'
37efbbd8
ZJS
1246 else
1247 EFI_MACHINE_TYPE_NAME = ''
6800fe7f 1248 gnu_efi_arch = ''
37efbbd8 1249 endif
5c23128d 1250
349cc4a5 1251 have = true
37efbbd8 1252 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
80c6fce8
ZJS
1253
1254 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
349cc4a5
ZJS
1255else
1256 have = false
5c23128d 1257endif
349cc4a5 1258conf.set10('ENABLE_EFI', have)
5c23128d
ZJS
1259
1260#####################################################################
1261
1262config_h = configure_file(
37efbbd8
ZJS
1263 output : 'config.h',
1264 configuration : conf)
5c23128d 1265
348b4437
YW
1266meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1267
5c23128d
ZJS
1268includes = include_directories('src/basic',
1269 'src/shared',
1270 'src/systemd',
1271 'src/journal',
a38f7fec 1272 'src/journal-remote',
97d90615 1273 'src/nspawn',
5c23128d
ZJS
1274 'src/resolve',
1275 'src/timesync',
5c3376ef 1276 'src/time-wait-sync',
5c23128d
ZJS
1277 'src/login',
1278 'src/udev',
1279 'src/libudev',
1280 'src/core',
1281 'src/libsystemd/sd-bus',
1282 'src/libsystemd/sd-device',
1283 'src/libsystemd/sd-hwdb',
1284 'src/libsystemd/sd-id128',
1285 'src/libsystemd/sd-netlink',
1286 'src/libsystemd/sd-network',
1287 'src/libsystemd-network',
2d4ceca8 1288 '.')
5c23128d
ZJS
1289
1290add_project_arguments('-include', 'config.h', language : 'c')
1291
5c23128d
ZJS
1292subdir('po')
1293subdir('catalog')
1294subdir('src/systemd')
1295subdir('src/basic')
1296subdir('src/libsystemd')
1297subdir('src/libsystemd-network')
5c23128d 1298subdir('src/journal')
5c23128d 1299subdir('src/login')
5c23128d
ZJS
1300
1301libjournal_core = static_library(
37efbbd8
ZJS
1302 'journal-core',
1303 libjournal_core_sources,
1304 journald_gperf_c,
1305 include_directories : includes,
1306 install : false)
5c23128d 1307
37ab1a25 1308libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
5c23128d 1309libsystemd = shared_library(
37efbbd8 1310 'systemd',
7f1ea2cc 1311 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
56d50ab1 1312 version : libsystemd_version,
37efbbd8
ZJS
1313 include_directories : includes,
1314 link_args : ['-shared',
1315 '-Wl,--version-script=' + libsystemd_sym_path],
34e221a5
ZJS
1316 link_with : [libbasic,
1317 libbasic_gcrypt],
5e3cec87
ZJS
1318 link_whole : [libsystemd_static,
1319 libjournal_client],
37efbbd8
ZJS
1320 dependencies : [threads,
1321 librt,
1322 libxz,
1323 liblz4],
1324 link_depends : libsystemd_sym,
1325 install : true,
1326 install_dir : rootlibdir)
5c23128d 1327
70848ecf
DC
1328static_libsystemd = get_option('static-libsystemd')
1329static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1330
1331install_libsystemd_static = static_library(
1332 'systemd',
1333 libsystemd_sources,
1334 journal_client_sources,
975464e0
ZJS
1335 basic_sources,
1336 basic_gcrypt_sources,
70848ecf 1337 include_directories : includes,
70848ecf
DC
1338 build_by_default : static_libsystemd != 'false',
1339 install : static_libsystemd != 'false',
1340 install_dir : rootlibdir,
1341 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1342 dependencies : [threads,
1343 librt,
1344 libxz,
1345 liblz4,
975464e0
ZJS
1346 libcap,
1347 libblkid,
1348 libmount,
1349 libselinux,
70848ecf
DC
1350 libgcrypt],
1351 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1352
5c23128d
ZJS
1353############################################################
1354
83b6af36
ZJS
1355# binaries that have --help and are intended for use by humans,
1356# usually, but not always, installed in /bin.
1357public_programs = []
1358
1359subdir('src/libudev')
1360subdir('src/shared')
1361subdir('src/core')
1362subdir('src/udev')
1363subdir('src/network')
1364
1365subdir('src/analyze')
1366subdir('src/journal-remote')
1367subdir('src/coredump')
1368subdir('src/hostname')
1369subdir('src/import')
1370subdir('src/kernel-install')
1371subdir('src/locale')
1372subdir('src/machine')
61d0578b 1373subdir('src/portable')
83b6af36
ZJS
1374subdir('src/nspawn')
1375subdir('src/resolve')
1376subdir('src/timedate')
1377subdir('src/timesync')
1378subdir('src/vconsole')
83b6af36
ZJS
1379subdir('src/boot/efi')
1380
1381subdir('src/test')
7db7d5b7 1382subdir('src/fuzz')
6b97bf22 1383subdir('rules')
83b6af36
ZJS
1384subdir('test')
1385
1386############################################################
1387
1388# only static linking apart from libdl, to make sure that the
1389# module is linked to all libraries that it uses.
1390test_dlopen = executable(
37efbbd8
ZJS
1391 'test-dlopen',
1392 test_dlopen_c,
1393 include_directories : includes,
1394 link_with : [libbasic],
1395 dependencies : [libdl])
83b6af36 1396
08cf5b8d 1397foreach tuple : [['myhostname', 'ENABLE_MYHOSTNAME'],
e7e11bbf 1398 ['systemd', 'ENABLE_NSS_SYSTEMD'],
5486a31d 1399 ['mymachines', 'ENABLE_MACHINED'],
1ec57f33 1400 ['resolve', 'ENABLE_RESOLVE']]
5c23128d 1401
349cc4a5 1402 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
37efbbd8
ZJS
1403 if condition
1404 module = tuple[0]
37efbbd8
ZJS
1405
1406 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1407 version_script_arg = join_paths(meson.current_source_dir(), sym)
1408
1409 nss = shared_library(
1410 'nss_' + module,
1411 'src/nss-@0@/nss-@0@.c'.format(module),
1412 version : '2',
1413 include_directories : includes,
b4b36f44
LP
1414 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1415 link_args : ['-Wl,-z,nodelete',
1416 '-shared',
37efbbd8
ZJS
1417 '-Wl,--version-script=' + version_script_arg,
1418 '-Wl,--undefined'],
37e4d7a8 1419 link_with : [libsystemd_static,
37efbbd8
ZJS
1420 libbasic],
1421 dependencies : [threads,
5486a31d 1422 librt],
37efbbd8
ZJS
1423 link_depends : sym,
1424 install : true,
1425 install_dir : rootlibdir)
1426
1427 # We cannot use shared_module because it does not support version suffix.
1428 # Unfortunately shared_library insists on creating the symlink…
1429 meson.add_install_script('sh', '-c',
1430 'rm $DESTDIR@0@/libnss_@1@.so'
1431 .format(rootlibdir, module))
1432
1433 test('dlopen-nss_' + module,
1434 test_dlopen,
1435 args : [nss.full_path()]) # path to dlopen must include a slash
1436 endif
5c23128d
ZJS
1437endforeach
1438
1439############################################################
1440
5c23128d
ZJS
1441executable('systemd',
1442 systemd_sources,
1443 include_directories : includes,
1444 link_with : [libcore,
34ce0a52 1445 libshared],
5c23128d
ZJS
1446 dependencies : [threads,
1447 librt,
1448 libseccomp,
1449 libselinux,
f4ee10a2
ZJS
1450 libmount,
1451 libblkid],
421f0012 1452 install_rpath : rootlibexecdir,
5c23128d
ZJS
1453 install : true,
1454 install_dir : rootlibexecdir)
1455
ba7f4ae6
ZJS
1456meson.add_install_script(meson_make_symlink,
1457 join_paths(rootlibexecdir, 'systemd'),
1458 join_paths(rootsbindir, 'init'))
1459
005a29f2
ZJS
1460exe = executable('systemd-analyze',
1461 systemd_analyze_sources,
1462 include_directories : includes,
1463 link_with : [libcore,
005a29f2
ZJS
1464 libshared],
1465 dependencies : [threads,
1466 librt,
1467 libseccomp,
1468 libselinux,
1469 libmount,
1470 libblkid],
1471 install_rpath : rootlibexecdir,
1472 install : true)
1473public_programs += [exe]
5c23128d
ZJS
1474
1475executable('systemd-journald',
1476 systemd_journald_sources,
1477 include_directories : includes,
aac26058 1478 link_with : [libjournal_core,
34ce0a52 1479 libshared],
5c23128d
ZJS
1480 dependencies : [threads,
1481 libxz,
aac26058
ZJS
1482 liblz4,
1483 libselinux],
421f0012 1484 install_rpath : rootlibexecdir,
5c23128d
ZJS
1485 install : true,
1486 install_dir : rootlibexecdir)
1487
005a29f2
ZJS
1488exe = executable('systemd-cat',
1489 systemd_cat_sources,
1490 include_directories : includes,
1491 link_with : [libjournal_core,
34ce0a52 1492 libshared],
005a29f2
ZJS
1493 dependencies : [threads],
1494 install_rpath : rootlibexecdir,
1495 install : true)
1496public_programs += [exe]
1497
1498exe = executable('journalctl',
1499 journalctl_sources,
1500 include_directories : includes,
34ce0a52 1501 link_with : [libshared],
005a29f2
ZJS
1502 dependencies : [threads,
1503 libqrencode,
1504 libxz,
6becf48c
ZJS
1505 liblz4,
1506 libpcre2],
005a29f2
ZJS
1507 install_rpath : rootlibexecdir,
1508 install : true,
1509 install_dir : rootbindir)
1510public_programs += [exe]
5c23128d
ZJS
1511
1512executable('systemd-getty-generator',
1513 'src/getty-generator/getty-generator.c',
5c23128d 1514 include_directories : includes,
b2fc5836
ZJS
1515 link_with : [libshared],
1516 install_rpath : rootlibexecdir,
1517 install : true,
1518 install_dir : systemgeneratordir)
5c23128d
ZJS
1519
1520executable('systemd-debug-generator',
1521 'src/debug-generator/debug-generator.c',
5c23128d 1522 include_directories : includes,
b2fc5836
ZJS
1523 link_with : [libshared],
1524 install_rpath : rootlibexecdir,
1525 install : true,
1526 install_dir : systemgeneratordir)
5c23128d
ZJS
1527
1528executable('systemd-fstab-generator',
1529 'src/fstab-generator/fstab-generator.c',
1530 'src/core/mount-setup.c',
5c23128d 1531 include_directories : includes,
b2fc5836
ZJS
1532 link_with : [libshared],
1533 install_rpath : rootlibexecdir,
1534 install : true,
1535 install_dir : systemgeneratordir)
5c23128d 1536
349cc4a5 1537if conf.get('ENABLE_ENVIRONMENT_D') == 1
37efbbd8
ZJS
1538 executable('30-systemd-environment-d-generator',
1539 'src/environment-d-generator/environment-d-generator.c',
1540 include_directories : includes,
1541 link_with : [libshared],
1542 install_rpath : rootlibexecdir,
1543 install : true,
1544 install_dir : userenvgeneratordir)
7b76fce1 1545
37efbbd8
ZJS
1546 meson.add_install_script(meson_make_symlink,
1547 join_paths(sysconfdir, 'environment'),
1548 join_paths(environmentdir, '99-environment.conf'))
5c23128d
ZJS
1549endif
1550
349cc4a5 1551if conf.get('ENABLE_HIBERNATE') == 1
37efbbd8
ZJS
1552 executable('systemd-hibernate-resume-generator',
1553 'src/hibernate-resume/hibernate-resume-generator.c',
1554 include_directories : includes,
1555 link_with : [libshared],
1556 install_rpath : rootlibexecdir,
1557 install : true,
1558 install_dir : systemgeneratordir)
5c23128d 1559
37efbbd8
ZJS
1560 executable('systemd-hibernate-resume',
1561 'src/hibernate-resume/hibernate-resume.c',
005a29f2
ZJS
1562 include_directories : includes,
1563 link_with : [libshared],
1564 install_rpath : rootlibexecdir,
1565 install : true,
1566 install_dir : rootlibexecdir)
37efbbd8
ZJS
1567endif
1568
349cc4a5 1569if conf.get('HAVE_BLKID') == 1
37efbbd8
ZJS
1570 executable('systemd-gpt-auto-generator',
1571 'src/gpt-auto-generator/gpt-auto-generator.c',
1572 'src/basic/blkid-util.h',
1573 include_directories : includes,
34ce0a52 1574 link_with : [libshared],
37efbbd8
ZJS
1575 dependencies : libblkid,
1576 install_rpath : rootlibexecdir,
1577 install : true,
1578 install_dir : systemgeneratordir)
1579
1580 exe = executable('systemd-dissect',
1581 'src/dissect/dissect.c',
1582 include_directories : includes,
1583 link_with : [libshared],
1584 install_rpath : rootlibexecdir,
1585 install : true,
1586 install_dir : rootlibexecdir)
1587 public_programs += [exe]
5c23128d
ZJS
1588endif
1589
1ec57f33 1590if conf.get('ENABLE_RESOLVE') == 1
37efbbd8
ZJS
1591 executable('systemd-resolved',
1592 systemd_resolved_sources,
005a29f2 1593 include_directories : includes,
34e221a5 1594 link_with : [libshared,
568a4ff8
ZJS
1595 libbasic_gcrypt,
1596 libsystemd_resolve_core],
005a29f2 1597 dependencies : [threads,
5d67a7ae 1598 libgnutls,
76c87410 1599 libgpg_error,
005a29f2
ZJS
1600 libm,
1601 libidn],
1602 install_rpath : rootlibexecdir,
37efbbd8
ZJS
1603 install : true,
1604 install_dir : rootlibexecdir)
1605
c2e84cab
YW
1606 exe = executable('resolvectl',
1607 resolvectl_sources,
37efbbd8 1608 include_directories : includes,
34e221a5 1609 link_with : [libshared,
568a4ff8
ZJS
1610 libbasic_gcrypt,
1611 libsystemd_resolve_core],
37efbbd8 1612 dependencies : [threads,
76c87410 1613 libgpg_error,
37efbbd8
ZJS
1614 libm,
1615 libidn],
1616 install_rpath : rootlibexecdir,
1617 install : true)
1618 public_programs += [exe]
088c1363
LP
1619
1620 meson.add_install_script(meson_make_symlink,
c2e84cab 1621 join_paths(bindir, 'resolvectl'),
088c1363 1622 join_paths(rootsbindir, 'resolvconf'))
c2e84cab
YW
1623
1624 meson.add_install_script(meson_make_symlink,
1625 join_paths(bindir, 'resolvectl'),
1626 join_paths(bindir, 'systemd-resolve'))
5c23128d
ZJS
1627endif
1628
349cc4a5 1629if conf.get('ENABLE_LOGIND') == 1
37efbbd8
ZJS
1630 executable('systemd-logind',
1631 systemd_logind_sources,
005a29f2 1632 include_directories : includes,
37efbbd8 1633 link_with : [liblogind_core,
34ce0a52 1634 libshared],
005a29f2 1635 dependencies : [threads,
37efbbd8 1636 libacl],
005a29f2
ZJS
1637 install_rpath : rootlibexecdir,
1638 install : true,
37efbbd8
ZJS
1639 install_dir : rootlibexecdir)
1640
1641 exe = executable('loginctl',
1642 loginctl_sources,
1643 include_directories : includes,
34ce0a52 1644 link_with : [libshared],
37efbbd8
ZJS
1645 dependencies : [threads,
1646 liblz4,
1647 libxz],
1648 install_rpath : rootlibexecdir,
1649 install : true,
1650 install_dir : rootbindir)
1651 public_programs += [exe]
1652
1653 exe = executable('systemd-inhibit',
1654 'src/login/inhibit.c',
1655 include_directories : includes,
1656 link_with : [libshared],
1657 install_rpath : rootlibexecdir,
1658 install : true,
1659 install_dir : rootbindir)
1660 public_programs += [exe]
1661
349cc4a5 1662 if conf.get('HAVE_PAM') == 1
37efbbd8
ZJS
1663 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1664 pam_systemd = shared_library(
1665 'pam_systemd',
1666 pam_systemd_c,
1667 name_prefix : '',
1668 include_directories : includes,
1669 link_args : ['-shared',
1670 '-Wl,--version-script=' + version_script_arg],
37e4d7a8 1671 link_with : [libsystemd_static,
37efbbd8
ZJS
1672 libshared_static],
1673 dependencies : [threads,
1674 libpam,
1675 libpam_misc],
1676 link_depends : pam_systemd_sym,
1677 install : true,
1678 install_dir : pamlibdir)
1679
1680 test('dlopen-pam_systemd',
1681 test_dlopen,
1682 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1683 endif
1684endif
005a29f2 1685
a9f0f5e5
ZJS
1686executable('systemd-user-runtime-dir',
1687 user_runtime_dir_sources,
1688 include_directories : includes,
1689 link_with : [libshared, liblogind_core],
1690 install_rpath : rootlibexecdir,
1691 install : true,
1692 install_dir : rootlibexecdir)
1693
349cc4a5 1694if conf.get('HAVE_PAM') == 1
37efbbd8
ZJS
1695 executable('systemd-user-sessions',
1696 'src/user-sessions/user-sessions.c',
005a29f2 1697 include_directories : includes,
aac26058 1698 link_with : [libshared],
005a29f2
ZJS
1699 install_rpath : rootlibexecdir,
1700 install : true,
37efbbd8 1701 install_dir : rootlibexecdir)
5c23128d
ZJS
1702endif
1703
349cc4a5 1704if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
37efbbd8
ZJS
1705 exe = executable('bootctl',
1706 'src/boot/bootctl.c',
1707 include_directories : includes,
1708 link_with : [libshared],
1709 dependencies : [libblkid],
1710 install_rpath : rootlibexecdir,
1711 install : true)
1712 public_programs += [exe]
005a29f2
ZJS
1713endif
1714
1715exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1716 include_directories : includes,
1717 link_with : [libshared],
1718 dependencies : [threads],
1719 install_rpath : rootlibexecdir,
1720 install : true)
1721public_programs += [exe]
1722
f3794366
FS
1723
1724if get_option('link-systemctl-shared')
1725 systemctl_link_with = [libshared]
1726else
1727 systemctl_link_with = [libsystemd_static,
1728 libshared_static,
1729 libjournal_client,
1730 libbasic_gcrypt]
1731endif
1732
005a29f2
ZJS
1733exe = executable('systemctl', 'src/systemctl/systemctl.c',
1734 include_directories : includes,
f3794366 1735 link_with : systemctl_link_with,
005a29f2
ZJS
1736 dependencies : [threads,
1737 libcap,
1738 libselinux,
1739 libxz,
1740 liblz4],
1741 install_rpath : rootlibexecdir,
1742 install : true,
1743 install_dir : rootbindir)
1744public_programs += [exe]
5c23128d 1745
61d0578b
LP
1746if conf.get('ENABLE_PORTABLED') == 1
1747 executable('systemd-portabled',
1748 systemd_portabled_sources,
1749 include_directories : includes,
1750 link_with : [libshared],
1751 dependencies : [threads],
1752 install_rpath : rootlibexecdir,
1753 install : true,
1754 install_dir : rootlibexecdir)
1755
1756 exe = executable('portablectl', 'src/portable/portablectl.c',
1757 include_directories : includes,
1758 link_with : [libshared],
1759 dependencies : [threads],
1760 install_rpath : rootlibexecdir,
1761 install : true,
1762 install_dir : rootlibexecdir)
1763 public_programs += [exe]
1764endif
1765
ba7f4ae6
ZJS
1766foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1767 meson.add_install_script(meson_make_symlink,
1768 join_paths(rootbindir, 'systemctl'),
1769 join_paths(rootsbindir, alias))
1770endforeach
1771
349cc4a5 1772if conf.get('ENABLE_BACKLIGHT') == 1
37efbbd8
ZJS
1773 executable('systemd-backlight',
1774 'src/backlight/backlight.c',
1775 include_directories : includes,
34ce0a52 1776 link_with : [libshared],
37efbbd8
ZJS
1777 install_rpath : rootlibexecdir,
1778 install : true,
1779 install_dir : rootlibexecdir)
5c23128d
ZJS
1780endif
1781
349cc4a5 1782if conf.get('ENABLE_RFKILL') == 1
37efbbd8
ZJS
1783 executable('systemd-rfkill',
1784 'src/rfkill/rfkill.c',
1785 include_directories : includes,
34ce0a52 1786 link_with : [libshared],
37efbbd8
ZJS
1787 install_rpath : rootlibexecdir,
1788 install : true,
1789 install_dir : rootlibexecdir)
5c23128d
ZJS
1790endif
1791
1792executable('systemd-system-update-generator',
1793 'src/system-update-generator/system-update-generator.c',
1794 include_directories : includes,
1795 link_with : [libshared],
b2fc5836 1796 install_rpath : rootlibexecdir,
5c23128d
ZJS
1797 install : true,
1798 install_dir : systemgeneratordir)
1799
349cc4a5 1800if conf.get('HAVE_LIBCRYPTSETUP') == 1
37efbbd8
ZJS
1801 executable('systemd-cryptsetup',
1802 'src/cryptsetup/cryptsetup.c',
1803 include_directories : includes,
1804 link_with : [libshared],
1805 dependencies : [libcryptsetup],
1806 install_rpath : rootlibexecdir,
1807 install : true,
1808 install_dir : rootlibexecdir)
1809
1810 executable('systemd-cryptsetup-generator',
1811 'src/cryptsetup/cryptsetup-generator.c',
1812 include_directories : includes,
1813 link_with : [libshared],
1814 dependencies : [libcryptsetup],
1815 install_rpath : rootlibexecdir,
1816 install : true,
1817 install_dir : systemgeneratordir)
1818
1819 executable('systemd-veritysetup',
1820 'src/veritysetup/veritysetup.c',
1821 include_directories : includes,
1822 link_with : [libshared],
1823 dependencies : [libcryptsetup],
1824 install_rpath : rootlibexecdir,
1825 install : true,
1826 install_dir : rootlibexecdir)
1827
1828 executable('systemd-veritysetup-generator',
1829 'src/veritysetup/veritysetup-generator.c',
1830 include_directories : includes,
1831 link_with : [libshared],
1832 dependencies : [libcryptsetup],
1833 install_rpath : rootlibexecdir,
1834 install : true,
1835 install_dir : systemgeneratordir)
5c23128d
ZJS
1836endif
1837
349cc4a5 1838if conf.get('HAVE_SYSV_COMPAT') == 1
37efbbd8
ZJS
1839 executable('systemd-sysv-generator',
1840 'src/sysv-generator/sysv-generator.c',
1841 include_directories : includes,
1842 link_with : [libshared],
1843 install_rpath : rootlibexecdir,
1844 install : true,
1845 install_dir : systemgeneratordir)
1846
1847 executable('systemd-rc-local-generator',
1848 'src/rc-local-generator/rc-local-generator.c',
1849 include_directories : includes,
1850 link_with : [libshared],
1851 install_rpath : rootlibexecdir,
1852 install : true,
1853 install_dir : systemgeneratordir)
5c23128d
ZJS
1854endif
1855
349cc4a5 1856if conf.get('ENABLE_HOSTNAMED') == 1
37efbbd8
ZJS
1857 executable('systemd-hostnamed',
1858 'src/hostname/hostnamed.c',
005a29f2 1859 include_directories : includes,
aac26058 1860 link_with : [libshared],
005a29f2 1861 install_rpath : rootlibexecdir,
37efbbd8
ZJS
1862 install : true,
1863 install_dir : rootlibexecdir)
1864
1865 exe = executable('hostnamectl',
1866 'src/hostname/hostnamectl.c',
1867 include_directories : includes,
1868 link_with : [libshared],
1869 install_rpath : rootlibexecdir,
1870 install : true)
1871 public_programs += [exe]
5c23128d
ZJS
1872endif
1873
349cc4a5
ZJS
1874if conf.get('ENABLE_LOCALED') == 1
1875 if conf.get('HAVE_XKBCOMMON') == 1
37efbbd8
ZJS
1876 # logind will load libxkbcommon.so dynamically on its own
1877 deps = [libdl]
1878 else
1879 deps = []
1880 endif
1881
1882 executable('systemd-localed',
1883 systemd_localed_sources,
005a29f2 1884 include_directories : includes,
aac26058 1885 link_with : [libshared],
37efbbd8 1886 dependencies : deps,
005a29f2 1887 install_rpath : rootlibexecdir,
37efbbd8
ZJS
1888 install : true,
1889 install_dir : rootlibexecdir)
1890
1891 exe = executable('localectl',
1892 localectl_sources,
1893 include_directories : includes,
1894 link_with : [libshared],
1895 install_rpath : rootlibexecdir,
1896 install : true)
1897 public_programs += [exe]
5c23128d
ZJS
1898endif
1899
349cc4a5 1900if conf.get('ENABLE_TIMEDATED') == 1
37efbbd8
ZJS
1901 executable('systemd-timedated',
1902 'src/timedate/timedated.c',
005a29f2 1903 include_directories : includes,
aac26058 1904 link_with : [libshared],
37efbbd8
ZJS
1905 install_rpath : rootlibexecdir,
1906 install : true,
1907 install_dir : rootlibexecdir)
6129ec85 1908endif
5c23128d 1909
6129ec85 1910if conf.get('ENABLE_TIMEDATECTL') == 1
37efbbd8
ZJS
1911 exe = executable('timedatectl',
1912 'src/timedate/timedatectl.c',
1913 include_directories : includes,
1914 install_rpath : rootlibexecdir,
1915 link_with : [libshared],
6129ec85 1916 dependencies : [libm],
37efbbd8
ZJS
1917 install : true)
1918 public_programs += [exe]
5c23128d
ZJS
1919endif
1920
349cc4a5 1921if conf.get('ENABLE_TIMESYNCD') == 1
37efbbd8
ZJS
1922 executable('systemd-timesyncd',
1923 systemd_timesyncd_sources,
005a29f2 1924 include_directories : includes,
aac26058 1925 link_with : [libshared],
005a29f2 1926 dependencies : [threads,
37efbbd8 1927 libm],
005a29f2
ZJS
1928 install_rpath : rootlibexecdir,
1929 install : true,
37efbbd8 1930 install_dir : rootlibexecdir)
5c3376ef
PB
1931
1932 executable('systemd-time-wait-sync',
1933 'src/time-wait-sync/time-wait-sync.c',
1934 include_directories : includes,
1935 link_with : [libshared],
1936 install_rpath : rootlibexecdir,
1937 install : true,
1938 install_dir : rootlibexecdir)
5c23128d
ZJS
1939endif
1940
349cc4a5 1941if conf.get('ENABLE_MACHINED') == 1
37efbbd8
ZJS
1942 executable('systemd-machined',
1943 systemd_machined_sources,
1944 include_directories : includes,
1945 link_with : [libmachine_core,
1946 libshared],
1947 install_rpath : rootlibexecdir,
1948 install : true,
1949 install_dir : rootlibexecdir)
1950
1951 exe = executable('machinectl',
1952 'src/machine/machinectl.c',
1953 include_directories : includes,
1954 link_with : [libshared],
1955 dependencies : [threads,
1956 libxz,
1957 liblz4],
1958 install_rpath : rootlibexecdir,
1959 install : true,
1960 install_dir : rootbindir)
1961 public_programs += [exe]
5c23128d
ZJS
1962endif
1963
349cc4a5 1964if conf.get('ENABLE_IMPORTD') == 1
37efbbd8
ZJS
1965 executable('systemd-importd',
1966 systemd_importd_sources,
005a29f2 1967 include_directories : includes,
aac26058 1968 link_with : [libshared],
37efbbd8 1969 dependencies : [threads],
005a29f2
ZJS
1970 install_rpath : rootlibexecdir,
1971 install : true,
1972 install_dir : rootlibexecdir)
37efbbd8
ZJS
1973
1974 systemd_pull = executable('systemd-pull',
1975 systemd_pull_sources,
1976 include_directories : includes,
1977 link_with : [libshared],
1978 dependencies : [libcurl,
1979 libz,
1980 libbzip2,
1981 libxz,
1982 libgcrypt],
1983 install_rpath : rootlibexecdir,
1984 install : true,
1985 install_dir : rootlibexecdir)
1986
1987 systemd_import = executable('systemd-import',
1988 systemd_import_sources,
1989 include_directories : includes,
1990 link_with : [libshared],
1991 dependencies : [libcurl,
1992 libz,
1993 libbzip2,
1994 libxz],
1995 install_rpath : rootlibexecdir,
1996 install : true,
1997 install_dir : rootlibexecdir)
1998
1999 systemd_export = executable('systemd-export',
2000 systemd_export_sources,
2001 include_directories : includes,
2002 link_with : [libshared],
2003 dependencies : [libcurl,
2004 libz,
2005 libbzip2,
2006 libxz],
2007 install_rpath : rootlibexecdir,
2008 install : true,
2009 install_dir : rootlibexecdir)
2010 public_programs += [systemd_pull, systemd_import, systemd_export]
2011endif
2012
349cc4a5 2013if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
37efbbd8
ZJS
2014 exe = executable('systemd-journal-upload',
2015 systemd_journal_upload_sources,
2016 include_directories : includes,
2017 link_with : [libshared],
2018 dependencies : [threads,
2019 libcurl,
2020 libgnutls,
2021 libxz,
2022 liblz4],
2023 install_rpath : rootlibexecdir,
2024 install : true,
2025 install_dir : rootlibexecdir)
2026 public_programs += [exe]
5c23128d
ZJS
2027endif
2028
349cc4a5 2029if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
37efbbd8
ZJS
2030 s_j_remote = executable('systemd-journal-remote',
2031 systemd_journal_remote_sources,
2032 include_directories : includes,
c064d8db
ZJS
2033 link_with : [libshared,
2034 libsystemd_journal_remote],
37efbbd8
ZJS
2035 dependencies : [threads,
2036 libmicrohttpd,
2037 libgnutls,
2038 libxz,
2039 liblz4],
2040 install_rpath : rootlibexecdir,
2041 install : true,
2042 install_dir : rootlibexecdir)
2043
2044 s_j_gatewayd = executable('systemd-journal-gatewayd',
2045 systemd_journal_gatewayd_sources,
2046 include_directories : includes,
2047 link_with : [libshared],
2048 dependencies : [threads,
2049 libmicrohttpd,
2050 libgnutls,
2051 libxz,
2052 liblz4],
2053 install_rpath : rootlibexecdir,
2054 install : true,
2055 install_dir : rootlibexecdir)
2056 public_programs += [s_j_remote, s_j_gatewayd]
5c23128d
ZJS
2057endif
2058
349cc4a5 2059if conf.get('ENABLE_COREDUMP') == 1
37efbbd8
ZJS
2060 executable('systemd-coredump',
2061 systemd_coredump_sources,
005a29f2 2062 include_directories : includes,
aac26058 2063 link_with : [libshared],
005a29f2 2064 dependencies : [threads,
37efbbd8
ZJS
2065 libacl,
2066 libdw,
005a29f2
ZJS
2067 libxz,
2068 liblz4],
2069 install_rpath : rootlibexecdir,
37efbbd8
ZJS
2070 install : true,
2071 install_dir : rootlibexecdir)
2072
2073 exe = executable('coredumpctl',
2074 coredumpctl_sources,
2075 include_directories : includes,
2076 link_with : [libshared],
2077 dependencies : [threads,
2078 libxz,
2079 liblz4],
2080 install_rpath : rootlibexecdir,
2081 install : true)
2082 public_programs += [exe]
5c23128d
ZJS
2083endif
2084
349cc4a5 2085if conf.get('ENABLE_BINFMT') == 1
37efbbd8
ZJS
2086 exe = executable('systemd-binfmt',
2087 'src/binfmt/binfmt.c',
2088 include_directories : includes,
2089 link_with : [libshared],
2090 install_rpath : rootlibexecdir,
2091 install : true,
2092 install_dir : rootlibexecdir)
2093 public_programs += [exe]
2094
2095 meson.add_install_script('sh', '-c',
2096 mkdir_p.format(binfmtdir))
2097 meson.add_install_script('sh', '-c',
2098 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2099endif
2100
349cc4a5 2101if conf.get('ENABLE_VCONSOLE') == 1
37efbbd8
ZJS
2102 executable('systemd-vconsole-setup',
2103 'src/vconsole/vconsole-setup.c',
005a29f2
ZJS
2104 include_directories : includes,
2105 link_with : [libshared],
2106 install_rpath : rootlibexecdir,
2107 install : true,
2108 install_dir : rootlibexecdir)
5c23128d
ZJS
2109endif
2110
349cc4a5 2111if conf.get('ENABLE_RANDOMSEED') == 1
37efbbd8
ZJS
2112 executable('systemd-random-seed',
2113 'src/random-seed/random-seed.c',
2114 include_directories : includes,
2115 link_with : [libshared],
2116 install_rpath : rootlibexecdir,
2117 install : true,
2118 install_dir : rootlibexecdir)
5c23128d
ZJS
2119endif
2120
349cc4a5 2121if conf.get('ENABLE_FIRSTBOOT') == 1
37efbbd8
ZJS
2122 executable('systemd-firstboot',
2123 'src/firstboot/firstboot.c',
2124 include_directories : includes,
2125 link_with : [libshared],
2126 dependencies : [libcrypt],
2127 install_rpath : rootlibexecdir,
2128 install : true,
2129 install_dir : rootbindir)
5c23128d
ZJS
2130endif
2131
2132executable('systemd-remount-fs',
2133 'src/remount-fs/remount-fs.c',
2134 'src/core/mount-setup.c',
2135 'src/core/mount-setup.h',
2136 include_directories : includes,
2137 link_with : [libshared],
b2fc5836 2138 install_rpath : rootlibexecdir,
5c23128d
ZJS
2139 install : true,
2140 install_dir : rootlibexecdir)
2141
2142executable('systemd-machine-id-setup',
2143 'src/machine-id-setup/machine-id-setup-main.c',
2144 'src/core/machine-id-setup.c',
2145 'src/core/machine-id-setup.h',
2146 include_directories : includes,
aac26058 2147 link_with : [libshared],
b2fc5836 2148 install_rpath : rootlibexecdir,
5c23128d
ZJS
2149 install : true,
2150 install_dir : rootbindir)
2151
2152executable('systemd-fsck',
2153 'src/fsck/fsck.c',
2154 include_directories : includes,
aac26058 2155 link_with : [libshared],
421f0012 2156 install_rpath : rootlibexecdir,
5c23128d
ZJS
2157 install : true,
2158 install_dir : rootlibexecdir)
2159
80750adb
ZJS
2160executable('systemd-growfs',
2161 'src/partition/growfs.c',
2162 include_directories : includes,
2163 link_with : [libshared],
c34b75a1 2164 dependencies : [libcryptsetup],
80750adb
ZJS
2165 install_rpath : rootlibexecdir,
2166 install : true,
2167 install_dir : rootlibexecdir)
2168
b7f28ac5
ZJS
2169executable('systemd-makefs',
2170 'src/partition/makefs.c',
2171 include_directories : includes,
2172 link_with : [libshared],
2173 install_rpath : rootlibexecdir,
2174 install : true,
2175 install_dir : rootlibexecdir)
2176
5c23128d
ZJS
2177executable('systemd-sleep',
2178 'src/sleep/sleep.c',
2179 include_directories : includes,
2180 link_with : [libshared],
421f0012 2181 install_rpath : rootlibexecdir,
5c23128d
ZJS
2182 install : true,
2183 install_dir : rootlibexecdir)
2184
005a29f2
ZJS
2185exe = executable('systemd-sysctl',
2186 'src/sysctl/sysctl.c',
2187 include_directories : includes,
2188 link_with : [libshared],
2189 install_rpath : rootlibexecdir,
2190 install : true,
2191 install_dir : rootlibexecdir)
2192public_programs += [exe]
5c23128d
ZJS
2193
2194executable('systemd-ac-power',
2195 'src/ac-power/ac-power.c',
2196 include_directories : includes,
2197 link_with : [libshared],
421f0012 2198 install_rpath : rootlibexecdir,
5c23128d
ZJS
2199 install : true,
2200 install_dir : rootlibexecdir)
2201
005a29f2
ZJS
2202exe = executable('systemd-detect-virt',
2203 'src/detect-virt/detect-virt.c',
2204 include_directories : includes,
2205 link_with : [libshared],
2206 install_rpath : rootlibexecdir,
2207 install : true)
2208public_programs += [exe]
2209
2210exe = executable('systemd-delta',
2211 'src/delta/delta.c',
2212 include_directories : includes,
2213 link_with : [libshared],
2214 install_rpath : rootlibexecdir,
2215 install : true)
2216public_programs += [exe]
2217
2218exe = executable('systemd-escape',
2219 'src/escape/escape.c',
2220 include_directories : includes,
2221 link_with : [libshared],
2222 install_rpath : rootlibexecdir,
2223 install : true,
2224 install_dir : rootbindir)
2225public_programs += [exe]
2226
2227exe = executable('systemd-notify',
2228 'src/notify/notify.c',
2229 include_directories : includes,
2230 link_with : [libshared],
2231 install_rpath : rootlibexecdir,
2232 install : true,
2233 install_dir : rootbindir)
2234public_programs += [exe]
5c23128d
ZJS
2235
2236executable('systemd-volatile-root',
2237 'src/volatile-root/volatile-root.c',
2238 include_directories : includes,
2239 link_with : [libshared],
421f0012 2240 install_rpath : rootlibexecdir,
5c23128d
ZJS
2241 install : true,
2242 install_dir : rootlibexecdir)
2243
2244executable('systemd-cgroups-agent',
2245 'src/cgroups-agent/cgroups-agent.c',
2246 include_directories : includes,
2247 link_with : [libshared],
421f0012 2248 install_rpath : rootlibexecdir,
5c23128d
ZJS
2249 install : true,
2250 install_dir : rootlibexecdir)
2251
005a29f2
ZJS
2252exe = executable('systemd-path',
2253 'src/path/path.c',
2254 include_directories : includes,
aac26058 2255 link_with : [libshared],
005a29f2
ZJS
2256 install_rpath : rootlibexecdir,
2257 install : true)
2258public_programs += [exe]
2259
2260exe = executable('systemd-ask-password',
2261 'src/ask-password/ask-password.c',
2262 include_directories : includes,
aac26058 2263 link_with : [libshared],
005a29f2
ZJS
2264 install_rpath : rootlibexecdir,
2265 install : true,
2266 install_dir : rootbindir)
2267public_programs += [exe]
5c23128d
ZJS
2268
2269executable('systemd-reply-password',
2270 'src/reply-password/reply-password.c',
2271 include_directories : includes,
aac26058 2272 link_with : [libshared],
421f0012 2273 install_rpath : rootlibexecdir,
5c23128d
ZJS
2274 install : true,
2275 install_dir : rootlibexecdir)
2276
005a29f2
ZJS
2277exe = executable('systemd-tty-ask-password-agent',
2278 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2279 include_directories : includes,
aac26058 2280 link_with : [libshared],
005a29f2
ZJS
2281 install_rpath : rootlibexecdir,
2282 install : true,
2283 install_dir : rootbindir)
2284public_programs += [exe]
2285
2286exe = executable('systemd-cgls',
2287 'src/cgls/cgls.c',
2288 include_directories : includes,
aac26058 2289 link_with : [libshared],
005a29f2
ZJS
2290 install_rpath : rootlibexecdir,
2291 install : true)
2292public_programs += [exe]
2293
2294exe = executable('systemd-cgtop',
2295 'src/cgtop/cgtop.c',
2296 include_directories : includes,
aac26058 2297 link_with : [libshared],
005a29f2
ZJS
2298 install_rpath : rootlibexecdir,
2299 install : true)
2300public_programs += [exe]
5c23128d
ZJS
2301
2302executable('systemd-initctl',
2303 'src/initctl/initctl.c',
2304 include_directories : includes,
aac26058 2305 link_with : [libshared],
421f0012 2306 install_rpath : rootlibexecdir,
5c23128d
ZJS
2307 install : true,
2308 install_dir : rootlibexecdir)
2309
005a29f2
ZJS
2310exe = executable('systemd-mount',
2311 'src/mount/mount-tool.c',
2312 include_directories : includes,
34ce0a52 2313 link_with : [libshared],
005a29f2
ZJS
2314 install_rpath : rootlibexecdir,
2315 install : true)
2316public_programs += [exe]
5c23128d 2317
7b76fce1 2318meson.add_install_script(meson_make_symlink,
e17e5ba9 2319 'systemd-mount', join_paths(bindir, 'systemd-umount'))
7b76fce1 2320
005a29f2
ZJS
2321exe = executable('systemd-run',
2322 'src/run/run.c',
2323 include_directories : includes,
aac26058 2324 link_with : [libshared],
005a29f2
ZJS
2325 install_rpath : rootlibexecdir,
2326 install : true)
2327public_programs += [exe]
2328
2329exe = executable('systemd-stdio-bridge',
2330 'src/stdio-bridge/stdio-bridge.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('busctl',
2338 'src/busctl/busctl.c',
2339 'src/busctl/busctl-introspect.c',
2340 'src/busctl/busctl-introspect.h',
2341 include_directories : includes,
aac26058 2342 link_with : [libshared],
005a29f2
ZJS
2343 install_rpath : rootlibexecdir,
2344 install : true)
2345public_programs += [exe]
5c23128d 2346
349cc4a5 2347if conf.get('ENABLE_SYSUSERS') == 1
37efbbd8
ZJS
2348 exe = executable('systemd-sysusers',
2349 'src/sysusers/sysusers.c',
2350 include_directories : includes,
2351 link_with : [libshared],
2352 install_rpath : rootlibexecdir,
2353 install : true,
2354 install_dir : rootbindir)
2355 public_programs += [exe]
5c23128d
ZJS
2356endif
2357
349cc4a5 2358if conf.get('ENABLE_TMPFILES') == 1
37efbbd8
ZJS
2359 exe = executable('systemd-tmpfiles',
2360 'src/tmpfiles/tmpfiles.c',
2361 include_directories : includes,
2362 link_with : [libshared],
2363 dependencies : [libacl],
2364 install_rpath : rootlibexecdir,
2365 install : true,
2366 install_dir : rootbindir)
2367 public_programs += [exe]
d9daae55
ZJS
2368
2369 test('test-systemd-tmpfiles',
2370 test_systemd_tmpfiles_py,
2371 args : exe.full_path())
2372 # https://github.com/mesonbuild/meson/issues/2681
5c23128d
ZJS
2373endif
2374
349cc4a5 2375if conf.get('ENABLE_HWDB') == 1
37efbbd8
ZJS
2376 exe = executable('systemd-hwdb',
2377 'src/hwdb/hwdb.c',
2378 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2379 include_directories : includes,
0c06b506 2380 link_with : [libudev_static],
0da6f396 2381 install_rpath : udev_rpath,
37efbbd8
ZJS
2382 install : true,
2383 install_dir : rootbindir)
2384 public_programs += [exe]
2385endif
2386
349cc4a5 2387if conf.get('ENABLE_QUOTACHECK') == 1
37efbbd8
ZJS
2388 executable('systemd-quotacheck',
2389 'src/quotacheck/quotacheck.c',
005a29f2 2390 include_directories : includes,
aac26058 2391 link_with : [libshared],
005a29f2
ZJS
2392 install_rpath : rootlibexecdir,
2393 install : true,
37efbbd8 2394 install_dir : rootlibexecdir)
5c23128d
ZJS
2395endif
2396
005a29f2
ZJS
2397exe = executable('systemd-socket-proxyd',
2398 'src/socket-proxy/socket-proxyd.c',
2399 include_directories : includes,
aac26058 2400 link_with : [libshared],
005a29f2
ZJS
2401 dependencies : [threads],
2402 install_rpath : rootlibexecdir,
2403 install : true,
2404 install_dir : rootlibexecdir)
2405public_programs += [exe]
2406
2407exe = executable('systemd-udevd',
2408 systemd_udevd_sources,
2409 include_directories : includes,
5c72049f 2410 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
005a29f2 2411 link_with : [libudev_core,
005a29f2 2412 libsystemd_network,
0c06b506 2413 libudev_static],
3a30f21f
ZJS
2414 dependencies : [threads,
2415 libkmod,
005a29f2 2416 libidn,
aac26058
ZJS
2417 libacl,
2418 libblkid],
1aec3ed9 2419 install_rpath : udev_rpath,
005a29f2
ZJS
2420 install : true,
2421 install_dir : rootlibexecdir)
2422public_programs += [exe]
2423
2424exe = executable('udevadm',
2425 udevadm_sources,
6671e818 2426 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
005a29f2
ZJS
2427 include_directories : includes,
2428 link_with : [libudev_core,
005a29f2 2429 libsystemd_network,
0c06b506 2430 libudev_static],
3a30f21f
ZJS
2431 dependencies : [threads,
2432 libkmod,
005a29f2 2433 libidn,
aac26058
ZJS
2434 libacl,
2435 libblkid],
1aec3ed9 2436 install_rpath : udev_rpath,
005a29f2
ZJS
2437 install : true,
2438 install_dir : rootbindir)
2439public_programs += [exe]
5c23128d
ZJS
2440
2441executable('systemd-shutdown',
2442 systemd_shutdown_sources,
2443 include_directories : includes,
34ce0a52 2444 link_with : [libshared],
95b862b0 2445 dependencies : [libmount],
421f0012 2446 install_rpath : rootlibexecdir,
5c23128d
ZJS
2447 install : true,
2448 install_dir : rootlibexecdir)
2449
2450executable('systemd-update-done',
2451 'src/update-done/update-done.c',
2452 include_directories : includes,
2453 link_with : [libshared],
421f0012 2454 install_rpath : rootlibexecdir,
5c23128d
ZJS
2455 install : true,
2456 install_dir : rootlibexecdir)
2457
2458executable('systemd-update-utmp',
2459 'src/update-utmp/update-utmp.c',
2460 include_directories : includes,
aac26058 2461 link_with : [libshared],
5c23128d 2462 dependencies : [libaudit],
421f0012 2463 install_rpath : rootlibexecdir,
5c23128d
ZJS
2464 install : true,
2465 install_dir : rootlibexecdir)
2466
349cc4a5 2467if conf.get('HAVE_KMOD') == 1
37efbbd8
ZJS
2468 executable('systemd-modules-load',
2469 'src/modules-load/modules-load.c',
2470 include_directories : includes,
2471 link_with : [libshared],
2472 dependencies : [libkmod],
2473 install_rpath : rootlibexecdir,
2474 install : true,
2475 install_dir : rootlibexecdir)
94e75a54 2476
37efbbd8
ZJS
2477 meson.add_install_script('sh', '-c',
2478 mkdir_p.format(modulesloaddir))
2479 meson.add_install_script('sh', '-c',
2480 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
5c23128d
ZJS
2481endif
2482
005a29f2
ZJS
2483exe = executable('systemd-nspawn',
2484 systemd_nspawn_sources,
2485 'src/core/mount-setup.c', # FIXME: use a variable?
2486 'src/core/mount-setup.h',
2487 'src/core/loopback-setup.c',
2488 'src/core/loopback-setup.h',
97d90615
ZJS
2489 include_directories : includes,
2490 link_with : [libnspawn_core,
2491 libshared],
2492 dependencies : [libblkid],
005a29f2
ZJS
2493 install_rpath : rootlibexecdir,
2494 install : true)
2495public_programs += [exe]
5c23128d 2496
349cc4a5 2497if conf.get('ENABLE_NETWORKD') == 1
37efbbd8
ZJS
2498 executable('systemd-networkd',
2499 systemd_networkd_sources,
2500 include_directories : includes,
2501 link_with : [libnetworkd_core,
37efbbd8 2502 libsystemd_network,
0c06b506 2503 libudev_static,
37efbbd8 2504 libshared],
4b57a272 2505 dependencies : [threads],
37efbbd8
ZJS
2506 install_rpath : rootlibexecdir,
2507 install : true,
2508 install_dir : rootlibexecdir)
2509
2510 executable('systemd-networkd-wait-online',
2511 systemd_networkd_wait_online_sources,
2512 include_directories : includes,
2513 link_with : [libnetworkd_core,
2514 libshared],
2515 install_rpath : rootlibexecdir,
2516 install : true,
2517 install_dir : rootlibexecdir)
5c23128d 2518
dcfe072a
FS
2519 exe = executable('networkctl',
2520 networkctl_sources,
2521 include_directories : includes,
2522 link_with : [libsystemd_network,
aac26058 2523 libshared],
dcfe072a
FS
2524 install_rpath : rootlibexecdir,
2525 install : true,
2526 install_dir : rootbindir)
2527 public_programs += [exe]
2528endif
e821f6a9
ZJS
2529
2530executable('systemd-sulogin-shell',
2531 ['src/sulogin-shell/sulogin-shell.c'],
2532 include_directories : includes,
2533 link_with : [libshared],
2534 install_rpath : rootlibexecdir,
2535 install : true,
2536 install_dir : rootlibexecdir)
2537
69e96427
ZJS
2538############################################################
2539
2540foreach tuple : tests
37efbbd8
ZJS
2541 sources = tuple[0]
2542 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2543 dependencies = tuple[2]
2544 condition = tuple.length() >= 4 ? tuple[3] : ''
2545 type = tuple.length() >= 5 ? tuple[4] : ''
2546 defs = tuple.length() >= 6 ? tuple[5] : []
2547 incs = tuple.length() >= 7 ? tuple[6] : includes
2548 timeout = 30
2549
2550 name = sources[0].split('/')[-1].split('.')[0]
2551 if type.startswith('timeout=')
2552 timeout = type.split('=')[1].to_int()
2553 type = ''
2554 endif
08318a2c
AD
2555 if want_tests == 'false'
2556 message('Not compiling @0@ because tests is set to false'.format(name))
2557 elif condition == '' or conf.get(condition) == 1
37efbbd8
ZJS
2558 exe = executable(
2559 name,
2560 sources,
2561 include_directories : incs,
2562 link_with : link_with,
2563 dependencies : dependencies,
2564 c_args : defs,
2565 install_rpath : rootlibexecdir,
7cdd9783
MB
2566 install : install_tests,
2567 install_dir : join_paths(testsdir, type))
37efbbd8
ZJS
2568
2569 if type == 'manual'
2570 message('@0@ is a manual test'.format(name))
2571 elif type == 'unsafe' and want_tests != 'unsafe'
2572 message('@0@ is an unsafe test'.format(name))
2573 else
2574 test(name, exe,
2575 env : test_env,
2576 timeout : timeout)
2577 endif
2578 else
2579 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2580 endif
69e96427
ZJS
2581endforeach
2582
0632b4cd 2583exe = executable(
37efbbd8
ZJS
2584 'test-libsystemd-sym',
2585 test_libsystemd_sym_c,
2586 include_directories : includes,
2587 link_with : [libsystemd],
2588 install : install_tests,
2589 install_dir : testsdir)
0632b4cd 2590test('test-libsystemd-sym', exe)
37ab1a25 2591
0632b4cd
ZJS
2592exe = executable(
2593 'test-libsystemd-static-sym',
2594 test_libsystemd_sym_c,
2595 include_directories : includes,
0632b4cd
ZJS
2596 link_with : [install_libsystemd_static],
2597 dependencies : [threads], # threads is already included in dependencies on the library,
2598 # but does not seem to get propagated. Add here as a work-around.
20f3d32d
DC
2599 build_by_default : static_libsystemd_pic,
2600 install : install_tests and static_libsystemd_pic,
0632b4cd 2601 install_dir : testsdir)
20f3d32d 2602if static_libsystemd_pic
0632b4cd
ZJS
2603 test('test-libsystemd-static-sym', exe)
2604endif
37ab1a25 2605
0632b4cd 2606exe = executable(
37efbbd8
ZJS
2607 'test-libudev-sym',
2608 test_libudev_sym_c,
2609 include_directories : includes,
2610 c_args : ['-Wno-deprecated-declarations'],
2611 link_with : [libudev],
2612 install : install_tests,
2613 install_dir : testsdir)
0632b4cd
ZJS
2614test('test-libudev-sym', exe)
2615
2616exe = executable(
2617 'test-libudev-static-sym',
2618 test_libudev_sym_c,
2619 include_directories : includes,
20f3d32d 2620 c_args : ['-Wno-deprecated-declarations'],
0632b4cd 2621 link_with : [install_libudev_static],
20f3d32d
DC
2622 build_by_default : static_libudev_pic,
2623 install : install_tests and static_libudev_pic,
0632b4cd 2624 install_dir : testsdir)
20f3d32d 2625if static_libudev_pic
0632b4cd
ZJS
2626 test('test-libudev-static-sym', exe)
2627endif
e0bec52f 2628
69e96427 2629############################################################
5c23128d 2630
7db7d5b7
JR
2631fuzzer_exes = []
2632
2633foreach tuple : fuzzers
2634 sources = tuple[0]
2635 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2636 dependencies = tuple[2]
2637 defs = tuple.length() >= 4 ? tuple[3] : []
2638 incs = tuple.length() >= 5 ? tuple[4] : includes
2639
31e57a35 2640 if fuzzer_build
7db7d5b7
JR
2641 dependencies += fuzzing_engine
2642 else
2643 sources += 'src/fuzz/fuzz-main.c'
2644 endif
2645
2646 name = sources[0].split('/')[-1].split('.')[0]
2647
2648 fuzzer_exes += executable(
2649 name,
2650 sources,
2651 include_directories : [incs, include_directories('src/fuzz')],
2652 link_with : link_with,
2653 dependencies : dependencies,
2654 c_args : defs,
2655 install : false)
2656endforeach
2657
2658run_target('fuzzers',
2659 depends : fuzzer_exes,
2660 command : ['true'])
2661
2662############################################################
2663
5c23128d
ZJS
2664make_directive_index_py = find_program('tools/make-directive-index.py')
2665make_man_index_py = find_program('tools/make-man-index.py')
b184e8fe 2666xml_helper_py = find_program('tools/xml_helper.py')
abba22c5 2667hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
5c23128d
ZJS
2668
2669subdir('units')
2670subdir('sysctl.d')
2671subdir('sysusers.d')
2672subdir('tmpfiles.d')
e783f957 2673subdir('presets')
5c23128d
ZJS
2674subdir('hwdb')
2675subdir('network')
2676subdir('man')
2677subdir('shell-completion/bash')
2678subdir('shell-completion/zsh')
2d684e65
LP
2679subdir('doc/sysvinit')
2680subdir('doc/var-log')
5c23128d
ZJS
2681
2682# FIXME: figure out if the warning is true:
2683# https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2684install_subdir('factory/etc',
2685 install_dir : factorydir)
2686
2687
2688install_data('xorg/50-systemd-user.sh',
2689 install_dir : xinitrcdir)
582faeb4
DJL
2690install_data('modprobe.d/systemd.conf',
2691 install_dir : modprobedir)
f09eb768 2692install_data('LICENSE.GPL2',
5c23128d 2693 'LICENSE.LGPL2.1',
f09eb768
LP
2694 'NEWS',
2695 'README',
2696 'doc/CODING_STYLE',
2697 'doc/DISTRO_PORTING',
2698 'doc/ENVIRONMENT.md',
2699 'doc/HACKING',
2700 'doc/TRANSIENT-SETTINGS.md',
2701 'doc/TRANSLATORS',
2702 'doc/UIDS-GIDS.md',
5c23128d
ZJS
2703 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2704 install_dir : docdir)
d68b342b 2705
94e75a54
ZJS
2706meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2707meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2708
d68b342b
ZJS
2709############################################################
2710
005a29f2
ZJS
2711meson_check_help = find_program('tools/meson-check-help.sh')
2712
2713foreach exec : public_programs
37efbbd8
ZJS
2714 name = exec.full_path().split('/')[-1]
2715 test('check-help-' + name,
2716 meson_check_help,
2717 args : [exec.full_path()])
005a29f2
ZJS
2718endforeach
2719
2720############################################################
2721
52d4d1d3
ZJS
2722# Enable tests for all supported sanitizers
2723foreach tuple : sanitizers
2724 sanitizer = tuple[0]
2725 build = tuple[1]
b68dfb9e 2726
52d4d1d3
ZJS
2727 have = run_command(check_compilation_sh,
2728 cc.cmd_array(), '-x', 'c',
2729 '-fsanitize=@0@'.format(sanitizer),
2730 '-include', link_test_c).returncode() == 0
2731 message('@0@ sanitizer supported: @1@'.format(sanitizer, have ? 'yes' : 'no'))
b68dfb9e 2732
52d4d1d3
ZJS
2733 if have
2734 prev = ''
2735 foreach p : fuzz_regression_tests
2736 b = p.split('/')[-2]
2737 c = p.split('/')[-1]
2738
2739 name = '@0@:@1@'.format(b, sanitizer)
2740
2741 if name != prev
2742 if want_tests == 'false'
2743 message('Not compiling @0@ because tests is set to false'.format(name))
2744 elif slow_tests
2745 exe = custom_target(
2746 name,
2747 output : name,
2748 depends : build,
2749 command : [env, 'ln', '-fs',
2750 join_paths(build.full_path(), b),
2751 '@OUTPUT@'],
2752 build_by_default : true)
2753 else
2754 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2755 endif
2756 endif
2757 prev = name
2758
2759 if want_tests != 'false' and slow_tests
2760 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2761 env,
2762 args : [exe.full_path(),
2763 join_paths(meson.source_root(),
2764 'test/fuzz-regressions',
2765 p)])
2766 endif
2767 endforeach
b68dfb9e
ZJS
2768 endif
2769endforeach
2770
52d4d1d3 2771
b68dfb9e
ZJS
2772############################################################
2773
0700e8ba 2774if git.found()
37efbbd8
ZJS
2775 all_files = run_command(
2776 git,
450b60ba 2777 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
37efbbd8
ZJS
2778 'ls-files',
2779 ':/*.[ch]'])
2780 all_files = files(all_files.stdout().split())
d68b342b 2781
e85a690b 2782 custom_target(
0700e8ba 2783 'tags',
e85a690b 2784 output : 'tags',
25a82102 2785 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2f09974f 2786 run_target(
0700e8ba 2787 'ctags',
25a82102 2788 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
d68b342b 2789endif
177929c2
ZJS
2790
2791if git.found()
37efbbd8 2792 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
a923e085 2793 run_target(
37efbbd8 2794 'git-contrib',
37efbbd8 2795 command : [meson_git_contrib_sh])
177929c2 2796endif
dd6ab3df
ZJS
2797
2798if git.found()
2799 git_head = run_command(
2800 git,
450b60ba 2801 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
dd6ab3df
ZJS
2802 'rev-parse', 'HEAD']).stdout().strip()
2803 git_head_short = run_command(
2804 git,
450b60ba 2805 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
dd6ab3df
ZJS
2806 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2807
2808 run_target(
2809 'git-snapshot',
2810 command : ['git', 'archive',
450b60ba 2811 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
dd6ab3df
ZJS
2812 git_head_short),
2813 '--prefix', 'systemd-@0@/'.format(git_head),
2814 'HEAD'])
2815endif
829257d1
ZJS
2816
2817############################################################
2818
51b13863
LP
2819meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2820run_target(
2821 'check-api-docs',
2822 depends : [man, libsystemd, libudev],
2823 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2824
2825############################################################
2826
829257d1
ZJS
2827status = [
2828 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2829
2675413e 2830 'split /usr: @0@'.format(split_usr),
157baa87 2831 'split bin-sbin: @0@'.format(split_bin),
359b496f
YW
2832 'prefix directory: @0@'.format(prefixdir),
2833 'rootprefix directory: @0@'.format(rootprefixdir),
2834 'sysconf directory: @0@'.format(sysconfdir),
2835 'include directory: @0@'.format(includedir),
2836 'lib directory: @0@'.format(libdir),
2837 'rootlib directory: @0@'.format(rootlibdir),
829257d1
ZJS
2838 'SysV init scripts: @0@'.format(sysvinit_path),
2839 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
359b496f
YW
2840 'PAM modules directory: @0@'.format(pamlibdir),
2841 'PAM configuration directory: @0@'.format(pamconfdir),
2842 'RPM macros directory: @0@'.format(rpmmacrosdir),
2843 'modprobe.d directory: @0@'.format(modprobedir),
2844 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2845 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2846 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2847 'bash completions directory: @0@'.format(bashcompletiondir),
2848 'zsh completions directory: @0@'.format(zshcompletiondir),
829257d1
ZJS
2849 'extra start script: @0@'.format(get_option('rc-local')),
2850 'extra stop script: @0@'.format(get_option('halt-local')),
2851 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2852 get_option('debug-tty')),
2853 'TTY GID: @0@'.format(tty_gid),
84786b8e 2854 'users GID: @0@'.format(users_gid),
829257d1
ZJS
2855 'maximum system UID: @0@'.format(system_uid_max),
2856 'maximum system GID: @0@'.format(system_gid_max),
87d5e4f2
LP
2857 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2858 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2859 'minimum container UID base: @0@'.format(container_uid_base_min),
2860 'maximum container UID base: @0@'.format(container_uid_base_max),
829257d1 2861 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
4e15a734 2862 'render group access mode: @0@'.format(get_option('group-render-mode')),
359b496f 2863 'certificate root directory: @0@'.format(get_option('certificate-root')),
829257d1 2864 'support URL: @0@'.format(support_url),
afde4574
LP
2865 'nobody user name: @0@'.format(nobody_user),
2866 'nobody group name: @0@'.format(nobody_group),
829257d1 2867 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
5248e7e1 2868 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
829257d1
ZJS
2869
2870 'default DNSSEC mode: @0@'.format(default_dnssec),
c9299be2 2871 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
829257d1
ZJS
2872 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2873 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2874
2875alt_dns_servers = '\n '.join(dns_servers.split(' '))
2876alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2877status += [
2878 'default DNS servers: @0@'.format(alt_dns_servers),
2879 'default NTP servers: @0@'.format(alt_ntp_servers)]
2880
2881alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2882 '@@0@'.format(time_epoch)).stdout().strip()
2883status += [
2884 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2885
2886# TODO:
2887# CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2888# CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2889# LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2890
349cc4a5 2891if conf.get('ENABLE_EFI') == 1
829257d1
ZJS
2892 status += [
2893 'efi arch: @0@'.format(efi_arch)]
2894
2895 if have_gnu_efi
2896 status += [
2897 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2898 'EFI CC @0@'.format(efi_cc),
359b496f
YW
2899 'EFI lib directory: @0@'.format(efi_libdir),
2900 'EFI lds directory: @0@'.format(efi_ldsdir),
2901 'EFI include directory: @0@'.format(efi_incdir)]
829257d1
ZJS
2902 endif
2903endif
2904
2905found = []
2906missing = []
2907
2908foreach tuple : [
2909 ['libcryptsetup'],
2910 ['PAM'],
2911 ['AUDIT'],
2912 ['IMA'],
2913 ['AppArmor'],
2914 ['SELinux'],
2915 ['SECCOMP'],
2916 ['SMACK'],
2917 ['zlib'],
2918 ['xz'],
2919 ['lz4'],
2920 ['bzip2'],
2921 ['ACL'],
2922 ['gcrypt'],
2923 ['qrencode'],
2924 ['microhttpd'],
2925 ['gnutls'],
2926 ['libcurl'],
d1bf5675 2927 ['idn'],
87057e24 2928 ['libidn2'],
829257d1 2929 ['libidn'],
e7e11bbf 2930 ['nss-systemd'],
829257d1
ZJS
2931 ['libiptc'],
2932 ['elfutils'],
2933 ['binfmt'],
2934 ['vconsole'],
2935 ['quotacheck'],
2936 ['tmpfiles'],
2937 ['environment.d'],
2938 ['sysusers'],
2939 ['firstboot'],
2940 ['randomseed'],
2941 ['backlight'],
2942 ['rfkill'],
2943 ['logind'],
2944 ['machined'],
61d0578b 2945 ['portabled'],
829257d1
ZJS
2946 ['importd'],
2947 ['hostnamed'],
2948 ['timedated'],
2949 ['timesyncd'],
2950 ['localed'],
2951 ['networkd'],
a7456af5 2952 ['resolve'],
829257d1
ZJS
2953 ['coredump'],
2954 ['polkit'],
2955 ['legacy pkla', install_polkit_pkla],
2956 ['efi'],
2957 ['gnu-efi', have_gnu_efi],
2958 ['kmod'],
2959 ['xkbcommon'],
c4c978a0 2960 ['pcre2'],
829257d1
ZJS
2961 ['blkid'],
2962 ['dbus'],
2963 ['glib'],
08cf5b8d 2964 ['nss-myhostname', conf.get('ENABLE_MYHOSTNAME') == 1],
829257d1
ZJS
2965 ['hwdb'],
2966 ['tpm'],
2967 ['man pages', want_man],
2968 ['html pages', want_html],
2969 ['man page indices', want_man and have_lxml],
829257d1
ZJS
2970 ['SysV compat'],
2971 ['utmp'],
2972 ['ldconfig'],
2973 ['hibernate'],
2974 ['adm group', get_option('adm-group')],
2975 ['wheel group', get_option('wheel-group')],
b14e1b43 2976 ['gshadow'],
829257d1
ZJS
2977 ['debug hashmap'],
2978 ['debug mmap cache'],
d18cb393 2979 ['valgrind', conf.get('VALGRIND') == 1],
829257d1
ZJS
2980]
2981
af4d7860
ZJS
2982 if tuple.length() >= 2
2983 cond = tuple[1]
2984 else
829257d1
ZJS
2985 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
2986 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
349cc4a5 2987 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
829257d1
ZJS
2988 endif
2989 if cond
2990 found += [tuple[0]]
2991 else
2992 missing += [tuple[0]]
2993 endif
2994endforeach
2995
2996status += [
9d39c1bf 2997 '',
829257d1 2998 'enabled features: @0@'.format(', '.join(found)),
9d39c1bf
ZJS
2999 '',
3000 'disabled features: @0@'.format(', '.join(missing)),
3001 '']
829257d1 3002message('\n '.join(status))
9a8e64b0
ZJS
3003
3004if rootprefixdir != rootprefix_default
8ea9fad7
YW
3005 warning('\n' +
3006 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3007 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3008 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
9a8e64b0 3009endif