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 = [
388 if cc.get_id() == 'clang'
389 possible_cc_flags += [
390 '-Wno-typedef-redefinition',
391 '-Wno-gnu-variable-sized-type-not-at-end',
395 if get_option('buildtype') != 'debug'
396 possible_cc_flags += [
397 '-ffunction-sections',
401 possible_link_flags += '-Wl,--gc-sections'
404 if get_option('b_ndebug') == 'true'
405 # With asserts disabled with get a bunch of warnings about variables which
406 # are used only in the asserts. This is not useful at all, so let's just silence
408 possible_cc_flags += [
409 '-Wno-unused-variable',
410 '-Wno-unused-but-set-variable',
414 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
415 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
419 #include <inttypes.h>
420 typedef uint64_t usec_t;
421 usec_t now(clockid_t clock);
426 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
427 add_project_arguments('-Werror=shadow', language : 'c')
430 cpp = ' '.join(cc.cmd_array()) + ' -E'
432 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
434 #####################################################################
435 # compilation result tests
437 conf.set('_GNU_SOURCE', true)
438 conf.set('__SANE_USERSPACE_TYPES__', true)
439 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
441 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
442 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
443 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
444 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
445 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
446 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
447 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
451 #include <sys/stat.h>
454 foreach decl : ['char16_t',
459 # We get -1 if the size cannot be determined
460 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
462 if decl == 'struct statx'
464 want_linux_stat_h = false
466 have = cc.sizeof(decl,
467 prefix : decl_headers + '#include <linux/stat.h>',
468 args : '-D_GNU_SOURCE') > 0
469 want_linux_stat_h = have
473 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
476 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
478 foreach ident : ['secure_getenv', '__secure_getenv']
479 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
483 ['memfd_create', '''#include <sys/mman.h>'''],
484 ['gettid', '''#include <sys/types.h>
485 #include <unistd.h>'''],
486 ['pivot_root', '''#include <stdlib.h>
487 #include <unistd.h>'''], # no known header declares pivot_root
488 ['name_to_handle_at', '''#include <sys/types.h>
489 #include <sys/stat.h>
490 #include <fcntl.h>'''],
491 ['setns', '''#include <sched.h>'''],
492 ['renameat2', '''#include <stdio.h>
493 #include <fcntl.h>'''],
494 ['kcmp', '''#include <linux/kcmp.h>'''],
495 ['keyctl', '''#include <sys/types.h>
496 #include <keyutils.h>'''],
497 ['copy_file_range', '''#include <sys/syscall.h>
498 #include <unistd.h>'''],
499 ['bpf', '''#include <sys/syscall.h>
500 #include <unistd.h>'''],
501 ['statx', '''#include <sys/types.h>
502 #include <sys/stat.h>
503 #include <unistd.h>'''],
504 ['explicit_bzero' , '''#include <string.h>'''],
505 ['reallocarray', '''#include <malloc.h>'''],
506 ['set_mempolicy', '''#include <stdlib.h>
507 #include <unistd.h>'''],
508 ['get_mempolicy', '''#include <stdlib.h>
509 #include <unistd.h>'''],
512 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
513 conf.set10('HAVE_' + ident[0].to_upper(), have)
516 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
517 conf.set10('USE_SYS_RANDOM_H', true)
518 conf.set10('HAVE_GETRANDOM', true)
520 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
521 conf.set10('USE_SYS_RANDOM_H', false)
522 conf.set10('HAVE_GETRANDOM', have)
525 #####################################################################
527 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
529 get_option('version-tag'),
530 meson.project_version()]
533 input : 'src/version/version.h.in',
534 output : 'version.h',
537 versiondep = declare_dependency(sources: version_h)
539 sed = find_program('sed')
540 awk = find_program('awk')
541 m4 = find_program('m4')
542 stat = find_program('stat')
543 git = find_program('git', required : false)
544 env = find_program('env')
545 perl = find_program('perl', required : false)
547 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
548 mkdir_p = 'mkdir -p $DESTDIR/@0@'
549 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
550 splash_bmp = files('test/splash.bmp')
552 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
553 # /usr/sbin, /sbin, and fall back to the default from middle column.
554 progs = [['quotaon', '/usr/sbin/quotaon' ],
555 ['quotacheck', '/usr/sbin/quotacheck' ],
556 ['kmod', '/usr/bin/kmod' ],
557 ['kexec', '/usr/sbin/kexec' ],
558 ['sulogin', '/usr/sbin/sulogin' ],
559 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
560 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
561 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
562 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
563 ['nologin', '/usr/sbin/nologin', ],
566 path = get_option(prog[0] + '-path')
568 message('Using @1@ for @0@'.format(prog[0], path))
570 exe = find_program(prog[0],
571 '/usr/sbin/' + prog[0],
574 path = exe.found() ? exe.path() : prog[1]
576 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
577 conf.set_quoted(name, path)
578 substs.set(name, path)
581 conf.set_quoted('TELINIT', get_option('telinit-path'))
583 if run_command('ln', '--relative', '--help').returncode() != 0
584 error('ln does not support --relative (added in coreutils 8.16)')
587 ############################################################
589 gperf = find_program('gperf')
591 gperf_test_format = '''
593 const char * in_word_set(const char *, @0@);
596 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
597 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
598 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
599 if cc.compiles(gperf_test)
600 gperf_len_type = 'size_t'
602 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
603 if cc.compiles(gperf_test)
604 gperf_len_type = 'unsigned'
606 error('unable to determine gperf len type')
609 message('gperf len type is @0@'.format(gperf_len_type))
610 conf.set('GPERF_LEN_TYPE', gperf_len_type,
611 description : 'The type of gperf "len" parameter')
613 ############################################################
615 if not cc.has_header('sys/capability.h')
616 error('POSIX caps headers not found')
618 foreach header : ['crypt.h',
620 'linux/vm_sockets.h',
622 'valgrind/memcheck.h',
623 'valgrind/valgrind.h',
626 conf.set10('HAVE_' + header.underscorify().to_upper(),
627 cc.has_header(header))
630 ############################################################
632 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
633 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
634 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
636 default_hierarchy = get_option('default-hierarchy')
637 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
638 description : 'default cgroup hierarchy as string')
639 if default_hierarchy == 'legacy'
640 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
641 elif default_hierarchy == 'hybrid'
642 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
644 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
647 default_net_naming_scheme = get_option('default-net-naming-scheme')
648 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
650 time_epoch = get_option('time-epoch')
653 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
655 conf.set('TIME_EPOCH', time_epoch)
657 system_uid_max = get_option('system-uid-max')
658 if system_uid_max == -1
659 system_uid_max = run_command(
661 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
662 '/etc/login.defs').stdout().strip()
663 if system_uid_max == ''
666 system_uid_max = system_uid_max.to_int()
669 conf.set('SYSTEM_UID_MAX', system_uid_max)
670 substs.set('systemuidmax', system_uid_max)
672 system_gid_max = get_option('system-gid-max')
673 if system_gid_max == -1
674 system_gid_max = run_command(
676 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
677 '/etc/login.defs').stdout().strip()
678 if system_gid_max == ''
681 system_gid_max = system_gid_max.to_int()
684 conf.set('SYSTEM_GID_MAX', system_gid_max)
685 substs.set('systemgidmax', system_gid_max)
687 dynamic_uid_min = get_option('dynamic-uid-min')
688 dynamic_uid_max = get_option('dynamic-uid-max')
689 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
690 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
691 substs.set('dynamicuidmin', dynamic_uid_min)
692 substs.set('dynamicuidmax', dynamic_uid_max)
694 container_uid_base_min = get_option('container-uid-base-min')
695 container_uid_base_max = get_option('container-uid-base-max')
696 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
697 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
698 substs.set('containeruidbasemin', container_uid_base_min)
699 substs.set('containeruidbasemax', container_uid_base_max)
701 nobody_user = get_option('nobody-user')
702 nobody_group = get_option('nobody-group')
704 if not meson.is_cross_build()
705 getent_result = run_command('getent', 'passwd', '65534')
706 if getent_result.returncode() == 0
707 name = getent_result.stdout().split(':')[0]
708 if name != nobody_user
710 '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) +
711 'Your build will result in an user table setup that is incompatible with the local system.')
714 id_result = run_command('id', '-u', nobody_user)
715 if id_result.returncode() == 0
716 id = id_result.stdout().to_int()
719 '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) +
720 'Your build will result in an user table setup that is incompatible with the local system.')
724 getent_result = run_command('getent', 'group', '65534')
725 if getent_result.returncode() == 0
726 name = getent_result.stdout().split(':')[0]
727 if name != nobody_group
729 '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) +
730 'Your build will result in an group table setup that is incompatible with the local system.')
733 id_result = run_command('id', '-g', nobody_group)
734 if id_result.returncode() == 0
735 id = id_result.stdout().to_int()
738 '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) +
739 'Your build will result in an group table setup that is incompatible with the local system.')
743 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
745 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
746 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
749 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
750 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
751 substs.set('NOBODY_USER_NAME', nobody_user)
752 substs.set('NOBODY_GROUP_NAME', nobody_group)
754 tty_gid = get_option('tty-gid')
755 conf.set('TTY_GID', tty_gid)
756 substs.set('TTY_GID', tty_gid)
758 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
759 users_gid = get_option('users-gid')
760 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
762 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
763 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
765 dev_kvm_mode = get_option('dev-kvm-mode')
766 substs.set('DEV_KVM_MODE', dev_kvm_mode)
767 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
768 group_render_mode = get_option('group-render-mode')
769 substs.set('GROUP_RENDER_MODE', group_render_mode)
770 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
772 kill_user_processes = get_option('default-kill-user-processes')
773 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
774 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
775 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
777 dns_servers = get_option('dns-servers')
778 conf.set_quoted('DNS_SERVERS', dns_servers)
779 substs.set('DNS_SERVERS', dns_servers)
781 ntp_servers = get_option('ntp-servers')
782 conf.set_quoted('NTP_SERVERS', ntp_servers)
783 substs.set('NTP_SERVERS', ntp_servers)
785 default_locale = get_option('default-locale')
786 if default_locale == ''
787 if not meson.is_cross_build()
788 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
789 default_locale = run_command(choose_default_locale_sh).stdout().strip()
791 default_locale = 'C.UTF-8'
794 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
796 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
798 service_watchdog = get_option('service-watchdog')
799 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
800 substs.set('SERVICE_WATCHDOG', watchdog_value)
802 substs.set('SUSHELL', get_option('debug-shell'))
803 substs.set('DEBUGTTY', get_option('debug-tty'))
804 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
806 enable_debug_hashmap = false
807 enable_debug_mmap_cache = false
808 enable_debug_siphash = false
809 foreach name : get_option('debug-extra')
811 enable_debug_hashmap = true
812 elif name == 'mmap-cache'
813 enable_debug_mmap_cache = true
814 elif name == 'siphash'
815 enable_debug_siphash = true
817 message('unknown debug option "@0@", ignoring'.format(name))
820 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
821 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
822 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
824 conf.set10('VALGRIND', get_option('valgrind'))
825 conf.set10('LOG_TRACE', get_option('log-trace'))
827 #####################################################################
829 threads = dependency('threads')
830 librt = cc.find_library('rt')
831 libm = cc.find_library('m')
832 libdl = cc.find_library('dl')
833 libcrypt = cc.find_library('crypt')
835 libcap = dependency('libcap', required : false)
836 if not libcap.found()
837 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
838 libcap = cc.find_library('cap')
841 libmount = dependency('mount',
842 version : fuzzer_build ? '>= 0' : '>= 2.30')
844 want_seccomp = get_option('seccomp')
845 if want_seccomp != 'false' and not skip_deps
846 libseccomp = dependency('libseccomp',
847 version : '>= 2.3.1',
848 required : want_seccomp == 'true')
849 have = libseccomp.found()
854 conf.set10('HAVE_SECCOMP', have)
856 want_selinux = get_option('selinux')
857 if want_selinux != 'false' and not skip_deps
858 libselinux = dependency('libselinux',
859 version : '>= 2.1.9',
860 required : want_selinux == 'true')
861 have = libselinux.found()
866 conf.set10('HAVE_SELINUX', have)
868 want_apparmor = get_option('apparmor')
869 if want_apparmor != 'false' and not skip_deps
870 libapparmor = dependency('libapparmor',
871 required : want_apparmor == 'true')
872 have = libapparmor.found()
877 conf.set10('HAVE_APPARMOR', have)
879 smack_run_label = get_option('smack-run-label')
880 if smack_run_label != ''
881 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
884 want_polkit = get_option('polkit')
885 install_polkit = false
886 install_polkit_pkla = false
887 if want_polkit != 'false' and not skip_deps
888 install_polkit = true
890 libpolkit = dependency('polkit-gobject-1',
892 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
893 message('Old polkit detected, will install pkla files')
894 install_polkit_pkla = true
897 conf.set10('ENABLE_POLKIT', install_polkit)
899 want_acl = get_option('acl')
900 if want_acl != 'false' and not skip_deps
901 libacl = cc.find_library('acl', required : want_acl == 'true')
902 have = libacl.found()
907 conf.set10('HAVE_ACL', have)
909 want_audit = get_option('audit')
910 if want_audit != 'false' and not skip_deps
911 libaudit = dependency('audit', required : want_audit == 'true')
912 have = libaudit.found()
917 conf.set10('HAVE_AUDIT', have)
919 want_blkid = get_option('blkid')
920 if want_blkid != 'false' and not skip_deps
921 libblkid = dependency('blkid', required : want_blkid == 'true')
922 have = libblkid.found()
927 conf.set10('HAVE_BLKID', have)
929 want_kmod = get_option('kmod')
930 if want_kmod != 'false' and not skip_deps
931 libkmod = dependency('libkmod',
933 required : want_kmod == 'true')
934 have = libkmod.found()
939 conf.set10('HAVE_KMOD', have)
941 want_pam = get_option('pam')
942 if want_pam != 'false' and not skip_deps
943 libpam = cc.find_library('pam', required : want_pam == 'true')
944 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
945 have = libpam.found() and libpam_misc.found()
951 conf.set10('HAVE_PAM', have)
953 want_microhttpd = get_option('microhttpd')
954 if want_microhttpd != 'false' and not skip_deps
955 libmicrohttpd = dependency('libmicrohttpd',
956 version : '>= 0.9.33',
957 required : want_microhttpd == 'true')
958 have = libmicrohttpd.found()
963 conf.set10('HAVE_MICROHTTPD', have)
965 want_libcryptsetup = get_option('libcryptsetup')
966 if want_libcryptsetup != 'false' and not skip_deps
967 libcryptsetup = dependency('libcryptsetup',
968 version : '>= 2.0.1',
969 required : want_libcryptsetup == 'true')
970 have = libcryptsetup.found()
975 conf.set10('HAVE_LIBCRYPTSETUP', have)
977 want_libcurl = get_option('libcurl')
978 if want_libcurl != 'false' and not skip_deps
979 libcurl = dependency('libcurl',
980 version : '>= 7.32.0',
981 required : want_libcurl == 'true')
982 have = libcurl.found()
987 conf.set10('HAVE_LIBCURL', have)
989 want_libidn = get_option('libidn')
990 want_libidn2 = get_option('libidn2')
991 if want_libidn == 'true' and want_libidn2 == 'true'
992 error('libidn and libidn2 cannot be requested simultaneously')
995 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
996 libidn = dependency('libidn2',
997 required : want_libidn2 == 'true')
998 have = libidn.found()
1003 conf.set10('HAVE_LIBIDN2', have)
1004 if not have and want_libidn != 'false' and not skip_deps
1005 # libidn is used for both libidn and libidn2 objects
1006 libidn = dependency('libidn',
1007 required : want_libidn == 'true')
1008 have = libidn.found()
1012 conf.set10('HAVE_LIBIDN', have)
1014 want_libiptc = get_option('libiptc')
1015 if want_libiptc != 'false' and not skip_deps
1016 libiptc = dependency('libiptc',
1017 required : want_libiptc == 'true')
1018 have = libiptc.found()
1023 conf.set10('HAVE_LIBIPTC', have)
1025 want_qrencode = get_option('qrencode')
1026 if want_qrencode != 'false' and not skip_deps
1027 libqrencode = dependency('libqrencode',
1028 required : want_qrencode == 'true')
1029 have = libqrencode.found()
1034 conf.set10('HAVE_QRENCODE', have)
1036 want_gcrypt = get_option('gcrypt')
1037 if want_gcrypt != 'false' and not skip_deps
1038 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1039 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1040 have = libgcrypt.found() and libgpg_error.found()
1045 # link to neither of the libs if one is not found
1049 conf.set10('HAVE_GCRYPT', have)
1051 want_gnutls = get_option('gnutls')
1052 if want_gnutls != 'false' and not skip_deps
1053 libgnutls = dependency('gnutls',
1054 version : '>= 3.1.4',
1055 required : want_gnutls == 'true')
1056 have = libgnutls.found()
1061 conf.set10('HAVE_GNUTLS', have)
1063 want_openssl = get_option('openssl')
1064 if want_openssl != 'false' and not skip_deps
1065 libopenssl = dependency('openssl',
1066 version : '>= 1.1.0',
1067 required : want_openssl == 'true')
1068 have = libopenssl.found()
1073 conf.set10('HAVE_OPENSSL', have)
1075 want_elfutils = get_option('elfutils')
1076 if want_elfutils != 'false' and not skip_deps
1077 libdw = dependency('libdw',
1078 required : want_elfutils == 'true')
1079 have = libdw.found()
1084 conf.set10('HAVE_ELFUTILS', have)
1086 want_zlib = get_option('zlib')
1087 if want_zlib != 'false' and not skip_deps
1088 libz = dependency('zlib',
1089 required : want_zlib == 'true')
1095 conf.set10('HAVE_ZLIB', have)
1097 want_bzip2 = get_option('bzip2')
1098 if want_bzip2 != 'false' and not skip_deps
1099 libbzip2 = cc.find_library('bz2',
1100 required : want_bzip2 == 'true')
1101 have = libbzip2.found()
1106 conf.set10('HAVE_BZIP2', have)
1108 want_xz = get_option('xz')
1109 if want_xz != 'false' and not skip_deps
1110 libxz = dependency('liblzma',
1111 required : want_xz == 'true')
1112 have = libxz.found()
1117 conf.set10('HAVE_XZ', have)
1119 want_lz4 = get_option('lz4')
1120 if want_lz4 != 'false' and not skip_deps
1121 liblz4 = dependency('liblz4',
1122 version : '>= 1.3.0',
1123 required : want_lz4 == 'true')
1124 have = liblz4.found()
1129 conf.set10('HAVE_LZ4', have)
1131 want_xkbcommon = get_option('xkbcommon')
1132 if want_xkbcommon != 'false' and not skip_deps
1133 libxkbcommon = dependency('xkbcommon',
1134 version : '>= 0.3.0',
1135 required : want_xkbcommon == 'true')
1136 have = libxkbcommon.found()
1141 conf.set10('HAVE_XKBCOMMON', have)
1143 want_pcre2 = get_option('pcre2')
1144 if want_pcre2 != 'false'
1145 libpcre2 = dependency('libpcre2-8',
1146 required : want_pcre2 == 'true')
1147 have = libpcre2.found()
1152 conf.set10('HAVE_PCRE2', have)
1154 want_glib = get_option('glib')
1155 if want_glib != 'false' and not skip_deps
1156 libglib = dependency('glib-2.0',
1157 version : '>= 2.22.0',
1158 required : want_glib == 'true')
1159 libgobject = dependency('gobject-2.0',
1160 version : '>= 2.22.0',
1161 required : want_glib == 'true')
1162 libgio = dependency('gio-2.0',
1163 required : want_glib == 'true')
1164 have = libglib.found() and libgobject.found() and libgio.found()
1171 conf.set10('HAVE_GLIB', have)
1173 want_dbus = get_option('dbus')
1174 if want_dbus != 'false' and not skip_deps
1175 libdbus = dependency('dbus-1',
1176 version : '>= 1.3.2',
1177 required : want_dbus == 'true')
1178 have = libdbus.found()
1183 conf.set10('HAVE_DBUS', have)
1185 default_dnssec = get_option('default-dnssec')
1187 default_dnssec = 'no'
1189 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1190 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1191 default_dnssec = 'no'
1193 conf.set('DEFAULT_DNSSEC_MODE',
1194 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1195 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1197 dns_over_tls = get_option('dns-over-tls')
1198 if dns_over_tls != 'false'
1199 if dns_over_tls == 'openssl'
1202 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1203 if dns_over_tls == 'gnutls' and not have_gnutls
1204 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1207 if dns_over_tls == 'gnutls' or have_gnutls
1208 have_openssl = false
1210 have_openssl = conf.get('HAVE_OPENSSL') == 1
1211 if dns_over_tls != 'auto' and not have_openssl
1212 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1213 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1216 have = have_gnutls or have_openssl
1220 have_openssl = false
1222 conf.set10('ENABLE_DNS_OVER_TLS', have)
1223 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1224 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1226 default_dns_over_tls = get_option('default-dns-over-tls')
1228 default_dns_over_tls = 'no'
1230 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1231 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.')
1232 default_dns_over_tls = 'no'
1234 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1235 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1236 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1238 want_importd = get_option('importd')
1239 if want_importd != 'false'
1240 have = (conf.get('HAVE_LIBCURL') == 1 and
1241 conf.get('HAVE_ZLIB') == 1 and
1242 conf.get('HAVE_XZ') == 1 and
1243 conf.get('HAVE_GCRYPT') == 1)
1244 if want_importd == 'true' and not have
1245 error('importd support was requested, but dependencies are not available')
1250 conf.set10('ENABLE_IMPORTD', have)
1252 want_remote = get_option('remote')
1253 if want_remote != 'false'
1254 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1255 conf.get('HAVE_LIBCURL') == 1]
1256 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1257 # it's possible to build one without the other. Complain only if
1258 # support was explicitly requested. The auxiliary files like sysusers
1259 # config should be installed when any of the programs are built.
1260 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1261 error('remote support was requested, but dependencies are not available')
1263 have = have_deps[0] or have_deps[1]
1267 conf.set10('ENABLE_REMOTE', have)
1269 foreach term : ['utmp',
1302 have = get_option(term)
1303 name = 'ENABLE_' + term.underscorify().to_upper()
1304 conf.set10(name, have)
1307 foreach tuple : [['nss-mymachines', 'machined'],
1308 ['nss-resolve', 'resolve']]
1309 want = get_option(tuple[0])
1311 have = get_option(tuple[1])
1312 if want == 'true' and not have
1313 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1318 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1319 conf.set10(name, have)
1323 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1324 'ENABLE_NSS_MYMACHINES',
1325 'ENABLE_NSS_RESOLVE',
1326 'ENABLE_NSS_SYSTEMD']
1327 if conf.get(term) == 1
1331 conf.set10('ENABLE_NSS', enable_nss)
1333 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1338 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1340 #####################################################################
1342 if get_option('efi')
1343 efi_arch = host_machine.cpu_family()
1345 if efi_arch == 'x86'
1346 EFI_MACHINE_TYPE_NAME = 'ia32'
1347 gnu_efi_arch = 'ia32'
1348 elif efi_arch == 'x86_64'
1349 EFI_MACHINE_TYPE_NAME = 'x64'
1350 gnu_efi_arch = 'x86_64'
1351 elif efi_arch == 'arm'
1352 EFI_MACHINE_TYPE_NAME = 'arm'
1353 gnu_efi_arch = 'arm'
1354 elif efi_arch == 'aarch64'
1355 EFI_MACHINE_TYPE_NAME = 'aa64'
1356 gnu_efi_arch = 'aarch64'
1358 EFI_MACHINE_TYPE_NAME = ''
1363 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1365 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1369 conf.set10('ENABLE_EFI', have)
1371 #####################################################################
1373 config_h = configure_file(
1374 output : 'config.h',
1375 configuration : conf)
1377 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1379 includes = include_directories('src/basic',
1384 'src/journal-remote',
1388 'src/time-wait-sync',
1394 'src/libsystemd/sd-bus',
1395 'src/libsystemd/sd-device',
1396 'src/libsystemd/sd-event',
1397 'src/libsystemd/sd-hwdb',
1398 'src/libsystemd/sd-id128',
1399 'src/libsystemd/sd-netlink',
1400 'src/libsystemd/sd-network',
1401 'src/libsystemd/sd-resolve',
1402 'src/libsystemd-network',
1405 add_project_arguments('-include', 'config.h', language : 'c')
1407 generate_gperfs = find_program('tools/generate-gperfs.py')
1411 subdir('src/systemd')
1413 subdir('src/libsystemd')
1414 subdir('src/libsystemd-network')
1415 subdir('src/journal')
1418 libjournal_core = static_library(
1420 libjournal_core_sources,
1422 include_directories : includes,
1425 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1426 libsystemd = shared_library(
1429 version : libsystemd_version,
1430 include_directories : includes,
1431 link_args : ['-shared',
1432 '-Wl,--version-script=' + libsystemd_sym_path],
1433 link_with : [libbasic,
1435 link_whole : [libsystemd_static,
1437 dependencies : [threads,
1441 link_depends : libsystemd_sym,
1443 install_dir : rootlibdir)
1445 static_libsystemd = get_option('static-libsystemd')
1446 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1448 install_libsystemd_static = static_library(
1451 journal_client_sources,
1453 basic_gcrypt_sources,
1455 include_directories : includes,
1456 build_by_default : static_libsystemd != 'false',
1457 install : static_libsystemd != 'false',
1458 install_dir : rootlibdir,
1459 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1460 dependencies : [threads,
1469 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1471 #Generate autosuspend rules
1472 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1474 ############################################################
1476 # binaries that have --help and are intended for use by humans,
1477 # usually, but not always, installed in /bin.
1478 public_programs = []
1480 subdir('src/libudev')
1481 subdir('src/shared')
1483 subdir('src/shutdown')
1485 subdir('src/network')
1487 subdir('src/analyze')
1488 subdir('src/journal-remote')
1489 subdir('src/coredump')
1490 subdir('src/pstore')
1491 subdir('src/hostname')
1492 subdir('src/import')
1493 subdir('src/kernel-install')
1494 subdir('src/locale')
1495 subdir('src/machine')
1496 subdir('src/portable')
1497 subdir('src/nspawn')
1498 subdir('src/resolve')
1499 subdir('src/timedate')
1500 subdir('src/timesync')
1501 subdir('src/vconsole')
1502 subdir('src/boot/efi')
1509 ############################################################
1511 # only static linking apart from libdl, to make sure that the
1512 # module is linked to all libraries that it uses.
1513 test_dlopen = executable(
1517 include_directories : includes,
1518 link_with : [libbasic],
1519 dependencies : [libdl],
1520 build_by_default : want_tests != 'false')
1522 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1523 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1524 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1525 ['resolve', 'ENABLE_NSS_RESOLVE']]
1527 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1531 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1532 version_script_arg = join_paths(project_source_root, sym)
1534 nss = shared_library(
1536 'src/nss-@0@/nss-@0@.c'.format(module),
1539 include_directories : includes,
1540 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1541 link_args : ['-Wl,-z,nodelete',
1543 '-Wl,--version-script=' + version_script_arg],
1544 link_with : [libsystemd_static,
1547 dependencies : [threads,
1551 install_dir : rootlibdir)
1553 # We cannot use shared_module because it does not support version suffix.
1554 # Unfortunately shared_library insists on creating the symlink…
1555 meson.add_install_script('sh', '-c',
1556 'rm $DESTDIR@0@/libnss_@1@.so'
1557 .format(rootlibdir, module))
1559 if want_tests != 'false'
1560 test('dlopen-nss_' + module,
1562 # path to dlopen must include a slash
1563 args : nss.full_path())
1568 ############################################################
1570 executable('systemd',
1572 include_directories : includes,
1573 link_with : [libcore,
1575 dependencies : [versiondep,
1582 install_rpath : rootlibexecdir,
1584 install_dir : rootlibexecdir)
1586 meson.add_install_script(meson_make_symlink,
1587 join_paths(rootlibexecdir, 'systemd'),
1588 join_paths(rootsbindir, 'init'))
1590 exe = executable('systemd-analyze',
1591 systemd_analyze_sources,
1592 include_directories : includes,
1593 link_with : [libcore,
1595 dependencies : [versiondep,
1602 install_rpath : rootlibexecdir,
1604 public_programs += exe
1606 executable('systemd-journald',
1607 systemd_journald_sources,
1608 include_directories : includes,
1609 link_with : [libjournal_core,
1611 dependencies : [threads,
1615 install_rpath : rootlibexecdir,
1617 install_dir : rootlibexecdir)
1619 exe = executable('systemd-cat',
1620 systemd_cat_sources,
1621 include_directories : includes,
1622 link_with : [libjournal_core,
1624 dependencies : [threads],
1625 install_rpath : rootlibexecdir,
1627 public_programs += exe
1629 exe = executable('journalctl',
1631 include_directories : includes,
1632 link_with : [libshared],
1633 dependencies : [threads,
1638 install_rpath : rootlibexecdir,
1640 install_dir : rootbindir)
1641 public_programs += exe
1643 executable('systemd-getty-generator',
1644 'src/getty-generator/getty-generator.c',
1645 include_directories : includes,
1646 link_with : [libshared],
1647 install_rpath : rootlibexecdir,
1649 install_dir : systemgeneratordir)
1651 executable('systemd-debug-generator',
1652 'src/debug-generator/debug-generator.c',
1653 include_directories : includes,
1654 link_with : [libshared],
1655 install_rpath : rootlibexecdir,
1657 install_dir : systemgeneratordir)
1659 executable('systemd-run-generator',
1660 'src/run-generator/run-generator.c',
1661 include_directories : includes,
1662 link_with : [libshared],
1663 install_rpath : rootlibexecdir,
1665 install_dir : systemgeneratordir)
1667 executable('systemd-fstab-generator',
1668 'src/fstab-generator/fstab-generator.c',
1669 include_directories : includes,
1670 link_with : [libcore_shared,
1672 install_rpath : rootlibexecdir,
1674 install_dir : systemgeneratordir)
1676 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1677 executable('30-systemd-environment-d-generator',
1678 'src/environment-d-generator/environment-d-generator.c',
1679 include_directories : includes,
1680 link_with : [libshared],
1681 install_rpath : rootlibexecdir,
1683 install_dir : userenvgeneratordir)
1685 meson.add_install_script(meson_make_symlink,
1686 join_paths(sysconfdir, 'environment'),
1687 join_paths(environmentdir, '99-environment.conf'))
1690 if conf.get('ENABLE_HIBERNATE') == 1
1691 executable('systemd-hibernate-resume-generator',
1692 'src/hibernate-resume/hibernate-resume-generator.c',
1693 include_directories : includes,
1694 link_with : [libshared],
1695 install_rpath : rootlibexecdir,
1697 install_dir : systemgeneratordir)
1699 executable('systemd-hibernate-resume',
1700 'src/hibernate-resume/hibernate-resume.c',
1701 include_directories : includes,
1702 link_with : [libshared],
1703 install_rpath : rootlibexecdir,
1705 install_dir : rootlibexecdir)
1708 if conf.get('HAVE_BLKID') == 1
1709 executable('systemd-gpt-auto-generator',
1710 'src/gpt-auto-generator/gpt-auto-generator.c',
1711 'src/shared/blkid-util.h',
1712 include_directories : includes,
1713 link_with : [libshared],
1714 dependencies : libblkid,
1715 install_rpath : rootlibexecdir,
1717 install_dir : systemgeneratordir)
1719 exe = executable('systemd-dissect',
1720 'src/dissect/dissect.c',
1721 include_directories : includes,
1722 link_with : [libshared],
1723 install_rpath : rootlibexecdir,
1725 install_dir : rootlibexecdir)
1726 public_programs += exe
1729 if conf.get('ENABLE_RESOLVE') == 1
1730 executable('systemd-resolved',
1731 systemd_resolved_sources,
1732 include_directories : includes,
1733 link_with : [libshared,
1735 libsystemd_resolve_core],
1736 dependencies : systemd_resolved_dependencies,
1737 install_rpath : rootlibexecdir,
1739 install_dir : rootlibexecdir)
1741 exe = executable('resolvectl',
1743 include_directories : includes,
1744 link_with : [libshared,
1746 libsystemd_resolve_core],
1747 dependencies : [threads,
1751 install_rpath : rootlibexecdir,
1753 public_programs += exe
1755 meson.add_install_script(meson_make_symlink,
1756 join_paths(bindir, 'resolvectl'),
1757 join_paths(rootsbindir, 'resolvconf'))
1759 meson.add_install_script(meson_make_symlink,
1760 join_paths(bindir, 'resolvectl'),
1761 join_paths(bindir, 'systemd-resolve'))
1764 if conf.get('ENABLE_LOGIND') == 1
1765 executable('systemd-logind',
1766 systemd_logind_sources,
1767 include_directories : includes,
1768 link_with : [liblogind_core,
1770 dependencies : [threads,
1772 install_rpath : rootlibexecdir,
1774 install_dir : rootlibexecdir)
1776 exe = executable('loginctl',
1778 include_directories : includes,
1779 link_with : [libshared],
1780 dependencies : [threads,
1783 install_rpath : rootlibexecdir,
1785 install_dir : rootbindir)
1786 public_programs += exe
1788 exe = executable('systemd-inhibit',
1789 'src/login/inhibit.c',
1790 include_directories : includes,
1791 link_with : [libshared],
1792 install_rpath : rootlibexecdir,
1794 install_dir : rootbindir)
1795 public_programs += exe
1797 if conf.get('HAVE_PAM') == 1
1798 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1799 pam_systemd = shared_library(
1803 include_directories : includes,
1804 link_args : ['-shared',
1805 '-Wl,--version-script=' + version_script_arg],
1806 link_with : [libsystemd_static,
1808 dependencies : [threads,
1811 link_depends : pam_systemd_sym,
1813 install_dir : pamlibdir)
1815 if want_tests != 'false'
1816 test('dlopen-pam_systemd',
1818 # path to dlopen must include a slash
1819 args : pam_systemd.full_path())
1823 executable('systemd-user-runtime-dir',
1824 user_runtime_dir_sources,
1825 include_directories : includes,
1826 link_with : [libshared],
1827 install_rpath : rootlibexecdir,
1829 install_dir : rootlibexecdir)
1832 if conf.get('HAVE_PAM') == 1
1833 executable('systemd-user-sessions',
1834 'src/user-sessions/user-sessions.c',
1835 include_directories : includes,
1836 link_with : [libshared],
1837 install_rpath : rootlibexecdir,
1839 install_dir : rootlibexecdir)
1842 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1843 exe = executable('bootctl',
1844 'src/boot/bootctl.c',
1845 include_directories : includes,
1846 link_with : [libshared],
1847 dependencies : [libblkid],
1848 install_rpath : rootlibexecdir,
1850 public_programs += exe
1852 executable('systemd-bless-boot',
1853 'src/boot/bless-boot.c',
1854 include_directories : includes,
1855 link_with : [libshared],
1856 dependencies : [libblkid],
1857 install_rpath : rootlibexecdir,
1859 install_dir : rootlibexecdir)
1861 executable('systemd-bless-boot-generator',
1862 'src/boot/bless-boot-generator.c',
1863 include_directories : includes,
1864 link_with : [libshared],
1865 install_rpath : rootlibexecdir,
1867 install_dir : systemgeneratordir)
1870 executable('systemd-boot-check-no-failures',
1871 'src/boot/boot-check-no-failures.c',
1872 include_directories : includes,
1873 link_with : [libshared],
1874 dependencies : [libblkid],
1875 install_rpath : rootlibexecdir,
1877 install_dir : rootlibexecdir)
1879 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1880 include_directories : includes,
1881 link_with : [libshared],
1882 dependencies : [threads],
1883 install_rpath : rootlibexecdir,
1885 public_programs += exe
1888 if get_option('link-systemctl-shared')
1889 systemctl_link_with = [libshared]
1891 systemctl_link_with = [libsystemd_static,
1897 exe = executable('systemctl',
1898 'src/systemctl/systemctl.c',
1899 'src/systemctl/sysv-compat.h',
1900 'src/systemctl/sysv-compat.c',
1901 include_directories : includes,
1902 link_with : systemctl_link_with,
1903 dependencies : [threads,
1908 install_rpath : rootlibexecdir,
1910 install_dir : rootbindir)
1911 public_programs += exe
1913 if conf.get('ENABLE_PORTABLED') == 1
1914 executable('systemd-portabled',
1915 systemd_portabled_sources,
1916 include_directories : includes,
1917 link_with : [libshared],
1918 dependencies : [threads],
1919 install_rpath : rootlibexecdir,
1921 install_dir : rootlibexecdir)
1923 exe = executable('portablectl', 'src/portable/portablectl.c',
1924 include_directories : includes,
1925 link_with : [libshared],
1926 dependencies : [threads],
1927 install_rpath : rootlibexecdir,
1929 install_dir : rootbindir)
1930 public_programs += exe
1933 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1934 meson.add_install_script(meson_make_symlink,
1935 join_paths(rootbindir, 'systemctl'),
1936 join_paths(rootsbindir, alias))
1939 if conf.get('ENABLE_BACKLIGHT') == 1
1940 executable('systemd-backlight',
1941 'src/backlight/backlight.c',
1942 include_directories : includes,
1943 link_with : [libshared],
1944 install_rpath : rootlibexecdir,
1946 install_dir : rootlibexecdir)
1949 if conf.get('ENABLE_RFKILL') == 1
1950 executable('systemd-rfkill',
1951 'src/rfkill/rfkill.c',
1952 include_directories : includes,
1953 link_with : [libshared],
1954 install_rpath : rootlibexecdir,
1956 install_dir : rootlibexecdir)
1959 executable('systemd-system-update-generator',
1960 'src/system-update-generator/system-update-generator.c',
1961 include_directories : includes,
1962 link_with : [libshared],
1963 install_rpath : rootlibexecdir,
1965 install_dir : systemgeneratordir)
1967 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1968 executable('systemd-cryptsetup',
1969 'src/cryptsetup/cryptsetup.c',
1970 include_directories : includes,
1971 link_with : [libshared],
1972 dependencies : [libcryptsetup],
1973 install_rpath : rootlibexecdir,
1975 install_dir : rootlibexecdir)
1977 executable('systemd-cryptsetup-generator',
1978 'src/cryptsetup/cryptsetup-generator.c',
1979 include_directories : includes,
1980 link_with : [libshared],
1981 dependencies : [libcryptsetup],
1982 install_rpath : rootlibexecdir,
1984 install_dir : systemgeneratordir)
1986 executable('systemd-veritysetup',
1987 'src/veritysetup/veritysetup.c',
1988 include_directories : includes,
1989 link_with : [libshared],
1990 dependencies : [libcryptsetup],
1991 install_rpath : rootlibexecdir,
1993 install_dir : rootlibexecdir)
1995 executable('systemd-veritysetup-generator',
1996 'src/veritysetup/veritysetup-generator.c',
1997 include_directories : includes,
1998 link_with : [libshared],
1999 dependencies : [libcryptsetup],
2000 install_rpath : rootlibexecdir,
2002 install_dir : systemgeneratordir)
2005 if conf.get('HAVE_SYSV_COMPAT') == 1
2006 executable('systemd-sysv-generator',
2007 'src/sysv-generator/sysv-generator.c',
2008 include_directories : includes,
2009 link_with : [libshared],
2010 install_rpath : rootlibexecdir,
2012 install_dir : systemgeneratordir)
2014 executable('systemd-rc-local-generator',
2015 'src/rc-local-generator/rc-local-generator.c',
2016 include_directories : includes,
2017 link_with : [libshared],
2018 install_rpath : rootlibexecdir,
2020 install_dir : systemgeneratordir)
2023 if conf.get('ENABLE_HOSTNAMED') == 1
2024 executable('systemd-hostnamed',
2025 'src/hostname/hostnamed.c',
2026 include_directories : includes,
2027 link_with : [libshared],
2028 install_rpath : rootlibexecdir,
2030 install_dir : rootlibexecdir)
2032 exe = executable('hostnamectl',
2033 'src/hostname/hostnamectl.c',
2034 include_directories : includes,
2035 link_with : [libshared],
2036 install_rpath : rootlibexecdir,
2038 public_programs += exe
2041 if conf.get('ENABLE_LOCALED') == 1
2042 if conf.get('HAVE_XKBCOMMON') == 1
2043 # logind will load libxkbcommon.so dynamically on its own
2049 executable('systemd-localed',
2050 systemd_localed_sources,
2051 include_directories : includes,
2052 link_with : [libshared],
2053 dependencies : deps,
2054 install_rpath : rootlibexecdir,
2056 install_dir : rootlibexecdir)
2058 exe = executable('localectl',
2060 include_directories : includes,
2061 link_with : [libshared],
2062 install_rpath : rootlibexecdir,
2064 public_programs += exe
2067 if conf.get('ENABLE_TIMEDATED') == 1
2068 executable('systemd-timedated',
2069 'src/timedate/timedated.c',
2070 include_directories : includes,
2071 link_with : [libshared],
2072 install_rpath : rootlibexecdir,
2074 install_dir : rootlibexecdir)
2077 if conf.get('ENABLE_TIMEDATECTL') == 1
2078 exe = executable('timedatectl',
2079 'src/timedate/timedatectl.c',
2080 include_directories : includes,
2081 install_rpath : rootlibexecdir,
2082 link_with : [libshared],
2083 dependencies : [libm],
2085 public_programs += exe
2088 if conf.get('ENABLE_TIMESYNCD') == 1
2089 executable('systemd-timesyncd',
2090 systemd_timesyncd_sources,
2091 include_directories : includes,
2092 link_with : [libshared],
2093 dependencies : [threads,
2095 install_rpath : rootlibexecdir,
2097 install_dir : rootlibexecdir)
2099 executable('systemd-time-wait-sync',
2100 'src/time-wait-sync/time-wait-sync.c',
2101 include_directories : includes,
2102 link_with : [libshared],
2103 install_rpath : rootlibexecdir,
2105 install_dir : rootlibexecdir)
2108 if conf.get('ENABLE_MACHINED') == 1
2109 executable('systemd-machined',
2110 systemd_machined_sources,
2111 include_directories : includes,
2112 link_with : [libmachine_core,
2114 install_rpath : rootlibexecdir,
2116 install_dir : rootlibexecdir)
2118 exe = executable('machinectl',
2119 'src/machine/machinectl.c',
2120 include_directories : includes,
2121 link_with : [libshared],
2122 dependencies : [threads,
2125 install_rpath : rootlibexecdir,
2127 install_dir : rootbindir)
2128 public_programs += exe
2131 if conf.get('ENABLE_IMPORTD') == 1
2132 executable('systemd-importd',
2133 systemd_importd_sources,
2134 include_directories : includes,
2135 link_with : [libshared],
2136 dependencies : [threads],
2137 install_rpath : rootlibexecdir,
2139 install_dir : rootlibexecdir)
2141 systemd_pull = executable('systemd-pull',
2142 systemd_pull_sources,
2143 include_directories : includes,
2144 link_with : [libshared],
2145 dependencies : [versiondep,
2151 install_rpath : rootlibexecdir,
2153 install_dir : rootlibexecdir)
2155 systemd_import = executable('systemd-import',
2156 systemd_import_sources,
2157 include_directories : includes,
2158 link_with : [libshared],
2159 dependencies : [libcurl,
2163 install_rpath : rootlibexecdir,
2165 install_dir : rootlibexecdir)
2167 systemd_import_fs = executable('systemd-import-fs',
2168 systemd_import_fs_sources,
2169 include_directories : includes,
2170 link_with : [libshared],
2171 install_rpath : rootlibexecdir,
2173 install_dir : rootlibexecdir)
2175 systemd_export = executable('systemd-export',
2176 systemd_export_sources,
2177 include_directories : includes,
2178 link_with : [libshared],
2179 dependencies : [libcurl,
2183 install_rpath : rootlibexecdir,
2185 install_dir : rootlibexecdir)
2187 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2190 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2191 exe = executable('systemd-journal-upload',
2192 systemd_journal_upload_sources,
2193 include_directories : includes,
2194 link_with : [libshared],
2195 dependencies : [versiondep,
2201 install_rpath : rootlibexecdir,
2203 install_dir : rootlibexecdir)
2204 public_programs += exe
2207 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2208 s_j_remote = executable('systemd-journal-remote',
2209 systemd_journal_remote_sources,
2210 include_directories : includes,
2211 link_with : [libshared,
2212 libsystemd_journal_remote],
2213 dependencies : [threads,
2218 install_rpath : rootlibexecdir,
2220 install_dir : rootlibexecdir)
2222 s_j_gatewayd = executable('systemd-journal-gatewayd',
2223 systemd_journal_gatewayd_sources,
2224 include_directories : includes,
2225 link_with : [libshared],
2226 dependencies : [threads,
2231 install_rpath : rootlibexecdir,
2233 install_dir : rootlibexecdir)
2234 public_programs += [s_j_remote, s_j_gatewayd]
2237 if conf.get('ENABLE_COREDUMP') == 1
2238 executable('systemd-coredump',
2239 systemd_coredump_sources,
2240 include_directories : includes,
2241 link_with : [libshared],
2242 dependencies : [threads,
2247 install_rpath : rootlibexecdir,
2249 install_dir : rootlibexecdir)
2251 exe = executable('coredumpctl',
2252 coredumpctl_sources,
2253 include_directories : includes,
2254 link_with : [libshared],
2255 dependencies : [threads,
2258 install_rpath : rootlibexecdir,
2260 public_programs += exe
2263 if conf.get('ENABLE_PSTORE') == 1
2264 executable('systemd-pstore',
2265 systemd_pstore_sources,
2266 include_directories : includes,
2267 link_with : [libshared],
2268 dependencies : [threads,
2273 install_rpath : rootlibexecdir,
2275 install_dir : rootlibexecdir)
2278 if conf.get('ENABLE_BINFMT') == 1
2279 exe = executable('systemd-binfmt',
2280 'src/binfmt/binfmt.c',
2281 include_directories : includes,
2282 link_with : [libshared],
2283 install_rpath : rootlibexecdir,
2285 install_dir : rootlibexecdir)
2286 public_programs += exe
2288 meson.add_install_script('sh', '-c',
2289 mkdir_p.format(binfmtdir))
2290 meson.add_install_script('sh', '-c',
2291 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2294 if conf.get('ENABLE_VCONSOLE') == 1
2295 executable('systemd-vconsole-setup',
2296 'src/vconsole/vconsole-setup.c',
2297 include_directories : includes,
2298 link_with : [libshared],
2299 install_rpath : rootlibexecdir,
2301 install_dir : rootlibexecdir)
2304 if conf.get('ENABLE_RANDOMSEED') == 1
2305 executable('systemd-random-seed',
2306 'src/random-seed/random-seed.c',
2307 include_directories : includes,
2308 link_with : [libshared],
2309 install_rpath : rootlibexecdir,
2311 install_dir : rootlibexecdir)
2314 if conf.get('ENABLE_FIRSTBOOT') == 1
2315 executable('systemd-firstboot',
2316 'src/firstboot/firstboot.c',
2317 include_directories : includes,
2318 link_with : [libshared],
2319 dependencies : [libcrypt],
2320 install_rpath : rootlibexecdir,
2322 install_dir : rootbindir)
2325 executable('systemd-remount-fs',
2326 'src/remount-fs/remount-fs.c',
2327 include_directories : includes,
2328 link_with : [libcore_shared,
2330 install_rpath : rootlibexecdir,
2332 install_dir : rootlibexecdir)
2334 executable('systemd-machine-id-setup',
2335 'src/machine-id-setup/machine-id-setup-main.c',
2336 include_directories : includes,
2337 link_with : [libcore_shared,
2339 install_rpath : rootlibexecdir,
2341 install_dir : rootbindir)
2343 executable('systemd-fsck',
2345 include_directories : includes,
2346 link_with : [libshared],
2347 install_rpath : rootlibexecdir,
2349 install_dir : rootlibexecdir)
2351 executable('systemd-growfs',
2352 'src/partition/growfs.c',
2353 include_directories : includes,
2354 link_with : [libshared],
2355 dependencies : [libcryptsetup],
2356 install_rpath : rootlibexecdir,
2358 install_dir : rootlibexecdir)
2360 executable('systemd-makefs',
2361 'src/partition/makefs.c',
2362 include_directories : includes,
2363 link_with : [libshared],
2364 install_rpath : rootlibexecdir,
2366 install_dir : rootlibexecdir)
2368 executable('systemd-sleep',
2369 'src/sleep/sleep.c',
2370 include_directories : includes,
2371 link_with : [libshared],
2372 install_rpath : rootlibexecdir,
2374 install_dir : rootlibexecdir)
2376 install_data('src/sleep/sleep.conf',
2377 install_dir : pkgsysconfdir)
2379 exe = executable('systemd-sysctl',
2380 'src/sysctl/sysctl.c',
2381 include_directories : includes,
2382 link_with : [libshared],
2383 install_rpath : rootlibexecdir,
2385 install_dir : rootlibexecdir)
2386 public_programs += exe
2388 executable('systemd-ac-power',
2389 'src/ac-power/ac-power.c',
2390 include_directories : includes,
2391 link_with : [libshared],
2392 install_rpath : rootlibexecdir,
2394 install_dir : rootlibexecdir)
2396 exe = executable('systemd-detect-virt',
2397 'src/detect-virt/detect-virt.c',
2398 include_directories : includes,
2399 link_with : [libshared],
2400 install_rpath : rootlibexecdir,
2402 public_programs += exe
2404 exe = executable('systemd-delta',
2405 'src/delta/delta.c',
2406 include_directories : includes,
2407 link_with : [libshared],
2408 install_rpath : rootlibexecdir,
2410 public_programs += exe
2412 exe = executable('systemd-escape',
2413 'src/escape/escape.c',
2414 include_directories : includes,
2415 link_with : [libshared],
2416 install_rpath : rootlibexecdir,
2418 install_dir : rootbindir)
2419 public_programs += exe
2421 exe = executable('systemd-notify',
2422 'src/notify/notify.c',
2423 include_directories : includes,
2424 link_with : [libshared],
2425 install_rpath : rootlibexecdir,
2427 install_dir : rootbindir)
2428 public_programs += exe
2430 executable('systemd-volatile-root',
2431 'src/volatile-root/volatile-root.c',
2432 include_directories : includes,
2433 link_with : [libshared],
2434 install_rpath : rootlibexecdir,
2436 install_dir : rootlibexecdir)
2438 executable('systemd-cgroups-agent',
2439 'src/cgroups-agent/cgroups-agent.c',
2440 include_directories : includes,
2441 link_with : [libshared],
2442 install_rpath : rootlibexecdir,
2444 install_dir : rootlibexecdir)
2446 exe = executable('systemd-id128',
2447 'src/id128/id128.c',
2448 include_directories : includes,
2449 link_with : [libshared],
2450 install_rpath : rootlibexecdir,
2452 public_programs += exe
2454 exe = executable('systemd-path',
2456 include_directories : includes,
2457 link_with : [libshared],
2458 install_rpath : rootlibexecdir,
2460 public_programs += exe
2462 exe = executable('systemd-ask-password',
2463 'src/ask-password/ask-password.c',
2464 include_directories : includes,
2465 link_with : [libshared],
2466 install_rpath : rootlibexecdir,
2468 install_dir : rootbindir)
2469 public_programs += exe
2471 executable('systemd-reply-password',
2472 'src/reply-password/reply-password.c',
2473 include_directories : includes,
2474 link_with : [libshared],
2475 install_rpath : rootlibexecdir,
2477 install_dir : rootlibexecdir)
2479 exe = executable('systemd-tty-ask-password-agent',
2480 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2481 include_directories : includes,
2482 link_with : [libshared],
2483 install_rpath : rootlibexecdir,
2485 install_dir : rootbindir)
2486 public_programs += exe
2488 exe = executable('systemd-cgls',
2490 include_directories : includes,
2491 link_with : [libshared],
2492 install_rpath : rootlibexecdir,
2494 public_programs += exe
2496 exe = executable('systemd-cgtop',
2497 'src/cgtop/cgtop.c',
2498 include_directories : includes,
2499 link_with : [libshared],
2500 install_rpath : rootlibexecdir,
2502 public_programs += exe
2504 executable('systemd-initctl',
2505 'src/initctl/initctl.c',
2506 include_directories : includes,
2507 link_with : [libshared],
2508 install_rpath : rootlibexecdir,
2510 install_dir : rootlibexecdir)
2512 exe = executable('systemd-mount',
2513 'src/mount/mount-tool.c',
2514 include_directories : includes,
2515 link_with : [libshared],
2516 dependencies: [libmount],
2517 install_rpath : rootlibexecdir,
2519 public_programs += exe
2521 meson.add_install_script(meson_make_symlink,
2522 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2524 exe = executable('systemd-run',
2526 include_directories : includes,
2527 link_with : [libshared],
2528 install_rpath : rootlibexecdir,
2530 public_programs += exe
2532 exe = executable('systemd-stdio-bridge',
2533 'src/stdio-bridge/stdio-bridge.c',
2534 include_directories : includes,
2535 link_with : [libshared],
2536 dependencies : [versiondep],
2537 install_rpath : rootlibexecdir,
2539 public_programs += exe
2541 exe = executable('busctl',
2542 'src/busctl/busctl.c',
2543 'src/busctl/busctl-introspect.c',
2544 'src/busctl/busctl-introspect.h',
2545 include_directories : includes,
2546 link_with : [libshared],
2547 install_rpath : rootlibexecdir,
2549 public_programs += exe
2551 if conf.get('ENABLE_SYSUSERS') == 1
2552 exe = executable('systemd-sysusers',
2553 'src/sysusers/sysusers.c',
2554 include_directories : includes,
2555 link_with : [libshared],
2556 install_rpath : rootlibexecdir,
2558 install_dir : rootbindir)
2559 public_programs += exe
2562 if conf.get('ENABLE_TMPFILES') == 1
2563 exe = executable('systemd-tmpfiles',
2564 'src/tmpfiles/tmpfiles.c',
2565 include_directories : includes,
2566 link_with : [libshared],
2567 dependencies : [libacl],
2568 install_rpath : rootlibexecdir,
2570 install_dir : rootbindir)
2571 public_programs += exe
2573 if want_tests != 'false'
2574 test('test-systemd-tmpfiles',
2575 test_systemd_tmpfiles_py,
2576 # https://github.com/mesonbuild/meson/issues/2681
2577 args : exe.full_path())
2581 if conf.get('ENABLE_HWDB') == 1
2582 exe = executable('systemd-hwdb',
2584 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2585 include_directories : includes,
2586 link_with : [libudev_static],
2587 install_rpath : udev_rpath,
2589 install_dir : rootbindir)
2590 public_programs += exe
2593 if conf.get('ENABLE_QUOTACHECK') == 1
2594 executable('systemd-quotacheck',
2595 'src/quotacheck/quotacheck.c',
2596 include_directories : includes,
2597 link_with : [libshared],
2598 install_rpath : rootlibexecdir,
2600 install_dir : rootlibexecdir)
2603 exe = executable('systemd-socket-proxyd',
2604 'src/socket-proxy/socket-proxyd.c',
2605 include_directories : includes,
2606 link_with : [libshared],
2607 dependencies : [threads],
2608 install_rpath : rootlibexecdir,
2610 install_dir : rootlibexecdir)
2611 public_programs += exe
2613 exe = executable('systemd-udevd',
2614 systemd_udevd_sources,
2615 include_directories : includes,
2616 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2617 link_with : [libudev_core,
2620 dependencies : [versiondep,
2626 install_rpath : udev_rpath,
2628 install_dir : rootlibexecdir)
2629 public_programs += exe
2631 exe = executable('udevadm',
2633 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2634 include_directories : includes,
2635 link_with : [libudev_core,
2638 dependencies : [versiondep,
2644 install_rpath : udev_rpath,
2646 install_dir : rootbindir)
2647 public_programs += exe
2649 executable('systemd-shutdown',
2650 systemd_shutdown_sources,
2651 include_directories : includes,
2652 link_with : [libcore_shared,
2654 dependencies : [libmount],
2655 install_rpath : rootlibexecdir,
2657 install_dir : rootlibexecdir)
2659 executable('systemd-update-done',
2660 'src/update-done/update-done.c',
2661 include_directories : includes,
2662 link_with : [libshared],
2663 install_rpath : rootlibexecdir,
2665 install_dir : rootlibexecdir)
2667 executable('systemd-update-utmp',
2668 'src/update-utmp/update-utmp.c',
2669 include_directories : includes,
2670 link_with : [libshared],
2671 dependencies : [libaudit],
2672 install_rpath : rootlibexecdir,
2674 install_dir : rootlibexecdir)
2676 if conf.get('HAVE_KMOD') == 1
2677 executable('systemd-modules-load',
2678 'src/modules-load/modules-load.c',
2679 include_directories : includes,
2680 link_with : [libshared],
2681 dependencies : [libkmod],
2682 install_rpath : rootlibexecdir,
2684 install_dir : rootlibexecdir)
2686 meson.add_install_script('sh', '-c',
2687 mkdir_p.format(modulesloaddir))
2688 meson.add_install_script('sh', '-c',
2689 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2692 exe = executable('systemd-nspawn',
2693 systemd_nspawn_sources,
2694 include_directories : includes,
2695 link_with : [libcore_shared,
2698 dependencies : [libblkid,
2700 install_rpath : rootlibexecdir,
2702 public_programs += exe
2704 if conf.get('ENABLE_NETWORKD') == 1
2705 executable('systemd-networkd',
2706 systemd_networkd_sources,
2707 include_directories : network_include_dir,
2708 link_with : [libnetworkd_core,
2712 dependencies : [threads],
2713 install_rpath : rootlibexecdir,
2715 install_dir : rootlibexecdir)
2717 executable('systemd-networkd-wait-online',
2718 systemd_networkd_wait_online_sources,
2719 include_directories : includes,
2720 link_with : [libnetworkd_core,
2722 install_rpath : rootlibexecdir,
2724 install_dir : rootlibexecdir)
2726 exe = executable('networkctl',
2728 include_directories : includes,
2729 link_with : [libsystemd_network,
2731 install_rpath : rootlibexecdir,
2733 install_dir : rootbindir)
2734 public_programs += exe
2736 executable('systemd-network-generator',
2737 network_generator_sources,
2738 include_directories : includes,
2739 link_with : [libshared],
2740 install_rpath : rootlibexecdir,
2742 install_dir : rootlibexecdir)
2745 executable('systemd-sulogin-shell',
2746 ['src/sulogin-shell/sulogin-shell.c'],
2747 include_directories : includes,
2748 link_with : [libshared],
2749 install_rpath : rootlibexecdir,
2751 install_dir : rootlibexecdir)
2753 ############################################################
2756 'systemd-runtest.env',
2757 output : 'systemd-runtest.env',
2758 command : ['sh', '-c', '{ ' +
2759 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2760 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2762 build_by_default : true)
2764 foreach tuple : tests
2766 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2767 dependencies = tuple[2]
2768 condition = tuple.length() >= 4 ? tuple[3] : ''
2769 type = tuple.length() >= 5 ? tuple[4] : ''
2770 defs = tuple.length() >= 6 ? tuple[5] : []
2771 incs = tuple.length() >= 7 ? tuple[6] : includes
2774 name = sources[0].split('/')[-1].split('.')[0]
2775 if type.startswith('timeout=')
2776 timeout = type.split('=')[1].to_int()
2780 if condition == '' or conf.get(condition) == 1
2784 include_directories : incs,
2785 link_with : link_with,
2786 dependencies : [versiondep,
2789 build_by_default : want_tests != 'false',
2790 install_rpath : rootlibexecdir,
2791 install : install_tests,
2792 install_dir : join_paths(testsdir, type))
2795 message('@0@ is a manual test'.format(name))
2796 elif type == 'unsafe' and want_tests != 'unsafe'
2797 message('@0@ is an unsafe test'.format(name))
2798 elif want_tests != 'false'
2804 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2809 'test-libsystemd-sym',
2810 test_libsystemd_sym_c,
2811 include_directories : includes,
2812 link_with : [libsystemd],
2813 build_by_default : want_tests != 'false',
2814 install : install_tests,
2815 install_dir : testsdir)
2816 if want_tests != 'false'
2817 test('test-libsystemd-sym', exe)
2821 'test-libsystemd-static-sym',
2822 test_libsystemd_sym_c,
2823 include_directories : includes,
2824 link_with : [install_libsystemd_static],
2825 dependencies : [threads], # threads is already included in dependencies on the library,
2826 # but does not seem to get propagated. Add here as a work-around.
2827 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2828 install : install_tests and static_libsystemd_pic,
2829 install_dir : testsdir)
2830 if want_tests != 'false' and static_libsystemd_pic
2831 test('test-libsystemd-static-sym', exe)
2837 include_directories : includes,
2838 c_args : '-Wno-deprecated-declarations',
2839 link_with : [libudev],
2840 build_by_default : want_tests != 'false',
2841 install : install_tests,
2842 install_dir : testsdir)
2843 if want_tests != 'false'
2844 test('test-libudev-sym', exe)
2848 'test-libudev-static-sym',
2850 include_directories : includes,
2851 c_args : '-Wno-deprecated-declarations',
2852 link_with : [install_libudev_static],
2853 build_by_default : want_tests != 'false' and static_libudev_pic,
2854 install : install_tests and static_libudev_pic,
2855 install_dir : testsdir)
2856 if want_tests != 'false' and static_libudev_pic
2857 test('test-libudev-static-sym', exe)
2860 ############################################################
2864 if get_option('tests') != 'false'
2865 foreach tuple : fuzzers
2867 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2868 dependencies = tuple[2]
2869 defs = tuple.length() >= 4 ? tuple[3] : []
2870 incs = tuple.length() >= 5 ? tuple[4] : includes
2873 if want_ossfuzz or want_fuzzbuzz
2874 dependencies += fuzzing_engine
2876 if fuzzing_engine.found()
2877 dependencies += fuzzing_engine
2879 link_args += ['-fsanitize=fuzzer']
2882 sources += 'src/fuzz/fuzz-main.c'
2886 sources += 'src/fuzz/fuzzer-entry-point.c'
2889 name = sources[0].split('/')[-1].split('.')[0]
2891 fuzzer_exes += executable(
2894 include_directories : [incs, include_directories('src/fuzz')],
2895 link_with : link_with,
2896 dependencies : dependencies,
2898 link_args: link_args,
2903 run_target('fuzzers',
2904 depends : fuzzer_exes,
2907 ############################################################
2909 make_directive_index_py = find_program('tools/make-directive-index.py')
2910 make_man_index_py = find_program('tools/make-man-index.py')
2911 xml_helper_py = find_program('tools/xml_helper.py')
2912 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2915 subdir('sysusers.d')
2916 subdir('tmpfiles.d')
2922 subdir('shell-completion/bash')
2923 subdir('shell-completion/zsh')
2924 subdir('docs/sysvinit')
2925 subdir('docs/var-log')
2927 install_subdir('factory/etc',
2928 install_dir : factorydir)
2930 install_data('xorg/50-systemd-user.sh',
2931 install_dir : xinitrcdir)
2932 install_data('modprobe.d/systemd.conf',
2933 install_dir : modprobedir)
2934 install_data('LICENSE.GPL2',
2938 'docs/CODING_STYLE.md',
2939 'docs/DISTRO_PORTING.md',
2940 'docs/ENVIRONMENT.md',
2942 'docs/TRANSIENT-SETTINGS.md',
2943 'docs/TRANSLATORS.md',
2944 'docs/UIDS-GIDS.md',
2945 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2946 install_dir : docdir)
2948 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2949 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2951 ############################################################
2953 meson_check_help = find_program('tools/meson-check-help.sh')
2955 foreach exec : public_programs
2956 name = exec.full_path().split('/')[-1]
2957 if want_tests != 'false'
2958 test('check-help-' + name,
2960 args : exec.full_path())
2964 ############################################################
2966 check_directives_sh = find_program('tools/check-directives.sh')
2968 if want_tests != 'false'
2969 test('check-directives',
2970 check_directives_sh,
2971 args : project_source_root)
2974 ############################################################
2976 # Enable tests for all supported sanitizers
2977 foreach tuple : sanitizers
2978 sanitizer = tuple[0]
2981 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2983 foreach p : fuzz_regression_tests
2984 b = p.split('/')[-2]
2985 c = p.split('/')[-1]
2987 name = '@0@:@1@'.format(b, sanitizer)
2990 if want_tests == 'false'
2991 message('Not compiling @0@ because tests is set to false'.format(name))
2993 exe = custom_target(
2997 command : [env, 'ln', '-fs',
2998 join_paths(build.full_path(), b),
3000 build_by_default : true)
3002 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3007 if want_tests != 'false' and slow_tests
3008 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3010 args : [exe.full_path(),
3011 join_paths(project_source_root, p)])
3018 ############################################################
3021 all_files = run_command(
3023 ['--git-dir=@0@/.git'.format(project_source_root),
3026 all_files = files(all_files.stdout().split())
3031 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3034 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3038 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3041 command : [meson_git_contrib_sh])
3045 git_head = run_command(
3047 ['--git-dir=@0@/.git'.format(project_source_root),
3048 'rev-parse', 'HEAD']).stdout().strip()
3049 git_head_short = run_command(
3051 ['--git-dir=@0@/.git'.format(project_source_root),
3052 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3056 command : ['git', 'archive',
3057 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3059 '--prefix', 'systemd-@0@/'.format(git_head),
3063 ############################################################
3065 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3068 depends : [man, libsystemd, libudev],
3069 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3071 ############################################################
3072 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3075 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3077 'split /usr: @0@'.format(split_usr),
3078 'split bin-sbin: @0@'.format(split_bin),
3079 'prefix directory: @0@'.format(prefixdir),
3080 'rootprefix directory: @0@'.format(rootprefixdir),
3081 'sysconf directory: @0@'.format(sysconfdir),
3082 'include directory: @0@'.format(includedir),
3083 'lib directory: @0@'.format(libdir),
3084 'rootlib directory: @0@'.format(rootlibdir),
3085 'SysV init scripts: @0@'.format(sysvinit_path),
3086 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3087 'PAM modules directory: @0@'.format(pamlibdir),
3088 'PAM configuration directory: @0@'.format(pamconfdir),
3089 'RPM macros directory: @0@'.format(rpmmacrosdir),
3090 'modprobe.d directory: @0@'.format(modprobedir),
3091 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3092 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3093 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3094 'bash completions directory: @0@'.format(bashcompletiondir),
3095 'zsh completions directory: @0@'.format(zshcompletiondir),
3096 'extra start script: @0@'.format(get_option('rc-local')),
3097 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3098 get_option('debug-tty')),
3099 'TTY GID: @0@'.format(tty_gid),
3100 'users GID: @0@'.format(substs.get('USERS_GID')),
3101 'maximum system UID: @0@'.format(system_uid_max),
3102 'maximum system GID: @0@'.format(system_gid_max),
3103 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3104 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3105 'minimum container UID base: @0@'.format(container_uid_base_min),
3106 'maximum container UID base: @0@'.format(container_uid_base_max),
3107 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3108 'render group access mode: @0@'.format(get_option('group-render-mode')),
3109 'certificate root directory: @0@'.format(get_option('certificate-root')),
3110 'support URL: @0@'.format(support_url),
3111 'nobody user name: @0@'.format(nobody_user),
3112 'nobody group name: @0@'.format(nobody_group),
3113 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3114 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3116 'default DNSSEC mode: @0@'.format(default_dnssec),
3117 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3118 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3119 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3120 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3121 'default locale: @0@'.format(default_locale),
3122 'systemd service watchdog: @0@'.format(watchdog_opt)]
3124 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3125 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3127 'default DNS servers: @0@'.format(alt_dns_servers),
3128 'default NTP servers: @0@'.format(alt_ntp_servers)]
3130 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3131 '@@0@'.format(time_epoch)).stdout().strip()
3133 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3136 'static libsystemd: @0@'.format(static_libsystemd),
3137 'static libudev: @0@'.format(static_libudev)]
3140 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3141 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3142 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3144 if conf.get('ENABLE_EFI') == 1
3145 status += 'efi arch: @0@'.format(efi_arch)
3149 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3150 'EFI CC @0@'.format(' '.join(efi_cc)),
3151 'EFI lib directory: @0@'.format(efi_libdir),
3152 'EFI lds directory: @0@'.format(efi_ldsdir),
3153 'EFI include directory: @0@'.format(efi_incdir)]
3205 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3206 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3210 ['legacy pkla', install_polkit_pkla],
3212 ['gnu-efi', have_gnu_efi],
3225 ['man pages', want_man],
3226 ['html pages', want_html],
3227 ['man page indices', want_man and have_lxml],
3232 ['adm group', get_option('adm-group')],
3233 ['wheel group', get_option('wheel-group')],
3236 ['debug mmap cache'],
3238 ['valgrind', conf.get('VALGRIND') == 1],
3239 ['trace logging', conf.get('LOG_TRACE') == 1],
3240 ['link-udev-shared', get_option('link-udev-shared')],
3241 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3244 if tuple.length() >= 2
3247 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3248 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3249 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3260 'enabled features: @0@'.format(', '.join(found)),
3262 'disabled features: @0@'.format(', '.join(missing)),
3264 message('\n '.join(status))
3266 if rootprefixdir != rootprefix_default
3268 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3269 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3270 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))