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