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