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