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 substs.set('SUSHELL', get_option('debug-shell'))
799 substs.set('DEBUGTTY', get_option('debug-tty'))
800 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
802 enable_debug_hashmap = false
803 enable_debug_mmap_cache = false
804 enable_debug_siphash = false
805 foreach name : get_option('debug-extra')
807 enable_debug_hashmap = true
808 elif name == 'mmap-cache'
809 enable_debug_mmap_cache = true
810 elif name == 'siphash'
811 enable_debug_siphash = true
813 message('unknown debug option "@0@", ignoring'.format(name))
816 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
817 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
818 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
820 conf.set10('VALGRIND', get_option('valgrind'))
821 conf.set10('LOG_TRACE', get_option('log-trace'))
823 #####################################################################
825 threads = dependency('threads')
826 librt = cc.find_library('rt')
827 libm = cc.find_library('m')
828 libdl = cc.find_library('dl')
829 libcrypt = cc.find_library('crypt')
831 libcap = dependency('libcap', required : false)
832 if not libcap.found()
833 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
834 libcap = cc.find_library('cap')
837 libmount = dependency('mount',
838 version : fuzzer_build ? '>= 0' : '>= 2.30')
840 want_seccomp = get_option('seccomp')
841 if want_seccomp != 'false' and not skip_deps
842 libseccomp = dependency('libseccomp',
843 version : '>= 2.3.1',
844 required : want_seccomp == 'true')
845 have = libseccomp.found()
850 conf.set10('HAVE_SECCOMP', have)
852 want_selinux = get_option('selinux')
853 if want_selinux != 'false' and not skip_deps
854 libselinux = dependency('libselinux',
855 version : '>= 2.1.9',
856 required : want_selinux == 'true')
857 have = libselinux.found()
862 conf.set10('HAVE_SELINUX', have)
864 want_apparmor = get_option('apparmor')
865 if want_apparmor != 'false' and not skip_deps
866 libapparmor = dependency('libapparmor',
867 required : want_apparmor == 'true')
868 have = libapparmor.found()
873 conf.set10('HAVE_APPARMOR', have)
875 smack_run_label = get_option('smack-run-label')
876 if smack_run_label != ''
877 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
880 want_polkit = get_option('polkit')
881 install_polkit = false
882 install_polkit_pkla = false
883 if want_polkit != 'false' and not skip_deps
884 install_polkit = true
886 libpolkit = dependency('polkit-gobject-1',
888 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
889 message('Old polkit detected, will install pkla files')
890 install_polkit_pkla = true
893 conf.set10('ENABLE_POLKIT', install_polkit)
895 want_acl = get_option('acl')
896 if want_acl != 'false' and not skip_deps
897 libacl = cc.find_library('acl', required : want_acl == 'true')
898 have = libacl.found()
903 conf.set10('HAVE_ACL', have)
905 want_audit = get_option('audit')
906 if want_audit != 'false' and not skip_deps
907 libaudit = dependency('audit', required : want_audit == 'true')
908 have = libaudit.found()
913 conf.set10('HAVE_AUDIT', have)
915 want_blkid = get_option('blkid')
916 if want_blkid != 'false' and not skip_deps
917 libblkid = dependency('blkid', required : want_blkid == 'true')
918 have = libblkid.found()
923 conf.set10('HAVE_BLKID', have)
925 want_kmod = get_option('kmod')
926 if want_kmod != 'false' and not skip_deps
927 libkmod = dependency('libkmod',
929 required : want_kmod == 'true')
930 have = libkmod.found()
935 conf.set10('HAVE_KMOD', have)
937 want_pam = get_option('pam')
938 if want_pam != 'false' and not skip_deps
939 libpam = cc.find_library('pam', required : want_pam == 'true')
940 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
941 have = libpam.found() and libpam_misc.found()
947 conf.set10('HAVE_PAM', have)
949 want_microhttpd = get_option('microhttpd')
950 if want_microhttpd != 'false' and not skip_deps
951 libmicrohttpd = dependency('libmicrohttpd',
952 version : '>= 0.9.33',
953 required : want_microhttpd == 'true')
954 have = libmicrohttpd.found()
959 conf.set10('HAVE_MICROHTTPD', have)
961 want_libcryptsetup = get_option('libcryptsetup')
962 if want_libcryptsetup != 'false' and not skip_deps
963 libcryptsetup = dependency('libcryptsetup',
964 version : '>= 2.0.1',
965 required : want_libcryptsetup == 'true')
966 have = libcryptsetup.found()
971 conf.set10('HAVE_LIBCRYPTSETUP', have)
973 want_libcurl = get_option('libcurl')
974 if want_libcurl != 'false' and not skip_deps
975 libcurl = dependency('libcurl',
976 version : '>= 7.32.0',
977 required : want_libcurl == 'true')
978 have = libcurl.found()
983 conf.set10('HAVE_LIBCURL', have)
985 want_libidn = get_option('libidn')
986 want_libidn2 = get_option('libidn2')
987 if want_libidn == 'true' and want_libidn2 == 'true'
988 error('libidn and libidn2 cannot be requested simultaneously')
991 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
992 libidn = dependency('libidn2',
993 required : want_libidn2 == 'true')
994 have = libidn.found()
999 conf.set10('HAVE_LIBIDN2', have)
1000 if not have and want_libidn != 'false' and not skip_deps
1001 # libidn is used for both libidn and libidn2 objects
1002 libidn = dependency('libidn',
1003 required : want_libidn == 'true')
1004 have = libidn.found()
1008 conf.set10('HAVE_LIBIDN', have)
1010 want_libiptc = get_option('libiptc')
1011 if want_libiptc != 'false' and not skip_deps
1012 libiptc = dependency('libiptc',
1013 required : want_libiptc == 'true')
1014 have = libiptc.found()
1019 conf.set10('HAVE_LIBIPTC', have)
1021 want_qrencode = get_option('qrencode')
1022 if want_qrencode != 'false' and not skip_deps
1023 libqrencode = dependency('libqrencode',
1024 required : want_qrencode == 'true')
1025 have = libqrencode.found()
1030 conf.set10('HAVE_QRENCODE', have)
1032 want_gcrypt = get_option('gcrypt')
1033 if want_gcrypt != 'false' and not skip_deps
1034 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1035 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1036 have = libgcrypt.found() and libgpg_error.found()
1041 # link to neither of the libs if one is not found
1045 conf.set10('HAVE_GCRYPT', have)
1047 want_gnutls = get_option('gnutls')
1048 if want_gnutls != 'false' and not skip_deps
1049 libgnutls = dependency('gnutls',
1050 version : '>= 3.1.4',
1051 required : want_gnutls == 'true')
1052 have = libgnutls.found()
1057 conf.set10('HAVE_GNUTLS', have)
1059 want_openssl = get_option('openssl')
1060 if want_openssl != 'false' and not skip_deps
1061 libopenssl = dependency('openssl',
1062 version : '>= 1.1.0',
1063 required : want_openssl == 'true')
1064 have = libopenssl.found()
1069 conf.set10('HAVE_OPENSSL', have)
1071 want_elfutils = get_option('elfutils')
1072 if want_elfutils != 'false' and not skip_deps
1073 libdw = dependency('libdw',
1074 required : want_elfutils == 'true')
1075 have = libdw.found()
1080 conf.set10('HAVE_ELFUTILS', have)
1082 want_zlib = get_option('zlib')
1083 if want_zlib != 'false' and not skip_deps
1084 libz = dependency('zlib',
1085 required : want_zlib == 'true')
1091 conf.set10('HAVE_ZLIB', have)
1093 want_bzip2 = get_option('bzip2')
1094 if want_bzip2 != 'false' and not skip_deps
1095 libbzip2 = cc.find_library('bz2',
1096 required : want_bzip2 == 'true')
1097 have = libbzip2.found()
1102 conf.set10('HAVE_BZIP2', have)
1104 want_xz = get_option('xz')
1105 if want_xz != 'false' and not skip_deps
1106 libxz = dependency('liblzma',
1107 required : want_xz == 'true')
1108 have = libxz.found()
1113 conf.set10('HAVE_XZ', have)
1115 want_lz4 = get_option('lz4')
1116 if want_lz4 != 'false' and not skip_deps
1117 liblz4 = dependency('liblz4',
1118 version : '>= 1.3.0',
1119 required : want_lz4 == 'true')
1120 have = liblz4.found()
1125 conf.set10('HAVE_LZ4', have)
1127 want_xkbcommon = get_option('xkbcommon')
1128 if want_xkbcommon != 'false' and not skip_deps
1129 libxkbcommon = dependency('xkbcommon',
1130 version : '>= 0.3.0',
1131 required : want_xkbcommon == 'true')
1132 have = libxkbcommon.found()
1137 conf.set10('HAVE_XKBCOMMON', have)
1139 want_pcre2 = get_option('pcre2')
1140 if want_pcre2 != 'false'
1141 libpcre2 = dependency('libpcre2-8',
1142 required : want_pcre2 == 'true')
1143 have = libpcre2.found()
1148 conf.set10('HAVE_PCRE2', have)
1150 want_glib = get_option('glib')
1151 if want_glib != 'false' and not skip_deps
1152 libglib = dependency('glib-2.0',
1153 version : '>= 2.22.0',
1154 required : want_glib == 'true')
1155 libgobject = dependency('gobject-2.0',
1156 version : '>= 2.22.0',
1157 required : want_glib == 'true')
1158 libgio = dependency('gio-2.0',
1159 required : want_glib == 'true')
1160 have = libglib.found() and libgobject.found() and libgio.found()
1167 conf.set10('HAVE_GLIB', have)
1169 want_dbus = get_option('dbus')
1170 if want_dbus != 'false' and not skip_deps
1171 libdbus = dependency('dbus-1',
1172 version : '>= 1.3.2',
1173 required : want_dbus == 'true')
1174 have = libdbus.found()
1179 conf.set10('HAVE_DBUS', have)
1181 default_dnssec = get_option('default-dnssec')
1183 default_dnssec = 'no'
1185 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1186 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1187 default_dnssec = 'no'
1189 conf.set('DEFAULT_DNSSEC_MODE',
1190 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1191 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1193 dns_over_tls = get_option('dns-over-tls')
1194 if dns_over_tls != 'false'
1195 if dns_over_tls == 'openssl'
1198 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1199 if dns_over_tls == 'gnutls' and not have_gnutls
1200 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1203 if dns_over_tls == 'gnutls' or have_gnutls
1204 have_openssl = false
1206 have_openssl = conf.get('HAVE_OPENSSL') == 1
1207 if dns_over_tls != 'auto' and not have_openssl
1208 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1209 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1212 have = have_gnutls or have_openssl
1216 have_openssl = false
1218 conf.set10('ENABLE_DNS_OVER_TLS', have)
1219 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1220 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1222 default_dns_over_tls = get_option('default-dns-over-tls')
1224 default_dns_over_tls = 'no'
1226 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1227 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.')
1228 default_dns_over_tls = 'no'
1230 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1231 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1232 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1234 want_importd = get_option('importd')
1235 if want_importd != 'false'
1236 have = (conf.get('HAVE_LIBCURL') == 1 and
1237 conf.get('HAVE_ZLIB') == 1 and
1238 conf.get('HAVE_XZ') == 1 and
1239 conf.get('HAVE_GCRYPT') == 1)
1240 if want_importd == 'true' and not have
1241 error('importd support was requested, but dependencies are not available')
1246 conf.set10('ENABLE_IMPORTD', have)
1248 want_remote = get_option('remote')
1249 if want_remote != 'false'
1250 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1251 conf.get('HAVE_LIBCURL') == 1]
1252 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1253 # it's possible to build one without the other. Complain only if
1254 # support was explicitly requested. The auxiliary files like sysusers
1255 # config should be installed when any of the programs are built.
1256 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1257 error('remote support was requested, but dependencies are not available')
1259 have = have_deps[0] or have_deps[1]
1263 conf.set10('ENABLE_REMOTE', have)
1265 foreach term : ['utmp',
1298 have = get_option(term)
1299 name = 'ENABLE_' + term.underscorify().to_upper()
1300 conf.set10(name, have)
1303 foreach tuple : [['nss-mymachines', 'machined'],
1304 ['nss-resolve', 'resolve']]
1305 want = get_option(tuple[0])
1307 have = get_option(tuple[1])
1308 if want == 'true' and not have
1309 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1314 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1315 conf.set10(name, have)
1319 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1320 'ENABLE_NSS_MYMACHINES',
1321 'ENABLE_NSS_RESOLVE',
1322 'ENABLE_NSS_SYSTEMD']
1323 if conf.get(term) == 1
1327 conf.set10('ENABLE_NSS', enable_nss)
1329 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1334 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1336 #####################################################################
1338 if get_option('efi')
1339 efi_arch = host_machine.cpu_family()
1341 if efi_arch == 'x86'
1342 EFI_MACHINE_TYPE_NAME = 'ia32'
1343 gnu_efi_arch = 'ia32'
1344 elif efi_arch == 'x86_64'
1345 EFI_MACHINE_TYPE_NAME = 'x64'
1346 gnu_efi_arch = 'x86_64'
1347 elif efi_arch == 'arm'
1348 EFI_MACHINE_TYPE_NAME = 'arm'
1349 gnu_efi_arch = 'arm'
1350 elif efi_arch == 'aarch64'
1351 EFI_MACHINE_TYPE_NAME = 'aa64'
1352 gnu_efi_arch = 'aarch64'
1354 EFI_MACHINE_TYPE_NAME = ''
1359 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1361 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1365 conf.set10('ENABLE_EFI', have)
1367 #####################################################################
1369 config_h = configure_file(
1370 output : 'config.h',
1371 configuration : conf)
1373 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1375 includes = include_directories('src/basic',
1380 'src/journal-remote',
1384 'src/time-wait-sync',
1390 'src/libsystemd/sd-bus',
1391 'src/libsystemd/sd-device',
1392 'src/libsystemd/sd-event',
1393 'src/libsystemd/sd-hwdb',
1394 'src/libsystemd/sd-id128',
1395 'src/libsystemd/sd-netlink',
1396 'src/libsystemd/sd-network',
1397 'src/libsystemd/sd-resolve',
1398 'src/libsystemd-network',
1401 add_project_arguments('-include', 'config.h', language : 'c')
1403 generate_gperfs = find_program('tools/generate-gperfs.py')
1407 subdir('src/systemd')
1409 subdir('src/libsystemd')
1410 subdir('src/libsystemd-network')
1411 subdir('src/journal')
1414 libjournal_core = static_library(
1416 libjournal_core_sources,
1418 include_directories : includes,
1421 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1422 libsystemd = shared_library(
1425 version : libsystemd_version,
1426 include_directories : includes,
1427 link_args : ['-shared',
1428 '-Wl,--version-script=' + libsystemd_sym_path],
1429 link_with : [libbasic,
1431 link_whole : [libsystemd_static,
1433 dependencies : [threads,
1437 link_depends : libsystemd_sym,
1439 install_dir : rootlibdir)
1441 static_libsystemd = get_option('static-libsystemd')
1442 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1444 install_libsystemd_static = static_library(
1447 journal_client_sources,
1449 basic_gcrypt_sources,
1451 include_directories : includes,
1452 build_by_default : static_libsystemd != 'false',
1453 install : static_libsystemd != 'false',
1454 install_dir : rootlibdir,
1455 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1456 dependencies : [threads,
1465 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1467 ############################################################
1469 # binaries that have --help and are intended for use by humans,
1470 # usually, but not always, installed in /bin.
1471 public_programs = []
1473 subdir('src/libudev')
1474 subdir('src/shared')
1476 subdir('src/shutdown')
1478 subdir('src/network')
1480 subdir('src/analyze')
1481 subdir('src/journal-remote')
1482 subdir('src/coredump')
1483 subdir('src/pstore')
1484 subdir('src/hostname')
1485 subdir('src/import')
1486 subdir('src/kernel-install')
1487 subdir('src/locale')
1488 subdir('src/machine')
1489 subdir('src/portable')
1490 subdir('src/nspawn')
1491 subdir('src/resolve')
1492 subdir('src/timedate')
1493 subdir('src/timesync')
1494 subdir('src/vconsole')
1495 subdir('src/boot/efi')
1502 ############################################################
1504 # only static linking apart from libdl, to make sure that the
1505 # module is linked to all libraries that it uses.
1506 test_dlopen = executable(
1510 include_directories : includes,
1511 link_with : [libbasic],
1512 dependencies : [libdl],
1513 build_by_default : want_tests != 'false')
1515 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1516 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1517 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1518 ['resolve', 'ENABLE_NSS_RESOLVE']]
1520 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1524 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1525 version_script_arg = join_paths(project_source_root, sym)
1527 nss = shared_library(
1529 'src/nss-@0@/nss-@0@.c'.format(module),
1532 include_directories : includes,
1533 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1534 link_args : ['-Wl,-z,nodelete',
1536 '-Wl,--version-script=' + version_script_arg],
1537 link_with : [libsystemd_static,
1540 dependencies : [threads,
1544 install_dir : rootlibdir)
1546 # We cannot use shared_module because it does not support version suffix.
1547 # Unfortunately shared_library insists on creating the symlink…
1548 meson.add_install_script('sh', '-c',
1549 'rm $DESTDIR@0@/libnss_@1@.so'
1550 .format(rootlibdir, module))
1552 if want_tests != 'false'
1553 test('dlopen-nss_' + module,
1555 # path to dlopen must include a slash
1556 args : nss.full_path())
1561 ############################################################
1563 executable('systemd',
1565 include_directories : includes,
1566 link_with : [libcore,
1568 dependencies : [versiondep,
1575 install_rpath : rootlibexecdir,
1577 install_dir : rootlibexecdir)
1579 meson.add_install_script(meson_make_symlink,
1580 join_paths(rootlibexecdir, 'systemd'),
1581 join_paths(rootsbindir, 'init'))
1583 exe = executable('systemd-analyze',
1584 systemd_analyze_sources,
1585 include_directories : includes,
1586 link_with : [libcore,
1588 dependencies : [versiondep,
1595 install_rpath : rootlibexecdir,
1597 public_programs += exe
1599 executable('systemd-journald',
1600 systemd_journald_sources,
1601 include_directories : includes,
1602 link_with : [libjournal_core,
1604 dependencies : [threads,
1608 install_rpath : rootlibexecdir,
1610 install_dir : rootlibexecdir)
1612 exe = executable('systemd-cat',
1613 systemd_cat_sources,
1614 include_directories : includes,
1615 link_with : [libjournal_core,
1617 dependencies : [threads],
1618 install_rpath : rootlibexecdir,
1620 public_programs += exe
1622 exe = executable('journalctl',
1624 include_directories : includes,
1625 link_with : [libshared],
1626 dependencies : [threads,
1631 install_rpath : rootlibexecdir,
1633 install_dir : rootbindir)
1634 public_programs += exe
1636 executable('systemd-getty-generator',
1637 'src/getty-generator/getty-generator.c',
1638 include_directories : includes,
1639 link_with : [libshared],
1640 install_rpath : rootlibexecdir,
1642 install_dir : systemgeneratordir)
1644 executable('systemd-debug-generator',
1645 'src/debug-generator/debug-generator.c',
1646 include_directories : includes,
1647 link_with : [libshared],
1648 install_rpath : rootlibexecdir,
1650 install_dir : systemgeneratordir)
1652 executable('systemd-run-generator',
1653 'src/run-generator/run-generator.c',
1654 include_directories : includes,
1655 link_with : [libshared],
1656 install_rpath : rootlibexecdir,
1658 install_dir : systemgeneratordir)
1660 executable('systemd-fstab-generator',
1661 'src/fstab-generator/fstab-generator.c',
1662 include_directories : includes,
1663 link_with : [libcore_shared,
1665 install_rpath : rootlibexecdir,
1667 install_dir : systemgeneratordir)
1669 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1670 executable('30-systemd-environment-d-generator',
1671 'src/environment-d-generator/environment-d-generator.c',
1672 include_directories : includes,
1673 link_with : [libshared],
1674 install_rpath : rootlibexecdir,
1676 install_dir : userenvgeneratordir)
1678 meson.add_install_script(meson_make_symlink,
1679 join_paths(sysconfdir, 'environment'),
1680 join_paths(environmentdir, '99-environment.conf'))
1683 if conf.get('ENABLE_HIBERNATE') == 1
1684 executable('systemd-hibernate-resume-generator',
1685 'src/hibernate-resume/hibernate-resume-generator.c',
1686 include_directories : includes,
1687 link_with : [libshared],
1688 install_rpath : rootlibexecdir,
1690 install_dir : systemgeneratordir)
1692 executable('systemd-hibernate-resume',
1693 'src/hibernate-resume/hibernate-resume.c',
1694 include_directories : includes,
1695 link_with : [libshared],
1696 install_rpath : rootlibexecdir,
1698 install_dir : rootlibexecdir)
1701 if conf.get('HAVE_BLKID') == 1
1702 executable('systemd-gpt-auto-generator',
1703 'src/gpt-auto-generator/gpt-auto-generator.c',
1704 'src/shared/blkid-util.h',
1705 include_directories : includes,
1706 link_with : [libshared],
1707 dependencies : libblkid,
1708 install_rpath : rootlibexecdir,
1710 install_dir : systemgeneratordir)
1712 exe = executable('systemd-dissect',
1713 'src/dissect/dissect.c',
1714 include_directories : includes,
1715 link_with : [libshared],
1716 install_rpath : rootlibexecdir,
1718 install_dir : rootlibexecdir)
1719 public_programs += exe
1722 if conf.get('ENABLE_RESOLVE') == 1
1723 executable('systemd-resolved',
1724 systemd_resolved_sources,
1725 include_directories : includes,
1726 link_with : [libshared,
1728 libsystemd_resolve_core],
1729 dependencies : systemd_resolved_dependencies,
1730 install_rpath : rootlibexecdir,
1732 install_dir : rootlibexecdir)
1734 exe = executable('resolvectl',
1736 include_directories : includes,
1737 link_with : [libshared,
1739 libsystemd_resolve_core],
1740 dependencies : [threads,
1744 install_rpath : rootlibexecdir,
1746 public_programs += exe
1748 meson.add_install_script(meson_make_symlink,
1749 join_paths(bindir, 'resolvectl'),
1750 join_paths(rootsbindir, 'resolvconf'))
1752 meson.add_install_script(meson_make_symlink,
1753 join_paths(bindir, 'resolvectl'),
1754 join_paths(bindir, 'systemd-resolve'))
1757 if conf.get('ENABLE_LOGIND') == 1
1758 executable('systemd-logind',
1759 systemd_logind_sources,
1760 include_directories : includes,
1761 link_with : [liblogind_core,
1763 dependencies : [threads,
1765 install_rpath : rootlibexecdir,
1767 install_dir : rootlibexecdir)
1769 exe = executable('loginctl',
1771 include_directories : includes,
1772 link_with : [libshared],
1773 dependencies : [threads,
1776 install_rpath : rootlibexecdir,
1778 install_dir : rootbindir)
1779 public_programs += exe
1781 exe = executable('systemd-inhibit',
1782 'src/login/inhibit.c',
1783 include_directories : includes,
1784 link_with : [libshared],
1785 install_rpath : rootlibexecdir,
1787 install_dir : rootbindir)
1788 public_programs += exe
1790 if conf.get('HAVE_PAM') == 1
1791 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1792 pam_systemd = shared_library(
1796 include_directories : includes,
1797 link_args : ['-shared',
1798 '-Wl,--version-script=' + version_script_arg],
1799 link_with : [libsystemd_static,
1801 dependencies : [threads,
1804 link_depends : pam_systemd_sym,
1806 install_dir : pamlibdir)
1808 if want_tests != 'false'
1809 test('dlopen-pam_systemd',
1811 # path to dlopen must include a slash
1812 args : pam_systemd.full_path())
1816 executable('systemd-user-runtime-dir',
1817 user_runtime_dir_sources,
1818 include_directories : includes,
1819 link_with : [libshared],
1820 install_rpath : rootlibexecdir,
1822 install_dir : rootlibexecdir)
1825 if conf.get('HAVE_PAM') == 1
1826 executable('systemd-user-sessions',
1827 'src/user-sessions/user-sessions.c',
1828 include_directories : includes,
1829 link_with : [libshared],
1830 install_rpath : rootlibexecdir,
1832 install_dir : rootlibexecdir)
1835 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1836 exe = executable('bootctl',
1837 'src/boot/bootctl.c',
1838 include_directories : includes,
1839 link_with : [libshared],
1840 dependencies : [libblkid],
1841 install_rpath : rootlibexecdir,
1843 public_programs += exe
1845 executable('systemd-bless-boot',
1846 'src/boot/bless-boot.c',
1847 include_directories : includes,
1848 link_with : [libshared],
1849 dependencies : [libblkid],
1850 install_rpath : rootlibexecdir,
1852 install_dir : rootlibexecdir)
1854 executable('systemd-bless-boot-generator',
1855 'src/boot/bless-boot-generator.c',
1856 include_directories : includes,
1857 link_with : [libshared],
1858 install_rpath : rootlibexecdir,
1860 install_dir : systemgeneratordir)
1863 executable('systemd-boot-check-no-failures',
1864 'src/boot/boot-check-no-failures.c',
1865 include_directories : includes,
1866 link_with : [libshared],
1867 dependencies : [libblkid],
1868 install_rpath : rootlibexecdir,
1870 install_dir : rootlibexecdir)
1872 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1873 include_directories : includes,
1874 link_with : [libshared],
1875 dependencies : [threads],
1876 install_rpath : rootlibexecdir,
1878 public_programs += exe
1881 if get_option('link-systemctl-shared')
1882 systemctl_link_with = [libshared]
1884 systemctl_link_with = [libsystemd_static,
1890 exe = executable('systemctl',
1891 'src/systemctl/systemctl.c',
1892 'src/systemctl/sysv-compat.h',
1893 'src/systemctl/sysv-compat.c',
1894 include_directories : includes,
1895 link_with : systemctl_link_with,
1896 dependencies : [threads,
1901 install_rpath : rootlibexecdir,
1903 install_dir : rootbindir)
1904 public_programs += exe
1906 if conf.get('ENABLE_PORTABLED') == 1
1907 executable('systemd-portabled',
1908 systemd_portabled_sources,
1909 include_directories : includes,
1910 link_with : [libshared],
1911 dependencies : [threads],
1912 install_rpath : rootlibexecdir,
1914 install_dir : rootlibexecdir)
1916 exe = executable('portablectl', 'src/portable/portablectl.c',
1917 include_directories : includes,
1918 link_with : [libshared],
1919 dependencies : [threads],
1920 install_rpath : rootlibexecdir,
1922 install_dir : rootbindir)
1923 public_programs += exe
1926 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1927 meson.add_install_script(meson_make_symlink,
1928 join_paths(rootbindir, 'systemctl'),
1929 join_paths(rootsbindir, alias))
1932 if conf.get('ENABLE_BACKLIGHT') == 1
1933 executable('systemd-backlight',
1934 'src/backlight/backlight.c',
1935 include_directories : includes,
1936 link_with : [libshared],
1937 install_rpath : rootlibexecdir,
1939 install_dir : rootlibexecdir)
1942 if conf.get('ENABLE_RFKILL') == 1
1943 executable('systemd-rfkill',
1944 'src/rfkill/rfkill.c',
1945 include_directories : includes,
1946 link_with : [libshared],
1947 install_rpath : rootlibexecdir,
1949 install_dir : rootlibexecdir)
1952 executable('systemd-system-update-generator',
1953 'src/system-update-generator/system-update-generator.c',
1954 include_directories : includes,
1955 link_with : [libshared],
1956 install_rpath : rootlibexecdir,
1958 install_dir : systemgeneratordir)
1960 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1961 executable('systemd-cryptsetup',
1962 'src/cryptsetup/cryptsetup.c',
1963 include_directories : includes,
1964 link_with : [libshared],
1965 dependencies : [libcryptsetup],
1966 install_rpath : rootlibexecdir,
1968 install_dir : rootlibexecdir)
1970 executable('systemd-cryptsetup-generator',
1971 'src/cryptsetup/cryptsetup-generator.c',
1972 include_directories : includes,
1973 link_with : [libshared],
1974 dependencies : [libcryptsetup],
1975 install_rpath : rootlibexecdir,
1977 install_dir : systemgeneratordir)
1979 executable('systemd-veritysetup',
1980 'src/veritysetup/veritysetup.c',
1981 include_directories : includes,
1982 link_with : [libshared],
1983 dependencies : [libcryptsetup],
1984 install_rpath : rootlibexecdir,
1986 install_dir : rootlibexecdir)
1988 executable('systemd-veritysetup-generator',
1989 'src/veritysetup/veritysetup-generator.c',
1990 include_directories : includes,
1991 link_with : [libshared],
1992 dependencies : [libcryptsetup],
1993 install_rpath : rootlibexecdir,
1995 install_dir : systemgeneratordir)
1998 if conf.get('HAVE_SYSV_COMPAT') == 1
1999 executable('systemd-sysv-generator',
2000 'src/sysv-generator/sysv-generator.c',
2001 include_directories : includes,
2002 link_with : [libshared],
2003 install_rpath : rootlibexecdir,
2005 install_dir : systemgeneratordir)
2007 executable('systemd-rc-local-generator',
2008 'src/rc-local-generator/rc-local-generator.c',
2009 include_directories : includes,
2010 link_with : [libshared],
2011 install_rpath : rootlibexecdir,
2013 install_dir : systemgeneratordir)
2016 if conf.get('ENABLE_HOSTNAMED') == 1
2017 executable('systemd-hostnamed',
2018 'src/hostname/hostnamed.c',
2019 include_directories : includes,
2020 link_with : [libshared],
2021 install_rpath : rootlibexecdir,
2023 install_dir : rootlibexecdir)
2025 exe = executable('hostnamectl',
2026 'src/hostname/hostnamectl.c',
2027 include_directories : includes,
2028 link_with : [libshared],
2029 install_rpath : rootlibexecdir,
2031 public_programs += exe
2034 if conf.get('ENABLE_LOCALED') == 1
2035 if conf.get('HAVE_XKBCOMMON') == 1
2036 # logind will load libxkbcommon.so dynamically on its own
2042 executable('systemd-localed',
2043 systemd_localed_sources,
2044 include_directories : includes,
2045 link_with : [libshared],
2046 dependencies : deps,
2047 install_rpath : rootlibexecdir,
2049 install_dir : rootlibexecdir)
2051 exe = executable('localectl',
2053 include_directories : includes,
2054 link_with : [libshared],
2055 install_rpath : rootlibexecdir,
2057 public_programs += exe
2060 if conf.get('ENABLE_TIMEDATED') == 1
2061 executable('systemd-timedated',
2062 'src/timedate/timedated.c',
2063 include_directories : includes,
2064 link_with : [libshared],
2065 install_rpath : rootlibexecdir,
2067 install_dir : rootlibexecdir)
2070 if conf.get('ENABLE_TIMEDATECTL') == 1
2071 exe = executable('timedatectl',
2072 'src/timedate/timedatectl.c',
2073 include_directories : includes,
2074 install_rpath : rootlibexecdir,
2075 link_with : [libshared],
2076 dependencies : [libm],
2078 public_programs += exe
2081 if conf.get('ENABLE_TIMESYNCD') == 1
2082 executable('systemd-timesyncd',
2083 systemd_timesyncd_sources,
2084 include_directories : includes,
2085 link_with : [libshared],
2086 dependencies : [threads,
2088 install_rpath : rootlibexecdir,
2090 install_dir : rootlibexecdir)
2092 executable('systemd-time-wait-sync',
2093 'src/time-wait-sync/time-wait-sync.c',
2094 include_directories : includes,
2095 link_with : [libshared],
2096 install_rpath : rootlibexecdir,
2098 install_dir : rootlibexecdir)
2101 if conf.get('ENABLE_MACHINED') == 1
2102 executable('systemd-machined',
2103 systemd_machined_sources,
2104 include_directories : includes,
2105 link_with : [libmachine_core,
2107 install_rpath : rootlibexecdir,
2109 install_dir : rootlibexecdir)
2111 exe = executable('machinectl',
2112 'src/machine/machinectl.c',
2113 include_directories : includes,
2114 link_with : [libshared],
2115 dependencies : [threads,
2118 install_rpath : rootlibexecdir,
2120 install_dir : rootbindir)
2121 public_programs += exe
2124 if conf.get('ENABLE_IMPORTD') == 1
2125 executable('systemd-importd',
2126 systemd_importd_sources,
2127 include_directories : includes,
2128 link_with : [libshared],
2129 dependencies : [threads],
2130 install_rpath : rootlibexecdir,
2132 install_dir : rootlibexecdir)
2134 systemd_pull = executable('systemd-pull',
2135 systemd_pull_sources,
2136 include_directories : includes,
2137 link_with : [libshared],
2138 dependencies : [versiondep,
2144 install_rpath : rootlibexecdir,
2146 install_dir : rootlibexecdir)
2148 systemd_import = executable('systemd-import',
2149 systemd_import_sources,
2150 include_directories : includes,
2151 link_with : [libshared],
2152 dependencies : [libcurl,
2156 install_rpath : rootlibexecdir,
2158 install_dir : rootlibexecdir)
2160 systemd_import_fs = executable('systemd-import-fs',
2161 systemd_import_fs_sources,
2162 include_directories : includes,
2163 link_with : [libshared],
2164 install_rpath : rootlibexecdir,
2166 install_dir : rootlibexecdir)
2168 systemd_export = executable('systemd-export',
2169 systemd_export_sources,
2170 include_directories : includes,
2171 link_with : [libshared],
2172 dependencies : [libcurl,
2176 install_rpath : rootlibexecdir,
2178 install_dir : rootlibexecdir)
2180 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2183 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2184 exe = executable('systemd-journal-upload',
2185 systemd_journal_upload_sources,
2186 include_directories : includes,
2187 link_with : [libshared],
2188 dependencies : [versiondep,
2194 install_rpath : rootlibexecdir,
2196 install_dir : rootlibexecdir)
2197 public_programs += exe
2200 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2201 s_j_remote = executable('systemd-journal-remote',
2202 systemd_journal_remote_sources,
2203 include_directories : includes,
2204 link_with : [libshared,
2205 libsystemd_journal_remote],
2206 dependencies : [threads,
2211 install_rpath : rootlibexecdir,
2213 install_dir : rootlibexecdir)
2215 s_j_gatewayd = executable('systemd-journal-gatewayd',
2216 systemd_journal_gatewayd_sources,
2217 include_directories : includes,
2218 link_with : [libshared],
2219 dependencies : [threads,
2224 install_rpath : rootlibexecdir,
2226 install_dir : rootlibexecdir)
2227 public_programs += [s_j_remote, s_j_gatewayd]
2230 if conf.get('ENABLE_COREDUMP') == 1
2231 executable('systemd-coredump',
2232 systemd_coredump_sources,
2233 include_directories : includes,
2234 link_with : [libshared],
2235 dependencies : [threads,
2240 install_rpath : rootlibexecdir,
2242 install_dir : rootlibexecdir)
2244 exe = executable('coredumpctl',
2245 coredumpctl_sources,
2246 include_directories : includes,
2247 link_with : [libshared],
2248 dependencies : [threads,
2251 install_rpath : rootlibexecdir,
2253 public_programs += exe
2256 if conf.get('ENABLE_PSTORE') == 1
2257 executable('systemd-pstore',
2258 systemd_pstore_sources,
2259 include_directories : includes,
2260 link_with : [libshared],
2261 dependencies : [threads,
2266 install_rpath : rootlibexecdir,
2268 install_dir : rootlibexecdir)
2271 if conf.get('ENABLE_BINFMT') == 1
2272 exe = executable('systemd-binfmt',
2273 'src/binfmt/binfmt.c',
2274 include_directories : includes,
2275 link_with : [libshared],
2276 install_rpath : rootlibexecdir,
2278 install_dir : rootlibexecdir)
2279 public_programs += exe
2281 meson.add_install_script('sh', '-c',
2282 mkdir_p.format(binfmtdir))
2283 meson.add_install_script('sh', '-c',
2284 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2287 if conf.get('ENABLE_VCONSOLE') == 1
2288 executable('systemd-vconsole-setup',
2289 'src/vconsole/vconsole-setup.c',
2290 include_directories : includes,
2291 link_with : [libshared],
2292 install_rpath : rootlibexecdir,
2294 install_dir : rootlibexecdir)
2297 if conf.get('ENABLE_RANDOMSEED') == 1
2298 executable('systemd-random-seed',
2299 'src/random-seed/random-seed.c',
2300 include_directories : includes,
2301 link_with : [libshared],
2302 install_rpath : rootlibexecdir,
2304 install_dir : rootlibexecdir)
2307 if conf.get('ENABLE_FIRSTBOOT') == 1
2308 executable('systemd-firstboot',
2309 'src/firstboot/firstboot.c',
2310 include_directories : includes,
2311 link_with : [libshared],
2312 dependencies : [libcrypt],
2313 install_rpath : rootlibexecdir,
2315 install_dir : rootbindir)
2318 executable('systemd-remount-fs',
2319 'src/remount-fs/remount-fs.c',
2320 include_directories : includes,
2321 link_with : [libcore_shared,
2323 install_rpath : rootlibexecdir,
2325 install_dir : rootlibexecdir)
2327 executable('systemd-machine-id-setup',
2328 'src/machine-id-setup/machine-id-setup-main.c',
2329 include_directories : includes,
2330 link_with : [libcore_shared,
2332 install_rpath : rootlibexecdir,
2334 install_dir : rootbindir)
2336 executable('systemd-fsck',
2338 include_directories : includes,
2339 link_with : [libshared],
2340 install_rpath : rootlibexecdir,
2342 install_dir : rootlibexecdir)
2344 executable('systemd-growfs',
2345 'src/partition/growfs.c',
2346 include_directories : includes,
2347 link_with : [libshared],
2348 dependencies : [libcryptsetup],
2349 install_rpath : rootlibexecdir,
2351 install_dir : rootlibexecdir)
2353 executable('systemd-makefs',
2354 'src/partition/makefs.c',
2355 include_directories : includes,
2356 link_with : [libshared],
2357 install_rpath : rootlibexecdir,
2359 install_dir : rootlibexecdir)
2361 executable('systemd-sleep',
2362 'src/sleep/sleep.c',
2363 include_directories : includes,
2364 link_with : [libshared],
2365 install_rpath : rootlibexecdir,
2367 install_dir : rootlibexecdir)
2369 install_data('src/sleep/sleep.conf',
2370 install_dir : pkgsysconfdir)
2372 exe = executable('systemd-sysctl',
2373 'src/sysctl/sysctl.c',
2374 include_directories : includes,
2375 link_with : [libshared],
2376 install_rpath : rootlibexecdir,
2378 install_dir : rootlibexecdir)
2379 public_programs += exe
2381 executable('systemd-ac-power',
2382 'src/ac-power/ac-power.c',
2383 include_directories : includes,
2384 link_with : [libshared],
2385 install_rpath : rootlibexecdir,
2387 install_dir : rootlibexecdir)
2389 exe = executable('systemd-detect-virt',
2390 'src/detect-virt/detect-virt.c',
2391 include_directories : includes,
2392 link_with : [libshared],
2393 install_rpath : rootlibexecdir,
2395 public_programs += exe
2397 exe = executable('systemd-delta',
2398 'src/delta/delta.c',
2399 include_directories : includes,
2400 link_with : [libshared],
2401 install_rpath : rootlibexecdir,
2403 public_programs += exe
2405 exe = executable('systemd-escape',
2406 'src/escape/escape.c',
2407 include_directories : includes,
2408 link_with : [libshared],
2409 install_rpath : rootlibexecdir,
2411 install_dir : rootbindir)
2412 public_programs += exe
2414 exe = executable('systemd-notify',
2415 'src/notify/notify.c',
2416 include_directories : includes,
2417 link_with : [libshared],
2418 install_rpath : rootlibexecdir,
2420 install_dir : rootbindir)
2421 public_programs += exe
2423 executable('systemd-volatile-root',
2424 'src/volatile-root/volatile-root.c',
2425 include_directories : includes,
2426 link_with : [libshared],
2427 install_rpath : rootlibexecdir,
2429 install_dir : rootlibexecdir)
2431 executable('systemd-cgroups-agent',
2432 'src/cgroups-agent/cgroups-agent.c',
2433 include_directories : includes,
2434 link_with : [libshared],
2435 install_rpath : rootlibexecdir,
2437 install_dir : rootlibexecdir)
2439 exe = executable('systemd-id128',
2440 'src/id128/id128.c',
2441 include_directories : includes,
2442 link_with : [libshared],
2443 install_rpath : rootlibexecdir,
2445 public_programs += exe
2447 exe = executable('systemd-path',
2449 include_directories : includes,
2450 link_with : [libshared],
2451 install_rpath : rootlibexecdir,
2453 public_programs += exe
2455 exe = executable('systemd-ask-password',
2456 'src/ask-password/ask-password.c',
2457 include_directories : includes,
2458 link_with : [libshared],
2459 install_rpath : rootlibexecdir,
2461 install_dir : rootbindir)
2462 public_programs += exe
2464 executable('systemd-reply-password',
2465 'src/reply-password/reply-password.c',
2466 include_directories : includes,
2467 link_with : [libshared],
2468 install_rpath : rootlibexecdir,
2470 install_dir : rootlibexecdir)
2472 exe = executable('systemd-tty-ask-password-agent',
2473 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2474 include_directories : includes,
2475 link_with : [libshared],
2476 install_rpath : rootlibexecdir,
2478 install_dir : rootbindir)
2479 public_programs += exe
2481 exe = executable('systemd-cgls',
2483 include_directories : includes,
2484 link_with : [libshared],
2485 install_rpath : rootlibexecdir,
2487 public_programs += exe
2489 exe = executable('systemd-cgtop',
2490 'src/cgtop/cgtop.c',
2491 include_directories : includes,
2492 link_with : [libshared],
2493 install_rpath : rootlibexecdir,
2495 public_programs += exe
2497 executable('systemd-initctl',
2498 'src/initctl/initctl.c',
2499 include_directories : includes,
2500 link_with : [libshared],
2501 install_rpath : rootlibexecdir,
2503 install_dir : rootlibexecdir)
2505 exe = executable('systemd-mount',
2506 'src/mount/mount-tool.c',
2507 include_directories : includes,
2508 link_with : [libshared],
2509 dependencies: [libmount],
2510 install_rpath : rootlibexecdir,
2512 public_programs += exe
2514 meson.add_install_script(meson_make_symlink,
2515 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2517 exe = executable('systemd-run',
2519 include_directories : includes,
2520 link_with : [libshared],
2521 install_rpath : rootlibexecdir,
2523 public_programs += exe
2525 exe = executable('systemd-stdio-bridge',
2526 'src/stdio-bridge/stdio-bridge.c',
2527 include_directories : includes,
2528 link_with : [libshared],
2529 dependencies : [versiondep],
2530 install_rpath : rootlibexecdir,
2532 public_programs += exe
2534 exe = executable('busctl',
2535 'src/busctl/busctl.c',
2536 'src/busctl/busctl-introspect.c',
2537 'src/busctl/busctl-introspect.h',
2538 include_directories : includes,
2539 link_with : [libshared],
2540 install_rpath : rootlibexecdir,
2542 public_programs += exe
2544 if conf.get('ENABLE_SYSUSERS') == 1
2545 exe = executable('systemd-sysusers',
2546 'src/sysusers/sysusers.c',
2547 include_directories : includes,
2548 link_with : [libshared],
2549 install_rpath : rootlibexecdir,
2551 install_dir : rootbindir)
2552 public_programs += exe
2555 if conf.get('ENABLE_TMPFILES') == 1
2556 exe = executable('systemd-tmpfiles',
2557 'src/tmpfiles/tmpfiles.c',
2558 include_directories : includes,
2559 link_with : [libshared],
2560 dependencies : [libacl],
2561 install_rpath : rootlibexecdir,
2563 install_dir : rootbindir)
2564 public_programs += exe
2566 if want_tests != 'false'
2567 test('test-systemd-tmpfiles',
2568 test_systemd_tmpfiles_py,
2569 # https://github.com/mesonbuild/meson/issues/2681
2570 args : exe.full_path())
2574 if conf.get('ENABLE_HWDB') == 1
2575 exe = executable('systemd-hwdb',
2577 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2578 include_directories : includes,
2579 link_with : [libudev_static],
2580 install_rpath : udev_rpath,
2582 install_dir : rootbindir)
2583 public_programs += exe
2586 if conf.get('ENABLE_QUOTACHECK') == 1
2587 executable('systemd-quotacheck',
2588 'src/quotacheck/quotacheck.c',
2589 include_directories : includes,
2590 link_with : [libshared],
2591 install_rpath : rootlibexecdir,
2593 install_dir : rootlibexecdir)
2596 exe = executable('systemd-socket-proxyd',
2597 'src/socket-proxy/socket-proxyd.c',
2598 include_directories : includes,
2599 link_with : [libshared],
2600 dependencies : [threads],
2601 install_rpath : rootlibexecdir,
2603 install_dir : rootlibexecdir)
2604 public_programs += exe
2606 exe = executable('systemd-udevd',
2607 systemd_udevd_sources,
2608 include_directories : includes,
2609 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2610 link_with : [libudev_core,
2613 dependencies : [versiondep,
2619 install_rpath : udev_rpath,
2621 install_dir : rootlibexecdir)
2622 public_programs += exe
2624 exe = executable('udevadm',
2626 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2627 include_directories : includes,
2628 link_with : [libudev_core,
2631 dependencies : [versiondep,
2637 install_rpath : udev_rpath,
2639 install_dir : rootbindir)
2640 public_programs += exe
2642 executable('systemd-shutdown',
2643 systemd_shutdown_sources,
2644 include_directories : includes,
2645 link_with : [libcore_shared,
2647 dependencies : [libmount],
2648 install_rpath : rootlibexecdir,
2650 install_dir : rootlibexecdir)
2652 executable('systemd-update-done',
2653 'src/update-done/update-done.c',
2654 include_directories : includes,
2655 link_with : [libshared],
2656 install_rpath : rootlibexecdir,
2658 install_dir : rootlibexecdir)
2660 executable('systemd-update-utmp',
2661 'src/update-utmp/update-utmp.c',
2662 include_directories : includes,
2663 link_with : [libshared],
2664 dependencies : [libaudit],
2665 install_rpath : rootlibexecdir,
2667 install_dir : rootlibexecdir)
2669 if conf.get('HAVE_KMOD') == 1
2670 executable('systemd-modules-load',
2671 'src/modules-load/modules-load.c',
2672 include_directories : includes,
2673 link_with : [libshared],
2674 dependencies : [libkmod],
2675 install_rpath : rootlibexecdir,
2677 install_dir : rootlibexecdir)
2679 meson.add_install_script('sh', '-c',
2680 mkdir_p.format(modulesloaddir))
2681 meson.add_install_script('sh', '-c',
2682 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2685 exe = executable('systemd-nspawn',
2686 systemd_nspawn_sources,
2687 include_directories : includes,
2688 link_with : [libcore_shared,
2691 dependencies : [libblkid,
2693 install_rpath : rootlibexecdir,
2695 public_programs += exe
2697 if conf.get('ENABLE_NETWORKD') == 1
2698 executable('systemd-networkd',
2699 systemd_networkd_sources,
2700 include_directories : includes,
2701 link_with : [libnetworkd_core,
2705 dependencies : [threads],
2706 install_rpath : rootlibexecdir,
2708 install_dir : rootlibexecdir)
2710 executable('systemd-networkd-wait-online',
2711 systemd_networkd_wait_online_sources,
2712 include_directories : includes,
2713 link_with : [libnetworkd_core,
2715 install_rpath : rootlibexecdir,
2717 install_dir : rootlibexecdir)
2719 exe = executable('networkctl',
2721 include_directories : includes,
2722 link_with : [libsystemd_network,
2724 install_rpath : rootlibexecdir,
2726 install_dir : rootbindir)
2727 public_programs += exe
2729 executable('systemd-network-generator',
2730 network_generator_sources,
2731 include_directories : includes,
2732 link_with : [libshared],
2733 install_rpath : rootlibexecdir,
2735 install_dir : rootlibexecdir)
2738 executable('systemd-sulogin-shell',
2739 ['src/sulogin-shell/sulogin-shell.c'],
2740 include_directories : includes,
2741 link_with : [libshared],
2742 install_rpath : rootlibexecdir,
2744 install_dir : rootlibexecdir)
2746 ############################################################
2749 'systemd-runtest.env',
2750 output : 'systemd-runtest.env',
2751 command : ['sh', '-c', '{ ' +
2752 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2753 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2755 build_by_default : true)
2757 foreach tuple : tests
2759 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2760 dependencies = tuple[2]
2761 condition = tuple.length() >= 4 ? tuple[3] : ''
2762 type = tuple.length() >= 5 ? tuple[4] : ''
2763 defs = tuple.length() >= 6 ? tuple[5] : []
2764 incs = tuple.length() >= 7 ? tuple[6] : includes
2767 name = sources[0].split('/')[-1].split('.')[0]
2768 if type.startswith('timeout=')
2769 timeout = type.split('=')[1].to_int()
2773 if condition == '' or conf.get(condition) == 1
2777 include_directories : incs,
2778 link_with : link_with,
2779 dependencies : [versiondep,
2782 build_by_default : want_tests != 'false',
2783 install_rpath : rootlibexecdir,
2784 install : install_tests,
2785 install_dir : join_paths(testsdir, type))
2788 message('@0@ is a manual test'.format(name))
2789 elif type == 'unsafe' and want_tests != 'unsafe'
2790 message('@0@ is an unsafe test'.format(name))
2791 elif want_tests != 'false'
2797 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2802 'test-libsystemd-sym',
2803 test_libsystemd_sym_c,
2804 include_directories : includes,
2805 link_with : [libsystemd],
2806 build_by_default : want_tests != 'false',
2807 install : install_tests,
2808 install_dir : testsdir)
2809 if want_tests != 'false'
2810 test('test-libsystemd-sym', exe)
2814 'test-libsystemd-static-sym',
2815 test_libsystemd_sym_c,
2816 include_directories : includes,
2817 link_with : [install_libsystemd_static],
2818 dependencies : [threads], # threads is already included in dependencies on the library,
2819 # but does not seem to get propagated. Add here as a work-around.
2820 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2821 install : install_tests and static_libsystemd_pic,
2822 install_dir : testsdir)
2823 if want_tests != 'false' and static_libsystemd_pic
2824 test('test-libsystemd-static-sym', exe)
2830 include_directories : includes,
2831 c_args : '-Wno-deprecated-declarations',
2832 link_with : [libudev],
2833 build_by_default : want_tests != 'false',
2834 install : install_tests,
2835 install_dir : testsdir)
2836 if want_tests != 'false'
2837 test('test-libudev-sym', exe)
2841 'test-libudev-static-sym',
2843 include_directories : includes,
2844 c_args : '-Wno-deprecated-declarations',
2845 link_with : [install_libudev_static],
2846 build_by_default : want_tests != 'false' and static_libudev_pic,
2847 install : install_tests and static_libudev_pic,
2848 install_dir : testsdir)
2849 if want_tests != 'false' and static_libudev_pic
2850 test('test-libudev-static-sym', exe)
2853 ############################################################
2857 if get_option('tests') != 'false'
2858 foreach tuple : fuzzers
2860 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2861 dependencies = tuple[2]
2862 defs = tuple.length() >= 4 ? tuple[3] : []
2863 incs = tuple.length() >= 5 ? tuple[4] : includes
2866 if want_ossfuzz or want_fuzzbuzz
2867 dependencies += fuzzing_engine
2869 if fuzzing_engine.found()
2870 dependencies += fuzzing_engine
2872 link_args += ['-fsanitize=fuzzer']
2875 sources += 'src/fuzz/fuzz-main.c'
2879 sources += 'src/fuzz/fuzzer-entry-point.c'
2882 name = sources[0].split('/')[-1].split('.')[0]
2884 fuzzer_exes += executable(
2887 include_directories : [incs, include_directories('src/fuzz')],
2888 link_with : link_with,
2889 dependencies : dependencies,
2891 link_args: link_args,
2896 run_target('fuzzers',
2897 depends : fuzzer_exes,
2900 ############################################################
2902 make_directive_index_py = find_program('tools/make-directive-index.py')
2903 make_man_index_py = find_program('tools/make-man-index.py')
2904 xml_helper_py = find_program('tools/xml_helper.py')
2905 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2909 subdir('sysusers.d')
2910 subdir('tmpfiles.d')
2915 subdir('shell-completion/bash')
2916 subdir('shell-completion/zsh')
2917 subdir('docs/sysvinit')
2918 subdir('docs/var-log')
2920 install_subdir('factory/etc',
2921 install_dir : factorydir)
2923 install_data('xorg/50-systemd-user.sh',
2924 install_dir : xinitrcdir)
2925 install_data('modprobe.d/systemd.conf',
2926 install_dir : modprobedir)
2927 install_data('LICENSE.GPL2',
2931 'docs/CODING_STYLE.md',
2932 'docs/DISTRO_PORTING.md',
2933 'docs/ENVIRONMENT.md',
2935 'docs/TRANSIENT-SETTINGS.md',
2936 'docs/TRANSLATORS.md',
2937 'docs/UIDS-GIDS.md',
2938 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2939 install_dir : docdir)
2941 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2942 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2944 ############################################################
2946 meson_check_help = find_program('tools/meson-check-help.sh')
2948 foreach exec : public_programs
2949 name = exec.full_path().split('/')[-1]
2950 if want_tests != 'false'
2951 test('check-help-' + name,
2953 args : exec.full_path())
2957 ############################################################
2959 check_directives_sh = find_program('tools/check-directives.sh')
2961 if want_tests != 'false'
2962 test('check-directives',
2963 check_directives_sh,
2964 args : project_source_root)
2967 ############################################################
2969 # Enable tests for all supported sanitizers
2970 foreach tuple : sanitizers
2971 sanitizer = tuple[0]
2974 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2976 foreach p : fuzz_regression_tests
2977 b = p.split('/')[-2]
2978 c = p.split('/')[-1]
2980 name = '@0@:@1@'.format(b, sanitizer)
2983 if want_tests == 'false'
2984 message('Not compiling @0@ because tests is set to false'.format(name))
2986 exe = custom_target(
2990 command : [env, 'ln', '-fs',
2991 join_paths(build.full_path(), b),
2993 build_by_default : true)
2995 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3000 if want_tests != 'false' and slow_tests
3001 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3003 args : [exe.full_path(),
3004 join_paths(project_source_root, p)])
3011 ############################################################
3014 all_files = run_command(
3016 ['--git-dir=@0@/.git'.format(project_source_root),
3019 all_files = files(all_files.stdout().split())
3024 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3027 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3031 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3034 command : [meson_git_contrib_sh])
3038 git_head = run_command(
3040 ['--git-dir=@0@/.git'.format(project_source_root),
3041 'rev-parse', 'HEAD']).stdout().strip()
3042 git_head_short = run_command(
3044 ['--git-dir=@0@/.git'.format(project_source_root),
3045 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3049 command : ['git', 'archive',
3050 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3052 '--prefix', 'systemd-@0@/'.format(git_head),
3056 ############################################################
3058 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3061 depends : [man, libsystemd, libudev],
3062 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3064 ############################################################
3067 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3069 'split /usr: @0@'.format(split_usr),
3070 'split bin-sbin: @0@'.format(split_bin),
3071 'prefix directory: @0@'.format(prefixdir),
3072 'rootprefix directory: @0@'.format(rootprefixdir),
3073 'sysconf directory: @0@'.format(sysconfdir),
3074 'include directory: @0@'.format(includedir),
3075 'lib directory: @0@'.format(libdir),
3076 'rootlib directory: @0@'.format(rootlibdir),
3077 'SysV init scripts: @0@'.format(sysvinit_path),
3078 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3079 'PAM modules directory: @0@'.format(pamlibdir),
3080 'PAM configuration directory: @0@'.format(pamconfdir),
3081 'RPM macros directory: @0@'.format(rpmmacrosdir),
3082 'modprobe.d directory: @0@'.format(modprobedir),
3083 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3084 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3085 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3086 'bash completions directory: @0@'.format(bashcompletiondir),
3087 'zsh completions directory: @0@'.format(zshcompletiondir),
3088 'extra start script: @0@'.format(get_option('rc-local')),
3089 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3090 get_option('debug-tty')),
3091 'TTY GID: @0@'.format(tty_gid),
3092 'users GID: @0@'.format(substs.get('USERS_GID')),
3093 'maximum system UID: @0@'.format(system_uid_max),
3094 'maximum system GID: @0@'.format(system_gid_max),
3095 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3096 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3097 'minimum container UID base: @0@'.format(container_uid_base_min),
3098 'maximum container UID base: @0@'.format(container_uid_base_max),
3099 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3100 'render group access mode: @0@'.format(get_option('group-render-mode')),
3101 'certificate root directory: @0@'.format(get_option('certificate-root')),
3102 'support URL: @0@'.format(support_url),
3103 'nobody user name: @0@'.format(nobody_user),
3104 'nobody group name: @0@'.format(nobody_group),
3105 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3106 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3108 'default DNSSEC mode: @0@'.format(default_dnssec),
3109 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3110 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3111 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3112 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3113 'default locale: @0@'.format(default_locale)]
3115 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3116 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3118 'default DNS servers: @0@'.format(alt_dns_servers),
3119 'default NTP servers: @0@'.format(alt_ntp_servers)]
3121 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3122 '@@0@'.format(time_epoch)).stdout().strip()
3124 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3127 'static libsystemd: @0@'.format(static_libsystemd),
3128 'static libudev: @0@'.format(static_libudev)]
3131 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3132 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3133 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3135 if conf.get('ENABLE_EFI') == 1
3136 status += 'efi arch: @0@'.format(efi_arch)
3140 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3141 'EFI CC @0@'.format(' '.join(efi_cc)),
3142 'EFI lib directory: @0@'.format(efi_libdir),
3143 'EFI lds directory: @0@'.format(efi_ldsdir),
3144 'EFI include directory: @0@'.format(efi_incdir)]
3196 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3197 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3201 ['legacy pkla', install_polkit_pkla],
3203 ['gnu-efi', have_gnu_efi],
3216 ['man pages', want_man],
3217 ['html pages', want_html],
3218 ['man page indices', want_man and have_lxml],
3223 ['adm group', get_option('adm-group')],
3224 ['wheel group', get_option('wheel-group')],
3227 ['debug mmap cache'],
3229 ['valgrind', conf.get('VALGRIND') == 1],
3230 ['trace logging', conf.get('LOG_TRACE') == 1],
3231 ['link-udev-shared', get_option('link-udev-shared')],
3232 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3235 if tuple.length() >= 2
3238 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3239 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3240 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3251 'enabled features: @0@'.format(', '.join(found)),
3253 'disabled features: @0@'.format(', '.join(missing)),
3255 message('\n '.join(status))
3257 if rootprefixdir != rootprefix_default
3259 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3260 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3261 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))