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