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