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