1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
12 meson_version : '>= 0.46',
15 libsystemd_version = '0.27.0'
16 libudev_version = '1.6.15'
18 # We need the same data in two different formats, ugh!
19 # Also, for hysterical reasons, we use different variable
20 # names, sometimes. Not all variables are included in every
22 conf = configuration_data()
23 conf.set('PROJECT_VERSION', meson.project_version())
25 substs = configuration_data()
26 substs.set('PROJECT_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
27 substs.set('PROJECT_VERSION', meson.project_version())
29 # This is to be used instead of meson.source_root(), as the latter will return
30 # the wrong result when systemd is being built as a meson subproject
31 project_source_root = meson.current_source_dir()
32 relative_source_path = run_command('realpath',
33 '--relative-to=@0@'.format(meson.current_build_dir()),
34 project_source_root).stdout().strip()
35 conf.set_quoted('RELATIVE_SOURCE_PATH', relative_source_path)
37 want_ossfuzz = get_option('oss-fuzz')
38 want_libfuzzer = get_option('llvm-fuzz')
39 want_fuzzbuzz = get_option('fuzzbuzz')
40 if want_ossfuzz + want_libfuzzer + want_fuzzbuzz > 1
41 error('only one of oss-fuzz, llvm-fuzz or fuzzbuzz can be specified')
44 skip_deps = want_ossfuzz or want_libfuzzer
45 fuzzer_build = want_ossfuzz or want_libfuzzer or want_fuzzbuzz
47 #####################################################################
49 # Try to install the git pre-commit hook
50 git_hook = run_command(join_paths(project_source_root, 'tools/add-git-hook.sh'))
51 if git_hook.returncode() == 0
52 message(git_hook.stdout().strip())
55 #####################################################################
57 if get_option('split-usr') == 'auto'
58 split_usr = run_command('test', '-L', '/bin').returncode() != 0
60 split_usr = get_option('split-usr') == 'true'
62 conf.set10('HAVE_SPLIT_USR', split_usr,
63 description : '/usr/bin and /bin directories are separate')
65 if get_option('split-bin') == 'auto'
66 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
68 split_bin = get_option('split-bin') == 'true'
70 conf.set10('HAVE_SPLIT_BIN', split_bin,
71 description : 'bin and sbin directories are separate')
73 rootprefixdir = get_option('rootprefix')
74 # Unusual rootprefixdir values are used by some distros
75 # (see https://github.com/systemd/systemd/pull/7461).
76 rootprefix_default = split_usr ? '/' : '/usr'
77 if rootprefixdir == ''
78 rootprefixdir = rootprefix_default
80 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
82 sysvinit_path = get_option('sysvinit-path')
83 sysvrcnd_path = get_option('sysvrcnd-path')
84 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
85 description : 'SysV init scripts and rcN.d links are supported')
87 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
88 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
89 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
91 # join_paths ignores the preceding arguments if an absolute component is
92 # encountered, so this should canonicalize various paths when they are
93 # absolute or relative.
94 prefixdir = get_option('prefix')
95 if not prefixdir.startswith('/')
96 error('Prefix is not absolute: "@0@"'.format(prefixdir))
98 bindir = join_paths(prefixdir, get_option('bindir'))
99 libdir = join_paths(prefixdir, get_option('libdir'))
100 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
101 includedir = join_paths(prefixdir, get_option('includedir'))
102 datadir = join_paths(prefixdir, get_option('datadir'))
103 localstatedir = join_paths('/', get_option('localstatedir'))
105 rootbindir = join_paths(rootprefixdir, 'bin')
106 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
107 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
109 rootlibdir = get_option('rootlibdir')
111 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
114 # Dirs of external packages
115 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
116 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
117 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
118 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
119 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
120 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
121 rpmmacrosdir = get_option('rpmmacrosdir')
122 if rpmmacrosdir != 'no'
123 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
125 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
128 pkgdatadir = join_paths(datadir, 'systemd')
129 environmentdir = join_paths(prefixdir, 'lib/environment.d')
130 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
131 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
132 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
133 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
134 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
135 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
136 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
137 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
138 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
139 pkgincludedir = join_paths(includedir, 'systemd')
140 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
141 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
142 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
143 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
144 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
145 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
146 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
147 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
148 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
149 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
150 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
151 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
152 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
153 factorydir = join_paths(datadir, 'factory')
154 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
155 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
156 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
157 catalogstatedir = join_paths(systemdstatedir, 'catalog')
158 randomseeddir = join_paths(localstatedir, 'lib/systemd')
159 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
160 ntpservicelistdir = join_paths(rootprefixdir, 'lib/systemd/ntp-units.d')
162 docdir = get_option('docdir')
164 docdir = join_paths(datadir, 'doc/systemd')
167 dbuspolicydir = get_option('dbuspolicydir')
168 if dbuspolicydir == ''
169 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
172 dbussessionservicedir = get_option('dbussessionservicedir')
173 if dbussessionservicedir == ''
174 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
177 dbussystemservicedir = get_option('dbussystemservicedir')
178 if dbussystemservicedir == ''
179 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
182 pamlibdir = get_option('pamlibdir')
184 pamlibdir = join_paths(rootlibdir, 'security')
187 pamconfdir = get_option('pamconfdir')
189 pamconfdir = join_paths(sysconfdir, 'pam.d')
192 memory_accounting_default = get_option('memory-accounting-default')
193 status_unit_format_default = get_option('status-unit-format-default')
195 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
196 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
197 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
198 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
199 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
200 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
202 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
204 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
205 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
206 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
207 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
208 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
209 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
210 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
211 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
212 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
213 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
214 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
215 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
216 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
217 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
218 conf.set_quoted('ROOTPREFIX', rootprefixdir)
219 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
220 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
221 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
222 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
223 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
224 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
225 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
226 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
227 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
228 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
229 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
230 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
231 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
232 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
233 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
234 conf.set_quoted('LIBDIR', libdir)
235 conf.set_quoted('ROOTLIBDIR', rootlibdir)
236 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
237 conf.set_quoted('BOOTLIBDIR', bootlibdir)
238 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
239 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
240 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
241 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
242 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
243 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
244 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
245 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
246 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
247 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
249 substs.set('prefix', prefixdir)
250 substs.set('rootprefix', rootprefixdir)
251 substs.set('rootprefix_noslash', rootprefixdir_noslash)
252 substs.set('exec_prefix', prefixdir)
253 substs.set('libdir', libdir)
254 substs.set('rootlibdir', rootlibdir)
255 substs.set('includedir', includedir)
256 substs.set('sysconfdir', sysconfdir)
257 substs.set('bindir', bindir)
258 substs.set('rootbindir', rootbindir)
259 substs.set('rootlibexecdir', rootlibexecdir)
260 substs.set('systemunitdir', systemunitdir)
261 substs.set('userunitdir', userunitdir)
262 substs.set('systempresetdir', systempresetdir)
263 substs.set('userpresetdir', userpresetdir)
264 substs.set('udevhwdbdir', udevhwdbdir)
265 substs.set('udevrulesdir', udevrulesdir)
266 substs.set('udevlibexecdir', udevlibexecdir)
267 substs.set('environmentdir', environmentdir)
268 substs.set('catalogdir', catalogdir)
269 substs.set('tmpfilesdir', tmpfilesdir)
270 substs.set('sysusersdir', sysusersdir)
271 substs.set('sysctldir', sysctldir)
272 substs.set('binfmtdir', binfmtdir)
273 substs.set('modulesloaddir', modulesloaddir)
274 substs.set('modprobedir', modprobedir)
275 substs.set('systemgeneratordir', systemgeneratordir)
276 substs.set('usergeneratordir', usergeneratordir)
277 substs.set('systemenvgeneratordir', systemenvgeneratordir)
278 substs.set('userenvgeneratordir', userenvgeneratordir)
279 substs.set('systemshutdowndir', systemshutdowndir)
280 substs.set('systemsleepdir', systemsleepdir)
281 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
282 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
283 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
284 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
285 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
286 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
287 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
288 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
289 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
290 substs.set('BUILD_ROOT', meson.current_build_dir())
292 #####################################################################
294 cc = meson.get_compiler('c')
295 pkgconfig = import('pkgconfig')
296 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
297 meson_build_sh = find_program('tools/meson-build.sh')
299 want_tests = get_option('tests')
300 slow_tests = want_tests != 'false' and get_option('slow-tests')
301 install_tests = get_option('install-tests')
303 if add_languages('cpp', required : fuzzer_build)
304 # Used only for tests
305 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
311 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
312 if fuzzing_engine.found()
313 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
314 elif cc.has_argument('-fsanitize=fuzzer-no-link')
315 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
317 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
320 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
322 fuzzing_engine = meson.get_compiler('cpp').find_library(get_option('fuzzbuzz-engine'), dirs: get_option('fuzzbuzz-engine-dir'))
325 possible_cc_flags = [
329 '-Wmissing-include-dirs',
330 '-Wold-style-definition',
334 '-Wsuggest-attribute=noreturn',
335 '-Werror=missing-prototypes',
336 '-Werror=implicit-function-declaration',
337 '-Werror=missing-declarations',
338 '-Werror=return-type',
339 '-Werror=incompatible-pointer-types',
341 '-Wstrict-prototypes',
343 '-Wmissing-noreturn',
344 '-Wimplicit-fallthrough=5',
347 '-Wstrict-aliasing=2',
350 '-Werror=shift-count-overflow',
351 '-Werror=shift-overflow=2',
355 # negative arguments are correctly detected starting with meson 0.46.
356 '-Wno-unused-parameter',
357 '-Wno-missing-field-initializers',
358 '-Wno-unused-result',
359 '-Wno-format-signedness',
360 '-Wno-error=#warnings', # clang
361 '-Wno-string-plus-int', # clang
363 # work-around for gcc 7.1 turning this on on its own.
364 '-Wno-error=nonnull',
366 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
367 # optimizations enabled, producing essentially false positives.
368 '-Wno-maybe-uninitialized',
372 '-fdiagnostics-show-option',
373 '-fno-strict-aliasing',
374 '-fvisibility=hidden',
376 '-fstack-protector-strong',
377 '--param=ssp-buffer-size=4',
380 # --as-needed and --no-undefined are provided by meson by default,
381 # run mesonconf to see what is enabled
382 possible_link_flags = [
387 if cc.get_id() == 'clang'
388 possible_cc_flags += [
389 '-Wno-typedef-redefinition',
390 '-Wno-gnu-variable-sized-type-not-at-end',
394 if get_option('buildtype') != 'debug'
395 possible_cc_flags += [
396 '-ffunction-sections',
400 possible_link_flags += '-Wl,--gc-sections'
403 if get_option('b_ndebug') == 'true'
404 # With asserts disabled with get a bunch of warnings about variables which
405 # are used only in the asserts. This is not useful at all, so let's just silence
407 possible_cc_flags += [
408 '-Wno-unused-variable',
409 '-Wno-unused-but-set-variable',
413 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
414 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
418 #include <inttypes.h>
419 typedef uint64_t usec_t;
420 usec_t now(clockid_t clock);
425 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
426 add_project_arguments('-Werror=shadow', language : 'c')
429 cpp = ' '.join(cc.cmd_array()) + ' -E'
431 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
433 #####################################################################
434 # compilation result tests
436 conf.set('_GNU_SOURCE', true)
437 conf.set('__SANE_USERSPACE_TYPES__', true)
438 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
440 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
441 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
442 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
443 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
444 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
445 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
446 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
450 #include <sys/stat.h>
453 foreach decl : ['char16_t',
458 # We get -1 if the size cannot be determined
459 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
461 if decl == 'struct statx'
463 want_linux_stat_h = false
465 have = cc.sizeof(decl,
466 prefix : decl_headers + '#include <linux/stat.h>',
467 args : '-D_GNU_SOURCE') > 0
468 want_linux_stat_h = have
472 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
475 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
477 foreach ident : ['secure_getenv', '__secure_getenv']
478 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
482 ['memfd_create', '''#include <sys/mman.h>'''],
483 ['gettid', '''#include <sys/types.h>
484 #include <unistd.h>'''],
485 ['pivot_root', '''#include <stdlib.h>
486 #include <unistd.h>'''], # no known header declares pivot_root
487 ['name_to_handle_at', '''#include <sys/types.h>
488 #include <sys/stat.h>
489 #include <fcntl.h>'''],
490 ['setns', '''#include <sched.h>'''],
491 ['renameat2', '''#include <stdio.h>
492 #include <fcntl.h>'''],
493 ['kcmp', '''#include <linux/kcmp.h>'''],
494 ['keyctl', '''#include <sys/types.h>
495 #include <keyutils.h>'''],
496 ['copy_file_range', '''#include <sys/syscall.h>
497 #include <unistd.h>'''],
498 ['bpf', '''#include <sys/syscall.h>
499 #include <unistd.h>'''],
500 ['statx', '''#include <sys/types.h>
501 #include <sys/stat.h>
502 #include <unistd.h>'''],
503 ['explicit_bzero' , '''#include <string.h>'''],
504 ['reallocarray', '''#include <malloc.h>'''],
505 ['set_mempolicy', '''#include <stdlib.h>
506 #include <unistd.h>'''],
507 ['get_mempolicy', '''#include <stdlib.h>
508 #include <unistd.h>'''],
511 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
512 conf.set10('HAVE_' + ident[0].to_upper(), have)
515 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
516 conf.set10('USE_SYS_RANDOM_H', true)
517 conf.set10('HAVE_GETRANDOM', true)
519 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
520 conf.set10('USE_SYS_RANDOM_H', false)
521 conf.set10('HAVE_GETRANDOM', have)
524 #####################################################################
526 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
528 get_option('version-tag'),
529 meson.project_version()]
532 input : 'src/version/version.h.in',
533 output : 'version.h',
536 versiondep = declare_dependency(sources: version_h)
538 sed = find_program('sed')
539 awk = find_program('awk')
540 m4 = find_program('m4')
541 stat = find_program('stat')
542 git = find_program('git', required : false)
543 env = find_program('env')
544 perl = find_program('perl', required : false)
546 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
547 mkdir_p = 'mkdir -p $DESTDIR/@0@'
548 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
549 splash_bmp = files('test/splash.bmp')
551 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
552 # /usr/sbin, /sbin, and fall back to the default from middle column.
553 progs = [['quotaon', '/usr/sbin/quotaon' ],
554 ['quotacheck', '/usr/sbin/quotacheck' ],
555 ['kmod', '/usr/bin/kmod' ],
556 ['kexec', '/usr/sbin/kexec' ],
557 ['sulogin', '/usr/sbin/sulogin' ],
558 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
559 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
560 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
561 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
562 ['nologin', '/usr/sbin/nologin', ],
565 path = get_option(prog[0] + '-path')
567 message('Using @1@ for @0@'.format(prog[0], path))
569 exe = find_program(prog[0],
570 '/usr/sbin/' + prog[0],
573 path = exe.found() ? exe.path() : prog[1]
575 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
576 conf.set_quoted(name, path)
577 substs.set(name, path)
580 conf.set_quoted('TELINIT', get_option('telinit-path'))
582 if run_command('ln', '--relative', '--help').returncode() != 0
583 error('ln does not support --relative (added in coreutils 8.16)')
586 ############################################################
588 gperf = find_program('gperf')
590 gperf_test_format = '''
592 const char * in_word_set(const char *, @0@);
595 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
596 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
597 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
598 if cc.compiles(gperf_test)
599 gperf_len_type = 'size_t'
601 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
602 if cc.compiles(gperf_test)
603 gperf_len_type = 'unsigned'
605 error('unable to determine gperf len type')
608 message('gperf len type is @0@'.format(gperf_len_type))
609 conf.set('GPERF_LEN_TYPE', gperf_len_type,
610 description : 'The type of gperf "len" parameter')
612 ############################################################
614 if not cc.has_header('sys/capability.h')
615 error('POSIX caps headers not found')
617 foreach header : ['crypt.h',
619 'linux/vm_sockets.h',
621 'valgrind/memcheck.h',
622 'valgrind/valgrind.h',
625 conf.set10('HAVE_' + header.underscorify().to_upper(),
626 cc.has_header(header))
629 ############################################################
631 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
632 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
633 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
635 default_hierarchy = get_option('default-hierarchy')
636 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
637 description : 'default cgroup hierarchy as string')
638 if default_hierarchy == 'legacy'
639 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
640 elif default_hierarchy == 'hybrid'
641 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
643 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
646 default_net_naming_scheme = get_option('default-net-naming-scheme')
647 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
649 time_epoch = get_option('time-epoch')
652 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
654 conf.set('TIME_EPOCH', time_epoch)
656 system_uid_max = get_option('system-uid-max')
657 if system_uid_max == -1
658 system_uid_max = run_command(
660 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
661 '/etc/login.defs').stdout().strip()
662 if system_uid_max == ''
665 system_uid_max = system_uid_max.to_int()
668 conf.set('SYSTEM_UID_MAX', system_uid_max)
669 substs.set('systemuidmax', system_uid_max)
671 system_gid_max = get_option('system-gid-max')
672 if system_gid_max == -1
673 system_gid_max = run_command(
675 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
676 '/etc/login.defs').stdout().strip()
677 if system_gid_max == ''
680 system_gid_max = system_gid_max.to_int()
683 conf.set('SYSTEM_GID_MAX', system_gid_max)
684 substs.set('systemgidmax', system_gid_max)
686 dynamic_uid_min = get_option('dynamic-uid-min')
687 dynamic_uid_max = get_option('dynamic-uid-max')
688 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
689 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
690 substs.set('dynamicuidmin', dynamic_uid_min)
691 substs.set('dynamicuidmax', dynamic_uid_max)
693 container_uid_base_min = get_option('container-uid-base-min')
694 container_uid_base_max = get_option('container-uid-base-max')
695 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
696 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
697 substs.set('containeruidbasemin', container_uid_base_min)
698 substs.set('containeruidbasemax', container_uid_base_max)
700 nobody_user = get_option('nobody-user')
701 nobody_group = get_option('nobody-group')
703 if not meson.is_cross_build()
704 getent_result = run_command('getent', 'passwd', '65534')
705 if getent_result.returncode() == 0
706 name = getent_result.stdout().split(':')[0]
707 if name != nobody_user
709 '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) +
710 'Your build will result in an user table setup that is incompatible with the local system.')
713 id_result = run_command('id', '-u', nobody_user)
714 if id_result.returncode() == 0
715 id = id_result.stdout().to_int()
718 '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) +
719 'Your build will result in an user table setup that is incompatible with the local system.')
723 getent_result = run_command('getent', 'group', '65534')
724 if getent_result.returncode() == 0
725 name = getent_result.stdout().split(':')[0]
726 if name != nobody_group
728 '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) +
729 'Your build will result in an group table setup that is incompatible with the local system.')
732 id_result = run_command('id', '-g', nobody_group)
733 if id_result.returncode() == 0
734 id = id_result.stdout().to_int()
737 '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) +
738 'Your build will result in an group table setup that is incompatible with the local system.')
742 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
744 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
745 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
748 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
749 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
750 substs.set('NOBODY_USER_NAME', nobody_user)
751 substs.set('NOBODY_GROUP_NAME', nobody_group)
753 tty_gid = get_option('tty-gid')
754 conf.set('TTY_GID', tty_gid)
755 substs.set('TTY_GID', tty_gid)
757 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
758 users_gid = get_option('users-gid')
759 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
761 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
762 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
764 dev_kvm_mode = get_option('dev-kvm-mode')
765 substs.set('DEV_KVM_MODE', dev_kvm_mode)
766 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
767 group_render_mode = get_option('group-render-mode')
768 substs.set('GROUP_RENDER_MODE', group_render_mode)
769 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
771 kill_user_processes = get_option('default-kill-user-processes')
772 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
773 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
774 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
776 dns_servers = get_option('dns-servers')
777 conf.set_quoted('DNS_SERVERS', dns_servers)
778 substs.set('DNS_SERVERS', dns_servers)
780 ntp_servers = get_option('ntp-servers')
781 conf.set_quoted('NTP_SERVERS', ntp_servers)
782 substs.set('NTP_SERVERS', ntp_servers)
784 default_locale = get_option('default-locale')
785 if default_locale == ''
786 if not meson.is_cross_build()
787 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
788 default_locale = run_command(choose_default_locale_sh).stdout().strip()
790 default_locale = 'C.UTF-8'
793 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
795 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
797 substs.set('SUSHELL', get_option('debug-shell'))
798 substs.set('DEBUGTTY', get_option('debug-tty'))
799 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
801 enable_debug_hashmap = false
802 enable_debug_mmap_cache = false
803 enable_debug_siphash = false
804 foreach name : get_option('debug-extra')
806 enable_debug_hashmap = true
807 elif name == 'mmap-cache'
808 enable_debug_mmap_cache = true
809 elif name == 'siphash'
810 enable_debug_siphash = true
812 message('unknown debug option "@0@", ignoring'.format(name))
815 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
816 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
817 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
819 conf.set10('VALGRIND', get_option('valgrind'))
820 conf.set10('LOG_TRACE', get_option('log-trace'))
822 #####################################################################
824 threads = dependency('threads')
825 librt = cc.find_library('rt')
826 libm = cc.find_library('m')
827 libdl = cc.find_library('dl')
828 libcrypt = cc.find_library('crypt')
830 libcap = dependency('libcap', required : false)
831 if not libcap.found()
832 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
833 libcap = cc.find_library('cap')
836 libmount = dependency('mount',
837 version : fuzzer_build ? '>= 0' : '>= 2.30')
839 want_seccomp = get_option('seccomp')
840 if want_seccomp != 'false' and not skip_deps
841 libseccomp = dependency('libseccomp',
842 version : '>= 2.3.1',
843 required : want_seccomp == 'true')
844 have = libseccomp.found()
849 conf.set10('HAVE_SECCOMP', have)
851 want_selinux = get_option('selinux')
852 if want_selinux != 'false' and not skip_deps
853 libselinux = dependency('libselinux',
854 version : '>= 2.1.9',
855 required : want_selinux == 'true')
856 have = libselinux.found()
861 conf.set10('HAVE_SELINUX', have)
863 want_apparmor = get_option('apparmor')
864 if want_apparmor != 'false' and not skip_deps
865 libapparmor = dependency('libapparmor',
866 required : want_apparmor == 'true')
867 have = libapparmor.found()
872 conf.set10('HAVE_APPARMOR', have)
874 smack_run_label = get_option('smack-run-label')
875 if smack_run_label != ''
876 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
879 want_polkit = get_option('polkit')
880 install_polkit = false
881 install_polkit_pkla = false
882 if want_polkit != 'false' and not skip_deps
883 install_polkit = true
885 libpolkit = dependency('polkit-gobject-1',
887 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
888 message('Old polkit detected, will install pkla files')
889 install_polkit_pkla = true
892 conf.set10('ENABLE_POLKIT', install_polkit)
894 want_acl = get_option('acl')
895 if want_acl != 'false' and not skip_deps
896 libacl = cc.find_library('acl', required : want_acl == 'true')
897 have = libacl.found()
902 conf.set10('HAVE_ACL', have)
904 want_audit = get_option('audit')
905 if want_audit != 'false' and not skip_deps
906 libaudit = dependency('audit', required : want_audit == 'true')
907 have = libaudit.found()
912 conf.set10('HAVE_AUDIT', have)
914 want_blkid = get_option('blkid')
915 if want_blkid != 'false' and not skip_deps
916 libblkid = dependency('blkid', required : want_blkid == 'true')
917 have = libblkid.found()
922 conf.set10('HAVE_BLKID', have)
924 want_kmod = get_option('kmod')
925 if want_kmod != 'false' and not skip_deps
926 libkmod = dependency('libkmod',
928 required : want_kmod == 'true')
929 have = libkmod.found()
934 conf.set10('HAVE_KMOD', have)
936 want_pam = get_option('pam')
937 if want_pam != 'false' and not skip_deps
938 libpam = cc.find_library('pam', required : want_pam == 'true')
939 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
940 have = libpam.found() and libpam_misc.found()
946 conf.set10('HAVE_PAM', have)
948 want_microhttpd = get_option('microhttpd')
949 if want_microhttpd != 'false' and not skip_deps
950 libmicrohttpd = dependency('libmicrohttpd',
951 version : '>= 0.9.33',
952 required : want_microhttpd == 'true')
953 have = libmicrohttpd.found()
958 conf.set10('HAVE_MICROHTTPD', have)
960 want_libcryptsetup = get_option('libcryptsetup')
961 if want_libcryptsetup != 'false' and not skip_deps
962 libcryptsetup = dependency('libcryptsetup',
963 version : '>= 1.6.0',
964 required : want_libcryptsetup == 'true')
965 have = libcryptsetup.found()
966 have_sector = cc.has_member(
967 'struct crypt_params_plain',
969 prefix : '#include <libcryptsetup.h>')
975 conf.set10('HAVE_LIBCRYPTSETUP', have)
976 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
978 want_libcurl = get_option('libcurl')
979 if want_libcurl != 'false' and not skip_deps
980 libcurl = dependency('libcurl',
981 version : '>= 7.32.0',
982 required : want_libcurl == 'true')
983 have = libcurl.found()
988 conf.set10('HAVE_LIBCURL', have)
990 want_libidn = get_option('libidn')
991 want_libidn2 = get_option('libidn2')
992 if want_libidn == 'true' and want_libidn2 == 'true'
993 error('libidn and libidn2 cannot be requested simultaneously')
996 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
997 libidn = dependency('libidn2',
998 required : want_libidn2 == 'true')
999 have = libidn.found()
1004 conf.set10('HAVE_LIBIDN2', have)
1005 if not have and want_libidn != 'false' and not skip_deps
1006 # libidn is used for both libidn and libidn2 objects
1007 libidn = dependency('libidn',
1008 required : want_libidn == 'true')
1009 have = libidn.found()
1013 conf.set10('HAVE_LIBIDN', have)
1015 want_libiptc = get_option('libiptc')
1016 if want_libiptc != 'false' and not skip_deps
1017 libiptc = dependency('libiptc',
1018 required : want_libiptc == 'true')
1019 have = libiptc.found()
1024 conf.set10('HAVE_LIBIPTC', have)
1026 want_qrencode = get_option('qrencode')
1027 if want_qrencode != 'false' and not skip_deps
1028 libqrencode = dependency('libqrencode',
1029 required : want_qrencode == 'true')
1030 have = libqrencode.found()
1035 conf.set10('HAVE_QRENCODE', have)
1037 want_gcrypt = get_option('gcrypt')
1038 if want_gcrypt != 'false' and not skip_deps
1039 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1040 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1041 have = libgcrypt.found() and libgpg_error.found()
1046 # link to neither of the libs if one is not found
1050 conf.set10('HAVE_GCRYPT', have)
1052 want_gnutls = get_option('gnutls')
1053 if want_gnutls != 'false' and not skip_deps
1054 libgnutls = dependency('gnutls',
1055 version : '>= 3.1.4',
1056 required : want_gnutls == 'true')
1057 have = libgnutls.found()
1062 conf.set10('HAVE_GNUTLS', have)
1064 want_openssl = get_option('openssl')
1065 if want_openssl != 'false' and not skip_deps
1066 libopenssl = dependency('openssl',
1067 version : '>= 1.1.0',
1068 required : want_openssl == 'true')
1069 have = libopenssl.found()
1074 conf.set10('HAVE_OPENSSL', have)
1076 want_elfutils = get_option('elfutils')
1077 if want_elfutils != 'false' and not skip_deps
1078 libdw = dependency('libdw',
1079 required : want_elfutils == 'true')
1080 have = libdw.found()
1085 conf.set10('HAVE_ELFUTILS', have)
1087 want_zlib = get_option('zlib')
1088 if want_zlib != 'false' and not skip_deps
1089 libz = dependency('zlib',
1090 required : want_zlib == 'true')
1096 conf.set10('HAVE_ZLIB', have)
1098 want_bzip2 = get_option('bzip2')
1099 if want_bzip2 != 'false' and not skip_deps
1100 libbzip2 = cc.find_library('bz2',
1101 required : want_bzip2 == 'true')
1102 have = libbzip2.found()
1107 conf.set10('HAVE_BZIP2', have)
1109 want_xz = get_option('xz')
1110 if want_xz != 'false' and not skip_deps
1111 libxz = dependency('liblzma',
1112 required : want_xz == 'true')
1113 have = libxz.found()
1118 conf.set10('HAVE_XZ', have)
1120 want_lz4 = get_option('lz4')
1121 if want_lz4 != 'false' and not skip_deps
1122 liblz4 = dependency('liblz4',
1123 version : '>= 1.3.0',
1124 required : want_lz4 == 'true')
1125 have = liblz4.found()
1130 conf.set10('HAVE_LZ4', have)
1132 want_xkbcommon = get_option('xkbcommon')
1133 if want_xkbcommon != 'false' and not skip_deps
1134 libxkbcommon = dependency('xkbcommon',
1135 version : '>= 0.3.0',
1136 required : want_xkbcommon == 'true')
1137 have = libxkbcommon.found()
1142 conf.set10('HAVE_XKBCOMMON', have)
1144 want_pcre2 = get_option('pcre2')
1145 if want_pcre2 != 'false'
1146 libpcre2 = dependency('libpcre2-8',
1147 required : want_pcre2 == 'true')
1148 have = libpcre2.found()
1153 conf.set10('HAVE_PCRE2', have)
1155 want_glib = get_option('glib')
1156 if want_glib != 'false' and not skip_deps
1157 libglib = dependency('glib-2.0',
1158 version : '>= 2.22.0',
1159 required : want_glib == 'true')
1160 libgobject = dependency('gobject-2.0',
1161 version : '>= 2.22.0',
1162 required : want_glib == 'true')
1163 libgio = dependency('gio-2.0',
1164 required : want_glib == 'true')
1165 have = libglib.found() and libgobject.found() and libgio.found()
1172 conf.set10('HAVE_GLIB', have)
1174 want_dbus = get_option('dbus')
1175 if want_dbus != 'false' and not skip_deps
1176 libdbus = dependency('dbus-1',
1177 version : '>= 1.3.2',
1178 required : want_dbus == 'true')
1179 have = libdbus.found()
1184 conf.set10('HAVE_DBUS', have)
1186 default_dnssec = get_option('default-dnssec')
1188 default_dnssec = 'no'
1190 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1191 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1192 default_dnssec = 'no'
1194 conf.set('DEFAULT_DNSSEC_MODE',
1195 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1196 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1198 dns_over_tls = get_option('dns-over-tls')
1199 if dns_over_tls != 'false'
1200 if dns_over_tls == 'openssl'
1203 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1204 if dns_over_tls == 'gnutls' and not have_gnutls
1205 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1208 if dns_over_tls == 'gnutls' or have_gnutls
1209 have_openssl = false
1211 have_openssl = conf.get('HAVE_OPENSSL') == 1
1212 if dns_over_tls != 'auto' and not have_openssl
1213 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1214 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1217 have = have_gnutls or have_openssl
1221 have_openssl = false
1223 conf.set10('ENABLE_DNS_OVER_TLS', have)
1224 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1225 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1227 default_dns_over_tls = get_option('default-dns-over-tls')
1229 default_dns_over_tls = 'no'
1231 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1232 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.')
1233 default_dns_over_tls = 'no'
1235 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1236 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1237 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1239 want_importd = get_option('importd')
1240 if want_importd != 'false'
1241 have = (conf.get('HAVE_LIBCURL') == 1 and
1242 conf.get('HAVE_ZLIB') == 1 and
1243 conf.get('HAVE_XZ') == 1 and
1244 conf.get('HAVE_GCRYPT') == 1)
1245 if want_importd == 'true' and not have
1246 error('importd support was requested, but dependencies are not available')
1251 conf.set10('ENABLE_IMPORTD', have)
1253 want_remote = get_option('remote')
1254 if want_remote != 'false'
1255 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1256 conf.get('HAVE_LIBCURL') == 1]
1257 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1258 # it's possible to build one without the other. Complain only if
1259 # support was explicitly requested. The auxiliary files like sysusers
1260 # config should be installed when any of the programs are built.
1261 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1262 error('remote support was requested, but dependencies are not available')
1264 have = have_deps[0] or have_deps[1]
1268 conf.set10('ENABLE_REMOTE', have)
1270 foreach term : ['utmp',
1303 have = get_option(term)
1304 name = 'ENABLE_' + term.underscorify().to_upper()
1305 conf.set10(name, have)
1308 foreach tuple : [['nss-mymachines', 'machined'],
1309 ['nss-resolve', 'resolve']]
1310 want = get_option(tuple[0])
1312 have = get_option(tuple[1])
1313 if want == 'true' and not have
1314 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1319 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1320 conf.set10(name, have)
1324 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1325 'ENABLE_NSS_MYMACHINES',
1326 'ENABLE_NSS_RESOLVE',
1327 'ENABLE_NSS_SYSTEMD']
1328 if conf.get(term) == 1
1332 conf.set10('ENABLE_NSS', enable_nss)
1334 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1339 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1341 #####################################################################
1343 if get_option('efi')
1344 efi_arch = host_machine.cpu_family()
1346 if efi_arch == 'x86'
1347 EFI_MACHINE_TYPE_NAME = 'ia32'
1348 gnu_efi_arch = 'ia32'
1349 elif efi_arch == 'x86_64'
1350 EFI_MACHINE_TYPE_NAME = 'x64'
1351 gnu_efi_arch = 'x86_64'
1352 elif efi_arch == 'arm'
1353 EFI_MACHINE_TYPE_NAME = 'arm'
1354 gnu_efi_arch = 'arm'
1355 elif efi_arch == 'aarch64'
1356 EFI_MACHINE_TYPE_NAME = 'aa64'
1357 gnu_efi_arch = 'aarch64'
1359 EFI_MACHINE_TYPE_NAME = ''
1364 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1366 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1370 conf.set10('ENABLE_EFI', have)
1372 #####################################################################
1374 config_h = configure_file(
1375 output : 'config.h',
1376 configuration : conf)
1378 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1380 includes = include_directories('src/basic',
1385 'src/journal-remote',
1389 'src/time-wait-sync',
1395 'src/libsystemd/sd-bus',
1396 'src/libsystemd/sd-device',
1397 'src/libsystemd/sd-event',
1398 'src/libsystemd/sd-hwdb',
1399 'src/libsystemd/sd-id128',
1400 'src/libsystemd/sd-netlink',
1401 'src/libsystemd/sd-network',
1402 'src/libsystemd/sd-resolve',
1403 'src/libsystemd-network',
1406 add_project_arguments('-include', 'config.h', language : 'c')
1408 generate_gperfs = find_program('tools/generate-gperfs.py')
1412 subdir('src/systemd')
1414 subdir('src/libsystemd')
1415 subdir('src/libsystemd-network')
1416 subdir('src/journal')
1419 libjournal_core = static_library(
1421 libjournal_core_sources,
1423 include_directories : includes,
1426 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1427 libsystemd = shared_library(
1430 version : libsystemd_version,
1431 include_directories : includes,
1432 link_args : ['-shared',
1433 '-Wl,--version-script=' + libsystemd_sym_path],
1434 link_with : [libbasic,
1436 link_whole : [libsystemd_static,
1438 dependencies : [threads,
1442 link_depends : libsystemd_sym,
1444 install_dir : rootlibdir)
1446 static_libsystemd = get_option('static-libsystemd')
1447 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1449 install_libsystemd_static = static_library(
1452 journal_client_sources,
1454 basic_gcrypt_sources,
1456 include_directories : includes,
1457 build_by_default : static_libsystemd != 'false',
1458 install : static_libsystemd != 'false',
1459 install_dir : rootlibdir,
1460 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1461 dependencies : [threads,
1470 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1472 ############################################################
1474 # binaries that have --help and are intended for use by humans,
1475 # usually, but not always, installed in /bin.
1476 public_programs = []
1478 subdir('src/libudev')
1479 subdir('src/shared')
1481 subdir('src/shutdown')
1483 subdir('src/network')
1485 subdir('src/analyze')
1486 subdir('src/journal-remote')
1487 subdir('src/coredump')
1488 subdir('src/pstore')
1489 subdir('src/hostname')
1490 subdir('src/import')
1491 subdir('src/kernel-install')
1492 subdir('src/locale')
1493 subdir('src/machine')
1494 subdir('src/portable')
1495 subdir('src/nspawn')
1496 subdir('src/resolve')
1497 subdir('src/timedate')
1498 subdir('src/timesync')
1499 subdir('src/vconsole')
1500 subdir('src/boot/efi')
1507 ############################################################
1509 # only static linking apart from libdl, to make sure that the
1510 # module is linked to all libraries that it uses.
1511 test_dlopen = executable(
1515 include_directories : includes,
1516 link_with : [libbasic],
1517 dependencies : [libdl],
1518 build_by_default : want_tests != 'false')
1520 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1521 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1522 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1523 ['resolve', 'ENABLE_NSS_RESOLVE']]
1525 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1529 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1530 version_script_arg = join_paths(project_source_root, sym)
1532 nss = shared_library(
1534 'src/nss-@0@/nss-@0@.c'.format(module),
1537 include_directories : includes,
1538 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1539 link_args : ['-Wl,-z,nodelete',
1541 '-Wl,--version-script=' + version_script_arg],
1542 link_with : [libsystemd_static,
1545 dependencies : [threads,
1549 install_dir : rootlibdir)
1551 # We cannot use shared_module because it does not support version suffix.
1552 # Unfortunately shared_library insists on creating the symlink…
1553 meson.add_install_script('sh', '-c',
1554 'rm $DESTDIR@0@/libnss_@1@.so'
1555 .format(rootlibdir, module))
1557 if want_tests != 'false'
1558 test('dlopen-nss_' + module,
1560 # path to dlopen must include a slash
1561 args : nss.full_path())
1566 ############################################################
1568 executable('systemd',
1570 include_directories : includes,
1571 link_with : [libcore,
1573 dependencies : [versiondep,
1580 install_rpath : rootlibexecdir,
1582 install_dir : rootlibexecdir)
1584 meson.add_install_script(meson_make_symlink,
1585 join_paths(rootlibexecdir, 'systemd'),
1586 join_paths(rootsbindir, 'init'))
1588 exe = executable('systemd-analyze',
1589 systemd_analyze_sources,
1590 include_directories : includes,
1591 link_with : [libcore,
1593 dependencies : [versiondep,
1600 install_rpath : rootlibexecdir,
1602 public_programs += exe
1604 executable('systemd-journald',
1605 systemd_journald_sources,
1606 include_directories : includes,
1607 link_with : [libjournal_core,
1609 dependencies : [threads,
1613 install_rpath : rootlibexecdir,
1615 install_dir : rootlibexecdir)
1617 exe = executable('systemd-cat',
1618 systemd_cat_sources,
1619 include_directories : includes,
1620 link_with : [libjournal_core,
1622 dependencies : [threads],
1623 install_rpath : rootlibexecdir,
1625 public_programs += exe
1627 exe = executable('journalctl',
1629 include_directories : includes,
1630 link_with : [libshared],
1631 dependencies : [threads,
1636 install_rpath : rootlibexecdir,
1638 install_dir : rootbindir)
1639 public_programs += exe
1641 executable('systemd-getty-generator',
1642 'src/getty-generator/getty-generator.c',
1643 include_directories : includes,
1644 link_with : [libshared],
1645 install_rpath : rootlibexecdir,
1647 install_dir : systemgeneratordir)
1649 executable('systemd-debug-generator',
1650 'src/debug-generator/debug-generator.c',
1651 include_directories : includes,
1652 link_with : [libshared],
1653 install_rpath : rootlibexecdir,
1655 install_dir : systemgeneratordir)
1657 executable('systemd-run-generator',
1658 'src/run-generator/run-generator.c',
1659 include_directories : includes,
1660 link_with : [libshared],
1661 install_rpath : rootlibexecdir,
1663 install_dir : systemgeneratordir)
1665 executable('systemd-fstab-generator',
1666 'src/fstab-generator/fstab-generator.c',
1667 include_directories : includes,
1668 link_with : [libcore_shared,
1670 install_rpath : rootlibexecdir,
1672 install_dir : systemgeneratordir)
1674 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1675 executable('30-systemd-environment-d-generator',
1676 'src/environment-d-generator/environment-d-generator.c',
1677 include_directories : includes,
1678 link_with : [libshared],
1679 install_rpath : rootlibexecdir,
1681 install_dir : userenvgeneratordir)
1683 meson.add_install_script(meson_make_symlink,
1684 join_paths(sysconfdir, 'environment'),
1685 join_paths(environmentdir, '99-environment.conf'))
1688 if conf.get('ENABLE_HIBERNATE') == 1
1689 executable('systemd-hibernate-resume-generator',
1690 'src/hibernate-resume/hibernate-resume-generator.c',
1691 include_directories : includes,
1692 link_with : [libshared],
1693 install_rpath : rootlibexecdir,
1695 install_dir : systemgeneratordir)
1697 executable('systemd-hibernate-resume',
1698 'src/hibernate-resume/hibernate-resume.c',
1699 include_directories : includes,
1700 link_with : [libshared],
1701 install_rpath : rootlibexecdir,
1703 install_dir : rootlibexecdir)
1706 if conf.get('HAVE_BLKID') == 1
1707 executable('systemd-gpt-auto-generator',
1708 'src/gpt-auto-generator/gpt-auto-generator.c',
1709 'src/shared/blkid-util.h',
1710 include_directories : includes,
1711 link_with : [libshared],
1712 dependencies : libblkid,
1713 install_rpath : rootlibexecdir,
1715 install_dir : systemgeneratordir)
1717 exe = executable('systemd-dissect',
1718 'src/dissect/dissect.c',
1719 include_directories : includes,
1720 link_with : [libshared],
1721 install_rpath : rootlibexecdir,
1723 install_dir : rootlibexecdir)
1724 public_programs += exe
1727 if conf.get('ENABLE_RESOLVE') == 1
1728 executable('systemd-resolved',
1729 systemd_resolved_sources,
1730 include_directories : includes,
1731 link_with : [libshared,
1733 libsystemd_resolve_core],
1734 dependencies : systemd_resolved_dependencies,
1735 install_rpath : rootlibexecdir,
1737 install_dir : rootlibexecdir)
1739 exe = executable('resolvectl',
1741 include_directories : includes,
1742 link_with : [libshared,
1744 libsystemd_resolve_core],
1745 dependencies : [threads,
1749 install_rpath : rootlibexecdir,
1751 public_programs += exe
1753 meson.add_install_script(meson_make_symlink,
1754 join_paths(bindir, 'resolvectl'),
1755 join_paths(rootsbindir, 'resolvconf'))
1757 meson.add_install_script(meson_make_symlink,
1758 join_paths(bindir, 'resolvectl'),
1759 join_paths(bindir, 'systemd-resolve'))
1762 if conf.get('ENABLE_LOGIND') == 1
1763 executable('systemd-logind',
1764 systemd_logind_sources,
1765 include_directories : includes,
1766 link_with : [liblogind_core,
1768 dependencies : [threads,
1770 install_rpath : rootlibexecdir,
1772 install_dir : rootlibexecdir)
1774 exe = executable('loginctl',
1776 include_directories : includes,
1777 link_with : [libshared],
1778 dependencies : [threads,
1781 install_rpath : rootlibexecdir,
1783 install_dir : rootbindir)
1784 public_programs += exe
1786 exe = executable('systemd-inhibit',
1787 'src/login/inhibit.c',
1788 include_directories : includes,
1789 link_with : [libshared],
1790 install_rpath : rootlibexecdir,
1792 install_dir : rootbindir)
1793 public_programs += exe
1795 if conf.get('HAVE_PAM') == 1
1796 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1797 pam_systemd = shared_library(
1801 include_directories : includes,
1802 link_args : ['-shared',
1803 '-Wl,--version-script=' + version_script_arg],
1804 link_with : [libsystemd_static,
1806 dependencies : [threads,
1809 link_depends : pam_systemd_sym,
1811 install_dir : pamlibdir)
1813 if want_tests != 'false'
1814 test('dlopen-pam_systemd',
1816 # path to dlopen must include a slash
1817 args : pam_systemd.full_path())
1821 executable('systemd-user-runtime-dir',
1822 user_runtime_dir_sources,
1823 include_directories : includes,
1824 link_with : [libshared],
1825 install_rpath : rootlibexecdir,
1827 install_dir : rootlibexecdir)
1830 if conf.get('HAVE_PAM') == 1
1831 executable('systemd-user-sessions',
1832 'src/user-sessions/user-sessions.c',
1833 include_directories : includes,
1834 link_with : [libshared],
1835 install_rpath : rootlibexecdir,
1837 install_dir : rootlibexecdir)
1840 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1841 exe = executable('bootctl',
1842 'src/boot/bootctl.c',
1843 include_directories : includes,
1844 link_with : [libshared],
1845 dependencies : [libblkid],
1846 install_rpath : rootlibexecdir,
1848 public_programs += exe
1850 executable('systemd-bless-boot',
1851 'src/boot/bless-boot.c',
1852 include_directories : includes,
1853 link_with : [libshared],
1854 dependencies : [libblkid],
1855 install_rpath : rootlibexecdir,
1857 install_dir : rootlibexecdir)
1859 executable('systemd-bless-boot-generator',
1860 'src/boot/bless-boot-generator.c',
1861 include_directories : includes,
1862 link_with : [libshared],
1863 install_rpath : rootlibexecdir,
1865 install_dir : systemgeneratordir)
1868 executable('systemd-boot-check-no-failures',
1869 'src/boot/boot-check-no-failures.c',
1870 include_directories : includes,
1871 link_with : [libshared],
1872 dependencies : [libblkid],
1873 install_rpath : rootlibexecdir,
1875 install_dir : rootlibexecdir)
1877 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1878 include_directories : includes,
1879 link_with : [libshared],
1880 dependencies : [threads],
1881 install_rpath : rootlibexecdir,
1883 public_programs += exe
1886 if get_option('link-systemctl-shared')
1887 systemctl_link_with = [libshared]
1889 systemctl_link_with = [libsystemd_static,
1895 exe = executable('systemctl',
1896 'src/systemctl/systemctl.c',
1897 'src/systemctl/sysv-compat.h',
1898 'src/systemctl/sysv-compat.c',
1899 include_directories : includes,
1900 link_with : systemctl_link_with,
1901 dependencies : [threads,
1906 install_rpath : rootlibexecdir,
1908 install_dir : rootbindir)
1909 public_programs += exe
1911 if conf.get('ENABLE_PORTABLED') == 1
1912 executable('systemd-portabled',
1913 systemd_portabled_sources,
1914 include_directories : includes,
1915 link_with : [libshared],
1916 dependencies : [threads],
1917 install_rpath : rootlibexecdir,
1919 install_dir : rootlibexecdir)
1921 exe = executable('portablectl', 'src/portable/portablectl.c',
1922 include_directories : includes,
1923 link_with : [libshared],
1924 dependencies : [threads],
1925 install_rpath : rootlibexecdir,
1927 install_dir : rootbindir)
1928 public_programs += exe
1931 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1932 meson.add_install_script(meson_make_symlink,
1933 join_paths(rootbindir, 'systemctl'),
1934 join_paths(rootsbindir, alias))
1937 if conf.get('ENABLE_BACKLIGHT') == 1
1938 executable('systemd-backlight',
1939 'src/backlight/backlight.c',
1940 include_directories : includes,
1941 link_with : [libshared],
1942 install_rpath : rootlibexecdir,
1944 install_dir : rootlibexecdir)
1947 if conf.get('ENABLE_RFKILL') == 1
1948 executable('systemd-rfkill',
1949 'src/rfkill/rfkill.c',
1950 include_directories : includes,
1951 link_with : [libshared],
1952 install_rpath : rootlibexecdir,
1954 install_dir : rootlibexecdir)
1957 executable('systemd-system-update-generator',
1958 'src/system-update-generator/system-update-generator.c',
1959 include_directories : includes,
1960 link_with : [libshared],
1961 install_rpath : rootlibexecdir,
1963 install_dir : systemgeneratordir)
1965 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1966 executable('systemd-cryptsetup',
1967 'src/cryptsetup/cryptsetup.c',
1968 include_directories : includes,
1969 link_with : [libshared],
1970 dependencies : [libcryptsetup],
1971 install_rpath : rootlibexecdir,
1973 install_dir : rootlibexecdir)
1975 executable('systemd-cryptsetup-generator',
1976 'src/cryptsetup/cryptsetup-generator.c',
1977 include_directories : includes,
1978 link_with : [libshared],
1979 dependencies : [libcryptsetup],
1980 install_rpath : rootlibexecdir,
1982 install_dir : systemgeneratordir)
1984 executable('systemd-veritysetup',
1985 'src/veritysetup/veritysetup.c',
1986 include_directories : includes,
1987 link_with : [libshared],
1988 dependencies : [libcryptsetup],
1989 install_rpath : rootlibexecdir,
1991 install_dir : rootlibexecdir)
1993 executable('systemd-veritysetup-generator',
1994 'src/veritysetup/veritysetup-generator.c',
1995 include_directories : includes,
1996 link_with : [libshared],
1997 dependencies : [libcryptsetup],
1998 install_rpath : rootlibexecdir,
2000 install_dir : systemgeneratordir)
2003 if conf.get('HAVE_SYSV_COMPAT') == 1
2004 executable('systemd-sysv-generator',
2005 'src/sysv-generator/sysv-generator.c',
2006 include_directories : includes,
2007 link_with : [libshared],
2008 install_rpath : rootlibexecdir,
2010 install_dir : systemgeneratordir)
2012 executable('systemd-rc-local-generator',
2013 'src/rc-local-generator/rc-local-generator.c',
2014 include_directories : includes,
2015 link_with : [libshared],
2016 install_rpath : rootlibexecdir,
2018 install_dir : systemgeneratordir)
2021 if conf.get('ENABLE_HOSTNAMED') == 1
2022 executable('systemd-hostnamed',
2023 'src/hostname/hostnamed.c',
2024 include_directories : includes,
2025 link_with : [libshared],
2026 install_rpath : rootlibexecdir,
2028 install_dir : rootlibexecdir)
2030 exe = executable('hostnamectl',
2031 'src/hostname/hostnamectl.c',
2032 include_directories : includes,
2033 link_with : [libshared],
2034 install_rpath : rootlibexecdir,
2036 public_programs += exe
2039 if conf.get('ENABLE_LOCALED') == 1
2040 if conf.get('HAVE_XKBCOMMON') == 1
2041 # logind will load libxkbcommon.so dynamically on its own
2047 executable('systemd-localed',
2048 systemd_localed_sources,
2049 include_directories : includes,
2050 link_with : [libshared],
2051 dependencies : deps,
2052 install_rpath : rootlibexecdir,
2054 install_dir : rootlibexecdir)
2056 exe = executable('localectl',
2058 include_directories : includes,
2059 link_with : [libshared],
2060 install_rpath : rootlibexecdir,
2062 public_programs += exe
2065 if conf.get('ENABLE_TIMEDATED') == 1
2066 executable('systemd-timedated',
2067 'src/timedate/timedated.c',
2068 include_directories : includes,
2069 link_with : [libshared],
2070 install_rpath : rootlibexecdir,
2072 install_dir : rootlibexecdir)
2075 if conf.get('ENABLE_TIMEDATECTL') == 1
2076 exe = executable('timedatectl',
2077 'src/timedate/timedatectl.c',
2078 include_directories : includes,
2079 install_rpath : rootlibexecdir,
2080 link_with : [libshared],
2081 dependencies : [libm],
2083 public_programs += exe
2086 if conf.get('ENABLE_TIMESYNCD') == 1
2087 executable('systemd-timesyncd',
2088 systemd_timesyncd_sources,
2089 include_directories : includes,
2090 link_with : [libshared],
2091 dependencies : [threads,
2093 install_rpath : rootlibexecdir,
2095 install_dir : rootlibexecdir)
2097 executable('systemd-time-wait-sync',
2098 'src/time-wait-sync/time-wait-sync.c',
2099 include_directories : includes,
2100 link_with : [libshared],
2101 install_rpath : rootlibexecdir,
2103 install_dir : rootlibexecdir)
2106 if conf.get('ENABLE_MACHINED') == 1
2107 executable('systemd-machined',
2108 systemd_machined_sources,
2109 include_directories : includes,
2110 link_with : [libmachine_core,
2112 install_rpath : rootlibexecdir,
2114 install_dir : rootlibexecdir)
2116 exe = executable('machinectl',
2117 'src/machine/machinectl.c',
2118 include_directories : includes,
2119 link_with : [libshared],
2120 dependencies : [threads,
2123 install_rpath : rootlibexecdir,
2125 install_dir : rootbindir)
2126 public_programs += exe
2129 if conf.get('ENABLE_IMPORTD') == 1
2130 executable('systemd-importd',
2131 systemd_importd_sources,
2132 include_directories : includes,
2133 link_with : [libshared],
2134 dependencies : [threads],
2135 install_rpath : rootlibexecdir,
2137 install_dir : rootlibexecdir)
2139 systemd_pull = executable('systemd-pull',
2140 systemd_pull_sources,
2141 include_directories : includes,
2142 link_with : [libshared],
2143 dependencies : [versiondep,
2149 install_rpath : rootlibexecdir,
2151 install_dir : rootlibexecdir)
2153 systemd_import = executable('systemd-import',
2154 systemd_import_sources,
2155 include_directories : includes,
2156 link_with : [libshared],
2157 dependencies : [libcurl,
2161 install_rpath : rootlibexecdir,
2163 install_dir : rootlibexecdir)
2165 systemd_import_fs = executable('systemd-import-fs',
2166 systemd_import_fs_sources,
2167 include_directories : includes,
2168 link_with : [libshared],
2169 install_rpath : rootlibexecdir,
2171 install_dir : rootlibexecdir)
2173 systemd_export = executable('systemd-export',
2174 systemd_export_sources,
2175 include_directories : includes,
2176 link_with : [libshared],
2177 dependencies : [libcurl,
2181 install_rpath : rootlibexecdir,
2183 install_dir : rootlibexecdir)
2185 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2188 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2189 exe = executable('systemd-journal-upload',
2190 systemd_journal_upload_sources,
2191 include_directories : includes,
2192 link_with : [libshared],
2193 dependencies : [versiondep,
2199 install_rpath : rootlibexecdir,
2201 install_dir : rootlibexecdir)
2202 public_programs += exe
2205 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2206 s_j_remote = executable('systemd-journal-remote',
2207 systemd_journal_remote_sources,
2208 include_directories : includes,
2209 link_with : [libshared,
2210 libsystemd_journal_remote],
2211 dependencies : [threads,
2216 install_rpath : rootlibexecdir,
2218 install_dir : rootlibexecdir)
2220 s_j_gatewayd = executable('systemd-journal-gatewayd',
2221 systemd_journal_gatewayd_sources,
2222 include_directories : includes,
2223 link_with : [libshared],
2224 dependencies : [threads,
2229 install_rpath : rootlibexecdir,
2231 install_dir : rootlibexecdir)
2232 public_programs += [s_j_remote, s_j_gatewayd]
2235 if conf.get('ENABLE_COREDUMP') == 1
2236 executable('systemd-coredump',
2237 systemd_coredump_sources,
2238 include_directories : includes,
2239 link_with : [libshared],
2240 dependencies : [threads,
2245 install_rpath : rootlibexecdir,
2247 install_dir : rootlibexecdir)
2249 exe = executable('coredumpctl',
2250 coredumpctl_sources,
2251 include_directories : includes,
2252 link_with : [libshared],
2253 dependencies : [threads,
2256 install_rpath : rootlibexecdir,
2258 public_programs += exe
2261 if conf.get('ENABLE_PSTORE') == 1
2262 executable('systemd-pstore',
2263 systemd_pstore_sources,
2264 include_directories : includes,
2265 link_with : [libshared],
2266 dependencies : [threads,
2271 install_rpath : rootlibexecdir,
2273 install_dir : rootlibexecdir)
2276 if conf.get('ENABLE_BINFMT') == 1
2277 exe = executable('systemd-binfmt',
2278 'src/binfmt/binfmt.c',
2279 include_directories : includes,
2280 link_with : [libshared],
2281 install_rpath : rootlibexecdir,
2283 install_dir : rootlibexecdir)
2284 public_programs += exe
2286 meson.add_install_script('sh', '-c',
2287 mkdir_p.format(binfmtdir))
2288 meson.add_install_script('sh', '-c',
2289 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2292 if conf.get('ENABLE_VCONSOLE') == 1
2293 executable('systemd-vconsole-setup',
2294 'src/vconsole/vconsole-setup.c',
2295 include_directories : includes,
2296 link_with : [libshared],
2297 install_rpath : rootlibexecdir,
2299 install_dir : rootlibexecdir)
2302 if conf.get('ENABLE_RANDOMSEED') == 1
2303 executable('systemd-random-seed',
2304 'src/random-seed/random-seed.c',
2305 include_directories : includes,
2306 link_with : [libshared],
2307 install_rpath : rootlibexecdir,
2309 install_dir : rootlibexecdir)
2312 if conf.get('ENABLE_FIRSTBOOT') == 1
2313 executable('systemd-firstboot',
2314 'src/firstboot/firstboot.c',
2315 include_directories : includes,
2316 link_with : [libshared],
2317 dependencies : [libcrypt],
2318 install_rpath : rootlibexecdir,
2320 install_dir : rootbindir)
2323 executable('systemd-remount-fs',
2324 'src/remount-fs/remount-fs.c',
2325 include_directories : includes,
2326 link_with : [libcore_shared,
2328 install_rpath : rootlibexecdir,
2330 install_dir : rootlibexecdir)
2332 executable('systemd-machine-id-setup',
2333 'src/machine-id-setup/machine-id-setup-main.c',
2334 include_directories : includes,
2335 link_with : [libcore_shared,
2337 install_rpath : rootlibexecdir,
2339 install_dir : rootbindir)
2341 executable('systemd-fsck',
2343 include_directories : includes,
2344 link_with : [libshared],
2345 install_rpath : rootlibexecdir,
2347 install_dir : rootlibexecdir)
2349 executable('systemd-growfs',
2350 'src/partition/growfs.c',
2351 include_directories : includes,
2352 link_with : [libshared],
2353 dependencies : [libcryptsetup],
2354 install_rpath : rootlibexecdir,
2356 install_dir : rootlibexecdir)
2358 executable('systemd-makefs',
2359 'src/partition/makefs.c',
2360 include_directories : includes,
2361 link_with : [libshared],
2362 install_rpath : rootlibexecdir,
2364 install_dir : rootlibexecdir)
2366 executable('systemd-sleep',
2367 'src/sleep/sleep.c',
2368 include_directories : includes,
2369 link_with : [libshared],
2370 install_rpath : rootlibexecdir,
2372 install_dir : rootlibexecdir)
2374 install_data('src/sleep/sleep.conf',
2375 install_dir : pkgsysconfdir)
2377 exe = executable('systemd-sysctl',
2378 'src/sysctl/sysctl.c',
2379 include_directories : includes,
2380 link_with : [libshared],
2381 install_rpath : rootlibexecdir,
2383 install_dir : rootlibexecdir)
2384 public_programs += exe
2386 executable('systemd-ac-power',
2387 'src/ac-power/ac-power.c',
2388 include_directories : includes,
2389 link_with : [libshared],
2390 install_rpath : rootlibexecdir,
2392 install_dir : rootlibexecdir)
2394 exe = executable('systemd-detect-virt',
2395 'src/detect-virt/detect-virt.c',
2396 include_directories : includes,
2397 link_with : [libshared],
2398 install_rpath : rootlibexecdir,
2400 public_programs += exe
2402 exe = executable('systemd-delta',
2403 'src/delta/delta.c',
2404 include_directories : includes,
2405 link_with : [libshared],
2406 install_rpath : rootlibexecdir,
2408 public_programs += exe
2410 exe = executable('systemd-escape',
2411 'src/escape/escape.c',
2412 include_directories : includes,
2413 link_with : [libshared],
2414 install_rpath : rootlibexecdir,
2416 install_dir : rootbindir)
2417 public_programs += exe
2419 exe = executable('systemd-notify',
2420 'src/notify/notify.c',
2421 include_directories : includes,
2422 link_with : [libshared],
2423 install_rpath : rootlibexecdir,
2425 install_dir : rootbindir)
2426 public_programs += exe
2428 executable('systemd-volatile-root',
2429 'src/volatile-root/volatile-root.c',
2430 include_directories : includes,
2431 link_with : [libshared],
2432 install_rpath : rootlibexecdir,
2434 install_dir : rootlibexecdir)
2436 executable('systemd-cgroups-agent',
2437 'src/cgroups-agent/cgroups-agent.c',
2438 include_directories : includes,
2439 link_with : [libshared],
2440 install_rpath : rootlibexecdir,
2442 install_dir : rootlibexecdir)
2444 exe = executable('systemd-id128',
2445 'src/id128/id128.c',
2446 include_directories : includes,
2447 link_with : [libshared],
2448 install_rpath : rootlibexecdir,
2450 public_programs += exe
2452 exe = executable('systemd-path',
2454 include_directories : includes,
2455 link_with : [libshared],
2456 install_rpath : rootlibexecdir,
2458 public_programs += exe
2460 exe = executable('systemd-ask-password',
2461 'src/ask-password/ask-password.c',
2462 include_directories : includes,
2463 link_with : [libshared],
2464 install_rpath : rootlibexecdir,
2466 install_dir : rootbindir)
2467 public_programs += exe
2469 executable('systemd-reply-password',
2470 'src/reply-password/reply-password.c',
2471 include_directories : includes,
2472 link_with : [libshared],
2473 install_rpath : rootlibexecdir,
2475 install_dir : rootlibexecdir)
2477 exe = executable('systemd-tty-ask-password-agent',
2478 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2479 include_directories : includes,
2480 link_with : [libshared],
2481 install_rpath : rootlibexecdir,
2483 install_dir : rootbindir)
2484 public_programs += exe
2486 exe = executable('systemd-cgls',
2488 include_directories : includes,
2489 link_with : [libshared],
2490 install_rpath : rootlibexecdir,
2492 public_programs += exe
2494 exe = executable('systemd-cgtop',
2495 'src/cgtop/cgtop.c',
2496 include_directories : includes,
2497 link_with : [libshared],
2498 install_rpath : rootlibexecdir,
2500 public_programs += exe
2502 executable('systemd-initctl',
2503 'src/initctl/initctl.c',
2504 include_directories : includes,
2505 link_with : [libshared],
2506 install_rpath : rootlibexecdir,
2508 install_dir : rootlibexecdir)
2510 exe = executable('systemd-mount',
2511 'src/mount/mount-tool.c',
2512 include_directories : includes,
2513 link_with : [libshared],
2514 dependencies: [libmount],
2515 install_rpath : rootlibexecdir,
2517 public_programs += exe
2519 meson.add_install_script(meson_make_symlink,
2520 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2522 exe = executable('systemd-run',
2524 include_directories : includes,
2525 link_with : [libshared],
2526 install_rpath : rootlibexecdir,
2528 public_programs += exe
2530 exe = executable('systemd-stdio-bridge',
2531 'src/stdio-bridge/stdio-bridge.c',
2532 include_directories : includes,
2533 link_with : [libshared],
2534 dependencies : [versiondep],
2535 install_rpath : rootlibexecdir,
2537 public_programs += exe
2539 exe = executable('busctl',
2540 'src/busctl/busctl.c',
2541 'src/busctl/busctl-introspect.c',
2542 'src/busctl/busctl-introspect.h',
2543 include_directories : includes,
2544 link_with : [libshared],
2545 install_rpath : rootlibexecdir,
2547 public_programs += exe
2549 if conf.get('ENABLE_SYSUSERS') == 1
2550 exe = executable('systemd-sysusers',
2551 'src/sysusers/sysusers.c',
2552 include_directories : includes,
2553 link_with : [libshared],
2554 install_rpath : rootlibexecdir,
2556 install_dir : rootbindir)
2557 public_programs += exe
2560 if conf.get('ENABLE_TMPFILES') == 1
2561 exe = executable('systemd-tmpfiles',
2562 'src/tmpfiles/tmpfiles.c',
2563 include_directories : includes,
2564 link_with : [libshared],
2565 dependencies : [libacl],
2566 install_rpath : rootlibexecdir,
2568 install_dir : rootbindir)
2569 public_programs += exe
2571 if want_tests != 'false'
2572 test('test-systemd-tmpfiles',
2573 test_systemd_tmpfiles_py,
2574 # https://github.com/mesonbuild/meson/issues/2681
2575 args : exe.full_path())
2579 if conf.get('ENABLE_HWDB') == 1
2580 exe = executable('systemd-hwdb',
2582 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2583 include_directories : includes,
2584 link_with : [libudev_static],
2585 install_rpath : udev_rpath,
2587 install_dir : rootbindir)
2588 public_programs += exe
2591 if conf.get('ENABLE_QUOTACHECK') == 1
2592 executable('systemd-quotacheck',
2593 'src/quotacheck/quotacheck.c',
2594 include_directories : includes,
2595 link_with : [libshared],
2596 install_rpath : rootlibexecdir,
2598 install_dir : rootlibexecdir)
2601 exe = executable('systemd-socket-proxyd',
2602 'src/socket-proxy/socket-proxyd.c',
2603 include_directories : includes,
2604 link_with : [libshared],
2605 dependencies : [threads],
2606 install_rpath : rootlibexecdir,
2608 install_dir : rootlibexecdir)
2609 public_programs += exe
2611 exe = executable('systemd-udevd',
2612 systemd_udevd_sources,
2613 include_directories : includes,
2614 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2615 link_with : [libudev_core,
2618 dependencies : [versiondep,
2624 install_rpath : udev_rpath,
2626 install_dir : rootlibexecdir)
2627 public_programs += exe
2629 exe = executable('udevadm',
2631 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2632 include_directories : includes,
2633 link_with : [libudev_core,
2636 dependencies : [versiondep,
2642 install_rpath : udev_rpath,
2644 install_dir : rootbindir)
2645 public_programs += exe
2647 executable('systemd-shutdown',
2648 systemd_shutdown_sources,
2649 include_directories : includes,
2650 link_with : [libcore_shared,
2652 dependencies : [libmount],
2653 install_rpath : rootlibexecdir,
2655 install_dir : rootlibexecdir)
2657 executable('systemd-update-done',
2658 'src/update-done/update-done.c',
2659 include_directories : includes,
2660 link_with : [libshared],
2661 install_rpath : rootlibexecdir,
2663 install_dir : rootlibexecdir)
2665 executable('systemd-update-utmp',
2666 'src/update-utmp/update-utmp.c',
2667 include_directories : includes,
2668 link_with : [libshared],
2669 dependencies : [libaudit],
2670 install_rpath : rootlibexecdir,
2672 install_dir : rootlibexecdir)
2674 if conf.get('HAVE_KMOD') == 1
2675 executable('systemd-modules-load',
2676 'src/modules-load/modules-load.c',
2677 include_directories : includes,
2678 link_with : [libshared],
2679 dependencies : [libkmod],
2680 install_rpath : rootlibexecdir,
2682 install_dir : rootlibexecdir)
2684 meson.add_install_script('sh', '-c',
2685 mkdir_p.format(modulesloaddir))
2686 meson.add_install_script('sh', '-c',
2687 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2690 exe = executable('systemd-nspawn',
2691 systemd_nspawn_sources,
2692 include_directories : includes,
2693 link_with : [libcore_shared,
2696 dependencies : [libblkid,
2698 install_rpath : rootlibexecdir,
2700 public_programs += exe
2702 if conf.get('ENABLE_NETWORKD') == 1
2703 executable('systemd-networkd',
2704 systemd_networkd_sources,
2705 include_directories : includes,
2706 link_with : [libnetworkd_core,
2710 dependencies : [threads],
2711 install_rpath : rootlibexecdir,
2713 install_dir : rootlibexecdir)
2715 executable('systemd-networkd-wait-online',
2716 systemd_networkd_wait_online_sources,
2717 include_directories : includes,
2718 link_with : [libnetworkd_core,
2720 install_rpath : rootlibexecdir,
2722 install_dir : rootlibexecdir)
2724 exe = executable('networkctl',
2726 include_directories : includes,
2727 link_with : [libsystemd_network,
2729 install_rpath : rootlibexecdir,
2731 install_dir : rootbindir)
2732 public_programs += exe
2734 executable('systemd-network-generator',
2735 network_generator_sources,
2736 include_directories : includes,
2737 link_with : [libshared],
2738 install_rpath : rootlibexecdir,
2740 install_dir : rootlibexecdir)
2743 executable('systemd-sulogin-shell',
2744 ['src/sulogin-shell/sulogin-shell.c'],
2745 include_directories : includes,
2746 link_with : [libshared],
2747 install_rpath : rootlibexecdir,
2749 install_dir : rootlibexecdir)
2751 ############################################################
2754 'systemd-runtest.env',
2755 output : 'systemd-runtest.env',
2756 command : ['sh', '-c', '{ ' +
2757 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2758 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2760 build_by_default : true)
2762 foreach tuple : tests
2764 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2765 dependencies = tuple[2]
2766 condition = tuple.length() >= 4 ? tuple[3] : ''
2767 type = tuple.length() >= 5 ? tuple[4] : ''
2768 defs = tuple.length() >= 6 ? tuple[5] : []
2769 incs = tuple.length() >= 7 ? tuple[6] : includes
2772 name = sources[0].split('/')[-1].split('.')[0]
2773 if type.startswith('timeout=')
2774 timeout = type.split('=')[1].to_int()
2778 if condition == '' or conf.get(condition) == 1
2782 include_directories : incs,
2783 link_with : link_with,
2784 dependencies : [versiondep,
2787 build_by_default : want_tests != 'false',
2788 install_rpath : rootlibexecdir,
2789 install : install_tests,
2790 install_dir : join_paths(testsdir, type))
2793 message('@0@ is a manual test'.format(name))
2794 elif type == 'unsafe' and want_tests != 'unsafe'
2795 message('@0@ is an unsafe test'.format(name))
2796 elif want_tests != 'false'
2802 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2807 'test-libsystemd-sym',
2808 test_libsystemd_sym_c,
2809 include_directories : includes,
2810 link_with : [libsystemd],
2811 build_by_default : want_tests != 'false',
2812 install : install_tests,
2813 install_dir : testsdir)
2814 if want_tests != 'false'
2815 test('test-libsystemd-sym', exe)
2819 'test-libsystemd-static-sym',
2820 test_libsystemd_sym_c,
2821 include_directories : includes,
2822 link_with : [install_libsystemd_static],
2823 dependencies : [threads], # threads is already included in dependencies on the library,
2824 # but does not seem to get propagated. Add here as a work-around.
2825 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2826 install : install_tests and static_libsystemd_pic,
2827 install_dir : testsdir)
2828 if want_tests != 'false' and static_libsystemd_pic
2829 test('test-libsystemd-static-sym', exe)
2835 include_directories : includes,
2836 c_args : '-Wno-deprecated-declarations',
2837 link_with : [libudev],
2838 build_by_default : want_tests != 'false',
2839 install : install_tests,
2840 install_dir : testsdir)
2841 if want_tests != 'false'
2842 test('test-libudev-sym', exe)
2846 'test-libudev-static-sym',
2848 include_directories : includes,
2849 c_args : '-Wno-deprecated-declarations',
2850 link_with : [install_libudev_static],
2851 build_by_default : want_tests != 'false' and static_libudev_pic,
2852 install : install_tests and static_libudev_pic,
2853 install_dir : testsdir)
2854 if want_tests != 'false' and static_libudev_pic
2855 test('test-libudev-static-sym', exe)
2858 ############################################################
2862 if get_option('tests') != 'false'
2863 foreach tuple : fuzzers
2865 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2866 dependencies = tuple[2]
2867 defs = tuple.length() >= 4 ? tuple[3] : []
2868 incs = tuple.length() >= 5 ? tuple[4] : includes
2871 if want_ossfuzz or want_fuzzbuzz
2872 dependencies += fuzzing_engine
2874 if fuzzing_engine.found()
2875 dependencies += fuzzing_engine
2877 link_args += ['-fsanitize=fuzzer']
2880 sources += 'src/fuzz/fuzz-main.c'
2884 sources += 'src/fuzz/fuzzer-entry-point.c'
2887 name = sources[0].split('/')[-1].split('.')[0]
2889 fuzzer_exes += executable(
2892 include_directories : [incs, include_directories('src/fuzz')],
2893 link_with : link_with,
2894 dependencies : dependencies,
2896 link_args: link_args,
2901 run_target('fuzzers',
2902 depends : fuzzer_exes,
2905 ############################################################
2907 make_directive_index_py = find_program('tools/make-directive-index.py')
2908 make_man_index_py = find_program('tools/make-man-index.py')
2909 xml_helper_py = find_program('tools/xml_helper.py')
2910 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2914 subdir('sysusers.d')
2915 subdir('tmpfiles.d')
2920 subdir('shell-completion/bash')
2921 subdir('shell-completion/zsh')
2922 subdir('docs/sysvinit')
2923 subdir('docs/var-log')
2925 install_subdir('factory/etc',
2926 install_dir : factorydir)
2928 install_data('xorg/50-systemd-user.sh',
2929 install_dir : xinitrcdir)
2930 install_data('modprobe.d/systemd.conf',
2931 install_dir : modprobedir)
2932 install_data('LICENSE.GPL2',
2936 'docs/CODING_STYLE.md',
2937 'docs/DISTRO_PORTING.md',
2938 'docs/ENVIRONMENT.md',
2940 'docs/TRANSIENT-SETTINGS.md',
2941 'docs/TRANSLATORS.md',
2942 'docs/UIDS-GIDS.md',
2943 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2944 install_dir : docdir)
2946 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2947 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2949 ############################################################
2951 meson_check_help = find_program('tools/meson-check-help.sh')
2953 foreach exec : public_programs
2954 name = exec.full_path().split('/')[-1]
2955 if want_tests != 'false'
2956 test('check-help-' + name,
2958 args : exec.full_path())
2962 ############################################################
2964 check_directives_sh = find_program('tools/check-directives.sh')
2966 if want_tests != 'false'
2967 test('check-directives',
2968 check_directives_sh,
2969 args : project_source_root)
2972 ############################################################
2974 # Enable tests for all supported sanitizers
2975 foreach tuple : sanitizers
2976 sanitizer = tuple[0]
2979 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2981 foreach p : fuzz_regression_tests
2982 b = p.split('/')[-2]
2983 c = p.split('/')[-1]
2985 name = '@0@:@1@'.format(b, sanitizer)
2988 if want_tests == 'false'
2989 message('Not compiling @0@ because tests is set to false'.format(name))
2991 exe = custom_target(
2995 command : [env, 'ln', '-fs',
2996 join_paths(build.full_path(), b),
2998 build_by_default : true)
3000 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3005 if want_tests != 'false' and slow_tests
3006 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3008 args : [exe.full_path(),
3009 join_paths(project_source_root, p)])
3016 ############################################################
3019 all_files = run_command(
3021 ['--git-dir=@0@/.git'.format(project_source_root),
3024 all_files = files(all_files.stdout().split())
3029 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3032 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3036 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3039 command : [meson_git_contrib_sh])
3043 git_head = run_command(
3045 ['--git-dir=@0@/.git'.format(project_source_root),
3046 'rev-parse', 'HEAD']).stdout().strip()
3047 git_head_short = run_command(
3049 ['--git-dir=@0@/.git'.format(project_source_root),
3050 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3054 command : ['git', 'archive',
3055 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3057 '--prefix', 'systemd-@0@/'.format(git_head),
3061 ############################################################
3063 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3066 depends : [man, libsystemd, libudev],
3067 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3069 ############################################################
3072 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3074 'split /usr: @0@'.format(split_usr),
3075 'split bin-sbin: @0@'.format(split_bin),
3076 'prefix directory: @0@'.format(prefixdir),
3077 'rootprefix directory: @0@'.format(rootprefixdir),
3078 'sysconf directory: @0@'.format(sysconfdir),
3079 'include directory: @0@'.format(includedir),
3080 'lib directory: @0@'.format(libdir),
3081 'rootlib directory: @0@'.format(rootlibdir),
3082 'SysV init scripts: @0@'.format(sysvinit_path),
3083 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3084 'PAM modules directory: @0@'.format(pamlibdir),
3085 'PAM configuration directory: @0@'.format(pamconfdir),
3086 'RPM macros directory: @0@'.format(rpmmacrosdir),
3087 'modprobe.d directory: @0@'.format(modprobedir),
3088 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3089 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3090 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3091 'bash completions directory: @0@'.format(bashcompletiondir),
3092 'zsh completions directory: @0@'.format(zshcompletiondir),
3093 'extra start script: @0@'.format(get_option('rc-local')),
3094 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3095 get_option('debug-tty')),
3096 'TTY GID: @0@'.format(tty_gid),
3097 'users GID: @0@'.format(substs.get('USERS_GID')),
3098 'maximum system UID: @0@'.format(system_uid_max),
3099 'maximum system GID: @0@'.format(system_gid_max),
3100 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3101 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3102 'minimum container UID base: @0@'.format(container_uid_base_min),
3103 'maximum container UID base: @0@'.format(container_uid_base_max),
3104 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3105 'render group access mode: @0@'.format(get_option('group-render-mode')),
3106 'certificate root directory: @0@'.format(get_option('certificate-root')),
3107 'support URL: @0@'.format(support_url),
3108 'nobody user name: @0@'.format(nobody_user),
3109 'nobody group name: @0@'.format(nobody_group),
3110 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3111 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3113 'default DNSSEC mode: @0@'.format(default_dnssec),
3114 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3115 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3116 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3117 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3118 'default locale: @0@'.format(default_locale)]
3120 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3121 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3123 'default DNS servers: @0@'.format(alt_dns_servers),
3124 'default NTP servers: @0@'.format(alt_ntp_servers)]
3126 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3127 '@@0@'.format(time_epoch)).stdout().strip()
3129 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3132 'static libsystemd: @0@'.format(static_libsystemd),
3133 'static libudev: @0@'.format(static_libudev)]
3136 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3137 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3138 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3140 if conf.get('ENABLE_EFI') == 1
3141 status += 'efi arch: @0@'.format(efi_arch)
3145 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3146 'EFI CC @0@'.format(' '.join(efi_cc)),
3147 'EFI lib directory: @0@'.format(efi_libdir),
3148 'EFI lds directory: @0@'.format(efi_ldsdir),
3149 'EFI include directory: @0@'.format(efi_incdir)]
3201 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3202 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3206 ['legacy pkla', install_polkit_pkla],
3208 ['gnu-efi', have_gnu_efi],
3221 ['man pages', want_man],
3222 ['html pages', want_html],
3223 ['man page indices', want_man and have_lxml],
3228 ['adm group', get_option('adm-group')],
3229 ['wheel group', get_option('wheel-group')],
3232 ['debug mmap cache'],
3234 ['valgrind', conf.get('VALGRIND') == 1],
3235 ['trace logging', conf.get('LOG_TRACE') == 1],
3236 ['link-udev-shared', get_option('link-udev-shared')],
3237 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3240 if tuple.length() >= 2
3243 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3244 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3245 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3256 'enabled features: @0@'.format(', '.join(found)),
3258 'disabled features: @0@'.format(', '.join(missing)),
3260 message('\n '.join(status))
3262 if rootprefixdir != rootprefix_default
3264 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3265 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3266 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))