1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
12 meson_version : '>= 0.46',
15 libsystemd_version = '0.26.0'
16 libudev_version = '1.6.14'
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()
33 want_ossfuzz = get_option('oss-fuzz')
34 want_libfuzzer = get_option('llvm-fuzz')
35 want_fuzzbuzz = get_option('fuzzbuzz')
36 if want_ossfuzz + want_libfuzzer + want_fuzzbuzz > 1
37 error('only one of oss-fuzz, llvm-fuzz or fuzzbuzz can be specified')
40 skip_deps = want_ossfuzz or want_libfuzzer
41 fuzzer_build = want_ossfuzz or want_libfuzzer or want_fuzzbuzz
43 #####################################################################
45 # Try to install the git pre-commit hook
46 git_hook = run_command(join_paths(project_source_root, 'tools/add-git-hook.sh'))
47 if git_hook.returncode() == 0
48 message(git_hook.stdout().strip())
51 #####################################################################
53 if get_option('split-usr') == 'auto'
54 split_usr = run_command('test', '-L', '/bin').returncode() != 0
56 split_usr = get_option('split-usr') == 'true'
58 conf.set10('HAVE_SPLIT_USR', split_usr,
59 description : '/usr/bin and /bin directories are separate')
61 if get_option('split-bin') == 'auto'
62 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
64 split_bin = get_option('split-bin') == 'true'
66 conf.set10('HAVE_SPLIT_BIN', split_bin,
67 description : 'bin and sbin directories are separate')
69 rootprefixdir = get_option('rootprefix')
70 # Unusual rootprefixdir values are used by some distros
71 # (see https://github.com/systemd/systemd/pull/7461).
72 rootprefix_default = split_usr ? '/' : '/usr'
73 if rootprefixdir == ''
74 rootprefixdir = rootprefix_default
76 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
78 sysvinit_path = get_option('sysvinit-path')
79 sysvrcnd_path = get_option('sysvrcnd-path')
80 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
81 description : 'SysV init scripts and rcN.d links are supported')
83 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
84 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
85 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
87 # join_paths ignores the preceding arguments if an absolute component is
88 # encountered, so this should canonicalize various paths when they are
89 # absolute or relative.
90 prefixdir = get_option('prefix')
91 if not prefixdir.startswith('/')
92 error('Prefix is not absolute: "@0@"'.format(prefixdir))
94 bindir = join_paths(prefixdir, get_option('bindir'))
95 libdir = join_paths(prefixdir, get_option('libdir'))
96 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
97 includedir = join_paths(prefixdir, get_option('includedir'))
98 datadir = join_paths(prefixdir, get_option('datadir'))
99 localstatedir = join_paths('/', get_option('localstatedir'))
101 rootbindir = join_paths(rootprefixdir, 'bin')
102 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
103 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
105 rootlibdir = get_option('rootlibdir')
107 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
110 # Dirs of external packages
111 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
112 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
113 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
114 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
115 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
116 varlogdir = join_paths(localstatedir, 'log')
117 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
118 rpmmacrosdir = get_option('rpmmacrosdir')
119 if rpmmacrosdir != 'no'
120 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
122 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
125 pkgdatadir = join_paths(datadir, 'systemd')
126 environmentdir = join_paths(prefixdir, 'lib/environment.d')
127 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
128 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
129 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
130 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
131 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
132 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
133 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
134 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
135 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
136 pkgincludedir = join_paths(includedir, 'systemd')
137 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
138 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
139 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
140 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
141 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
142 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
143 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
144 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
145 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
146 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
147 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
148 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
149 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
150 factorydir = join_paths(datadir, 'factory')
151 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
152 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
153 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
154 catalogstatedir = join_paths(systemdstatedir, 'catalog')
155 randomseeddir = join_paths(localstatedir, 'lib/systemd')
156 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
158 docdir = get_option('docdir')
160 docdir = join_paths(datadir, 'doc/systemd')
163 dbuspolicydir = get_option('dbuspolicydir')
164 if dbuspolicydir == ''
165 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
168 dbussessionservicedir = get_option('dbussessionservicedir')
169 if dbussessionservicedir == ''
170 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
173 dbussystemservicedir = get_option('dbussystemservicedir')
174 if dbussystemservicedir == ''
175 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
178 pamlibdir = get_option('pamlibdir')
180 pamlibdir = join_paths(rootlibdir, 'security')
183 pamconfdir = get_option('pamconfdir')
185 pamconfdir = join_paths(sysconfdir, 'pam.d')
188 memory_accounting_default = get_option('memory-accounting-default')
190 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
191 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
192 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
193 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
194 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
195 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
196 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
198 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
200 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
201 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
202 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
203 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
204 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
205 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
206 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
207 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
208 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
209 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
210 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
211 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
212 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
213 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
214 conf.set_quoted('ROOTPREFIX', rootprefixdir)
215 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
216 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
217 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
218 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
219 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
220 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
221 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
222 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
223 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
224 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
225 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
226 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
227 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
228 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
229 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
230 conf.set_quoted('LIBDIR', libdir)
231 conf.set_quoted('ROOTLIBDIR', rootlibdir)
232 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
233 conf.set_quoted('BOOTLIBDIR', bootlibdir)
234 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
235 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
236 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
237 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
238 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
239 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
240 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
241 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
242 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
244 substs.set('prefix', prefixdir)
245 substs.set('rootprefix', rootprefixdir)
246 substs.set('rootprefix_noslash', rootprefixdir_noslash)
247 substs.set('exec_prefix', prefixdir)
248 substs.set('libdir', libdir)
249 substs.set('rootlibdir', rootlibdir)
250 substs.set('includedir', includedir)
251 substs.set('sysconfdir', sysconfdir)
252 substs.set('bindir', bindir)
253 substs.set('rootbindir', rootbindir)
254 substs.set('rootlibexecdir', rootlibexecdir)
255 substs.set('systemunitdir', systemunitdir)
256 substs.set('userunitdir', userunitdir)
257 substs.set('systempresetdir', systempresetdir)
258 substs.set('userpresetdir', userpresetdir)
259 substs.set('udevhwdbdir', udevhwdbdir)
260 substs.set('udevrulesdir', udevrulesdir)
261 substs.set('udevlibexecdir', udevlibexecdir)
262 substs.set('environmentdir', environmentdir)
263 substs.set('catalogdir', catalogdir)
264 substs.set('tmpfilesdir', tmpfilesdir)
265 substs.set('sysusersdir', sysusersdir)
266 substs.set('sysctldir', sysctldir)
267 substs.set('binfmtdir', binfmtdir)
268 substs.set('modulesloaddir', modulesloaddir)
269 substs.set('modprobedir', modprobedir)
270 substs.set('systemgeneratordir', systemgeneratordir)
271 substs.set('usergeneratordir', usergeneratordir)
272 substs.set('systemenvgeneratordir', systemenvgeneratordir)
273 substs.set('userenvgeneratordir', userenvgeneratordir)
274 substs.set('systemshutdowndir', systemshutdowndir)
275 substs.set('systemsleepdir', systemsleepdir)
276 substs.set('VARLOGDIR', varlogdir)
277 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
278 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
279 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
280 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
281 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
282 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
283 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
284 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
285 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
287 #####################################################################
289 cc = meson.get_compiler('c')
290 pkgconfig = import('pkgconfig')
291 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
292 meson_build_sh = find_program('tools/meson-build.sh')
294 want_tests = get_option('tests')
295 slow_tests = want_tests != 'false' and get_option('slow-tests')
296 install_tests = get_option('install-tests')
298 if add_languages('cpp', required : fuzzer_build)
299 # Used only for tests
300 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
306 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
307 if fuzzing_engine.found()
308 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
309 elif cc.has_argument('-fsanitize=fuzzer-no-link')
310 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
312 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
315 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
317 fuzzing_engine = meson.get_compiler('cpp').find_library(get_option('fuzzbuzz-engine'), dirs: get_option('fuzzbuzz-engine-dir'))
320 possible_cc_flags = [
324 '-Wmissing-include-dirs',
325 '-Wold-style-definition',
329 '-Wsuggest-attribute=noreturn',
330 '-Werror=missing-prototypes',
331 '-Werror=implicit-function-declaration',
332 '-Werror=missing-declarations',
333 '-Werror=return-type',
334 '-Werror=incompatible-pointer-types',
336 '-Wstrict-prototypes',
338 '-Wmissing-noreturn',
339 '-Wimplicit-fallthrough=5',
342 '-Wstrict-aliasing=2',
345 '-Werror=shift-count-overflow',
346 '-Werror=shift-overflow=2',
350 # negative arguments are correctly detected starting with meson 0.46.
351 '-Wno-unused-parameter',
352 '-Wno-missing-field-initializers',
353 '-Wno-unused-result',
354 '-Wno-format-signedness',
355 '-Wno-error=#warnings', # clang
356 '-Wno-string-plus-int', # clang
358 # work-around for gcc 7.1 turning this on on its own.
359 '-Wno-error=nonnull',
361 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
362 # optimizations enabled, producing essentially false positives.
363 '-Wno-maybe-uninitialized',
367 '-fdiagnostics-show-option',
368 '-fno-strict-aliasing',
369 '-fvisibility=hidden',
371 '-fstack-protector-strong',
372 '--param=ssp-buffer-size=4',
375 # --as-needed and --no-undefined are provided by meson by default,
376 # run mesonconf to see what is enabled
377 possible_link_flags = [
382 if cc.get_id() == 'clang'
383 possible_cc_flags += [
384 '-Wno-typedef-redefinition',
385 '-Wno-gnu-variable-sized-type-not-at-end',
389 if get_option('buildtype') != 'debug'
390 possible_cc_flags += [
391 '-ffunction-sections',
395 possible_link_flags += '-Wl,--gc-sections'
398 if get_option('b_ndebug') == 'true'
399 # With asserts disabled with get a bunch of warnings about variables which
400 # are used only in the asserts. This is not useful at all, so let's just silence
402 possible_cc_flags += [
403 '-Wno-unused-variable',
404 '-Wno-unused-but-set-variable',
408 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
409 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
413 #include <inttypes.h>
414 typedef uint64_t usec_t;
415 usec_t now(clockid_t clock);
420 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
421 add_project_arguments('-Werror=shadow', language : 'c')
424 cpp = ' '.join(cc.cmd_array()) + ' -E'
426 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
428 #####################################################################
429 # compilation result tests
431 conf.set('_GNU_SOURCE', true)
432 conf.set('__SANE_USERSPACE_TYPES__', true)
433 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
435 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
436 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
437 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
438 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
439 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
440 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
441 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
445 #include <sys/stat.h>
448 foreach decl : ['char16_t',
453 # We get -1 if the size cannot be determined
454 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
456 if decl == 'struct statx'
458 want_linux_stat_h = false
460 have = cc.sizeof(decl,
461 prefix : decl_headers + '#include <linux/stat.h>',
462 args : '-D_GNU_SOURCE') > 0
463 want_linux_stat_h = have
467 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
470 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
472 foreach ident : ['secure_getenv', '__secure_getenv']
473 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
477 ['memfd_create', '''#include <sys/mman.h>'''],
478 ['gettid', '''#include <sys/types.h>
479 #include <unistd.h>'''],
480 ['pivot_root', '''#include <stdlib.h>
481 #include <unistd.h>'''], # no known header declares pivot_root
482 ['name_to_handle_at', '''#include <sys/types.h>
483 #include <sys/stat.h>
484 #include <fcntl.h>'''],
485 ['setns', '''#include <sched.h>'''],
486 ['renameat2', '''#include <stdio.h>
487 #include <fcntl.h>'''],
488 ['kcmp', '''#include <linux/kcmp.h>'''],
489 ['keyctl', '''#include <sys/types.h>
490 #include <keyutils.h>'''],
491 ['copy_file_range', '''#include <sys/syscall.h>
492 #include <unistd.h>'''],
493 ['bpf', '''#include <sys/syscall.h>
494 #include <unistd.h>'''],
495 ['statx', '''#include <sys/types.h>
496 #include <sys/stat.h>
497 #include <unistd.h>'''],
498 ['explicit_bzero' , '''#include <string.h>'''],
499 ['reallocarray', '''#include <malloc.h>'''],
502 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
503 conf.set10('HAVE_' + ident[0].to_upper(), have)
506 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
507 conf.set10('USE_SYS_RANDOM_H', true)
508 conf.set10('HAVE_GETRANDOM', true)
510 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
511 conf.set10('USE_SYS_RANDOM_H', false)
512 conf.set10('HAVE_GETRANDOM', have)
515 #####################################################################
517 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
519 get_option('version-tag'),
520 meson.project_version()]
523 input : 'src/version/version.h.in',
524 output : 'version.h',
527 versiondep = declare_dependency(sources: version_h)
529 sed = find_program('sed')
530 awk = find_program('awk')
531 m4 = find_program('m4')
532 stat = find_program('stat')
533 git = find_program('git', required : false)
534 env = find_program('env')
535 perl = find_program('perl', required : false)
537 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
538 mkdir_p = 'mkdir -p $DESTDIR/@0@'
539 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
540 splash_bmp = files('test/splash.bmp')
542 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
543 # /usr/sbin, /sbin, and fall back to the default from middle column.
544 progs = [['quotaon', '/usr/sbin/quotaon' ],
545 ['quotacheck', '/usr/sbin/quotacheck' ],
546 ['kmod', '/usr/bin/kmod' ],
547 ['kexec', '/usr/sbin/kexec' ],
548 ['sulogin', '/usr/sbin/sulogin' ],
549 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
550 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
551 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
552 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
555 path = get_option(prog[0] + '-path')
557 message('Using @1@ for @0@'.format(prog[0], path))
559 exe = find_program(prog[0],
560 '/usr/sbin/' + prog[0],
563 path = exe.found() ? exe.path() : prog[1]
565 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
566 conf.set_quoted(name, path)
567 substs.set(name, path)
570 conf.set_quoted('TELINIT', get_option('telinit-path'))
572 if run_command('ln', '--relative', '--help').returncode() != 0
573 error('ln does not support --relative (added in coreutils 8.16)')
576 ############################################################
578 gperf = find_program('gperf')
580 gperf_test_format = '''
582 const char * in_word_set(const char *, @0@);
585 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
586 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
587 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
588 if cc.compiles(gperf_test)
589 gperf_len_type = 'size_t'
591 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
592 if cc.compiles(gperf_test)
593 gperf_len_type = 'unsigned'
595 error('unable to determine gperf len type')
598 message('gperf len type is @0@'.format(gperf_len_type))
599 conf.set('GPERF_LEN_TYPE', gperf_len_type,
600 description : 'The type of gperf "len" parameter')
602 ############################################################
604 if not cc.has_header('sys/capability.h')
605 error('POSIX caps headers not found')
607 foreach header : ['crypt.h',
609 'linux/vm_sockets.h',
611 'valgrind/memcheck.h',
612 'valgrind/valgrind.h',
615 conf.set10('HAVE_' + header.underscorify().to_upper(),
616 cc.has_header(header))
619 ############################################################
621 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
622 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
623 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
625 default_hierarchy = get_option('default-hierarchy')
626 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
627 description : 'default cgroup hierarchy as string')
628 if default_hierarchy == 'legacy'
629 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
630 elif default_hierarchy == 'hybrid'
631 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
633 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
636 default_net_naming_scheme = get_option('default-net-naming-scheme')
637 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
639 time_epoch = get_option('time-epoch')
642 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
644 conf.set('TIME_EPOCH', time_epoch)
646 system_uid_max = get_option('system-uid-max')
647 if system_uid_max == -1
648 system_uid_max = run_command(
650 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
651 '/etc/login.defs').stdout().strip()
652 if system_uid_max == ''
655 system_uid_max = system_uid_max.to_int()
658 conf.set('SYSTEM_UID_MAX', system_uid_max)
659 substs.set('systemuidmax', system_uid_max)
661 system_gid_max = get_option('system-gid-max')
662 if system_gid_max == -1
663 system_gid_max = run_command(
665 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
666 '/etc/login.defs').stdout().strip()
667 if system_gid_max == ''
670 system_gid_max = system_gid_max.to_int()
673 conf.set('SYSTEM_GID_MAX', system_gid_max)
674 substs.set('systemgidmax', system_gid_max)
676 dynamic_uid_min = get_option('dynamic-uid-min')
677 dynamic_uid_max = get_option('dynamic-uid-max')
678 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
679 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
680 substs.set('dynamicuidmin', dynamic_uid_min)
681 substs.set('dynamicuidmax', dynamic_uid_max)
683 container_uid_base_min = get_option('container-uid-base-min')
684 container_uid_base_max = get_option('container-uid-base-max')
685 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
686 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
687 substs.set('containeruidbasemin', container_uid_base_min)
688 substs.set('containeruidbasemax', container_uid_base_max)
690 nobody_user = get_option('nobody-user')
691 nobody_group = get_option('nobody-group')
693 if not meson.is_cross_build()
694 getent_result = run_command('getent', 'passwd', '65534')
695 if getent_result.returncode() == 0
696 name = getent_result.stdout().split(':')[0]
697 if name != nobody_user
699 '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) +
700 'Your build will result in an user table setup that is incompatible with the local system.')
703 id_result = run_command('id', '-u', nobody_user)
704 if id_result.returncode() == 0
705 id = id_result.stdout().to_int()
708 '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) +
709 'Your build will result in an user table setup that is incompatible with the local system.')
713 getent_result = run_command('getent', 'group', '65534')
714 if getent_result.returncode() == 0
715 name = getent_result.stdout().split(':')[0]
716 if name != nobody_group
718 '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) +
719 'Your build will result in an group table setup that is incompatible with the local system.')
722 id_result = run_command('id', '-g', nobody_group)
723 if id_result.returncode() == 0
724 id = id_result.stdout().to_int()
727 '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) +
728 'Your build will result in an group table setup that is incompatible with the local system.')
732 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
734 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
735 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
738 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
739 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
740 substs.set('NOBODY_USER_NAME', nobody_user)
741 substs.set('NOBODY_GROUP_NAME', nobody_group)
743 tty_gid = get_option('tty-gid')
744 conf.set('TTY_GID', tty_gid)
745 substs.set('TTY_GID', tty_gid)
747 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
748 users_gid = get_option('users-gid')
749 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
751 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
752 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
754 dev_kvm_mode = get_option('dev-kvm-mode')
755 substs.set('DEV_KVM_MODE', dev_kvm_mode)
756 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
757 group_render_mode = get_option('group-render-mode')
758 substs.set('GROUP_RENDER_MODE', group_render_mode)
759 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
761 kill_user_processes = get_option('default-kill-user-processes')
762 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
763 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
764 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
766 dns_servers = get_option('dns-servers')
767 conf.set_quoted('DNS_SERVERS', dns_servers)
768 substs.set('DNS_SERVERS', dns_servers)
770 ntp_servers = get_option('ntp-servers')
771 conf.set_quoted('NTP_SERVERS', ntp_servers)
772 substs.set('NTP_SERVERS', ntp_servers)
774 default_locale = get_option('default-locale')
775 if default_locale == ''
776 if not meson.is_cross_build()
777 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
778 default_locale = run_command(choose_default_locale_sh).stdout().strip()
780 default_locale = 'C.UTF-8'
783 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
785 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
787 substs.set('SUSHELL', get_option('debug-shell'))
788 substs.set('DEBUGTTY', get_option('debug-tty'))
790 enable_debug_hashmap = false
791 enable_debug_mmap_cache = false
792 enable_debug_siphash = false
793 enable_debug_udev = false
794 foreach name : get_option('debug-extra')
796 enable_debug_hashmap = true
797 elif name == 'mmap-cache'
798 enable_debug_mmap_cache = true
799 elif name == 'siphash'
800 enable_debug_siphash = true
802 enable_debug_udev = true
804 message('unknown debug option "@0@", ignoring'.format(name))
807 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
808 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
809 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
810 conf.set10('ENABLE_DEBUG_UDEV', enable_debug_udev)
812 conf.set10('VALGRIND', get_option('valgrind'))
813 conf.set10('LOG_TRACE', get_option('log-trace'))
815 #####################################################################
817 threads = dependency('threads')
818 librt = cc.find_library('rt')
819 libm = cc.find_library('m')
820 libdl = cc.find_library('dl')
821 libcrypt = cc.find_library('crypt')
823 libcap = dependency('libcap', required : false)
824 if not libcap.found()
825 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
826 libcap = cc.find_library('cap')
829 libmount = dependency('mount',
830 version : fuzzer_build ? '>= 0' : '>= 2.30')
832 want_seccomp = get_option('seccomp')
833 if want_seccomp != 'false' and not skip_deps
834 libseccomp = dependency('libseccomp',
835 version : '>= 2.3.1',
836 required : want_seccomp == 'true')
837 have = libseccomp.found()
842 conf.set10('HAVE_SECCOMP', have)
844 want_selinux = get_option('selinux')
845 if want_selinux != 'false' and not skip_deps
846 libselinux = dependency('libselinux',
847 version : '>= 2.1.9',
848 required : want_selinux == 'true')
849 have = libselinux.found()
854 conf.set10('HAVE_SELINUX', have)
856 want_apparmor = get_option('apparmor')
857 if want_apparmor != 'false' and not skip_deps
858 libapparmor = dependency('libapparmor',
859 required : want_apparmor == 'true')
860 have = libapparmor.found()
865 conf.set10('HAVE_APPARMOR', have)
867 smack_run_label = get_option('smack-run-label')
868 if smack_run_label != ''
869 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
872 want_polkit = get_option('polkit')
873 install_polkit = false
874 install_polkit_pkla = false
875 if want_polkit != 'false' and not skip_deps
876 install_polkit = true
878 libpolkit = dependency('polkit-gobject-1',
880 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
881 message('Old polkit detected, will install pkla files')
882 install_polkit_pkla = true
885 conf.set10('ENABLE_POLKIT', install_polkit)
887 want_acl = get_option('acl')
888 if want_acl != 'false' and not skip_deps
889 libacl = cc.find_library('acl', required : want_acl == 'true')
890 have = libacl.found()
895 conf.set10('HAVE_ACL', have)
897 want_audit = get_option('audit')
898 if want_audit != 'false' and not skip_deps
899 libaudit = dependency('audit', required : want_audit == 'true')
900 have = libaudit.found()
905 conf.set10('HAVE_AUDIT', have)
907 want_blkid = get_option('blkid')
908 if want_blkid != 'false' and not skip_deps
909 libblkid = dependency('blkid', required : want_blkid == 'true')
910 have = libblkid.found()
915 conf.set10('HAVE_BLKID', have)
917 want_kmod = get_option('kmod')
918 if want_kmod != 'false' and not skip_deps
919 libkmod = dependency('libkmod',
921 required : want_kmod == 'true')
922 have = libkmod.found()
927 conf.set10('HAVE_KMOD', have)
929 want_pam = get_option('pam')
930 if want_pam != 'false' and not skip_deps
931 libpam = cc.find_library('pam', required : want_pam == 'true')
932 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
933 have = libpam.found() and libpam_misc.found()
939 conf.set10('HAVE_PAM', have)
941 want_microhttpd = get_option('microhttpd')
942 if want_microhttpd != 'false' and not skip_deps
943 libmicrohttpd = dependency('libmicrohttpd',
944 version : '>= 0.9.33',
945 required : want_microhttpd == 'true')
946 have = libmicrohttpd.found()
951 conf.set10('HAVE_MICROHTTPD', have)
953 want_libcryptsetup = get_option('libcryptsetup')
954 if want_libcryptsetup != 'false' and not skip_deps
955 libcryptsetup = dependency('libcryptsetup',
956 version : '>= 1.6.0',
957 required : want_libcryptsetup == 'true')
958 have = libcryptsetup.found()
959 have_sector = cc.has_member(
960 'struct crypt_params_plain',
962 prefix : '#include <libcryptsetup.h>')
968 conf.set10('HAVE_LIBCRYPTSETUP', have)
969 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
971 want_libcurl = get_option('libcurl')
972 if want_libcurl != 'false' and not skip_deps
973 libcurl = dependency('libcurl',
974 version : '>= 7.32.0',
975 required : want_libcurl == 'true')
976 have = libcurl.found()
981 conf.set10('HAVE_LIBCURL', have)
983 want_libidn = get_option('libidn')
984 want_libidn2 = get_option('libidn2')
985 if want_libidn == 'true' and want_libidn2 == 'true'
986 error('libidn and libidn2 cannot be requested simultaneously')
989 if want_libidn != 'false' and want_libidn2 != 'true' and not skip_deps
990 libidn = dependency('libidn',
991 required : want_libidn == 'true')
992 have = libidn.found()
997 conf.set10('HAVE_LIBIDN', have)
998 if not have and want_libidn2 != 'false' and not skip_deps
999 # libidn is used for both libidn and libidn2 objects
1000 libidn = dependency('libidn2',
1001 required : want_libidn2 == 'true')
1002 have = libidn.found()
1006 conf.set10('HAVE_LIBIDN2', have)
1008 want_libiptc = get_option('libiptc')
1009 if want_libiptc != 'false' and not skip_deps
1010 libiptc = dependency('libiptc',
1011 required : want_libiptc == 'true')
1012 have = libiptc.found()
1017 conf.set10('HAVE_LIBIPTC', have)
1019 want_qrencode = get_option('qrencode')
1020 if want_qrencode != 'false' and not skip_deps
1021 libqrencode = dependency('libqrencode',
1022 required : want_qrencode == 'true')
1023 have = libqrencode.found()
1028 conf.set10('HAVE_QRENCODE', have)
1030 want_gcrypt = get_option('gcrypt')
1031 if want_gcrypt != 'false' and not skip_deps
1032 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1033 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1034 have = libgcrypt.found() and libgpg_error.found()
1039 # link to neither of the libs if one is not found
1043 conf.set10('HAVE_GCRYPT', have)
1045 want_gnutls = get_option('gnutls')
1046 if want_gnutls != 'false' and not skip_deps
1047 libgnutls = dependency('gnutls',
1048 version : '>= 3.1.4',
1049 required : want_gnutls == 'true')
1050 have = libgnutls.found()
1055 conf.set10('HAVE_GNUTLS', have)
1057 want_openssl = get_option('openssl')
1058 if want_openssl != 'false' and not skip_deps
1059 libopenssl = dependency('openssl',
1060 version : '>= 1.1.0',
1061 required : want_openssl == 'true')
1062 have = libopenssl.found()
1067 conf.set10('HAVE_OPENSSL', have)
1069 want_elfutils = get_option('elfutils')
1070 if want_elfutils != 'false' and not skip_deps
1071 libdw = dependency('libdw',
1072 required : want_elfutils == 'true')
1073 have = libdw.found()
1078 conf.set10('HAVE_ELFUTILS', have)
1080 want_zlib = get_option('zlib')
1081 if want_zlib != 'false' and not skip_deps
1082 libz = dependency('zlib',
1083 required : want_zlib == 'true')
1089 conf.set10('HAVE_ZLIB', have)
1091 want_bzip2 = get_option('bzip2')
1092 if want_bzip2 != 'false' and not skip_deps
1093 libbzip2 = cc.find_library('bz2',
1094 required : want_bzip2 == 'true')
1095 have = libbzip2.found()
1100 conf.set10('HAVE_BZIP2', have)
1102 want_xz = get_option('xz')
1103 if want_xz != 'false' and not skip_deps
1104 libxz = dependency('liblzma',
1105 required : want_xz == 'true')
1106 have = libxz.found()
1111 conf.set10('HAVE_XZ', have)
1113 want_lz4 = get_option('lz4')
1114 if want_lz4 != 'false' and not skip_deps
1115 liblz4 = dependency('liblz4',
1116 version : '>= 1.3.0',
1117 required : want_lz4 == 'true')
1118 have = liblz4.found()
1123 conf.set10('HAVE_LZ4', have)
1125 want_xkbcommon = get_option('xkbcommon')
1126 if want_xkbcommon != 'false' and not skip_deps
1127 libxkbcommon = dependency('xkbcommon',
1128 version : '>= 0.3.0',
1129 required : want_xkbcommon == 'true')
1130 have = libxkbcommon.found()
1135 conf.set10('HAVE_XKBCOMMON', have)
1137 want_pcre2 = get_option('pcre2')
1138 if want_pcre2 != 'false'
1139 libpcre2 = dependency('libpcre2-8',
1140 required : want_pcre2 == 'true')
1141 have = libpcre2.found()
1146 conf.set10('HAVE_PCRE2', have)
1148 want_glib = get_option('glib')
1149 if want_glib != 'false' and not skip_deps
1150 libglib = dependency('glib-2.0',
1151 version : '>= 2.22.0',
1152 required : want_glib == 'true')
1153 libgobject = dependency('gobject-2.0',
1154 version : '>= 2.22.0',
1155 required : want_glib == 'true')
1156 libgio = dependency('gio-2.0',
1157 required : want_glib == 'true')
1158 have = libglib.found() and libgobject.found() and libgio.found()
1165 conf.set10('HAVE_GLIB', have)
1167 want_dbus = get_option('dbus')
1168 if want_dbus != 'false' and not skip_deps
1169 libdbus = dependency('dbus-1',
1170 version : '>= 1.3.2',
1171 required : want_dbus == 'true')
1172 have = libdbus.found()
1177 conf.set10('HAVE_DBUS', have)
1179 default_dnssec = get_option('default-dnssec')
1181 default_dnssec = 'no'
1183 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1184 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1185 default_dnssec = 'no'
1187 conf.set('DEFAULT_DNSSEC_MODE',
1188 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1189 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1191 dns_over_tls = get_option('dns-over-tls')
1192 if dns_over_tls != 'false'
1193 if dns_over_tls == 'openssl'
1196 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1197 if dns_over_tls == 'gnutls' and not have_gnutls
1198 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1201 if dns_over_tls == 'gnutls' or have_gnutls
1202 have_openssl = false
1204 have_openssl = conf.get('HAVE_OPENSSL') == 1
1205 if dns_over_tls != 'auto' and not have_openssl
1206 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1207 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1210 have = have_gnutls or have_openssl
1214 have_openssl = false
1216 conf.set10('ENABLE_DNS_OVER_TLS', have)
1217 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1218 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1220 default_dns_over_tls = get_option('default-dns-over-tls')
1222 default_dns_over_tls = 'no'
1224 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1225 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1226 default_dns_over_tls = 'no'
1228 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1229 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1230 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1232 want_importd = get_option('importd')
1233 if want_importd != 'false'
1234 have = (conf.get('HAVE_LIBCURL') == 1 and
1235 conf.get('HAVE_ZLIB') == 1 and
1236 conf.get('HAVE_XZ') == 1 and
1237 conf.get('HAVE_GCRYPT') == 1)
1238 if want_importd == 'true' and not have
1239 error('importd support was requested, but dependencies are not available')
1244 conf.set10('ENABLE_IMPORTD', have)
1246 want_remote = get_option('remote')
1247 if want_remote != 'false'
1248 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1249 conf.get('HAVE_LIBCURL') == 1]
1250 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1251 # it's possible to build one without the other. Complain only if
1252 # support was explicitly requested. The auxiliary files like sysusers
1253 # config should be installed when any of the programs are built.
1254 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1255 error('remote support was requested, but dependencies are not available')
1257 have = have_deps[0] or have_deps[1]
1261 conf.set10('ENABLE_REMOTE', have)
1263 foreach term : ['utmp',
1295 have = get_option(term)
1296 name = 'ENABLE_' + term.underscorify().to_upper()
1297 conf.set10(name, have)
1300 foreach tuple : [['nss-mymachines', 'machined'],
1301 ['nss-resolve', 'resolve']]
1302 want = get_option(tuple[0])
1304 have = get_option(tuple[1])
1305 if want == 'true' and not have
1306 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1311 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1312 conf.set10(name, have)
1316 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1317 'ENABLE_NSS_MYMACHINES',
1318 'ENABLE_NSS_RESOLVE',
1319 'ENABLE_NSS_SYSTEMD']
1320 if conf.get(term) == 1
1324 conf.set10('ENABLE_NSS', enable_nss)
1326 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1331 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1333 #####################################################################
1335 if get_option('efi')
1336 efi_arch = host_machine.cpu_family()
1338 if efi_arch == 'x86'
1339 EFI_MACHINE_TYPE_NAME = 'ia32'
1340 gnu_efi_arch = 'ia32'
1341 elif efi_arch == 'x86_64'
1342 EFI_MACHINE_TYPE_NAME = 'x64'
1343 gnu_efi_arch = 'x86_64'
1344 elif efi_arch == 'arm'
1345 EFI_MACHINE_TYPE_NAME = 'arm'
1346 gnu_efi_arch = 'arm'
1347 elif efi_arch == 'aarch64'
1348 EFI_MACHINE_TYPE_NAME = 'aa64'
1349 gnu_efi_arch = 'aarch64'
1351 EFI_MACHINE_TYPE_NAME = ''
1356 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1358 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1362 conf.set10('ENABLE_EFI', have)
1364 #####################################################################
1366 config_h = configure_file(
1367 output : 'config.h',
1368 configuration : conf)
1370 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1372 includes = include_directories('src/basic',
1376 'src/journal-remote',
1380 'src/time-wait-sync',
1386 'src/libsystemd/sd-bus',
1387 'src/libsystemd/sd-device',
1388 'src/libsystemd/sd-event',
1389 'src/libsystemd/sd-hwdb',
1390 'src/libsystemd/sd-id128',
1391 'src/libsystemd/sd-netlink',
1392 'src/libsystemd/sd-network',
1393 'src/libsystemd/sd-resolve',
1394 'src/libsystemd-network',
1397 add_project_arguments('-include', 'config.h', language : 'c')
1399 generate_gperfs = find_program('tools/generate-gperfs.py')
1403 subdir('src/systemd')
1405 subdir('src/libsystemd')
1406 subdir('src/libsystemd-network')
1407 subdir('src/journal')
1410 libjournal_core = static_library(
1412 libjournal_core_sources,
1414 include_directories : includes,
1417 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1418 libsystemd = shared_library(
1421 version : libsystemd_version,
1422 include_directories : includes,
1423 link_args : ['-shared',
1424 '-Wl,--version-script=' + libsystemd_sym_path],
1425 link_with : [libbasic,
1427 link_whole : [libsystemd_static,
1429 dependencies : [threads,
1433 link_depends : libsystemd_sym,
1435 install_dir : rootlibdir)
1437 static_libsystemd = get_option('static-libsystemd')
1438 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1440 install_libsystemd_static = static_library(
1443 journal_client_sources,
1445 basic_gcrypt_sources,
1447 include_directories : includes,
1448 build_by_default : static_libsystemd != 'false',
1449 install : static_libsystemd != 'false',
1450 install_dir : rootlibdir,
1451 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1452 dependencies : [threads,
1461 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1463 ############################################################
1465 # binaries that have --help and are intended for use by humans,
1466 # usually, but not always, installed in /bin.
1467 public_programs = []
1469 subdir('src/libudev')
1470 subdir('src/shared')
1472 subdir('src/shutdown')
1474 subdir('src/network')
1476 subdir('src/analyze')
1477 subdir('src/journal-remote')
1478 subdir('src/coredump')
1479 subdir('src/hostname')
1480 subdir('src/import')
1481 subdir('src/kernel-install')
1482 subdir('src/locale')
1483 subdir('src/machine')
1484 subdir('src/portable')
1485 subdir('src/nspawn')
1486 subdir('src/resolve')
1487 subdir('src/timedate')
1488 subdir('src/timesync')
1489 subdir('src/vconsole')
1490 subdir('src/boot/efi')
1497 ############################################################
1499 # only static linking apart from libdl, to make sure that the
1500 # module is linked to all libraries that it uses.
1501 test_dlopen = executable(
1505 include_directories : includes,
1506 link_with : [libbasic],
1507 dependencies : [libdl],
1508 build_by_default : want_tests != 'false')
1510 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1511 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1512 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1513 ['resolve', 'ENABLE_NSS_RESOLVE']]
1515 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1519 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1520 version_script_arg = join_paths(project_source_root, sym)
1522 nss = shared_library(
1524 'src/nss-@0@/nss-@0@.c'.format(module),
1527 include_directories : includes,
1528 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1529 link_args : ['-Wl,-z,nodelete',
1531 '-Wl,--version-script=' + version_script_arg],
1532 link_with : [libsystemd_static,
1534 dependencies : [threads,
1538 install_dir : rootlibdir)
1540 # We cannot use shared_module because it does not support version suffix.
1541 # Unfortunately shared_library insists on creating the symlink…
1542 meson.add_install_script('sh', '-c',
1543 'rm $DESTDIR@0@/libnss_@1@.so'
1544 .format(rootlibdir, module))
1546 if want_tests != 'false'
1547 test('dlopen-nss_' + module,
1549 # path to dlopen must include a slash
1550 args : nss.full_path())
1555 ############################################################
1557 executable('systemd',
1559 include_directories : includes,
1560 link_with : [libcore,
1562 dependencies : [versiondep,
1569 install_rpath : rootlibexecdir,
1571 install_dir : rootlibexecdir)
1573 meson.add_install_script(meson_make_symlink,
1574 join_paths(rootlibexecdir, 'systemd'),
1575 join_paths(rootsbindir, 'init'))
1577 exe = executable('systemd-analyze',
1578 systemd_analyze_sources,
1579 include_directories : includes,
1580 link_with : [libcore,
1582 dependencies : [versiondep,
1589 install_rpath : rootlibexecdir,
1591 public_programs += exe
1593 executable('systemd-journald',
1594 systemd_journald_sources,
1595 include_directories : includes,
1596 link_with : [libjournal_core,
1598 dependencies : [threads,
1602 install_rpath : rootlibexecdir,
1604 install_dir : rootlibexecdir)
1606 exe = executable('systemd-cat',
1607 systemd_cat_sources,
1608 include_directories : includes,
1609 link_with : [libjournal_core,
1611 dependencies : [threads],
1612 install_rpath : rootlibexecdir,
1614 public_programs += exe
1616 exe = executable('journalctl',
1618 include_directories : includes,
1619 link_with : [libshared],
1620 dependencies : [threads,
1625 install_rpath : rootlibexecdir,
1627 install_dir : rootbindir)
1628 public_programs += exe
1630 executable('systemd-getty-generator',
1631 'src/getty-generator/getty-generator.c',
1632 include_directories : includes,
1633 link_with : [libshared],
1634 install_rpath : rootlibexecdir,
1636 install_dir : systemgeneratordir)
1638 executable('systemd-debug-generator',
1639 'src/debug-generator/debug-generator.c',
1640 include_directories : includes,
1641 link_with : [libshared],
1642 install_rpath : rootlibexecdir,
1644 install_dir : systemgeneratordir)
1646 executable('systemd-run-generator',
1647 'src/run-generator/run-generator.c',
1648 include_directories : includes,
1649 link_with : [libshared],
1650 install_rpath : rootlibexecdir,
1652 install_dir : systemgeneratordir)
1654 executable('systemd-fstab-generator',
1655 'src/fstab-generator/fstab-generator.c',
1656 include_directories : includes,
1657 link_with : [libcore_shared,
1659 install_rpath : rootlibexecdir,
1661 install_dir : systemgeneratordir)
1663 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1664 executable('30-systemd-environment-d-generator',
1665 'src/environment-d-generator/environment-d-generator.c',
1666 include_directories : includes,
1667 link_with : [libshared],
1668 install_rpath : rootlibexecdir,
1670 install_dir : userenvgeneratordir)
1672 meson.add_install_script(meson_make_symlink,
1673 join_paths(sysconfdir, 'environment'),
1674 join_paths(environmentdir, '99-environment.conf'))
1677 if conf.get('ENABLE_HIBERNATE') == 1
1678 executable('systemd-hibernate-resume-generator',
1679 'src/hibernate-resume/hibernate-resume-generator.c',
1680 include_directories : includes,
1681 link_with : [libshared],
1682 install_rpath : rootlibexecdir,
1684 install_dir : systemgeneratordir)
1686 executable('systemd-hibernate-resume',
1687 'src/hibernate-resume/hibernate-resume.c',
1688 include_directories : includes,
1689 link_with : [libshared],
1690 install_rpath : rootlibexecdir,
1692 install_dir : rootlibexecdir)
1695 if conf.get('HAVE_BLKID') == 1
1696 executable('systemd-gpt-auto-generator',
1697 'src/gpt-auto-generator/gpt-auto-generator.c',
1698 'src/shared/blkid-util.h',
1699 include_directories : includes,
1700 link_with : [libshared],
1701 dependencies : libblkid,
1702 install_rpath : rootlibexecdir,
1704 install_dir : systemgeneratordir)
1706 exe = executable('systemd-dissect',
1707 'src/dissect/dissect.c',
1708 include_directories : includes,
1709 link_with : [libshared],
1710 install_rpath : rootlibexecdir,
1712 install_dir : rootlibexecdir)
1713 public_programs += exe
1716 if conf.get('ENABLE_RESOLVE') == 1
1717 executable('systemd-resolved',
1718 systemd_resolved_sources,
1719 include_directories : includes,
1720 link_with : [libshared,
1722 libsystemd_resolve_core],
1723 dependencies : systemd_resolved_dependencies,
1724 install_rpath : rootlibexecdir,
1726 install_dir : rootlibexecdir)
1728 exe = executable('resolvectl',
1730 include_directories : includes,
1731 link_with : [libshared,
1733 libsystemd_resolve_core],
1734 dependencies : [threads,
1738 install_rpath : rootlibexecdir,
1740 public_programs += exe
1742 meson.add_install_script(meson_make_symlink,
1743 join_paths(bindir, 'resolvectl'),
1744 join_paths(rootsbindir, 'resolvconf'))
1746 meson.add_install_script(meson_make_symlink,
1747 join_paths(bindir, 'resolvectl'),
1748 join_paths(bindir, 'systemd-resolve'))
1751 if conf.get('ENABLE_LOGIND') == 1
1752 executable('systemd-logind',
1753 systemd_logind_sources,
1754 include_directories : includes,
1755 link_with : [liblogind_core,
1757 dependencies : [threads,
1759 install_rpath : rootlibexecdir,
1761 install_dir : rootlibexecdir)
1763 exe = executable('loginctl',
1765 include_directories : includes,
1766 link_with : [libshared],
1767 dependencies : [threads,
1770 install_rpath : rootlibexecdir,
1772 install_dir : rootbindir)
1773 public_programs += exe
1775 exe = executable('systemd-inhibit',
1776 'src/login/inhibit.c',
1777 include_directories : includes,
1778 link_with : [libshared],
1779 install_rpath : rootlibexecdir,
1781 install_dir : rootbindir)
1782 public_programs += exe
1784 if conf.get('HAVE_PAM') == 1
1785 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1786 pam_systemd = shared_library(
1790 include_directories : includes,
1791 link_args : ['-shared',
1792 '-Wl,--version-script=' + version_script_arg],
1793 link_with : [libsystemd_static,
1795 dependencies : [threads,
1798 link_depends : pam_systemd_sym,
1800 install_dir : pamlibdir)
1802 if want_tests != 'false'
1803 test('dlopen-pam_systemd',
1805 # path to dlopen must include a slash
1806 args : pam_systemd.full_path())
1810 executable('systemd-user-runtime-dir',
1811 user_runtime_dir_sources,
1812 include_directories : includes,
1813 link_with : [libshared],
1814 install_rpath : rootlibexecdir,
1816 install_dir : rootlibexecdir)
1819 if conf.get('HAVE_PAM') == 1
1820 executable('systemd-user-sessions',
1821 'src/user-sessions/user-sessions.c',
1822 include_directories : includes,
1823 link_with : [libshared],
1824 install_rpath : rootlibexecdir,
1826 install_dir : rootlibexecdir)
1829 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1830 exe = executable('bootctl',
1831 'src/boot/bootctl.c',
1832 include_directories : includes,
1833 link_with : [libshared],
1834 dependencies : [libblkid],
1835 install_rpath : rootlibexecdir,
1837 public_programs += exe
1839 executable('systemd-bless-boot',
1840 'src/boot/bless-boot.c',
1841 include_directories : includes,
1842 link_with : [libshared],
1843 dependencies : [libblkid],
1844 install_rpath : rootlibexecdir,
1846 install_dir : rootlibexecdir)
1848 executable('systemd-bless-boot-generator',
1849 'src/boot/bless-boot-generator.c',
1850 include_directories : includes,
1851 link_with : [libshared],
1852 install_rpath : rootlibexecdir,
1854 install_dir : systemgeneratordir)
1857 executable('systemd-boot-check-no-failures',
1858 'src/boot/boot-check-no-failures.c',
1859 include_directories : includes,
1860 link_with : [libshared],
1861 dependencies : [libblkid],
1862 install_rpath : rootlibexecdir,
1864 install_dir : rootlibexecdir)
1866 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1867 include_directories : includes,
1868 link_with : [libshared],
1869 dependencies : [threads],
1870 install_rpath : rootlibexecdir,
1872 public_programs += exe
1875 if get_option('link-systemctl-shared')
1876 systemctl_link_with = [libshared]
1878 systemctl_link_with = [libsystemd_static,
1884 exe = executable('systemctl',
1885 'src/systemctl/systemctl.c',
1886 'src/systemctl/sysv-compat.h',
1887 'src/systemctl/sysv-compat.c',
1888 include_directories : includes,
1889 link_with : systemctl_link_with,
1890 dependencies : [threads,
1895 install_rpath : rootlibexecdir,
1897 install_dir : rootbindir)
1898 public_programs += exe
1900 if conf.get('ENABLE_PORTABLED') == 1
1901 executable('systemd-portabled',
1902 systemd_portabled_sources,
1903 include_directories : includes,
1904 link_with : [libshared],
1905 dependencies : [threads],
1906 install_rpath : rootlibexecdir,
1908 install_dir : rootlibexecdir)
1910 exe = executable('portablectl', 'src/portable/portablectl.c',
1911 include_directories : includes,
1912 link_with : [libshared],
1913 dependencies : [threads],
1914 install_rpath : rootlibexecdir,
1916 install_dir : rootbindir)
1917 public_programs += exe
1920 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1921 meson.add_install_script(meson_make_symlink,
1922 join_paths(rootbindir, 'systemctl'),
1923 join_paths(rootsbindir, alias))
1926 if conf.get('ENABLE_BACKLIGHT') == 1
1927 executable('systemd-backlight',
1928 'src/backlight/backlight.c',
1929 include_directories : includes,
1930 link_with : [libshared],
1931 install_rpath : rootlibexecdir,
1933 install_dir : rootlibexecdir)
1936 if conf.get('ENABLE_RFKILL') == 1
1937 executable('systemd-rfkill',
1938 'src/rfkill/rfkill.c',
1939 include_directories : includes,
1940 link_with : [libshared],
1941 install_rpath : rootlibexecdir,
1943 install_dir : rootlibexecdir)
1946 executable('systemd-system-update-generator',
1947 'src/system-update-generator/system-update-generator.c',
1948 include_directories : includes,
1949 link_with : [libshared],
1950 install_rpath : rootlibexecdir,
1952 install_dir : systemgeneratordir)
1954 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1955 executable('systemd-cryptsetup',
1956 'src/cryptsetup/cryptsetup.c',
1957 include_directories : includes,
1958 link_with : [libshared],
1959 dependencies : [libcryptsetup],
1960 install_rpath : rootlibexecdir,
1962 install_dir : rootlibexecdir)
1964 executable('systemd-cryptsetup-generator',
1965 'src/cryptsetup/cryptsetup-generator.c',
1966 include_directories : includes,
1967 link_with : [libshared],
1968 dependencies : [libcryptsetup],
1969 install_rpath : rootlibexecdir,
1971 install_dir : systemgeneratordir)
1973 executable('systemd-veritysetup',
1974 'src/veritysetup/veritysetup.c',
1975 include_directories : includes,
1976 link_with : [libshared],
1977 dependencies : [libcryptsetup],
1978 install_rpath : rootlibexecdir,
1980 install_dir : rootlibexecdir)
1982 executable('systemd-veritysetup-generator',
1983 'src/veritysetup/veritysetup-generator.c',
1984 include_directories : includes,
1985 link_with : [libshared],
1986 dependencies : [libcryptsetup],
1987 install_rpath : rootlibexecdir,
1989 install_dir : systemgeneratordir)
1992 if conf.get('HAVE_SYSV_COMPAT') == 1
1993 executable('systemd-sysv-generator',
1994 'src/sysv-generator/sysv-generator.c',
1995 include_directories : includes,
1996 link_with : [libshared],
1997 install_rpath : rootlibexecdir,
1999 install_dir : systemgeneratordir)
2001 executable('systemd-rc-local-generator',
2002 'src/rc-local-generator/rc-local-generator.c',
2003 include_directories : includes,
2004 link_with : [libshared],
2005 install_rpath : rootlibexecdir,
2007 install_dir : systemgeneratordir)
2010 if conf.get('ENABLE_HOSTNAMED') == 1
2011 executable('systemd-hostnamed',
2012 'src/hostname/hostnamed.c',
2013 include_directories : includes,
2014 link_with : [libshared],
2015 install_rpath : rootlibexecdir,
2017 install_dir : rootlibexecdir)
2019 exe = executable('hostnamectl',
2020 'src/hostname/hostnamectl.c',
2021 include_directories : includes,
2022 link_with : [libshared],
2023 install_rpath : rootlibexecdir,
2025 public_programs += exe
2028 if conf.get('ENABLE_LOCALED') == 1
2029 if conf.get('HAVE_XKBCOMMON') == 1
2030 # logind will load libxkbcommon.so dynamically on its own
2036 executable('systemd-localed',
2037 systemd_localed_sources,
2038 include_directories : includes,
2039 link_with : [libshared],
2040 dependencies : deps,
2041 install_rpath : rootlibexecdir,
2043 install_dir : rootlibexecdir)
2045 exe = executable('localectl',
2047 include_directories : includes,
2048 link_with : [libshared],
2049 install_rpath : rootlibexecdir,
2051 public_programs += exe
2054 if conf.get('ENABLE_TIMEDATED') == 1
2055 executable('systemd-timedated',
2056 'src/timedate/timedated.c',
2057 include_directories : includes,
2058 link_with : [libshared],
2059 install_rpath : rootlibexecdir,
2061 install_dir : rootlibexecdir)
2064 if conf.get('ENABLE_TIMEDATECTL') == 1
2065 exe = executable('timedatectl',
2066 'src/timedate/timedatectl.c',
2067 include_directories : includes,
2068 install_rpath : rootlibexecdir,
2069 link_with : [libshared],
2070 dependencies : [libm],
2072 public_programs += exe
2075 if conf.get('ENABLE_TIMESYNCD') == 1
2076 executable('systemd-timesyncd',
2077 systemd_timesyncd_sources,
2078 include_directories : includes,
2079 link_with : [libshared],
2080 dependencies : [threads,
2082 install_rpath : rootlibexecdir,
2084 install_dir : rootlibexecdir)
2086 executable('systemd-time-wait-sync',
2087 'src/time-wait-sync/time-wait-sync.c',
2088 include_directories : includes,
2089 link_with : [libshared],
2090 install_rpath : rootlibexecdir,
2092 install_dir : rootlibexecdir)
2095 if conf.get('ENABLE_MACHINED') == 1
2096 executable('systemd-machined',
2097 systemd_machined_sources,
2098 include_directories : includes,
2099 link_with : [libmachine_core,
2101 install_rpath : rootlibexecdir,
2103 install_dir : rootlibexecdir)
2105 exe = executable('machinectl',
2106 'src/machine/machinectl.c',
2107 include_directories : includes,
2108 link_with : [libshared],
2109 dependencies : [threads,
2112 install_rpath : rootlibexecdir,
2114 install_dir : rootbindir)
2115 public_programs += exe
2118 if conf.get('ENABLE_IMPORTD') == 1
2119 executable('systemd-importd',
2120 systemd_importd_sources,
2121 include_directories : includes,
2122 link_with : [libshared],
2123 dependencies : [threads],
2124 install_rpath : rootlibexecdir,
2126 install_dir : rootlibexecdir)
2128 systemd_pull = executable('systemd-pull',
2129 systemd_pull_sources,
2130 include_directories : includes,
2131 link_with : [libshared],
2132 dependencies : [versiondep,
2138 install_rpath : rootlibexecdir,
2140 install_dir : rootlibexecdir)
2142 systemd_import = executable('systemd-import',
2143 systemd_import_sources,
2144 include_directories : includes,
2145 link_with : [libshared],
2146 dependencies : [libcurl,
2150 install_rpath : rootlibexecdir,
2152 install_dir : rootlibexecdir)
2154 systemd_import_fs = executable('systemd-import-fs',
2155 systemd_import_fs_sources,
2156 include_directories : includes,
2157 link_with : [libshared],
2158 install_rpath : rootlibexecdir,
2160 install_dir : rootlibexecdir)
2162 systemd_export = executable('systemd-export',
2163 systemd_export_sources,
2164 include_directories : includes,
2165 link_with : [libshared],
2166 dependencies : [libcurl,
2170 install_rpath : rootlibexecdir,
2172 install_dir : rootlibexecdir)
2174 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2177 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2178 exe = executable('systemd-journal-upload',
2179 systemd_journal_upload_sources,
2180 include_directories : includes,
2181 link_with : [libshared],
2182 dependencies : [versiondep,
2188 install_rpath : rootlibexecdir,
2190 install_dir : rootlibexecdir)
2191 public_programs += exe
2194 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2195 s_j_remote = executable('systemd-journal-remote',
2196 systemd_journal_remote_sources,
2197 include_directories : includes,
2198 link_with : [libshared,
2199 libsystemd_journal_remote],
2200 dependencies : [threads,
2205 install_rpath : rootlibexecdir,
2207 install_dir : rootlibexecdir)
2209 s_j_gatewayd = executable('systemd-journal-gatewayd',
2210 systemd_journal_gatewayd_sources,
2211 include_directories : includes,
2212 link_with : [libshared],
2213 dependencies : [threads,
2218 install_rpath : rootlibexecdir,
2220 install_dir : rootlibexecdir)
2221 public_programs += [s_j_remote, s_j_gatewayd]
2224 if conf.get('ENABLE_COREDUMP') == 1
2225 executable('systemd-coredump',
2226 systemd_coredump_sources,
2227 include_directories : includes,
2228 link_with : [libshared],
2229 dependencies : [threads,
2234 install_rpath : rootlibexecdir,
2236 install_dir : rootlibexecdir)
2238 exe = executable('coredumpctl',
2239 coredumpctl_sources,
2240 include_directories : includes,
2241 link_with : [libshared],
2242 dependencies : [threads,
2245 install_rpath : rootlibexecdir,
2247 public_programs += exe
2250 if conf.get('ENABLE_BINFMT') == 1
2251 exe = executable('systemd-binfmt',
2252 'src/binfmt/binfmt.c',
2253 include_directories : includes,
2254 link_with : [libshared],
2255 install_rpath : rootlibexecdir,
2257 install_dir : rootlibexecdir)
2258 public_programs += exe
2260 meson.add_install_script('sh', '-c',
2261 mkdir_p.format(binfmtdir))
2262 meson.add_install_script('sh', '-c',
2263 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2266 if conf.get('ENABLE_VCONSOLE') == 1
2267 executable('systemd-vconsole-setup',
2268 'src/vconsole/vconsole-setup.c',
2269 include_directories : includes,
2270 link_with : [libshared],
2271 install_rpath : rootlibexecdir,
2273 install_dir : rootlibexecdir)
2276 if conf.get('ENABLE_RANDOMSEED') == 1
2277 executable('systemd-random-seed',
2278 'src/random-seed/random-seed.c',
2279 include_directories : includes,
2280 link_with : [libshared],
2281 install_rpath : rootlibexecdir,
2283 install_dir : rootlibexecdir)
2286 if conf.get('ENABLE_FIRSTBOOT') == 1
2287 executable('systemd-firstboot',
2288 'src/firstboot/firstboot.c',
2289 include_directories : includes,
2290 link_with : [libshared],
2291 dependencies : [libcrypt],
2292 install_rpath : rootlibexecdir,
2294 install_dir : rootbindir)
2297 executable('systemd-remount-fs',
2298 'src/remount-fs/remount-fs.c',
2299 include_directories : includes,
2300 link_with : [libcore_shared,
2302 install_rpath : rootlibexecdir,
2304 install_dir : rootlibexecdir)
2306 executable('systemd-machine-id-setup',
2307 'src/machine-id-setup/machine-id-setup-main.c',
2308 include_directories : includes,
2309 link_with : [libcore_shared,
2311 install_rpath : rootlibexecdir,
2313 install_dir : rootbindir)
2315 executable('systemd-fsck',
2317 include_directories : includes,
2318 link_with : [libshared],
2319 install_rpath : rootlibexecdir,
2321 install_dir : rootlibexecdir)
2323 executable('systemd-growfs',
2324 'src/partition/growfs.c',
2325 include_directories : includes,
2326 link_with : [libshared],
2327 dependencies : [libcryptsetup],
2328 install_rpath : rootlibexecdir,
2330 install_dir : rootlibexecdir)
2332 executable('systemd-makefs',
2333 'src/partition/makefs.c',
2334 include_directories : includes,
2335 link_with : [libshared],
2336 install_rpath : rootlibexecdir,
2338 install_dir : rootlibexecdir)
2340 executable('systemd-sleep',
2341 'src/sleep/sleep.c',
2342 include_directories : includes,
2343 link_with : [libshared],
2344 install_rpath : rootlibexecdir,
2346 install_dir : rootlibexecdir)
2348 install_data('src/sleep/sleep.conf',
2349 install_dir : pkgsysconfdir)
2351 exe = executable('systemd-sysctl',
2352 'src/sysctl/sysctl.c',
2353 include_directories : includes,
2354 link_with : [libshared],
2355 install_rpath : rootlibexecdir,
2357 install_dir : rootlibexecdir)
2358 public_programs += exe
2360 executable('systemd-ac-power',
2361 'src/ac-power/ac-power.c',
2362 include_directories : includes,
2363 link_with : [libshared],
2364 install_rpath : rootlibexecdir,
2366 install_dir : rootlibexecdir)
2368 exe = executable('systemd-detect-virt',
2369 'src/detect-virt/detect-virt.c',
2370 include_directories : includes,
2371 link_with : [libshared],
2372 install_rpath : rootlibexecdir,
2374 public_programs += exe
2376 exe = executable('systemd-delta',
2377 'src/delta/delta.c',
2378 include_directories : includes,
2379 link_with : [libshared],
2380 install_rpath : rootlibexecdir,
2382 public_programs += exe
2384 exe = executable('systemd-escape',
2385 'src/escape/escape.c',
2386 include_directories : includes,
2387 link_with : [libshared],
2388 install_rpath : rootlibexecdir,
2390 install_dir : rootbindir)
2391 public_programs += exe
2393 exe = executable('systemd-notify',
2394 'src/notify/notify.c',
2395 include_directories : includes,
2396 link_with : [libshared],
2397 install_rpath : rootlibexecdir,
2399 install_dir : rootbindir)
2400 public_programs += exe
2402 executable('systemd-volatile-root',
2403 'src/volatile-root/volatile-root.c',
2404 include_directories : includes,
2405 link_with : [libshared],
2406 install_rpath : rootlibexecdir,
2408 install_dir : rootlibexecdir)
2410 executable('systemd-cgroups-agent',
2411 'src/cgroups-agent/cgroups-agent.c',
2412 include_directories : includes,
2413 link_with : [libshared],
2414 install_rpath : rootlibexecdir,
2416 install_dir : rootlibexecdir)
2418 exe = executable('systemd-id128',
2419 'src/id128/id128.c',
2420 include_directories : includes,
2421 link_with : [libshared],
2422 install_rpath : rootlibexecdir,
2424 public_programs += exe
2426 exe = executable('systemd-path',
2428 include_directories : includes,
2429 link_with : [libshared],
2430 install_rpath : rootlibexecdir,
2432 public_programs += exe
2434 exe = executable('systemd-ask-password',
2435 'src/ask-password/ask-password.c',
2436 include_directories : includes,
2437 link_with : [libshared],
2438 install_rpath : rootlibexecdir,
2440 install_dir : rootbindir)
2441 public_programs += exe
2443 executable('systemd-reply-password',
2444 'src/reply-password/reply-password.c',
2445 include_directories : includes,
2446 link_with : [libshared],
2447 install_rpath : rootlibexecdir,
2449 install_dir : rootlibexecdir)
2451 exe = executable('systemd-tty-ask-password-agent',
2452 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2453 include_directories : includes,
2454 link_with : [libshared],
2455 install_rpath : rootlibexecdir,
2457 install_dir : rootbindir)
2458 public_programs += exe
2460 exe = executable('systemd-cgls',
2462 include_directories : includes,
2463 link_with : [libshared],
2464 install_rpath : rootlibexecdir,
2466 public_programs += exe
2468 exe = executable('systemd-cgtop',
2469 'src/cgtop/cgtop.c',
2470 include_directories : includes,
2471 link_with : [libshared],
2472 install_rpath : rootlibexecdir,
2474 public_programs += exe
2476 executable('systemd-initctl',
2477 'src/initctl/initctl.c',
2478 include_directories : includes,
2479 link_with : [libshared],
2480 install_rpath : rootlibexecdir,
2482 install_dir : rootlibexecdir)
2484 exe = executable('systemd-mount',
2485 'src/mount/mount-tool.c',
2486 include_directories : includes,
2487 link_with : [libshared],
2488 dependencies: [libmount],
2489 install_rpath : rootlibexecdir,
2491 public_programs += exe
2493 meson.add_install_script(meson_make_symlink,
2494 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2496 exe = executable('systemd-run',
2498 include_directories : includes,
2499 link_with : [libshared],
2500 install_rpath : rootlibexecdir,
2502 public_programs += exe
2504 exe = executable('systemd-stdio-bridge',
2505 'src/stdio-bridge/stdio-bridge.c',
2506 include_directories : includes,
2507 link_with : [libshared],
2508 dependencies : [versiondep],
2509 install_rpath : rootlibexecdir,
2511 public_programs += exe
2513 exe = executable('busctl',
2514 'src/busctl/busctl.c',
2515 'src/busctl/busctl-introspect.c',
2516 'src/busctl/busctl-introspect.h',
2517 include_directories : includes,
2518 link_with : [libshared],
2519 install_rpath : rootlibexecdir,
2521 public_programs += exe
2523 if conf.get('ENABLE_SYSUSERS') == 1
2524 exe = executable('systemd-sysusers',
2525 'src/sysusers/sysusers.c',
2526 include_directories : includes,
2527 link_with : [libshared],
2528 install_rpath : rootlibexecdir,
2530 install_dir : rootbindir)
2531 public_programs += exe
2534 if conf.get('ENABLE_TMPFILES') == 1
2535 exe = executable('systemd-tmpfiles',
2536 'src/tmpfiles/tmpfiles.c',
2537 include_directories : includes,
2538 link_with : [libshared],
2539 dependencies : [libacl],
2540 install_rpath : rootlibexecdir,
2542 install_dir : rootbindir)
2543 public_programs += exe
2545 if want_tests != 'false'
2546 test('test-systemd-tmpfiles',
2547 test_systemd_tmpfiles_py,
2548 # https://github.com/mesonbuild/meson/issues/2681
2549 args : exe.full_path())
2553 if conf.get('ENABLE_HWDB') == 1
2554 exe = executable('systemd-hwdb',
2556 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2557 include_directories : includes,
2558 link_with : [libudev_static],
2559 install_rpath : udev_rpath,
2561 install_dir : rootbindir)
2562 public_programs += exe
2565 if conf.get('ENABLE_QUOTACHECK') == 1
2566 executable('systemd-quotacheck',
2567 'src/quotacheck/quotacheck.c',
2568 include_directories : includes,
2569 link_with : [libshared],
2570 install_rpath : rootlibexecdir,
2572 install_dir : rootlibexecdir)
2575 exe = executable('systemd-socket-proxyd',
2576 'src/socket-proxy/socket-proxyd.c',
2577 include_directories : includes,
2578 link_with : [libshared],
2579 dependencies : [threads],
2580 install_rpath : rootlibexecdir,
2582 install_dir : rootlibexecdir)
2583 public_programs += exe
2585 exe = executable('systemd-udevd',
2586 systemd_udevd_sources,
2587 include_directories : includes,
2588 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2589 link_with : [libudev_core,
2592 dependencies : [versiondep,
2598 install_rpath : udev_rpath,
2600 install_dir : rootlibexecdir)
2601 public_programs += exe
2603 exe = executable('udevadm',
2605 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2606 include_directories : includes,
2607 link_with : [libudev_core,
2610 dependencies : [versiondep,
2616 install_rpath : udev_rpath,
2618 install_dir : rootbindir)
2619 public_programs += exe
2621 executable('systemd-shutdown',
2622 systemd_shutdown_sources,
2623 include_directories : includes,
2624 link_with : [libcore_shared,
2626 dependencies : [libmount],
2627 install_rpath : rootlibexecdir,
2629 install_dir : rootlibexecdir)
2631 executable('systemd-update-done',
2632 'src/update-done/update-done.c',
2633 include_directories : includes,
2634 link_with : [libshared],
2635 install_rpath : rootlibexecdir,
2637 install_dir : rootlibexecdir)
2639 executable('systemd-update-utmp',
2640 'src/update-utmp/update-utmp.c',
2641 include_directories : includes,
2642 link_with : [libshared],
2643 dependencies : [libaudit],
2644 install_rpath : rootlibexecdir,
2646 install_dir : rootlibexecdir)
2648 if conf.get('HAVE_KMOD') == 1
2649 executable('systemd-modules-load',
2650 'src/modules-load/modules-load.c',
2651 include_directories : includes,
2652 link_with : [libshared],
2653 dependencies : [libkmod],
2654 install_rpath : rootlibexecdir,
2656 install_dir : rootlibexecdir)
2658 meson.add_install_script('sh', '-c',
2659 mkdir_p.format(modulesloaddir))
2660 meson.add_install_script('sh', '-c',
2661 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2664 exe = executable('systemd-nspawn',
2665 systemd_nspawn_sources,
2666 include_directories : includes,
2667 link_with : [libcore_shared,
2670 dependencies : [libblkid,
2672 install_rpath : rootlibexecdir,
2674 public_programs += exe
2676 if conf.get('ENABLE_NETWORKD') == 1
2677 executable('systemd-networkd',
2678 systemd_networkd_sources,
2679 include_directories : includes,
2680 link_with : [libnetworkd_core,
2684 dependencies : [threads],
2685 install_rpath : rootlibexecdir,
2687 install_dir : rootlibexecdir)
2689 executable('systemd-networkd-wait-online',
2690 systemd_networkd_wait_online_sources,
2691 include_directories : includes,
2692 link_with : [libnetworkd_core,
2694 install_rpath : rootlibexecdir,
2696 install_dir : rootlibexecdir)
2698 exe = executable('networkctl',
2700 include_directories : includes,
2701 link_with : [libsystemd_network,
2703 install_rpath : rootlibexecdir,
2705 install_dir : rootbindir)
2706 public_programs += exe
2709 executable('systemd-sulogin-shell',
2710 ['src/sulogin-shell/sulogin-shell.c'],
2711 include_directories : includes,
2712 link_with : [libshared],
2713 install_rpath : rootlibexecdir,
2715 install_dir : rootlibexecdir)
2717 ############################################################
2720 'systemd-runtest.env',
2721 output : 'systemd-runtest.env',
2722 command : ['sh', '-c', '{ ' +
2723 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2724 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2726 build_by_default : true)
2728 foreach tuple : tests
2730 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2731 dependencies = tuple[2]
2732 condition = tuple.length() >= 4 ? tuple[3] : ''
2733 type = tuple.length() >= 5 ? tuple[4] : ''
2734 defs = tuple.length() >= 6 ? tuple[5] : []
2735 incs = tuple.length() >= 7 ? tuple[6] : includes
2738 name = sources[0].split('/')[-1].split('.')[0]
2739 if type.startswith('timeout=')
2740 timeout = type.split('=')[1].to_int()
2744 if condition == '' or conf.get(condition) == 1
2748 include_directories : incs,
2749 link_with : link_with,
2750 dependencies : [versiondep,
2753 build_by_default : want_tests != 'false',
2754 install_rpath : rootlibexecdir,
2755 install : install_tests,
2756 install_dir : join_paths(testsdir, type))
2759 message('@0@ is a manual test'.format(name))
2760 elif type == 'unsafe' and want_tests != 'unsafe'
2761 message('@0@ is an unsafe test'.format(name))
2762 elif want_tests != 'false'
2768 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2773 'test-libsystemd-sym',
2774 test_libsystemd_sym_c,
2775 include_directories : includes,
2776 link_with : [libsystemd],
2777 build_by_default : want_tests != 'false',
2778 install : install_tests,
2779 install_dir : testsdir)
2780 if want_tests != 'false'
2781 test('test-libsystemd-sym', exe)
2785 'test-libsystemd-static-sym',
2786 test_libsystemd_sym_c,
2787 include_directories : includes,
2788 link_with : [install_libsystemd_static],
2789 dependencies : [threads], # threads is already included in dependencies on the library,
2790 # but does not seem to get propagated. Add here as a work-around.
2791 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2792 install : install_tests and static_libsystemd_pic,
2793 install_dir : testsdir)
2794 if want_tests != 'false' and static_libsystemd_pic
2795 test('test-libsystemd-static-sym', exe)
2801 include_directories : includes,
2802 c_args : '-Wno-deprecated-declarations',
2803 link_with : [libudev],
2804 build_by_default : want_tests != 'false',
2805 install : install_tests,
2806 install_dir : testsdir)
2807 if want_tests != 'false'
2808 test('test-libudev-sym', exe)
2812 'test-libudev-static-sym',
2814 include_directories : includes,
2815 c_args : '-Wno-deprecated-declarations',
2816 link_with : [install_libudev_static],
2817 build_by_default : want_tests != 'false' and static_libudev_pic,
2818 install : install_tests and static_libudev_pic,
2819 install_dir : testsdir)
2820 if want_tests != 'false' and static_libudev_pic
2821 test('test-libudev-static-sym', exe)
2824 ############################################################
2828 if get_option('tests') != 'false'
2829 foreach tuple : fuzzers
2831 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2832 dependencies = tuple[2]
2833 defs = tuple.length() >= 4 ? tuple[3] : []
2834 incs = tuple.length() >= 5 ? tuple[4] : includes
2837 if want_ossfuzz or want_fuzzbuzz
2838 dependencies += fuzzing_engine
2840 if fuzzing_engine.found()
2841 dependencies += fuzzing_engine
2843 link_args += ['-fsanitize=fuzzer']
2846 sources += 'src/fuzz/fuzz-main.c'
2850 sources += 'src/fuzz/fuzzer-entry-point.c'
2853 name = sources[0].split('/')[-1].split('.')[0]
2855 fuzzer_exes += executable(
2858 include_directories : [incs, include_directories('src/fuzz')],
2859 link_with : link_with,
2860 dependencies : dependencies,
2862 link_args: link_args,
2867 run_target('fuzzers',
2868 depends : fuzzer_exes,
2871 ############################################################
2873 make_directive_index_py = find_program('tools/make-directive-index.py')
2874 make_man_index_py = find_program('tools/make-man-index.py')
2875 xml_helper_py = find_program('tools/xml_helper.py')
2876 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2880 subdir('sysusers.d')
2881 subdir('tmpfiles.d')
2886 subdir('shell-completion/bash')
2887 subdir('shell-completion/zsh')
2888 subdir('docs/sysvinit')
2889 subdir('docs/var-log')
2891 install_subdir('factory/etc',
2892 install_dir : factorydir)
2894 install_data('xorg/50-systemd-user.sh',
2895 install_dir : xinitrcdir)
2896 install_data('modprobe.d/systemd.conf',
2897 install_dir : modprobedir)
2898 install_data('LICENSE.GPL2',
2902 'docs/CODING_STYLE.md',
2903 'docs/DISTRO_PORTING.md',
2904 'docs/ENVIRONMENT.md',
2906 'docs/TRANSIENT-SETTINGS.md',
2907 'docs/TRANSLATORS.md',
2908 'docs/UIDS-GIDS.md',
2909 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2910 install_dir : docdir)
2912 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2913 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2915 ############################################################
2917 meson_check_help = find_program('tools/meson-check-help.sh')
2919 foreach exec : public_programs
2920 name = exec.full_path().split('/')[-1]
2921 if want_tests != 'false'
2922 test('check-help-' + name,
2924 args : exec.full_path())
2928 ############################################################
2930 # Enable tests for all supported sanitizers
2931 foreach tuple : sanitizers
2932 sanitizer = tuple[0]
2935 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2937 foreach p : fuzz_regression_tests
2938 b = p.split('/')[-2]
2939 c = p.split('/')[-1]
2941 name = '@0@:@1@'.format(b, sanitizer)
2944 if want_tests == 'false'
2945 message('Not compiling @0@ because tests is set to false'.format(name))
2947 exe = custom_target(
2951 command : [env, 'ln', '-fs',
2952 join_paths(build.full_path(), b),
2954 build_by_default : true)
2956 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2961 if want_tests != 'false' and slow_tests
2962 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2964 args : [exe.full_path(),
2965 join_paths(project_source_root, p)])
2972 ############################################################
2975 all_files = run_command(
2977 ['--git-dir=@0@/.git'.format(project_source_root),
2980 all_files = files(all_files.stdout().split())
2985 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
2988 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
2992 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2995 command : [meson_git_contrib_sh])
2999 git_head = run_command(
3001 ['--git-dir=@0@/.git'.format(project_source_root),
3002 'rev-parse', 'HEAD']).stdout().strip()
3003 git_head_short = run_command(
3005 ['--git-dir=@0@/.git'.format(project_source_root),
3006 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3010 command : ['git', 'archive',
3011 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3013 '--prefix', 'systemd-@0@/'.format(git_head),
3017 ############################################################
3019 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3022 depends : [man, libsystemd, libudev],
3023 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3025 ############################################################
3028 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3030 'split /usr: @0@'.format(split_usr),
3031 'split bin-sbin: @0@'.format(split_bin),
3032 'prefix directory: @0@'.format(prefixdir),
3033 'rootprefix directory: @0@'.format(rootprefixdir),
3034 'sysconf directory: @0@'.format(sysconfdir),
3035 'include directory: @0@'.format(includedir),
3036 'lib directory: @0@'.format(libdir),
3037 'rootlib directory: @0@'.format(rootlibdir),
3038 'SysV init scripts: @0@'.format(sysvinit_path),
3039 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3040 'PAM modules directory: @0@'.format(pamlibdir),
3041 'PAM configuration directory: @0@'.format(pamconfdir),
3042 'RPM macros directory: @0@'.format(rpmmacrosdir),
3043 'modprobe.d directory: @0@'.format(modprobedir),
3044 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3045 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3046 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3047 'bash completions directory: @0@'.format(bashcompletiondir),
3048 'zsh completions directory: @0@'.format(zshcompletiondir),
3049 'extra start script: @0@'.format(get_option('rc-local')),
3050 'extra stop script: @0@'.format(get_option('halt-local')),
3051 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3052 get_option('debug-tty')),
3053 'TTY GID: @0@'.format(tty_gid),
3054 'users GID: @0@'.format(substs.get('USERS_GID')),
3055 'maximum system UID: @0@'.format(system_uid_max),
3056 'maximum system GID: @0@'.format(system_gid_max),
3057 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3058 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3059 'minimum container UID base: @0@'.format(container_uid_base_min),
3060 'maximum container UID base: @0@'.format(container_uid_base_max),
3061 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3062 'render group access mode: @0@'.format(get_option('group-render-mode')),
3063 'certificate root directory: @0@'.format(get_option('certificate-root')),
3064 'support URL: @0@'.format(support_url),
3065 'nobody user name: @0@'.format(nobody_user),
3066 'nobody group name: @0@'.format(nobody_group),
3067 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3068 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3070 'default DNSSEC mode: @0@'.format(default_dnssec),
3071 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3072 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3073 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3074 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3075 'default locale: @0@'.format(default_locale)]
3077 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3078 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3080 'default DNS servers: @0@'.format(alt_dns_servers),
3081 'default NTP servers: @0@'.format(alt_ntp_servers)]
3083 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3084 '@@0@'.format(time_epoch)).stdout().strip()
3086 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3089 'static libsystemd: @0@'.format(static_libsystemd),
3090 'static libudev: @0@'.format(static_libudev)]
3093 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3094 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3095 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3097 if conf.get('ENABLE_EFI') == 1
3098 status += 'efi arch: @0@'.format(efi_arch)
3102 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3103 'EFI CC @0@'.format(' '.join(efi_cc)),
3104 'EFI lib directory: @0@'.format(efi_libdir),
3105 'EFI lds directory: @0@'.format(efi_ldsdir),
3106 'EFI include directory: @0@'.format(efi_incdir)]
3158 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3159 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3162 ['legacy pkla', install_polkit_pkla],
3164 ['gnu-efi', have_gnu_efi],
3177 ['man pages', want_man],
3178 ['html pages', want_html],
3179 ['man page indices', want_man and have_lxml],
3184 ['adm group', get_option('adm-group')],
3185 ['wheel group', get_option('wheel-group')],
3188 ['debug mmap cache'],
3191 ['valgrind', conf.get('VALGRIND') == 1],
3192 ['trace logging', conf.get('LOG_TRACE') == 1],
3193 ['link-udev-shared', get_option('link-udev-shared')],
3194 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3197 if tuple.length() >= 2
3200 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3201 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3202 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3213 'enabled features: @0@'.format(', '.join(found)),
3215 'disabled features: @0@'.format(', '.join(missing)),
3217 message('\n '.join(status))
3219 if rootprefixdir != rootprefix_default
3221 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3222 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3223 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))