]> git.ipfire.org Git - thirdparty/systemd.git/blame - meson.build
busctl: add a --json= output mode
[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
c09edc79
ZJS
30want_ossfuzz = get_option('oss-fuzz')
31want_libfuzzer = get_option('llvm-fuzz')
32if want_ossfuzz and want_libfuzzer
33 error('only one of oss-fuzz and llvm-fuzz can be specified')
34endif
35fuzzer_build = want_ossfuzz or want_libfuzzer
36
5c23128d
ZJS
37#####################################################################
38
003c8879
ZJS
39# Try to install the git pre-commit hook
40git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
41if git_hook.returncode() == 0
42 message(git_hook.stdout().strip())
43endif
44
45#####################################################################
46
2675413e
ZJS
47if get_option('split-usr') == 'auto'
48 split_usr = run_command('test', '-L', '/bin').returncode() != 0
49else
50 split_usr = get_option('split-usr') == 'true'
51endif
671f0f8d
ZJS
52conf.set10('HAVE_SPLIT_USR', split_usr,
53 description : '/usr/bin and /bin directories are separate')
9a8e64b0 54
157baa87
ZJS
55if get_option('split-bin') == 'auto'
56 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
57else
58 split_bin = get_option('split-bin') == 'true'
59endif
671f0f8d
ZJS
60conf.set10('HAVE_SPLIT_BIN', split_bin,
61 description : 'bin and sbin directories are separate')
157baa87 62
74344a17 63rootprefixdir = get_option('rootprefix')
74344a17
ZJS
64# Unusual rootprefixdir values are used by some distros
65# (see https://github.com/systemd/systemd/pull/7461).
ba7f4ae6 66rootprefix_default = split_usr ? '/' : '/usr'
9a8e64b0
ZJS
67if rootprefixdir == ''
68 rootprefixdir = rootprefix_default
74344a17 69endif
5c23128d
ZJS
70
71sysvinit_path = get_option('sysvinit-path')
72sysvrcnd_path = get_option('sysvrcnd-path')
348b4437 73conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
349cc4a5 74 description : 'SysV init scripts and rcN.d links are supported')
5c23128d
ZJS
75
76# join_paths ignore the preceding arguments if an absolute component is
77# encountered, so this should canonicalize various paths when they are
78# absolute or relative.
79prefixdir = get_option('prefix')
80if not prefixdir.startswith('/')
37efbbd8 81 error('Prefix is not absolute: "@0@"'.format(prefixdir))
5c23128d
ZJS
82endif
83bindir = join_paths(prefixdir, get_option('bindir'))
84libdir = join_paths(prefixdir, get_option('libdir'))
85sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
86includedir = join_paths(prefixdir, get_option('includedir'))
87datadir = join_paths(prefixdir, get_option('datadir'))
88localstatedir = join_paths('/', get_option('localstatedir'))
89
90rootbindir = join_paths(rootprefixdir, 'bin')
157baa87 91rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
5c23128d
ZJS
92rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
93
94rootlibdir = get_option('rootlibdir')
95if rootlibdir == ''
37efbbd8 96 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
5c23128d
ZJS
97endif
98
99# Dirs of external packages
a95696e3
BM
100pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
101pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
e17e5ba9
MB
102polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
103polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
104polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
105varlogdir = join_paths(localstatedir, 'log')
106xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
8a38aac3
YW
107rpmmacrosdir = get_option('rpmmacrosdir')
108if rpmmacrosdir != 'no'
109 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
110endif
02fa054d 111modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
5c23128d
ZJS
112
113# Our own paths
e17e5ba9
MB
114pkgdatadir = join_paths(datadir, 'systemd')
115environmentdir = join_paths(prefixdir, 'lib/environment.d')
116pkgsysconfdir = join_paths(sysconfdir, 'systemd')
117userunitdir = join_paths(prefixdir, 'lib/systemd/user')
118userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
119tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
120sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
121sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
122binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
123modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
124networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
125pkgincludedir = join_paths(includedir, 'systemd')
126systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
127usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
128systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
129userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
130systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
131systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
132systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
133systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
134udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
135udevhomedir = udevlibexecdir
136udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
137udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
138catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
139kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
140factorydir = join_paths(datadir, 'factory')
e17e5ba9
MB
141bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
142testsdir = join_paths(prefixdir, 'lib/systemd/tests')
143systemdstatedir = join_paths(localstatedir, 'lib/systemd')
144catalogstatedir = join_paths(systemdstatedir, 'catalog')
145randomseeddir = join_paths(localstatedir, 'lib/systemd')
61d0578b 146profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
5c23128d 147
75aaade1
TB
148docdir = get_option('docdir')
149if docdir == ''
150 docdir = join_paths(datadir, 'doc/systemd')
151endif
152
5c23128d
ZJS
153dbuspolicydir = get_option('dbuspolicydir')
154if dbuspolicydir == ''
37efbbd8 155 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
5c23128d
ZJS
156endif
157
158dbussessionservicedir = get_option('dbussessionservicedir')
159if dbussessionservicedir == ''
37efbbd8 160 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
5c23128d
ZJS
161endif
162
163dbussystemservicedir = get_option('dbussystemservicedir')
164if dbussystemservicedir == ''
37efbbd8 165 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
5c23128d
ZJS
166endif
167
168pamlibdir = get_option('pamlibdir')
169if pamlibdir == ''
37efbbd8 170 pamlibdir = join_paths(rootlibdir, 'security')
5c23128d
ZJS
171endif
172
173pamconfdir = get_option('pamconfdir')
174if pamconfdir == ''
37efbbd8 175 pamconfdir = join_paths(sysconfdir, 'pam.d')
5c23128d
ZJS
176endif
177
444d5863
ZJS
178memory_accounting_default = get_option('memory-accounting-default')
179
5c23128d 180conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
e17e5ba9 181conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
5c23128d
ZJS
182conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
183conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
184conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
2a4c156d
ZJS
185conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
186conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
96164a39 187
f7c5427c 188conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
96164a39 189
e17e5ba9 190conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
5c23128d
ZJS
191conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
192conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
e17e5ba9
MB
193conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
194conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
195conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
196conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
da495a03 197conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
7f2806d5 198conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
e17e5ba9
MB
199conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
200conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
201conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
202conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
203conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
74344a17 204conf.set_quoted('ROOTPREFIX', rootprefixdir)
3131bfe3 205conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
e17e5ba9
MB
206conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
207conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
5c23128d
ZJS
208conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
209conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
210conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
211conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
212conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
213conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
e17e5ba9
MB
214conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
215conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
e2d41370 216conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
49cdae63 217conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
5c23128d 218conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
e17e5ba9 219conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
5c23128d
ZJS
220conf.set_quoted('LIBDIR', libdir)
221conf.set_quoted('ROOTLIBDIR', rootlibdir)
222conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
223conf.set_quoted('BOOTLIBDIR', bootlibdir)
e17e5ba9
MB
224conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
225conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
226conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
227conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
228conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
229conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
444d5863 230conf.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'true' : 'false')
7f672e86 231conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
5c23128d 232
5c23128d 233substs.set('prefix', prefixdir)
3131bfe3
ZJS
234substs.set('exec_prefix', prefixdir)
235substs.set('libdir', libdir)
236substs.set('rootlibdir', rootlibdir)
237substs.set('includedir', includedir)
5c23128d 238substs.set('pkgsysconfdir', pkgsysconfdir)
3131bfe3
ZJS
239substs.set('bindir', bindir)
240substs.set('rootbindir', rootbindir)
5c23128d
ZJS
241substs.set('rootlibexecdir', rootlibexecdir)
242substs.set('systemunitdir', systemunitdir)
243substs.set('userunitdir', userunitdir)
244substs.set('systempresetdir', systempresetdir)
245substs.set('userpresetdir', userpresetdir)
246substs.set('udevhwdbdir', udevhwdbdir)
247substs.set('udevrulesdir', udevrulesdir)
3131bfe3 248substs.set('udevlibexecdir', udevlibexecdir)
424e80b4 249substs.set('environmentdir', environmentdir)
5c23128d
ZJS
250substs.set('catalogdir', catalogdir)
251substs.set('tmpfilesdir', tmpfilesdir)
252substs.set('sysusersdir', sysusersdir)
253substs.set('sysctldir', sysctldir)
254substs.set('binfmtdir', binfmtdir)
255substs.set('modulesloaddir', modulesloaddir)
424e80b4 256substs.set('modprobedir', modprobedir)
5c23128d
ZJS
257substs.set('systemgeneratordir', systemgeneratordir)
258substs.set('usergeneratordir', usergeneratordir)
259substs.set('systemenvgeneratordir', systemenvgeneratordir)
260substs.set('userenvgeneratordir', userenvgeneratordir)
261substs.set('systemshutdowndir', systemshutdowndir)
262substs.set('systemsleepdir', systemsleepdir)
2a4c156d
ZJS
263substs.set('VARLOGDIR', varlogdir)
264substs.set('CERTIFICATEROOT', get_option('certificate-root'))
e17e5ba9
MB
265substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
266substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
2a4c156d
ZJS
267substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
268substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
269substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
270substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
444d5863 271substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
5c23128d
ZJS
272
273#####################################################################
274
275cc = meson.get_compiler('c')
276pkgconfig = import('pkgconfig')
6e2afb1c 277check_compilation_sh = find_program('tools/meson-check-compilation.sh')
b68dfb9e 278meson_build_sh = find_program('tools/meson-build.sh')
5c23128d 279
d3da291e
ZJS
280want_tests = get_option('tests')
281slow_tests = want_tests != 'false' and get_option('slow-tests')
282install_tests = get_option('install-tests')
283
c09edc79 284cxx = find_program('c++', required : fuzzer_build)
3b2bdd62
ZJS
285if cxx.found()
286 # Used only for tests
287 add_languages('cpp')
9b0ca019 288 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
1b2acaa7 289else
9b0ca019 290 cxx_cmd = ''
94e2523b
ZJS
291endif
292
31e57a35
JR
293if want_libfuzzer
294 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
c09edc79 295elif 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',
a5d8835c 1386 disable_mempool_c,
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,
a5d8835c 1468 disable_mempool_c,
37efbbd8
ZJS
1469 include_directories : includes,
1470 link_with : [libbasic],
fd1939fb
YW
1471 dependencies : [libdl],
1472 build_by_default : want_tests != 'false')
83b6af36 1473
08540a95 1474foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
e7e11bbf 1475 ['systemd', 'ENABLE_NSS_SYSTEMD'],
08540a95
YW
1476 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1477 ['resolve', 'ENABLE_NSS_RESOLVE']]
5c23128d 1478
349cc4a5 1479 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
37efbbd8
ZJS
1480 if condition
1481 module = tuple[0]
37efbbd8
ZJS
1482
1483 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
243e5cec 1484 version_script_arg = join_paths(meson.source_root(), sym)
37efbbd8
ZJS
1485
1486 nss = shared_library(
1487 'nss_' + module,
1488 'src/nss-@0@/nss-@0@.c'.format(module),
a5d8835c 1489 disable_mempool_c,
37efbbd8
ZJS
1490 version : '2',
1491 include_directories : includes,
b4b36f44
LP
1492 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1493 link_args : ['-Wl,-z,nodelete',
1494 '-shared',
37efbbd8
ZJS
1495 '-Wl,--version-script=' + version_script_arg,
1496 '-Wl,--undefined'],
37e4d7a8 1497 link_with : [libsystemd_static,
37efbbd8
ZJS
1498 libbasic],
1499 dependencies : [threads,
5486a31d 1500 librt],
37efbbd8
ZJS
1501 link_depends : sym,
1502 install : true,
1503 install_dir : rootlibdir)
1504
1505 # We cannot use shared_module because it does not support version suffix.
1506 # Unfortunately shared_library insists on creating the symlink…
1507 meson.add_install_script('sh', '-c',
1508 'rm $DESTDIR@0@/libnss_@1@.so'
1509 .format(rootlibdir, module))
1510
938be089
ZJS
1511 if want_tests != 'false'
1512 test('dlopen-nss_' + module,
1513 test_dlopen,
1514 # path to dlopen must include a slash
1515 args : nss.full_path())
1516 endif
37efbbd8 1517 endif
5c23128d
ZJS
1518endforeach
1519
1520############################################################
1521
5c23128d
ZJS
1522executable('systemd',
1523 systemd_sources,
1524 include_directories : includes,
1525 link_with : [libcore,
34ce0a52 1526 libshared],
5c23128d
ZJS
1527 dependencies : [threads,
1528 librt,
1529 libseccomp,
1530 libselinux,
f4ee10a2
ZJS
1531 libmount,
1532 libblkid],
421f0012 1533 install_rpath : rootlibexecdir,
5c23128d
ZJS
1534 install : true,
1535 install_dir : rootlibexecdir)
1536
ba7f4ae6
ZJS
1537meson.add_install_script(meson_make_symlink,
1538 join_paths(rootlibexecdir, 'systemd'),
1539 join_paths(rootsbindir, 'init'))
1540
005a29f2
ZJS
1541exe = executable('systemd-analyze',
1542 systemd_analyze_sources,
1543 include_directories : includes,
1544 link_with : [libcore,
005a29f2
ZJS
1545 libshared],
1546 dependencies : [threads,
1547 librt,
1548 libseccomp,
1549 libselinux,
1550 libmount,
1551 libblkid],
1552 install_rpath : rootlibexecdir,
1553 install : true)
5a8b1640 1554public_programs += exe
5c23128d
ZJS
1555
1556executable('systemd-journald',
1557 systemd_journald_sources,
1558 include_directories : includes,
aac26058 1559 link_with : [libjournal_core,
34ce0a52 1560 libshared],
5c23128d
ZJS
1561 dependencies : [threads,
1562 libxz,
aac26058
ZJS
1563 liblz4,
1564 libselinux],
421f0012 1565 install_rpath : rootlibexecdir,
5c23128d
ZJS
1566 install : true,
1567 install_dir : rootlibexecdir)
1568
005a29f2
ZJS
1569exe = executable('systemd-cat',
1570 systemd_cat_sources,
1571 include_directories : includes,
1572 link_with : [libjournal_core,
34ce0a52 1573 libshared],
005a29f2
ZJS
1574 dependencies : [threads],
1575 install_rpath : rootlibexecdir,
1576 install : true)
5a8b1640 1577public_programs += exe
005a29f2
ZJS
1578
1579exe = executable('journalctl',
1580 journalctl_sources,
1581 include_directories : includes,
34ce0a52 1582 link_with : [libshared],
005a29f2
ZJS
1583 dependencies : [threads,
1584 libqrencode,
1585 libxz,
6becf48c
ZJS
1586 liblz4,
1587 libpcre2],
005a29f2
ZJS
1588 install_rpath : rootlibexecdir,
1589 install : true,
1590 install_dir : rootbindir)
5a8b1640 1591public_programs += exe
5c23128d
ZJS
1592
1593executable('systemd-getty-generator',
1594 'src/getty-generator/getty-generator.c',
5c23128d 1595 include_directories : includes,
b2fc5836
ZJS
1596 link_with : [libshared],
1597 install_rpath : rootlibexecdir,
1598 install : true,
1599 install_dir : systemgeneratordir)
5c23128d
ZJS
1600
1601executable('systemd-debug-generator',
1602 'src/debug-generator/debug-generator.c',
5c23128d 1603 include_directories : includes,
b2fc5836
ZJS
1604 link_with : [libshared],
1605 install_rpath : rootlibexecdir,
1606 install : true,
1607 install_dir : systemgeneratordir)
5c23128d
ZJS
1608
1609executable('systemd-fstab-generator',
1610 'src/fstab-generator/fstab-generator.c',
1611 'src/core/mount-setup.c',
5c23128d 1612 include_directories : includes,
b2fc5836
ZJS
1613 link_with : [libshared],
1614 install_rpath : rootlibexecdir,
1615 install : true,
1616 install_dir : systemgeneratordir)
5c23128d 1617
349cc4a5 1618if conf.get('ENABLE_ENVIRONMENT_D') == 1
37efbbd8
ZJS
1619 executable('30-systemd-environment-d-generator',
1620 'src/environment-d-generator/environment-d-generator.c',
1621 include_directories : includes,
1622 link_with : [libshared],
1623 install_rpath : rootlibexecdir,
1624 install : true,
1625 install_dir : userenvgeneratordir)
7b76fce1 1626
37efbbd8
ZJS
1627 meson.add_install_script(meson_make_symlink,
1628 join_paths(sysconfdir, 'environment'),
1629 join_paths(environmentdir, '99-environment.conf'))
5c23128d
ZJS
1630endif
1631
349cc4a5 1632if conf.get('ENABLE_HIBERNATE') == 1
37efbbd8
ZJS
1633 executable('systemd-hibernate-resume-generator',
1634 'src/hibernate-resume/hibernate-resume-generator.c',
1635 include_directories : includes,
1636 link_with : [libshared],
1637 install_rpath : rootlibexecdir,
1638 install : true,
1639 install_dir : systemgeneratordir)
5c23128d 1640
37efbbd8
ZJS
1641 executable('systemd-hibernate-resume',
1642 'src/hibernate-resume/hibernate-resume.c',
005a29f2
ZJS
1643 include_directories : includes,
1644 link_with : [libshared],
1645 install_rpath : rootlibexecdir,
1646 install : true,
1647 install_dir : rootlibexecdir)
37efbbd8
ZJS
1648endif
1649
349cc4a5 1650if conf.get('HAVE_BLKID') == 1
37efbbd8
ZJS
1651 executable('systemd-gpt-auto-generator',
1652 'src/gpt-auto-generator/gpt-auto-generator.c',
1653 'src/basic/blkid-util.h',
1654 include_directories : includes,
34ce0a52 1655 link_with : [libshared],
37efbbd8
ZJS
1656 dependencies : libblkid,
1657 install_rpath : rootlibexecdir,
1658 install : true,
1659 install_dir : systemgeneratordir)
1660
1661 exe = executable('systemd-dissect',
1662 'src/dissect/dissect.c',
1663 include_directories : includes,
1664 link_with : [libshared],
1665 install_rpath : rootlibexecdir,
1666 install : true,
1667 install_dir : rootlibexecdir)
5a8b1640 1668 public_programs += exe
5c23128d
ZJS
1669endif
1670
1ec57f33 1671if conf.get('ENABLE_RESOLVE') == 1
37efbbd8
ZJS
1672 executable('systemd-resolved',
1673 systemd_resolved_sources,
005a29f2 1674 include_directories : includes,
34e221a5 1675 link_with : [libshared,
568a4ff8
ZJS
1676 libbasic_gcrypt,
1677 libsystemd_resolve_core],
56ddbf10 1678 dependencies : systemd_resolved_dependencies,
005a29f2 1679 install_rpath : rootlibexecdir,
37efbbd8
ZJS
1680 install : true,
1681 install_dir : rootlibexecdir)
1682
c2e84cab
YW
1683 exe = executable('resolvectl',
1684 resolvectl_sources,
37efbbd8 1685 include_directories : includes,
34e221a5 1686 link_with : [libshared,
568a4ff8
ZJS
1687 libbasic_gcrypt,
1688 libsystemd_resolve_core],
37efbbd8 1689 dependencies : [threads,
76c87410 1690 libgpg_error,
37efbbd8
ZJS
1691 libm,
1692 libidn],
1693 install_rpath : rootlibexecdir,
1694 install : true)
5a8b1640 1695 public_programs += exe
088c1363
LP
1696
1697 meson.add_install_script(meson_make_symlink,
c2e84cab 1698 join_paths(bindir, 'resolvectl'),
088c1363 1699 join_paths(rootsbindir, 'resolvconf'))
c2e84cab
YW
1700
1701 meson.add_install_script(meson_make_symlink,
1702 join_paths(bindir, 'resolvectl'),
1703 join_paths(bindir, 'systemd-resolve'))
5c23128d
ZJS
1704endif
1705
349cc4a5 1706if conf.get('ENABLE_LOGIND') == 1
37efbbd8
ZJS
1707 executable('systemd-logind',
1708 systemd_logind_sources,
005a29f2 1709 include_directories : includes,
37efbbd8 1710 link_with : [liblogind_core,
34ce0a52 1711 libshared],
005a29f2 1712 dependencies : [threads,
37efbbd8 1713 libacl],
005a29f2
ZJS
1714 install_rpath : rootlibexecdir,
1715 install : true,
37efbbd8
ZJS
1716 install_dir : rootlibexecdir)
1717
1718 exe = executable('loginctl',
1719 loginctl_sources,
1720 include_directories : includes,
34ce0a52 1721 link_with : [libshared],
37efbbd8
ZJS
1722 dependencies : [threads,
1723 liblz4,
1724 libxz],
1725 install_rpath : rootlibexecdir,
1726 install : true,
1727 install_dir : rootbindir)
5a8b1640 1728 public_programs += exe
37efbbd8
ZJS
1729
1730 exe = executable('systemd-inhibit',
1731 'src/login/inhibit.c',
1732 include_directories : includes,
1733 link_with : [libshared],
1734 install_rpath : rootlibexecdir,
1735 install : true,
1736 install_dir : rootbindir)
5a8b1640 1737 public_programs += exe
37efbbd8 1738
349cc4a5 1739 if conf.get('HAVE_PAM') == 1
243e5cec 1740 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
37efbbd8
ZJS
1741 pam_systemd = shared_library(
1742 'pam_systemd',
1743 pam_systemd_c,
1744 name_prefix : '',
1745 include_directories : includes,
1746 link_args : ['-shared',
1747 '-Wl,--version-script=' + version_script_arg],
37e4d7a8 1748 link_with : [libsystemd_static,
37efbbd8
ZJS
1749 libshared_static],
1750 dependencies : [threads,
1751 libpam,
1752 libpam_misc],
1753 link_depends : pam_systemd_sym,
1754 install : true,
1755 install_dir : pamlibdir)
1756
938be089
ZJS
1757 if want_tests != 'false'
1758 test('dlopen-pam_systemd',
1759 test_dlopen,
1760 # path to dlopen must include a slash
c1cd6743 1761 args : pam_systemd.full_path())
938be089 1762 endif
37efbbd8
ZJS
1763 endif
1764endif
005a29f2 1765
a9f0f5e5
ZJS
1766executable('systemd-user-runtime-dir',
1767 user_runtime_dir_sources,
1768 include_directories : includes,
1769 link_with : [libshared, liblogind_core],
1770 install_rpath : rootlibexecdir,
1771 install : true,
1772 install_dir : rootlibexecdir)
1773
349cc4a5 1774if conf.get('HAVE_PAM') == 1
37efbbd8
ZJS
1775 executable('systemd-user-sessions',
1776 'src/user-sessions/user-sessions.c',
005a29f2 1777 include_directories : includes,
aac26058 1778 link_with : [libshared],
005a29f2
ZJS
1779 install_rpath : rootlibexecdir,
1780 install : true,
37efbbd8 1781 install_dir : rootlibexecdir)
5c23128d
ZJS
1782endif
1783
349cc4a5 1784if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
37efbbd8
ZJS
1785 exe = executable('bootctl',
1786 'src/boot/bootctl.c',
1787 include_directories : includes,
1788 link_with : [libshared],
1789 dependencies : [libblkid],
1790 install_rpath : rootlibexecdir,
1791 install : true)
5a8b1640 1792 public_programs += exe
005a29f2
ZJS
1793endif
1794
1795exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1796 include_directories : includes,
1797 link_with : [libshared],
1798 dependencies : [threads],
1799 install_rpath : rootlibexecdir,
1800 install : true)
5a8b1640 1801public_programs += exe
005a29f2 1802
f3794366
FS
1803
1804if get_option('link-systemctl-shared')
1805 systemctl_link_with = [libshared]
1806else
1807 systemctl_link_with = [libsystemd_static,
1808 libshared_static,
1809 libjournal_client,
1810 libbasic_gcrypt]
1811endif
1812
005a29f2
ZJS
1813exe = executable('systemctl', 'src/systemctl/systemctl.c',
1814 include_directories : includes,
f3794366 1815 link_with : systemctl_link_with,
005a29f2
ZJS
1816 dependencies : [threads,
1817 libcap,
1818 libselinux,
1819 libxz,
1820 liblz4],
1821 install_rpath : rootlibexecdir,
1822 install : true,
1823 install_dir : rootbindir)
5a8b1640 1824public_programs += exe
5c23128d 1825
61d0578b
LP
1826if conf.get('ENABLE_PORTABLED') == 1
1827 executable('systemd-portabled',
1828 systemd_portabled_sources,
1829 include_directories : includes,
1830 link_with : [libshared],
1831 dependencies : [threads],
1832 install_rpath : rootlibexecdir,
1833 install : true,
1834 install_dir : rootlibexecdir)
1835
1836 exe = executable('portablectl', 'src/portable/portablectl.c',
1837 include_directories : includes,
1838 link_with : [libshared],
1839 dependencies : [threads],
1840 install_rpath : rootlibexecdir,
1841 install : true,
80f39b81 1842 install_dir : rootbindir)
5a8b1640 1843 public_programs += exe
61d0578b
LP
1844endif
1845
ba7f4ae6
ZJS
1846foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1847 meson.add_install_script(meson_make_symlink,
1848 join_paths(rootbindir, 'systemctl'),
1849 join_paths(rootsbindir, alias))
1850endforeach
1851
349cc4a5 1852if conf.get('ENABLE_BACKLIGHT') == 1
37efbbd8
ZJS
1853 executable('systemd-backlight',
1854 'src/backlight/backlight.c',
1855 include_directories : includes,
34ce0a52 1856 link_with : [libshared],
37efbbd8
ZJS
1857 install_rpath : rootlibexecdir,
1858 install : true,
1859 install_dir : rootlibexecdir)
5c23128d
ZJS
1860endif
1861
349cc4a5 1862if conf.get('ENABLE_RFKILL') == 1
37efbbd8
ZJS
1863 executable('systemd-rfkill',
1864 'src/rfkill/rfkill.c',
1865 include_directories : includes,
34ce0a52 1866 link_with : [libshared],
37efbbd8
ZJS
1867 install_rpath : rootlibexecdir,
1868 install : true,
1869 install_dir : rootlibexecdir)
5c23128d
ZJS
1870endif
1871
1872executable('systemd-system-update-generator',
1873 'src/system-update-generator/system-update-generator.c',
1874 include_directories : includes,
1875 link_with : [libshared],
b2fc5836 1876 install_rpath : rootlibexecdir,
5c23128d
ZJS
1877 install : true,
1878 install_dir : systemgeneratordir)
1879
349cc4a5 1880if conf.get('HAVE_LIBCRYPTSETUP') == 1
37efbbd8
ZJS
1881 executable('systemd-cryptsetup',
1882 'src/cryptsetup/cryptsetup.c',
1883 include_directories : includes,
1884 link_with : [libshared],
1885 dependencies : [libcryptsetup],
1886 install_rpath : rootlibexecdir,
1887 install : true,
1888 install_dir : rootlibexecdir)
1889
1890 executable('systemd-cryptsetup-generator',
1891 'src/cryptsetup/cryptsetup-generator.c',
1892 include_directories : includes,
1893 link_with : [libshared],
1894 dependencies : [libcryptsetup],
1895 install_rpath : rootlibexecdir,
1896 install : true,
1897 install_dir : systemgeneratordir)
1898
1899 executable('systemd-veritysetup',
1900 'src/veritysetup/veritysetup.c',
1901 include_directories : includes,
1902 link_with : [libshared],
1903 dependencies : [libcryptsetup],
1904 install_rpath : rootlibexecdir,
1905 install : true,
1906 install_dir : rootlibexecdir)
1907
1908 executable('systemd-veritysetup-generator',
1909 'src/veritysetup/veritysetup-generator.c',
1910 include_directories : includes,
1911 link_with : [libshared],
1912 dependencies : [libcryptsetup],
1913 install_rpath : rootlibexecdir,
1914 install : true,
1915 install_dir : systemgeneratordir)
5c23128d
ZJS
1916endif
1917
349cc4a5 1918if conf.get('HAVE_SYSV_COMPAT') == 1
37efbbd8
ZJS
1919 executable('systemd-sysv-generator',
1920 'src/sysv-generator/sysv-generator.c',
1921 include_directories : includes,
1922 link_with : [libshared],
1923 install_rpath : rootlibexecdir,
1924 install : true,
1925 install_dir : systemgeneratordir)
1926
1927 executable('systemd-rc-local-generator',
1928 'src/rc-local-generator/rc-local-generator.c',
1929 include_directories : includes,
1930 link_with : [libshared],
1931 install_rpath : rootlibexecdir,
1932 install : true,
1933 install_dir : systemgeneratordir)
5c23128d
ZJS
1934endif
1935
349cc4a5 1936if conf.get('ENABLE_HOSTNAMED') == 1
37efbbd8
ZJS
1937 executable('systemd-hostnamed',
1938 'src/hostname/hostnamed.c',
005a29f2 1939 include_directories : includes,
aac26058 1940 link_with : [libshared],
005a29f2 1941 install_rpath : rootlibexecdir,
37efbbd8
ZJS
1942 install : true,
1943 install_dir : rootlibexecdir)
1944
1945 exe = executable('hostnamectl',
1946 'src/hostname/hostnamectl.c',
1947 include_directories : includes,
1948 link_with : [libshared],
1949 install_rpath : rootlibexecdir,
1950 install : true)
5a8b1640 1951 public_programs += exe
5c23128d
ZJS
1952endif
1953
349cc4a5
ZJS
1954if conf.get('ENABLE_LOCALED') == 1
1955 if conf.get('HAVE_XKBCOMMON') == 1
37efbbd8
ZJS
1956 # logind will load libxkbcommon.so dynamically on its own
1957 deps = [libdl]
1958 else
1959 deps = []
1960 endif
1961
1962 executable('systemd-localed',
1963 systemd_localed_sources,
005a29f2 1964 include_directories : includes,
aac26058 1965 link_with : [libshared],
37efbbd8 1966 dependencies : deps,
005a29f2 1967 install_rpath : rootlibexecdir,
37efbbd8
ZJS
1968 install : true,
1969 install_dir : rootlibexecdir)
1970
1971 exe = executable('localectl',
1972 localectl_sources,
1973 include_directories : includes,
1974 link_with : [libshared],
1975 install_rpath : rootlibexecdir,
1976 install : true)
5a8b1640 1977 public_programs += exe
5c23128d
ZJS
1978endif
1979
349cc4a5 1980if conf.get('ENABLE_TIMEDATED') == 1
37efbbd8
ZJS
1981 executable('systemd-timedated',
1982 'src/timedate/timedated.c',
005a29f2 1983 include_directories : includes,
aac26058 1984 link_with : [libshared],
37efbbd8
ZJS
1985 install_rpath : rootlibexecdir,
1986 install : true,
1987 install_dir : rootlibexecdir)
6129ec85 1988endif
5c23128d 1989
6129ec85 1990if conf.get('ENABLE_TIMEDATECTL') == 1
37efbbd8
ZJS
1991 exe = executable('timedatectl',
1992 'src/timedate/timedatectl.c',
1993 include_directories : includes,
1994 install_rpath : rootlibexecdir,
1995 link_with : [libshared],
6129ec85 1996 dependencies : [libm],
37efbbd8 1997 install : true)
5a8b1640 1998 public_programs += exe
5c23128d
ZJS
1999endif
2000
349cc4a5 2001if conf.get('ENABLE_TIMESYNCD') == 1
37efbbd8
ZJS
2002 executable('systemd-timesyncd',
2003 systemd_timesyncd_sources,
005a29f2 2004 include_directories : includes,
aac26058 2005 link_with : [libshared],
005a29f2 2006 dependencies : [threads,
37efbbd8 2007 libm],
005a29f2
ZJS
2008 install_rpath : rootlibexecdir,
2009 install : true,
37efbbd8 2010 install_dir : rootlibexecdir)
5c3376ef
PB
2011
2012 executable('systemd-time-wait-sync',
2013 'src/time-wait-sync/time-wait-sync.c',
2014 include_directories : includes,
2015 link_with : [libshared],
2016 install_rpath : rootlibexecdir,
2017 install : true,
2018 install_dir : rootlibexecdir)
5c23128d
ZJS
2019endif
2020
349cc4a5 2021if conf.get('ENABLE_MACHINED') == 1
37efbbd8
ZJS
2022 executable('systemd-machined',
2023 systemd_machined_sources,
2024 include_directories : includes,
2025 link_with : [libmachine_core,
2026 libshared],
2027 install_rpath : rootlibexecdir,
2028 install : true,
2029 install_dir : rootlibexecdir)
2030
2031 exe = executable('machinectl',
2032 'src/machine/machinectl.c',
2033 include_directories : includes,
2034 link_with : [libshared],
2035 dependencies : [threads,
2036 libxz,
2037 liblz4],
2038 install_rpath : rootlibexecdir,
2039 install : true,
2040 install_dir : rootbindir)
5a8b1640 2041 public_programs += exe
5c23128d
ZJS
2042endif
2043
349cc4a5 2044if conf.get('ENABLE_IMPORTD') == 1
37efbbd8
ZJS
2045 executable('systemd-importd',
2046 systemd_importd_sources,
005a29f2 2047 include_directories : includes,
aac26058 2048 link_with : [libshared],
37efbbd8 2049 dependencies : [threads],
005a29f2
ZJS
2050 install_rpath : rootlibexecdir,
2051 install : true,
2052 install_dir : rootlibexecdir)
37efbbd8
ZJS
2053
2054 systemd_pull = executable('systemd-pull',
2055 systemd_pull_sources,
2056 include_directories : includes,
2057 link_with : [libshared],
2058 dependencies : [libcurl,
2059 libz,
2060 libbzip2,
2061 libxz,
2062 libgcrypt],
2063 install_rpath : rootlibexecdir,
2064 install : true,
2065 install_dir : rootlibexecdir)
2066
2067 systemd_import = executable('systemd-import',
2068 systemd_import_sources,
2069 include_directories : includes,
2070 link_with : [libshared],
2071 dependencies : [libcurl,
2072 libz,
2073 libbzip2,
2074 libxz],
2075 install_rpath : rootlibexecdir,
2076 install : true,
2077 install_dir : rootlibexecdir)
2078
2079 systemd_export = executable('systemd-export',
2080 systemd_export_sources,
2081 include_directories : includes,
2082 link_with : [libshared],
2083 dependencies : [libcurl,
2084 libz,
2085 libbzip2,
2086 libxz],
2087 install_rpath : rootlibexecdir,
2088 install : true,
2089 install_dir : rootlibexecdir)
2090 public_programs += [systemd_pull, systemd_import, systemd_export]
2091endif
2092
349cc4a5 2093if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
37efbbd8
ZJS
2094 exe = executable('systemd-journal-upload',
2095 systemd_journal_upload_sources,
2096 include_directories : includes,
2097 link_with : [libshared],
2098 dependencies : [threads,
2099 libcurl,
2100 libgnutls,
2101 libxz,
2102 liblz4],
2103 install_rpath : rootlibexecdir,
2104 install : true,
2105 install_dir : rootlibexecdir)
5a8b1640 2106 public_programs += exe
5c23128d
ZJS
2107endif
2108
349cc4a5 2109if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
37efbbd8
ZJS
2110 s_j_remote = executable('systemd-journal-remote',
2111 systemd_journal_remote_sources,
2112 include_directories : includes,
c064d8db
ZJS
2113 link_with : [libshared,
2114 libsystemd_journal_remote],
37efbbd8
ZJS
2115 dependencies : [threads,
2116 libmicrohttpd,
2117 libgnutls,
2118 libxz,
2119 liblz4],
2120 install_rpath : rootlibexecdir,
2121 install : true,
2122 install_dir : rootlibexecdir)
2123
2124 s_j_gatewayd = executable('systemd-journal-gatewayd',
2125 systemd_journal_gatewayd_sources,
2126 include_directories : includes,
2127 link_with : [libshared],
2128 dependencies : [threads,
2129 libmicrohttpd,
2130 libgnutls,
2131 libxz,
2132 liblz4],
2133 install_rpath : rootlibexecdir,
2134 install : true,
2135 install_dir : rootlibexecdir)
2136 public_programs += [s_j_remote, s_j_gatewayd]
5c23128d
ZJS
2137endif
2138
349cc4a5 2139if conf.get('ENABLE_COREDUMP') == 1
37efbbd8
ZJS
2140 executable('systemd-coredump',
2141 systemd_coredump_sources,
005a29f2 2142 include_directories : includes,
aac26058 2143 link_with : [libshared],
005a29f2 2144 dependencies : [threads,
37efbbd8
ZJS
2145 libacl,
2146 libdw,
005a29f2
ZJS
2147 libxz,
2148 liblz4],
2149 install_rpath : rootlibexecdir,
37efbbd8
ZJS
2150 install : true,
2151 install_dir : rootlibexecdir)
2152
2153 exe = executable('coredumpctl',
2154 coredumpctl_sources,
2155 include_directories : includes,
2156 link_with : [libshared],
2157 dependencies : [threads,
2158 libxz,
2159 liblz4],
2160 install_rpath : rootlibexecdir,
2161 install : true)
5a8b1640 2162 public_programs += exe
5c23128d
ZJS
2163endif
2164
349cc4a5 2165if conf.get('ENABLE_BINFMT') == 1
37efbbd8
ZJS
2166 exe = executable('systemd-binfmt',
2167 'src/binfmt/binfmt.c',
2168 include_directories : includes,
2169 link_with : [libshared],
2170 install_rpath : rootlibexecdir,
2171 install : true,
2172 install_dir : rootlibexecdir)
5a8b1640 2173 public_programs += exe
37efbbd8
ZJS
2174
2175 meson.add_install_script('sh', '-c',
2176 mkdir_p.format(binfmtdir))
2177 meson.add_install_script('sh', '-c',
2178 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2179endif
2180
349cc4a5 2181if conf.get('ENABLE_VCONSOLE') == 1
37efbbd8
ZJS
2182 executable('systemd-vconsole-setup',
2183 'src/vconsole/vconsole-setup.c',
005a29f2
ZJS
2184 include_directories : includes,
2185 link_with : [libshared],
2186 install_rpath : rootlibexecdir,
2187 install : true,
2188 install_dir : rootlibexecdir)
5c23128d
ZJS
2189endif
2190
349cc4a5 2191if conf.get('ENABLE_RANDOMSEED') == 1
37efbbd8
ZJS
2192 executable('systemd-random-seed',
2193 'src/random-seed/random-seed.c',
2194 include_directories : includes,
2195 link_with : [libshared],
2196 install_rpath : rootlibexecdir,
2197 install : true,
2198 install_dir : rootlibexecdir)
5c23128d
ZJS
2199endif
2200
349cc4a5 2201if conf.get('ENABLE_FIRSTBOOT') == 1
37efbbd8
ZJS
2202 executable('systemd-firstboot',
2203 'src/firstboot/firstboot.c',
2204 include_directories : includes,
2205 link_with : [libshared],
2206 dependencies : [libcrypt],
2207 install_rpath : rootlibexecdir,
2208 install : true,
2209 install_dir : rootbindir)
5c23128d
ZJS
2210endif
2211
2212executable('systemd-remount-fs',
2213 'src/remount-fs/remount-fs.c',
2214 'src/core/mount-setup.c',
2215 'src/core/mount-setup.h',
2216 include_directories : includes,
2217 link_with : [libshared],
b2fc5836 2218 install_rpath : rootlibexecdir,
5c23128d
ZJS
2219 install : true,
2220 install_dir : rootlibexecdir)
2221
2222executable('systemd-machine-id-setup',
2223 'src/machine-id-setup/machine-id-setup-main.c',
2224 'src/core/machine-id-setup.c',
2225 'src/core/machine-id-setup.h',
2226 include_directories : includes,
aac26058 2227 link_with : [libshared],
b2fc5836 2228 install_rpath : rootlibexecdir,
5c23128d
ZJS
2229 install : true,
2230 install_dir : rootbindir)
2231
2232executable('systemd-fsck',
2233 'src/fsck/fsck.c',
2234 include_directories : includes,
aac26058 2235 link_with : [libshared],
421f0012 2236 install_rpath : rootlibexecdir,
5c23128d
ZJS
2237 install : true,
2238 install_dir : rootlibexecdir)
2239
80750adb
ZJS
2240executable('systemd-growfs',
2241 'src/partition/growfs.c',
2242 include_directories : includes,
2243 link_with : [libshared],
c34b75a1 2244 dependencies : [libcryptsetup],
80750adb
ZJS
2245 install_rpath : rootlibexecdir,
2246 install : true,
2247 install_dir : rootlibexecdir)
2248
b7f28ac5
ZJS
2249executable('systemd-makefs',
2250 'src/partition/makefs.c',
2251 include_directories : includes,
2252 link_with : [libshared],
2253 install_rpath : rootlibexecdir,
2254 install : true,
2255 install_dir : rootlibexecdir)
2256
5c23128d
ZJS
2257executable('systemd-sleep',
2258 'src/sleep/sleep.c',
2259 include_directories : includes,
2260 link_with : [libshared],
421f0012 2261 install_rpath : rootlibexecdir,
5c23128d
ZJS
2262 install : true,
2263 install_dir : rootlibexecdir)
2264
005a29f2
ZJS
2265exe = executable('systemd-sysctl',
2266 'src/sysctl/sysctl.c',
2267 include_directories : includes,
2268 link_with : [libshared],
2269 install_rpath : rootlibexecdir,
2270 install : true,
2271 install_dir : rootlibexecdir)
5a8b1640 2272public_programs += exe
5c23128d
ZJS
2273
2274executable('systemd-ac-power',
2275 'src/ac-power/ac-power.c',
2276 include_directories : includes,
2277 link_with : [libshared],
421f0012 2278 install_rpath : rootlibexecdir,
5c23128d
ZJS
2279 install : true,
2280 install_dir : rootlibexecdir)
2281
005a29f2
ZJS
2282exe = executable('systemd-detect-virt',
2283 'src/detect-virt/detect-virt.c',
2284 include_directories : includes,
2285 link_with : [libshared],
2286 install_rpath : rootlibexecdir,
2287 install : true)
5a8b1640 2288public_programs += exe
005a29f2
ZJS
2289
2290exe = executable('systemd-delta',
2291 'src/delta/delta.c',
2292 include_directories : includes,
2293 link_with : [libshared],
2294 install_rpath : rootlibexecdir,
2295 install : true)
5a8b1640 2296public_programs += exe
005a29f2
ZJS
2297
2298exe = executable('systemd-escape',
2299 'src/escape/escape.c',
2300 include_directories : includes,
2301 link_with : [libshared],
2302 install_rpath : rootlibexecdir,
2303 install : true,
2304 install_dir : rootbindir)
5a8b1640 2305public_programs += exe
005a29f2
ZJS
2306
2307exe = executable('systemd-notify',
2308 'src/notify/notify.c',
2309 include_directories : includes,
2310 link_with : [libshared],
2311 install_rpath : rootlibexecdir,
2312 install : true,
2313 install_dir : rootbindir)
5a8b1640 2314public_programs += exe
5c23128d
ZJS
2315
2316executable('systemd-volatile-root',
2317 'src/volatile-root/volatile-root.c',
2318 include_directories : includes,
2319 link_with : [libshared],
421f0012 2320 install_rpath : rootlibexecdir,
5c23128d
ZJS
2321 install : true,
2322 install_dir : rootlibexecdir)
2323
2324executable('systemd-cgroups-agent',
2325 'src/cgroups-agent/cgroups-agent.c',
2326 include_directories : includes,
2327 link_with : [libshared],
421f0012 2328 install_rpath : rootlibexecdir,
5c23128d
ZJS
2329 install : true,
2330 install_dir : rootlibexecdir)
2331
0d1d512f
ZJS
2332exe = executable('systemd-id128',
2333 'src/id128/id128.c',
2334 include_directories : includes,
2335 link_with : [libshared],
2336 install_rpath : rootlibexecdir,
2337 install : true)
2338public_programs += exe
2339
005a29f2
ZJS
2340exe = executable('systemd-path',
2341 'src/path/path.c',
2342 include_directories : includes,
aac26058 2343 link_with : [libshared],
005a29f2
ZJS
2344 install_rpath : rootlibexecdir,
2345 install : true)
5a8b1640 2346public_programs += exe
005a29f2
ZJS
2347
2348exe = executable('systemd-ask-password',
2349 'src/ask-password/ask-password.c',
2350 include_directories : includes,
aac26058 2351 link_with : [libshared],
005a29f2
ZJS
2352 install_rpath : rootlibexecdir,
2353 install : true,
2354 install_dir : rootbindir)
5a8b1640 2355public_programs += exe
5c23128d
ZJS
2356
2357executable('systemd-reply-password',
2358 'src/reply-password/reply-password.c',
2359 include_directories : includes,
aac26058 2360 link_with : [libshared],
421f0012 2361 install_rpath : rootlibexecdir,
5c23128d
ZJS
2362 install : true,
2363 install_dir : rootlibexecdir)
2364
005a29f2
ZJS
2365exe = executable('systemd-tty-ask-password-agent',
2366 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2367 include_directories : includes,
aac26058 2368 link_with : [libshared],
005a29f2
ZJS
2369 install_rpath : rootlibexecdir,
2370 install : true,
2371 install_dir : rootbindir)
5a8b1640 2372public_programs += exe
005a29f2
ZJS
2373
2374exe = executable('systemd-cgls',
2375 'src/cgls/cgls.c',
2376 include_directories : includes,
aac26058 2377 link_with : [libshared],
005a29f2
ZJS
2378 install_rpath : rootlibexecdir,
2379 install : true)
5a8b1640 2380public_programs += exe
005a29f2
ZJS
2381
2382exe = executable('systemd-cgtop',
2383 'src/cgtop/cgtop.c',
2384 include_directories : includes,
aac26058 2385 link_with : [libshared],
005a29f2
ZJS
2386 install_rpath : rootlibexecdir,
2387 install : true)
5a8b1640 2388public_programs += exe
5c23128d
ZJS
2389
2390executable('systemd-initctl',
2391 'src/initctl/initctl.c',
2392 include_directories : includes,
aac26058 2393 link_with : [libshared],
421f0012 2394 install_rpath : rootlibexecdir,
5c23128d
ZJS
2395 install : true,
2396 install_dir : rootlibexecdir)
2397
005a29f2
ZJS
2398exe = executable('systemd-mount',
2399 'src/mount/mount-tool.c',
2400 include_directories : includes,
34ce0a52 2401 link_with : [libshared],
005a29f2
ZJS
2402 install_rpath : rootlibexecdir,
2403 install : true)
5a8b1640 2404public_programs += exe
5c23128d 2405
7b76fce1 2406meson.add_install_script(meson_make_symlink,
e17e5ba9 2407 'systemd-mount', join_paths(bindir, 'systemd-umount'))
7b76fce1 2408
005a29f2
ZJS
2409exe = executable('systemd-run',
2410 'src/run/run.c',
2411 include_directories : includes,
aac26058 2412 link_with : [libshared],
005a29f2
ZJS
2413 install_rpath : rootlibexecdir,
2414 install : true)
5a8b1640 2415public_programs += exe
005a29f2
ZJS
2416
2417exe = executable('systemd-stdio-bridge',
2418 'src/stdio-bridge/stdio-bridge.c',
2419 include_directories : includes,
aac26058 2420 link_with : [libshared],
005a29f2
ZJS
2421 install_rpath : rootlibexecdir,
2422 install : true)
5a8b1640 2423public_programs += exe
005a29f2
ZJS
2424
2425exe = executable('busctl',
2426 'src/busctl/busctl.c',
2427 'src/busctl/busctl-introspect.c',
2428 'src/busctl/busctl-introspect.h',
2429 include_directories : includes,
aac26058 2430 link_with : [libshared],
005a29f2
ZJS
2431 install_rpath : rootlibexecdir,
2432 install : true)
5a8b1640 2433public_programs += exe
5c23128d 2434
349cc4a5 2435if conf.get('ENABLE_SYSUSERS') == 1
37efbbd8
ZJS
2436 exe = executable('systemd-sysusers',
2437 'src/sysusers/sysusers.c',
2438 include_directories : includes,
2439 link_with : [libshared],
2440 install_rpath : rootlibexecdir,
2441 install : true,
2442 install_dir : rootbindir)
5a8b1640 2443 public_programs += exe
5c23128d
ZJS
2444endif
2445
349cc4a5 2446if conf.get('ENABLE_TMPFILES') == 1
37efbbd8
ZJS
2447 exe = executable('systemd-tmpfiles',
2448 'src/tmpfiles/tmpfiles.c',
2449 include_directories : includes,
2450 link_with : [libshared],
2451 dependencies : [libacl],
2452 install_rpath : rootlibexecdir,
2453 install : true,
2454 install_dir : rootbindir)
5a8b1640 2455 public_programs += exe
d9daae55 2456
938be089
ZJS
2457 if want_tests != 'false'
2458 test('test-systemd-tmpfiles',
2459 test_systemd_tmpfiles_py,
2460 # https://github.com/mesonbuild/meson/issues/2681
2461 args : exe.full_path())
2462 endif
5c23128d
ZJS
2463endif
2464
349cc4a5 2465if conf.get('ENABLE_HWDB') == 1
37efbbd8
ZJS
2466 exe = executable('systemd-hwdb',
2467 'src/hwdb/hwdb.c',
2468 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2469 include_directories : includes,
0c06b506 2470 link_with : [libudev_static],
0da6f396 2471 install_rpath : udev_rpath,
37efbbd8
ZJS
2472 install : true,
2473 install_dir : rootbindir)
5a8b1640 2474 public_programs += exe
37efbbd8
ZJS
2475endif
2476
349cc4a5 2477if conf.get('ENABLE_QUOTACHECK') == 1
37efbbd8
ZJS
2478 executable('systemd-quotacheck',
2479 'src/quotacheck/quotacheck.c',
005a29f2 2480 include_directories : includes,
aac26058 2481 link_with : [libshared],
005a29f2
ZJS
2482 install_rpath : rootlibexecdir,
2483 install : true,
37efbbd8 2484 install_dir : rootlibexecdir)
5c23128d
ZJS
2485endif
2486
005a29f2
ZJS
2487exe = executable('systemd-socket-proxyd',
2488 'src/socket-proxy/socket-proxyd.c',
2489 include_directories : includes,
aac26058 2490 link_with : [libshared],
005a29f2
ZJS
2491 dependencies : [threads],
2492 install_rpath : rootlibexecdir,
2493 install : true,
2494 install_dir : rootlibexecdir)
5a8b1640 2495public_programs += exe
005a29f2
ZJS
2496
2497exe = executable('systemd-udevd',
2498 systemd_udevd_sources,
2499 include_directories : includes,
c1cd6743 2500 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
005a29f2 2501 link_with : [libudev_core,
005a29f2 2502 libsystemd_network,
0c06b506 2503 libudev_static],
3a30f21f
ZJS
2504 dependencies : [threads,
2505 libkmod,
005a29f2 2506 libidn,
aac26058
ZJS
2507 libacl,
2508 libblkid],
1aec3ed9 2509 install_rpath : udev_rpath,
005a29f2
ZJS
2510 install : true,
2511 install_dir : rootlibexecdir)
5a8b1640 2512public_programs += exe
005a29f2
ZJS
2513
2514exe = executable('udevadm',
2515 udevadm_sources,
c1cd6743 2516 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
005a29f2
ZJS
2517 include_directories : includes,
2518 link_with : [libudev_core,
005a29f2 2519 libsystemd_network,
0c06b506 2520 libudev_static],
3a30f21f
ZJS
2521 dependencies : [threads,
2522 libkmod,
005a29f2 2523 libidn,
aac26058
ZJS
2524 libacl,
2525 libblkid],
1aec3ed9 2526 install_rpath : udev_rpath,
005a29f2
ZJS
2527 install : true,
2528 install_dir : rootbindir)
5a8b1640 2529public_programs += exe
5c23128d
ZJS
2530
2531executable('systemd-shutdown',
2532 systemd_shutdown_sources,
2533 include_directories : includes,
34ce0a52 2534 link_with : [libshared],
95b862b0 2535 dependencies : [libmount],
421f0012 2536 install_rpath : rootlibexecdir,
5c23128d
ZJS
2537 install : true,
2538 install_dir : rootlibexecdir)
2539
2540executable('systemd-update-done',
2541 'src/update-done/update-done.c',
2542 include_directories : includes,
2543 link_with : [libshared],
421f0012 2544 install_rpath : rootlibexecdir,
5c23128d
ZJS
2545 install : true,
2546 install_dir : rootlibexecdir)
2547
2548executable('systemd-update-utmp',
2549 'src/update-utmp/update-utmp.c',
2550 include_directories : includes,
aac26058 2551 link_with : [libshared],
5c23128d 2552 dependencies : [libaudit],
421f0012 2553 install_rpath : rootlibexecdir,
5c23128d
ZJS
2554 install : true,
2555 install_dir : rootlibexecdir)
2556
349cc4a5 2557if conf.get('HAVE_KMOD') == 1
37efbbd8
ZJS
2558 executable('systemd-modules-load',
2559 'src/modules-load/modules-load.c',
2560 include_directories : includes,
2561 link_with : [libshared],
2562 dependencies : [libkmod],
2563 install_rpath : rootlibexecdir,
2564 install : true,
2565 install_dir : rootlibexecdir)
94e75a54 2566
37efbbd8
ZJS
2567 meson.add_install_script('sh', '-c',
2568 mkdir_p.format(modulesloaddir))
2569 meson.add_install_script('sh', '-c',
2570 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
5c23128d
ZJS
2571endif
2572
005a29f2
ZJS
2573exe = executable('systemd-nspawn',
2574 systemd_nspawn_sources,
2575 'src/core/mount-setup.c', # FIXME: use a variable?
2576 'src/core/mount-setup.h',
2577 'src/core/loopback-setup.c',
2578 'src/core/loopback-setup.h',
97d90615
ZJS
2579 include_directories : includes,
2580 link_with : [libnspawn_core,
2581 libshared],
2582 dependencies : [libblkid],
005a29f2
ZJS
2583 install_rpath : rootlibexecdir,
2584 install : true)
5a8b1640 2585public_programs += exe
5c23128d 2586
349cc4a5 2587if conf.get('ENABLE_NETWORKD') == 1
37efbbd8
ZJS
2588 executable('systemd-networkd',
2589 systemd_networkd_sources,
2590 include_directories : includes,
2591 link_with : [libnetworkd_core,
37efbbd8 2592 libsystemd_network,
0c06b506 2593 libudev_static,
37efbbd8 2594 libshared],
4b57a272 2595 dependencies : [threads],
37efbbd8
ZJS
2596 install_rpath : rootlibexecdir,
2597 install : true,
2598 install_dir : rootlibexecdir)
2599
2600 executable('systemd-networkd-wait-online',
2601 systemd_networkd_wait_online_sources,
2602 include_directories : includes,
2603 link_with : [libnetworkd_core,
2604 libshared],
2605 install_rpath : rootlibexecdir,
2606 install : true,
2607 install_dir : rootlibexecdir)
5c23128d 2608
dcfe072a
FS
2609 exe = executable('networkctl',
2610 networkctl_sources,
2611 include_directories : includes,
2612 link_with : [libsystemd_network,
aac26058 2613 libshared],
dcfe072a
FS
2614 install_rpath : rootlibexecdir,
2615 install : true,
2616 install_dir : rootbindir)
5a8b1640 2617 public_programs += exe
dcfe072a 2618endif
e821f6a9
ZJS
2619
2620executable('systemd-sulogin-shell',
2621 ['src/sulogin-shell/sulogin-shell.c'],
2622 include_directories : includes,
2623 link_with : [libshared],
2624 install_rpath : rootlibexecdir,
2625 install : true,
2626 install_dir : rootlibexecdir)
2627
69e96427
ZJS
2628############################################################
2629
e2d41370
FB
2630custom_target(
2631 'systemd-runtest.env',
2632 output : 'systemd-runtest.env',
2633 command : ['sh', '-c', '{ ' +
2634 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
49cdae63 2635 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
e2d41370
FB
2636 '} >@OUTPUT@'],
2637 build_by_default : true)
2638
69e96427 2639foreach tuple : tests
37efbbd8
ZJS
2640 sources = tuple[0]
2641 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2642 dependencies = tuple[2]
2643 condition = tuple.length() >= 4 ? tuple[3] : ''
2644 type = tuple.length() >= 5 ? tuple[4] : ''
2645 defs = tuple.length() >= 6 ? tuple[5] : []
2646 incs = tuple.length() >= 7 ? tuple[6] : includes
2647 timeout = 30
2648
2649 name = sources[0].split('/')[-1].split('.')[0]
2650 if type.startswith('timeout=')
2651 timeout = type.split('=')[1].to_int()
2652 type = ''
2653 endif
3b2bdd62
ZJS
2654
2655 if condition == '' or conf.get(condition) == 1
37efbbd8
ZJS
2656 exe = executable(
2657 name,
2658 sources,
2659 include_directories : incs,
2660 link_with : link_with,
2661 dependencies : dependencies,
2662 c_args : defs,
3b2bdd62 2663 build_by_default : want_tests != 'false',
37efbbd8 2664 install_rpath : rootlibexecdir,
7cdd9783
MB
2665 install : install_tests,
2666 install_dir : join_paths(testsdir, type))
37efbbd8
ZJS
2667
2668 if type == 'manual'
2669 message('@0@ is a manual test'.format(name))
2670 elif type == 'unsafe' and want_tests != 'unsafe'
2671 message('@0@ is an unsafe test'.format(name))
3b2bdd62 2672 elif want_tests != 'false'
37efbbd8
ZJS
2673 test(name, exe,
2674 env : test_env,
2675 timeout : timeout)
2676 endif
2677 else
2678 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2679 endif
69e96427
ZJS
2680endforeach
2681
0632b4cd 2682exe = executable(
37efbbd8
ZJS
2683 'test-libsystemd-sym',
2684 test_libsystemd_sym_c,
2685 include_directories : includes,
2686 link_with : [libsystemd],
fd1939fb 2687 build_by_default : want_tests != 'false',
37efbbd8
ZJS
2688 install : install_tests,
2689 install_dir : testsdir)
938be089
ZJS
2690if want_tests != 'false'
2691 test('test-libsystemd-sym', exe)
2692endif
37ab1a25 2693
0632b4cd
ZJS
2694exe = executable(
2695 'test-libsystemd-static-sym',
2696 test_libsystemd_sym_c,
2697 include_directories : includes,
0632b4cd
ZJS
2698 link_with : [install_libsystemd_static],
2699 dependencies : [threads], # threads is already included in dependencies on the library,
2700 # but does not seem to get propagated. Add here as a work-around.
fd1939fb 2701 build_by_default : want_tests != 'false' and static_libsystemd_pic,
20f3d32d 2702 install : install_tests and static_libsystemd_pic,
0632b4cd 2703 install_dir : testsdir)
938be089 2704if want_tests != 'false' and static_libsystemd_pic
0632b4cd
ZJS
2705 test('test-libsystemd-static-sym', exe)
2706endif
37ab1a25 2707
0632b4cd 2708exe = executable(
37efbbd8
ZJS
2709 'test-libudev-sym',
2710 test_libudev_sym_c,
2711 include_directories : includes,
c1cd6743 2712 c_args : '-Wno-deprecated-declarations',
37efbbd8 2713 link_with : [libudev],
fd1939fb 2714 build_by_default : want_tests != 'false',
37efbbd8
ZJS
2715 install : install_tests,
2716 install_dir : testsdir)
938be089
ZJS
2717if want_tests != 'false'
2718 test('test-libudev-sym', exe)
2719endif
0632b4cd
ZJS
2720
2721exe = executable(
2722 'test-libudev-static-sym',
2723 test_libudev_sym_c,
2724 include_directories : includes,
c1cd6743 2725 c_args : '-Wno-deprecated-declarations',
0632b4cd 2726 link_with : [install_libudev_static],
fd1939fb 2727 build_by_default : want_tests != 'false' and static_libudev_pic,
20f3d32d 2728 install : install_tests and static_libudev_pic,
0632b4cd 2729 install_dir : testsdir)
938be089 2730if want_tests != 'false' and static_libudev_pic
0632b4cd
ZJS
2731 test('test-libudev-static-sym', exe)
2732endif
e0bec52f 2733
69e96427 2734############################################################
5c23128d 2735
7db7d5b7
JR
2736fuzzer_exes = []
2737
2738foreach tuple : fuzzers
2739 sources = tuple[0]
2740 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2741 dependencies = tuple[2]
2742 defs = tuple.length() >= 4 ? tuple[3] : []
2743 incs = tuple.length() >= 5 ? tuple[4] : includes
2744
31e57a35 2745 if fuzzer_build
7db7d5b7
JR
2746 dependencies += fuzzing_engine
2747 else
2748 sources += 'src/fuzz/fuzz-main.c'
2749 endif
2750
2751 name = sources[0].split('/')[-1].split('.')[0]
2752
2753 fuzzer_exes += executable(
2754 name,
2755 sources,
2756 include_directories : [incs, include_directories('src/fuzz')],
2757 link_with : link_with,
2758 dependencies : dependencies,
2759 c_args : defs,
2760 install : false)
2761endforeach
2762
2763run_target('fuzzers',
2764 depends : fuzzer_exes,
2765 command : ['true'])
2766
2767############################################################
2768
5c23128d
ZJS
2769make_directive_index_py = find_program('tools/make-directive-index.py')
2770make_man_index_py = find_program('tools/make-man-index.py')
b184e8fe 2771xml_helper_py = find_program('tools/xml_helper.py')
abba22c5 2772hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
5c23128d
ZJS
2773
2774subdir('units')
2775subdir('sysctl.d')
2776subdir('sysusers.d')
2777subdir('tmpfiles.d')
e783f957 2778subdir('presets')
5c23128d
ZJS
2779subdir('hwdb')
2780subdir('network')
2781subdir('man')
2782subdir('shell-completion/bash')
2783subdir('shell-completion/zsh')
9e825ebf
FB
2784subdir('docs/sysvinit')
2785subdir('docs/var-log')
5c23128d 2786
5c23128d
ZJS
2787install_subdir('factory/etc',
2788 install_dir : factorydir)
2789
5c23128d
ZJS
2790install_data('xorg/50-systemd-user.sh',
2791 install_dir : xinitrcdir)
582faeb4
DJL
2792install_data('modprobe.d/systemd.conf',
2793 install_dir : modprobedir)
f09eb768 2794install_data('LICENSE.GPL2',
5c23128d 2795 'LICENSE.LGPL2.1',
f09eb768
LP
2796 'NEWS',
2797 'README',
9e825ebf 2798 'docs/CODING_STYLE',
1d1cb168 2799 'docs/DISTRO_PORTING.md',
9e825ebf
FB
2800 'docs/ENVIRONMENT.md',
2801 'docs/HACKING',
2802 'docs/TRANSIENT-SETTINGS.md',
b6dc0d7d 2803 'docs/TRANSLATORS.md',
9e825ebf 2804 'docs/UIDS-GIDS.md',
5c23128d
ZJS
2805 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2806 install_dir : docdir)
d68b342b 2807
94e75a54
ZJS
2808meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2809meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2810
d68b342b
ZJS
2811############################################################
2812
005a29f2
ZJS
2813meson_check_help = find_program('tools/meson-check-help.sh')
2814
2815foreach exec : public_programs
37efbbd8 2816 name = exec.full_path().split('/')[-1]
938be089
ZJS
2817 if want_tests != 'false'
2818 test('check-help-' + name,
2819 meson_check_help,
c1cd6743 2820 args : exec.full_path())
938be089 2821 endif
005a29f2
ZJS
2822endforeach
2823
2824############################################################
2825
52d4d1d3
ZJS
2826# Enable tests for all supported sanitizers
2827foreach tuple : sanitizers
2828 sanitizer = tuple[0]
2829 build = tuple[1]
b68dfb9e 2830
7a6397d2 2831 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
52d4d1d3
ZJS
2832 prev = ''
2833 foreach p : fuzz_regression_tests
2834 b = p.split('/')[-2]
2835 c = p.split('/')[-1]
2836
2837 name = '@0@:@1@'.format(b, sanitizer)
2838
2839 if name != prev
2840 if want_tests == 'false'
2841 message('Not compiling @0@ because tests is set to false'.format(name))
2842 elif slow_tests
2843 exe = custom_target(
2844 name,
2845 output : name,
2846 depends : build,
2847 command : [env, 'ln', '-fs',
2848 join_paths(build.full_path(), b),
2849 '@OUTPUT@'],
2850 build_by_default : true)
2851 else
2852 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2853 endif
2854 endif
2855 prev = name
2856
2857 if want_tests != 'false' and slow_tests
2858 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2859 env,
2860 args : [exe.full_path(),
e6bad674 2861 join_paths(meson.source_root(), p)])
52d4d1d3
ZJS
2862 endif
2863 endforeach
b68dfb9e
ZJS
2864 endif
2865endforeach
2866
52d4d1d3 2867
b68dfb9e
ZJS
2868############################################################
2869
0700e8ba 2870if git.found()
37efbbd8
ZJS
2871 all_files = run_command(
2872 git,
243e5cec 2873 ['--git-dir=@0@/.git'.format(meson.source_root()),
37efbbd8
ZJS
2874 'ls-files',
2875 ':/*.[ch]'])
2876 all_files = files(all_files.stdout().split())
d68b342b 2877
e85a690b 2878 custom_target(
0700e8ba 2879 'tags',
e85a690b 2880 output : 'tags',
243e5cec 2881 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
2f09974f 2882 run_target(
0700e8ba 2883 'ctags',
243e5cec 2884 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
d68b342b 2885endif
177929c2
ZJS
2886
2887if git.found()
37efbbd8 2888 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
a923e085 2889 run_target(
37efbbd8 2890 'git-contrib',
37efbbd8 2891 command : [meson_git_contrib_sh])
177929c2 2892endif
dd6ab3df
ZJS
2893
2894if git.found()
2895 git_head = run_command(
2896 git,
243e5cec 2897 ['--git-dir=@0@/.git'.format(meson.source_root()),
dd6ab3df
ZJS
2898 'rev-parse', 'HEAD']).stdout().strip()
2899 git_head_short = run_command(
2900 git,
243e5cec 2901 ['--git-dir=@0@/.git'.format(meson.source_root()),
dd6ab3df
ZJS
2902 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2903
2904 run_target(
2905 'git-snapshot',
2906 command : ['git', 'archive',
243e5cec 2907 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
dd6ab3df
ZJS
2908 git_head_short),
2909 '--prefix', 'systemd-@0@/'.format(git_head),
2910 'HEAD'])
2911endif
829257d1
ZJS
2912
2913############################################################
2914
51b13863
LP
2915meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2916run_target(
2917 'check-api-docs',
2918 depends : [man, libsystemd, libudev],
2919 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2920
0bc7a22d
LP
2921run_target(
2922 'make-index-md',
2923 command : ['sh', '@0@/tools/make-index-md.sh'.format(meson.source_root()), meson.source_root()])
2924
51b13863
LP
2925############################################################
2926
829257d1
ZJS
2927status = [
2928 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2929
2675413e 2930 'split /usr: @0@'.format(split_usr),
157baa87 2931 'split bin-sbin: @0@'.format(split_bin),
359b496f
YW
2932 'prefix directory: @0@'.format(prefixdir),
2933 'rootprefix directory: @0@'.format(rootprefixdir),
2934 'sysconf directory: @0@'.format(sysconfdir),
2935 'include directory: @0@'.format(includedir),
2936 'lib directory: @0@'.format(libdir),
2937 'rootlib directory: @0@'.format(rootlibdir),
829257d1
ZJS
2938 'SysV init scripts: @0@'.format(sysvinit_path),
2939 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
359b496f
YW
2940 'PAM modules directory: @0@'.format(pamlibdir),
2941 'PAM configuration directory: @0@'.format(pamconfdir),
2942 'RPM macros directory: @0@'.format(rpmmacrosdir),
2943 'modprobe.d directory: @0@'.format(modprobedir),
2944 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2945 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2946 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2947 'bash completions directory: @0@'.format(bashcompletiondir),
2948 'zsh completions directory: @0@'.format(zshcompletiondir),
829257d1
ZJS
2949 'extra start script: @0@'.format(get_option('rc-local')),
2950 'extra stop script: @0@'.format(get_option('halt-local')),
2951 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2952 get_option('debug-tty')),
2953 'TTY GID: @0@'.format(tty_gid),
ac09340e 2954 'users GID: @0@'.format(substs.get('USERS_GID')),
829257d1
ZJS
2955 'maximum system UID: @0@'.format(system_uid_max),
2956 'maximum system GID: @0@'.format(system_gid_max),
87d5e4f2
LP
2957 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2958 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2959 'minimum container UID base: @0@'.format(container_uid_base_min),
2960 'maximum container UID base: @0@'.format(container_uid_base_max),
829257d1 2961 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
4e15a734 2962 'render group access mode: @0@'.format(get_option('group-render-mode')),
359b496f 2963 'certificate root directory: @0@'.format(get_option('certificate-root')),
829257d1 2964 'support URL: @0@'.format(support_url),
afde4574
LP
2965 'nobody user name: @0@'.format(nobody_user),
2966 'nobody group name: @0@'.format(nobody_group),
829257d1 2967 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
5248e7e1 2968 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
829257d1
ZJS
2969
2970 'default DNSSEC mode: @0@'.format(default_dnssec),
c9299be2 2971 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
829257d1
ZJS
2972 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2973 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2974
2975alt_dns_servers = '\n '.join(dns_servers.split(' '))
2976alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2977status += [
2978 'default DNS servers: @0@'.format(alt_dns_servers),
2979 'default NTP servers: @0@'.format(alt_ntp_servers)]
2980
2981alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2982 '@@0@'.format(time_epoch)).stdout().strip()
2983status += [
2984 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2985
19d8c9c9 2986status += [
abc8caf7
ZJS
2987 'static libsystemd: @0@'.format(static_libsystemd),
2988 'static libudev: @0@'.format(static_libudev)]
19d8c9c9 2989
829257d1
ZJS
2990# TODO:
2991# CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2992# CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2993# LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2994
349cc4a5 2995if conf.get('ENABLE_EFI') == 1
5a8b1640 2996 status += 'efi arch: @0@'.format(efi_arch)
829257d1
ZJS
2997
2998 if have_gnu_efi
2999 status += [
3000 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3001 'EFI CC @0@'.format(efi_cc),
359b496f
YW
3002 'EFI lib directory: @0@'.format(efi_libdir),
3003 'EFI lds directory: @0@'.format(efi_ldsdir),
3004 'EFI include directory: @0@'.format(efi_incdir)]
829257d1
ZJS
3005 endif
3006endif
3007
3008found = []
3009missing = []
3010
3011foreach tuple : [
3012 ['libcryptsetup'],
3013 ['PAM'],
3014 ['AUDIT'],
3015 ['IMA'],
3016 ['AppArmor'],
3017 ['SELinux'],
3018 ['SECCOMP'],
3019 ['SMACK'],
3020 ['zlib'],
3021 ['xz'],
3022 ['lz4'],
3023 ['bzip2'],
3024 ['ACL'],
3025 ['gcrypt'],
3026 ['qrencode'],
3027 ['microhttpd'],
3028 ['gnutls'],
096cbdce 3029 ['openssl'],
829257d1 3030 ['libcurl'],
d1bf5675 3031 ['idn'],
87057e24 3032 ['libidn2'],
829257d1
ZJS
3033 ['libidn'],
3034 ['libiptc'],
3035 ['elfutils'],
3036 ['binfmt'],
3037 ['vconsole'],
3038 ['quotacheck'],
3039 ['tmpfiles'],
3040 ['environment.d'],
3041 ['sysusers'],
3042 ['firstboot'],
3043 ['randomseed'],
3044 ['backlight'],
3045 ['rfkill'],
3046 ['logind'],
3047 ['machined'],
61d0578b 3048 ['portabled'],
829257d1
ZJS
3049 ['importd'],
3050 ['hostnamed'],
3051 ['timedated'],
3052 ['timesyncd'],
3053 ['localed'],
3054 ['networkd'],
a7456af5 3055 ['resolve'],
096cbdce
IT
3056 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3057 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
829257d1
ZJS
3058 ['coredump'],
3059 ['polkit'],
3060 ['legacy pkla', install_polkit_pkla],
3061 ['efi'],
3062 ['gnu-efi', have_gnu_efi],
3063 ['kmod'],
3064 ['xkbcommon'],
c4c978a0 3065 ['pcre2'],
829257d1
ZJS
3066 ['blkid'],
3067 ['dbus'],
3068 ['glib'],
6bd2bc8e
ZJS
3069 ['nss-myhostname'],
3070 ['nss-mymachines'],
3071 ['nss-resolve'],
3072 ['nss-systemd'],
829257d1
ZJS
3073 ['hwdb'],
3074 ['tpm'],
3075 ['man pages', want_man],
3076 ['html pages', want_html],
3077 ['man page indices', want_man and have_lxml],
829257d1
ZJS
3078 ['SysV compat'],
3079 ['utmp'],
3080 ['ldconfig'],
3081 ['hibernate'],
3082 ['adm group', get_option('adm-group')],
3083 ['wheel group', get_option('wheel-group')],
b14e1b43 3084 ['gshadow'],
829257d1
ZJS
3085 ['debug hashmap'],
3086 ['debug mmap cache'],
d18cb393 3087 ['valgrind', conf.get('VALGRIND') == 1],
fd5dec9a 3088 ['trace logging', conf.get('LOG_TRACE') == 1],
19d8c9c9
LP
3089 ['link-udev-shared', get_option('link-udev-shared')],
3090 ['link-systemctl-shared', get_option('link-systemctl-shared')],
829257d1
ZJS
3091]
3092
af4d7860
ZJS
3093 if tuple.length() >= 2
3094 cond = tuple[1]
3095 else
829257d1
ZJS
3096 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3097 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
349cc4a5 3098 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
829257d1
ZJS
3099 endif
3100 if cond
5a8b1640 3101 found += tuple[0]
829257d1 3102 else
5a8b1640 3103 missing += tuple[0]
829257d1
ZJS
3104 endif
3105endforeach
3106
3107status += [
9d39c1bf 3108 '',
829257d1 3109 'enabled features: @0@'.format(', '.join(found)),
9d39c1bf
ZJS
3110 '',
3111 'disabled features: @0@'.format(', '.join(missing)),
3112 '']
829257d1 3113message('\n '.join(status))
9a8e64b0
ZJS
3114
3115if rootprefixdir != rootprefix_default
8ea9fad7
YW
3116 warning('\n' +
3117 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3118 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3119 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
9a8e64b0 3120endif