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