1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
12 meson_version : '>= 0.46',
15 libsystemd_version = '0.27.0'
16 libudev_version = '1.6.15'
18 # We need the same data in two different formats, ugh!
19 # Also, for hysterical reasons, we use different variable
20 # names, sometimes. Not all variables are included in every
22 conf = configuration_data()
23 conf.set('PROJECT_VERSION', meson.project_version())
25 substs = configuration_data()
26 substs.set('PROJECT_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
27 substs.set('PROJECT_VERSION', meson.project_version())
29 # This is to be used instead of meson.source_root(), as the latter will return
30 # the wrong result when systemd is being built as a meson subproject
31 project_source_root = meson.current_source_dir()
32 relative_source_path = run_command('realpath',
33 '--relative-to=@0@'.format(meson.current_build_dir()),
34 project_source_root).stdout().strip()
35 conf.set_quoted('RELATIVE_SOURCE_PATH', relative_source_path)
37 want_ossfuzz = get_option('oss-fuzz')
38 want_libfuzzer = get_option('llvm-fuzz')
39 want_fuzzbuzz = get_option('fuzzbuzz')
40 if want_ossfuzz + want_libfuzzer + want_fuzzbuzz > 1
41 error('only one of oss-fuzz, llvm-fuzz or fuzzbuzz can be specified')
44 skip_deps = want_ossfuzz or want_libfuzzer
45 fuzzer_build = want_ossfuzz or want_libfuzzer or want_fuzzbuzz
47 #####################################################################
49 # Try to install the git pre-commit hook
50 git_hook = run_command(join_paths(project_source_root, 'tools/add-git-hook.sh'))
51 if git_hook.returncode() == 0
52 message(git_hook.stdout().strip())
55 #####################################################################
57 if get_option('split-usr') == 'auto'
58 split_usr = run_command('test', '-L', '/bin').returncode() != 0
60 split_usr = get_option('split-usr') == 'true'
62 conf.set10('HAVE_SPLIT_USR', split_usr,
63 description : '/usr/bin and /bin directories are separate')
65 if get_option('split-bin') == 'auto'
66 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
68 split_bin = get_option('split-bin') == 'true'
70 conf.set10('HAVE_SPLIT_BIN', split_bin,
71 description : 'bin and sbin directories are separate')
73 rootprefixdir = get_option('rootprefix')
74 # Unusual rootprefixdir values are used by some distros
75 # (see https://github.com/systemd/systemd/pull/7461).
76 rootprefix_default = split_usr ? '/' : '/usr'
77 if rootprefixdir == ''
78 rootprefixdir = rootprefix_default
80 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
82 sysvinit_path = get_option('sysvinit-path')
83 sysvrcnd_path = get_option('sysvrcnd-path')
84 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
85 description : 'SysV init scripts and rcN.d links are supported')
87 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
88 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
89 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
91 # join_paths ignores the preceding arguments if an absolute component is
92 # encountered, so this should canonicalize various paths when they are
93 # absolute or relative.
94 prefixdir = get_option('prefix')
95 if not prefixdir.startswith('/')
96 error('Prefix is not absolute: "@0@"'.format(prefixdir))
98 bindir = join_paths(prefixdir, get_option('bindir'))
99 libdir = join_paths(prefixdir, get_option('libdir'))
100 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
101 includedir = join_paths(prefixdir, get_option('includedir'))
102 datadir = join_paths(prefixdir, get_option('datadir'))
103 localstatedir = join_paths('/', get_option('localstatedir'))
105 rootbindir = join_paths(rootprefixdir, 'bin')
106 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
107 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
109 rootlibdir = get_option('rootlibdir')
111 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
114 # Dirs of external packages
115 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
116 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
117 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
118 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
119 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
120 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
121 rpmmacrosdir = get_option('rpmmacrosdir')
122 if rpmmacrosdir != 'no'
123 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
125 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
128 pkgdatadir = join_paths(datadir, 'systemd')
129 environmentdir = join_paths(prefixdir, 'lib/environment.d')
130 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
131 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
132 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
133 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
134 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
135 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
136 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
137 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
138 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
139 pkgincludedir = join_paths(includedir, 'systemd')
140 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
141 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
142 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
143 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
144 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
145 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
146 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
147 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
148 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
149 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
150 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
151 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
152 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
153 factorydir = join_paths(datadir, 'factory')
154 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
155 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
156 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
157 catalogstatedir = join_paths(systemdstatedir, 'catalog')
158 randomseeddir = join_paths(localstatedir, 'lib/systemd')
159 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
160 ntpservicelistdir = join_paths(rootprefixdir, 'lib/systemd/ntp-units.d')
162 docdir = get_option('docdir')
164 docdir = join_paths(datadir, 'doc/systemd')
167 dbuspolicydir = get_option('dbuspolicydir')
168 if dbuspolicydir == ''
169 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
172 dbussessionservicedir = get_option('dbussessionservicedir')
173 if dbussessionservicedir == ''
174 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
177 dbussystemservicedir = get_option('dbussystemservicedir')
178 if dbussystemservicedir == ''
179 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
182 pamlibdir = get_option('pamlibdir')
184 pamlibdir = join_paths(rootlibdir, 'security')
187 pamconfdir = get_option('pamconfdir')
189 pamconfdir = join_paths(sysconfdir, 'pam.d')
192 memory_accounting_default = get_option('memory-accounting-default')
193 status_unit_format_default = get_option('status-unit-format-default')
195 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
196 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
197 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
198 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
199 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
200 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
202 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
204 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
205 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
206 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
207 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
208 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
209 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
210 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
211 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
212 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
213 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
214 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
215 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
216 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
217 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
218 conf.set_quoted('ROOTPREFIX', rootprefixdir)
219 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
220 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
221 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
222 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
223 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
224 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
225 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
226 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
227 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
228 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
229 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
230 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
231 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
232 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
233 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
234 conf.set_quoted('LIBDIR', libdir)
235 conf.set_quoted('ROOTLIBDIR', rootlibdir)
236 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
237 conf.set_quoted('BOOTLIBDIR', bootlibdir)
238 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
239 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
240 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
241 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
242 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
243 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
244 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
245 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
246 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
247 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
249 substs.set('prefix', prefixdir)
250 substs.set('rootprefix', rootprefixdir)
251 substs.set('rootprefix_noslash', rootprefixdir_noslash)
252 substs.set('exec_prefix', prefixdir)
253 substs.set('libdir', libdir)
254 substs.set('rootlibdir', rootlibdir)
255 substs.set('includedir', includedir)
256 substs.set('sysconfdir', sysconfdir)
257 substs.set('bindir', bindir)
258 substs.set('rootbindir', rootbindir)
259 substs.set('rootlibexecdir', rootlibexecdir)
260 substs.set('systemunitdir', systemunitdir)
261 substs.set('userunitdir', userunitdir)
262 substs.set('systempresetdir', systempresetdir)
263 substs.set('userpresetdir', userpresetdir)
264 substs.set('udevhwdbdir', udevhwdbdir)
265 substs.set('udevrulesdir', udevrulesdir)
266 substs.set('udevlibexecdir', udevlibexecdir)
267 substs.set('environmentdir', environmentdir)
268 substs.set('catalogdir', catalogdir)
269 substs.set('tmpfilesdir', tmpfilesdir)
270 substs.set('sysusersdir', sysusersdir)
271 substs.set('sysctldir', sysctldir)
272 substs.set('binfmtdir', binfmtdir)
273 substs.set('modulesloaddir', modulesloaddir)
274 substs.set('modprobedir', modprobedir)
275 substs.set('systemgeneratordir', systemgeneratordir)
276 substs.set('usergeneratordir', usergeneratordir)
277 substs.set('systemenvgeneratordir', systemenvgeneratordir)
278 substs.set('userenvgeneratordir', userenvgeneratordir)
279 substs.set('systemshutdowndir', systemshutdowndir)
280 substs.set('systemsleepdir', systemsleepdir)
281 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
282 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
283 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
284 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
285 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
286 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
287 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
288 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
289 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
290 substs.set('BUILD_ROOT', meson.current_build_dir())
292 #####################################################################
294 cc = meson.get_compiler('c')
295 pkgconfig = import('pkgconfig')
296 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
297 meson_build_sh = find_program('tools/meson-build.sh')
299 want_tests = get_option('tests')
300 slow_tests = want_tests != 'false' and get_option('slow-tests')
301 install_tests = get_option('install-tests')
303 if add_languages('cpp', required : fuzzer_build)
304 # Used only for tests
305 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
311 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
312 if fuzzing_engine.found()
313 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
314 elif cc.has_argument('-fsanitize=fuzzer-no-link')
315 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
317 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
320 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
322 fuzzing_engine = meson.get_compiler('cpp').find_library(get_option('fuzzbuzz-engine'), dirs: get_option('fuzzbuzz-engine-dir'))
325 possible_cc_flags = [
329 '-Wmissing-include-dirs',
330 '-Wold-style-definition',
334 '-Wsuggest-attribute=noreturn',
335 '-Werror=missing-prototypes',
336 '-Werror=implicit-function-declaration',
337 '-Werror=missing-declarations',
338 '-Werror=return-type',
339 '-Werror=incompatible-pointer-types',
341 '-Wstrict-prototypes',
343 '-Wmissing-noreturn',
344 '-Wimplicit-fallthrough=5',
347 '-Wstrict-aliasing=2',
350 '-Werror=shift-count-overflow',
351 '-Werror=shift-overflow=2',
355 # negative arguments are correctly detected starting with meson 0.46.
356 '-Wno-unused-parameter',
357 '-Wno-missing-field-initializers',
358 '-Wno-unused-result',
359 '-Wno-format-signedness',
360 '-Wno-error=#warnings', # clang
361 '-Wno-string-plus-int', # clang
363 # work-around for gcc 7.1 turning this on on its own.
364 '-Wno-error=nonnull',
366 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
367 # optimizations enabled, producing essentially false positives.
368 '-Wno-maybe-uninitialized',
372 '-fdiagnostics-show-option',
373 '-fno-strict-aliasing',
374 '-fvisibility=hidden',
376 '-fstack-protector-strong',
377 '--param=ssp-buffer-size=4',
380 # --as-needed and --no-undefined are provided by meson by default,
381 # run mesonconf to see what is enabled
382 possible_link_flags = [
387 if cc.get_id() == 'clang'
388 possible_cc_flags += [
389 '-Wno-typedef-redefinition',
390 '-Wno-gnu-variable-sized-type-not-at-end',
394 if get_option('buildtype') != 'debug'
395 possible_cc_flags += [
396 '-ffunction-sections',
400 possible_link_flags += '-Wl,--gc-sections'
403 if get_option('b_ndebug') == 'true'
404 # With asserts disabled with get a bunch of warnings about variables which
405 # are used only in the asserts. This is not useful at all, so let's just silence
407 possible_cc_flags += [
408 '-Wno-unused-variable',
409 '-Wno-unused-but-set-variable',
413 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
414 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
418 #include <inttypes.h>
419 typedef uint64_t usec_t;
420 usec_t now(clockid_t clock);
425 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
426 add_project_arguments('-Werror=shadow', language : 'c')
429 cpp = ' '.join(cc.cmd_array()) + ' -E'
431 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
433 #####################################################################
434 # compilation result tests
436 conf.set('_GNU_SOURCE', true)
437 conf.set('__SANE_USERSPACE_TYPES__', true)
438 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
440 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
441 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
442 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
443 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
444 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
445 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
446 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
450 #include <sys/stat.h>
453 foreach decl : ['char16_t',
458 # We get -1 if the size cannot be determined
459 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
461 if decl == 'struct statx'
463 want_linux_stat_h = false
465 have = cc.sizeof(decl,
466 prefix : decl_headers + '#include <linux/stat.h>',
467 args : '-D_GNU_SOURCE') > 0
468 want_linux_stat_h = have
472 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
475 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
477 foreach ident : ['secure_getenv', '__secure_getenv']
478 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
482 ['memfd_create', '''#include <sys/mman.h>'''],
483 ['gettid', '''#include <sys/types.h>
484 #include <unistd.h>'''],
485 ['pivot_root', '''#include <stdlib.h>
486 #include <unistd.h>'''], # no known header declares pivot_root
487 ['name_to_handle_at', '''#include <sys/types.h>
488 #include <sys/stat.h>
489 #include <fcntl.h>'''],
490 ['setns', '''#include <sched.h>'''],
491 ['renameat2', '''#include <stdio.h>
492 #include <fcntl.h>'''],
493 ['kcmp', '''#include <linux/kcmp.h>'''],
494 ['keyctl', '''#include <sys/types.h>
495 #include <keyutils.h>'''],
496 ['copy_file_range', '''#include <sys/syscall.h>
497 #include <unistd.h>'''],
498 ['bpf', '''#include <sys/syscall.h>
499 #include <unistd.h>'''],
500 ['statx', '''#include <sys/types.h>
501 #include <sys/stat.h>
502 #include <unistd.h>'''],
503 ['explicit_bzero' , '''#include <string.h>'''],
504 ['reallocarray', '''#include <malloc.h>'''],
505 ['set_mempolicy', '''#include <stdlib.h>
506 #include <unistd.h>'''],
507 ['get_mempolicy', '''#include <stdlib.h>
508 #include <unistd.h>'''],
511 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
512 conf.set10('HAVE_' + ident[0].to_upper(), have)
515 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
516 conf.set10('USE_SYS_RANDOM_H', true)
517 conf.set10('HAVE_GETRANDOM', true)
519 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
520 conf.set10('USE_SYS_RANDOM_H', false)
521 conf.set10('HAVE_GETRANDOM', have)
524 #####################################################################
526 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
528 get_option('version-tag'),
529 meson.project_version()]
532 input : 'src/version/version.h.in',
533 output : 'version.h',
536 versiondep = declare_dependency(sources: version_h)
538 sed = find_program('sed')
539 awk = find_program('awk')
540 m4 = find_program('m4')
541 stat = find_program('stat')
542 git = find_program('git', required : false)
543 env = find_program('env')
544 perl = find_program('perl', required : false)
546 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
547 mkdir_p = 'mkdir -p $DESTDIR/@0@'
548 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
549 splash_bmp = files('test/splash.bmp')
551 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
552 # /usr/sbin, /sbin, and fall back to the default from middle column.
553 progs = [['quotaon', '/usr/sbin/quotaon' ],
554 ['quotacheck', '/usr/sbin/quotacheck' ],
555 ['kmod', '/usr/bin/kmod' ],
556 ['kexec', '/usr/sbin/kexec' ],
557 ['sulogin', '/usr/sbin/sulogin' ],
558 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
559 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
560 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
561 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
562 ['nologin', '/usr/sbin/nologin', ],
565 path = get_option(prog[0] + '-path')
567 message('Using @1@ for @0@'.format(prog[0], path))
569 exe = find_program(prog[0],
570 '/usr/sbin/' + prog[0],
573 path = exe.found() ? exe.path() : prog[1]
575 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
576 conf.set_quoted(name, path)
577 substs.set(name, path)
580 conf.set_quoted('TELINIT', get_option('telinit-path'))
582 if run_command('ln', '--relative', '--help').returncode() != 0
583 error('ln does not support --relative (added in coreutils 8.16)')
586 ############################################################
588 gperf = find_program('gperf')
590 gperf_test_format = '''
592 const char * in_word_set(const char *, @0@);
595 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
596 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
597 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
598 if cc.compiles(gperf_test)
599 gperf_len_type = 'size_t'
601 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
602 if cc.compiles(gperf_test)
603 gperf_len_type = 'unsigned'
605 error('unable to determine gperf len type')
608 message('gperf len type is @0@'.format(gperf_len_type))
609 conf.set('GPERF_LEN_TYPE', gperf_len_type,
610 description : 'The type of gperf "len" parameter')
612 ############################################################
614 if not cc.has_header('sys/capability.h')
615 error('POSIX caps headers not found')
617 foreach header : ['crypt.h',
619 'linux/vm_sockets.h',
621 'valgrind/memcheck.h',
622 'valgrind/valgrind.h',
625 conf.set10('HAVE_' + header.underscorify().to_upper(),
626 cc.has_header(header))
629 ############################################################
631 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
632 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
633 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
635 default_hierarchy = get_option('default-hierarchy')
636 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
637 description : 'default cgroup hierarchy as string')
638 if default_hierarchy == 'legacy'
639 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
640 elif default_hierarchy == 'hybrid'
641 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
643 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
646 default_net_naming_scheme = get_option('default-net-naming-scheme')
647 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
649 time_epoch = get_option('time-epoch')
652 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
654 conf.set('TIME_EPOCH', time_epoch)
656 system_uid_max = get_option('system-uid-max')
657 if system_uid_max == -1
658 system_uid_max = run_command(
660 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
661 '/etc/login.defs').stdout().strip()
662 if system_uid_max == ''
665 system_uid_max = system_uid_max.to_int()
668 conf.set('SYSTEM_UID_MAX', system_uid_max)
669 substs.set('systemuidmax', system_uid_max)
671 system_gid_max = get_option('system-gid-max')
672 if system_gid_max == -1
673 system_gid_max = run_command(
675 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
676 '/etc/login.defs').stdout().strip()
677 if system_gid_max == ''
680 system_gid_max = system_gid_max.to_int()
683 conf.set('SYSTEM_GID_MAX', system_gid_max)
684 substs.set('systemgidmax', system_gid_max)
686 dynamic_uid_min = get_option('dynamic-uid-min')
687 dynamic_uid_max = get_option('dynamic-uid-max')
688 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
689 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
690 substs.set('dynamicuidmin', dynamic_uid_min)
691 substs.set('dynamicuidmax', dynamic_uid_max)
693 container_uid_base_min = get_option('container-uid-base-min')
694 container_uid_base_max = get_option('container-uid-base-max')
695 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
696 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
697 substs.set('containeruidbasemin', container_uid_base_min)
698 substs.set('containeruidbasemax', container_uid_base_max)
700 nobody_user = get_option('nobody-user')
701 nobody_group = get_option('nobody-group')
703 if not meson.is_cross_build()
704 getent_result = run_command('getent', 'passwd', '65534')
705 if getent_result.returncode() == 0
706 name = getent_result.stdout().split(':')[0]
707 if name != nobody_user
709 'The local user with the UID 65534 does not match the configured user name "@0@" of the nobody user (its name is @1@).\n'.format(nobody_user, name) +
710 'Your build will result in an user table setup that is incompatible with the local system.')
713 id_result = run_command('id', '-u', nobody_user)
714 if id_result.returncode() == 0
715 id = id_result.stdout().to_int()
718 'The local user with the configured user name "@0@" of the nobody user does not have UID 65534 (it has @1@).\n'.format(nobody_user, id) +
719 'Your build will result in an user table setup that is incompatible with the local system.')
723 getent_result = run_command('getent', 'group', '65534')
724 if getent_result.returncode() == 0
725 name = getent_result.stdout().split(':')[0]
726 if name != nobody_group
728 'The local group with the GID 65534 does not match the configured group name "@0@" of the nobody group (its name is @1@).\n'.format(nobody_group, name) +
729 'Your build will result in an group table setup that is incompatible with the local system.')
732 id_result = run_command('id', '-g', nobody_group)
733 if id_result.returncode() == 0
734 id = id_result.stdout().to_int()
737 'The local group with the configured group name "@0@" of the nobody group does not have UID 65534 (it has @1@).\n'.format(nobody_group, id) +
738 'Your build will result in an group table setup that is incompatible with the local system.')
742 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
744 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
745 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
748 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
749 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
750 substs.set('NOBODY_USER_NAME', nobody_user)
751 substs.set('NOBODY_GROUP_NAME', nobody_group)
753 tty_gid = get_option('tty-gid')
754 conf.set('TTY_GID', tty_gid)
755 substs.set('TTY_GID', tty_gid)
757 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
758 users_gid = get_option('users-gid')
759 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
761 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
762 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
764 dev_kvm_mode = get_option('dev-kvm-mode')
765 substs.set('DEV_KVM_MODE', dev_kvm_mode)
766 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
767 group_render_mode = get_option('group-render-mode')
768 substs.set('GROUP_RENDER_MODE', group_render_mode)
769 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
771 kill_user_processes = get_option('default-kill-user-processes')
772 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
773 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
774 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
776 dns_servers = get_option('dns-servers')
777 conf.set_quoted('DNS_SERVERS', dns_servers)
778 substs.set('DNS_SERVERS', dns_servers)
780 ntp_servers = get_option('ntp-servers')
781 conf.set_quoted('NTP_SERVERS', ntp_servers)
782 substs.set('NTP_SERVERS', ntp_servers)
784 default_locale = get_option('default-locale')
785 if default_locale == ''
786 if not meson.is_cross_build()
787 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
788 default_locale = run_command(choose_default_locale_sh).stdout().strip()
790 default_locale = 'C.UTF-8'
793 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
795 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
797 substs.set('SUSHELL', get_option('debug-shell'))
798 substs.set('DEBUGTTY', get_option('debug-tty'))
799 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
801 enable_debug_hashmap = false
802 enable_debug_mmap_cache = false
803 enable_debug_siphash = false
804 foreach name : get_option('debug-extra')
806 enable_debug_hashmap = true
807 elif name == 'mmap-cache'
808 enable_debug_mmap_cache = true
809 elif name == 'siphash'
810 enable_debug_siphash = true
812 message('unknown debug option "@0@", ignoring'.format(name))
815 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
816 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
817 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
819 conf.set10('VALGRIND', get_option('valgrind'))
820 conf.set10('LOG_TRACE', get_option('log-trace'))
822 #####################################################################
824 threads = dependency('threads')
825 librt = cc.find_library('rt')
826 libm = cc.find_library('m')
827 libdl = cc.find_library('dl')
828 libcrypt = cc.find_library('crypt')
830 libcap = dependency('libcap', required : false)
831 if not libcap.found()
832 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
833 libcap = cc.find_library('cap')
836 libmount = dependency('mount',
837 version : fuzzer_build ? '>= 0' : '>= 2.30')
839 want_seccomp = get_option('seccomp')
840 if want_seccomp != 'false' and not skip_deps
841 libseccomp = dependency('libseccomp',
842 version : '>= 2.3.1',
843 required : want_seccomp == 'true')
844 have = libseccomp.found()
849 conf.set10('HAVE_SECCOMP', have)
851 want_selinux = get_option('selinux')
852 if want_selinux != 'false' and not skip_deps
853 libselinux = dependency('libselinux',
854 version : '>= 2.1.9',
855 required : want_selinux == 'true')
856 have = libselinux.found()
861 conf.set10('HAVE_SELINUX', have)
863 want_apparmor = get_option('apparmor')
864 if want_apparmor != 'false' and not skip_deps
865 libapparmor = dependency('libapparmor',
866 required : want_apparmor == 'true')
867 have = libapparmor.found()
872 conf.set10('HAVE_APPARMOR', have)
874 smack_run_label = get_option('smack-run-label')
875 if smack_run_label != ''
876 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
879 want_polkit = get_option('polkit')
880 install_polkit = false
881 install_polkit_pkla = false
882 if want_polkit != 'false' and not skip_deps
883 install_polkit = true
885 libpolkit = dependency('polkit-gobject-1',
887 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
888 message('Old polkit detected, will install pkla files')
889 install_polkit_pkla = true
892 conf.set10('ENABLE_POLKIT', install_polkit)
894 want_acl = get_option('acl')
895 if want_acl != 'false' and not skip_deps
896 libacl = cc.find_library('acl', required : want_acl == 'true')
897 have = libacl.found()
902 conf.set10('HAVE_ACL', have)
904 want_audit = get_option('audit')
905 if want_audit != 'false' and not skip_deps
906 libaudit = dependency('audit', required : want_audit == 'true')
907 have = libaudit.found()
912 conf.set10('HAVE_AUDIT', have)
914 want_blkid = get_option('blkid')
915 if want_blkid != 'false' and not skip_deps
916 libblkid = dependency('blkid', required : want_blkid == 'true')
917 have = libblkid.found()
922 conf.set10('HAVE_BLKID', have)
924 want_kmod = get_option('kmod')
925 if want_kmod != 'false' and not skip_deps
926 libkmod = dependency('libkmod',
928 required : want_kmod == 'true')
929 have = libkmod.found()
934 conf.set10('HAVE_KMOD', have)
936 want_pam = get_option('pam')
937 if want_pam != 'false' and not skip_deps
938 libpam = cc.find_library('pam', required : want_pam == 'true')
939 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
940 have = libpam.found() and libpam_misc.found()
946 conf.set10('HAVE_PAM', have)
948 want_microhttpd = get_option('microhttpd')
949 if want_microhttpd != 'false' and not skip_deps
950 libmicrohttpd = dependency('libmicrohttpd',
951 version : '>= 0.9.33',
952 required : want_microhttpd == 'true')
953 have = libmicrohttpd.found()
958 conf.set10('HAVE_MICROHTTPD', have)
960 want_libcryptsetup = get_option('libcryptsetup')
961 if want_libcryptsetup != 'false' and not skip_deps
962 libcryptsetup = dependency('libcryptsetup',
963 version : '>= 2.0.1',
964 required : want_libcryptsetup == 'true')
965 have = libcryptsetup.found()
970 conf.set10('HAVE_LIBCRYPTSETUP', have)
972 want_libcurl = get_option('libcurl')
973 if want_libcurl != 'false' and not skip_deps
974 libcurl = dependency('libcurl',
975 version : '>= 7.32.0',
976 required : want_libcurl == 'true')
977 have = libcurl.found()
982 conf.set10('HAVE_LIBCURL', have)
984 want_libidn = get_option('libidn')
985 want_libidn2 = get_option('libidn2')
986 if want_libidn == 'true' and want_libidn2 == 'true'
987 error('libidn and libidn2 cannot be requested simultaneously')
990 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
991 libidn = dependency('libidn2',
992 required : want_libidn2 == 'true')
993 have = libidn.found()
998 conf.set10('HAVE_LIBIDN2', have)
999 if not have and want_libidn != 'false' and not skip_deps
1000 # libidn is used for both libidn and libidn2 objects
1001 libidn = dependency('libidn',
1002 required : want_libidn == 'true')
1003 have = libidn.found()
1007 conf.set10('HAVE_LIBIDN', have)
1009 want_libiptc = get_option('libiptc')
1010 if want_libiptc != 'false' and not skip_deps
1011 libiptc = dependency('libiptc',
1012 required : want_libiptc == 'true')
1013 have = libiptc.found()
1018 conf.set10('HAVE_LIBIPTC', have)
1020 want_qrencode = get_option('qrencode')
1021 if want_qrencode != 'false' and not skip_deps
1022 libqrencode = dependency('libqrencode',
1023 required : want_qrencode == 'true')
1024 have = libqrencode.found()
1029 conf.set10('HAVE_QRENCODE', have)
1031 want_gcrypt = get_option('gcrypt')
1032 if want_gcrypt != 'false' and not skip_deps
1033 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1034 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1035 have = libgcrypt.found() and libgpg_error.found()
1040 # link to neither of the libs if one is not found
1044 conf.set10('HAVE_GCRYPT', have)
1046 want_gnutls = get_option('gnutls')
1047 if want_gnutls != 'false' and not skip_deps
1048 libgnutls = dependency('gnutls',
1049 version : '>= 3.1.4',
1050 required : want_gnutls == 'true')
1051 have = libgnutls.found()
1056 conf.set10('HAVE_GNUTLS', have)
1058 want_openssl = get_option('openssl')
1059 if want_openssl != 'false' and not skip_deps
1060 libopenssl = dependency('openssl',
1061 version : '>= 1.1.0',
1062 required : want_openssl == 'true')
1063 have = libopenssl.found()
1068 conf.set10('HAVE_OPENSSL', have)
1070 want_elfutils = get_option('elfutils')
1071 if want_elfutils != 'false' and not skip_deps
1072 libdw = dependency('libdw',
1073 required : want_elfutils == 'true')
1074 have = libdw.found()
1079 conf.set10('HAVE_ELFUTILS', have)
1081 want_zlib = get_option('zlib')
1082 if want_zlib != 'false' and not skip_deps
1083 libz = dependency('zlib',
1084 required : want_zlib == 'true')
1090 conf.set10('HAVE_ZLIB', have)
1092 want_bzip2 = get_option('bzip2')
1093 if want_bzip2 != 'false' and not skip_deps
1094 libbzip2 = cc.find_library('bz2',
1095 required : want_bzip2 == 'true')
1096 have = libbzip2.found()
1101 conf.set10('HAVE_BZIP2', have)
1103 want_xz = get_option('xz')
1104 if want_xz != 'false' and not skip_deps
1105 libxz = dependency('liblzma',
1106 required : want_xz == 'true')
1107 have = libxz.found()
1112 conf.set10('HAVE_XZ', have)
1114 want_lz4 = get_option('lz4')
1115 if want_lz4 != 'false' and not skip_deps
1116 liblz4 = dependency('liblz4',
1117 version : '>= 1.3.0',
1118 required : want_lz4 == 'true')
1119 have = liblz4.found()
1124 conf.set10('HAVE_LZ4', have)
1126 want_xkbcommon = get_option('xkbcommon')
1127 if want_xkbcommon != 'false' and not skip_deps
1128 libxkbcommon = dependency('xkbcommon',
1129 version : '>= 0.3.0',
1130 required : want_xkbcommon == 'true')
1131 have = libxkbcommon.found()
1136 conf.set10('HAVE_XKBCOMMON', have)
1138 want_pcre2 = get_option('pcre2')
1139 if want_pcre2 != 'false'
1140 libpcre2 = dependency('libpcre2-8',
1141 required : want_pcre2 == 'true')
1142 have = libpcre2.found()
1147 conf.set10('HAVE_PCRE2', have)
1149 want_glib = get_option('glib')
1150 if want_glib != 'false' and not skip_deps
1151 libglib = dependency('glib-2.0',
1152 version : '>= 2.22.0',
1153 required : want_glib == 'true')
1154 libgobject = dependency('gobject-2.0',
1155 version : '>= 2.22.0',
1156 required : want_glib == 'true')
1157 libgio = dependency('gio-2.0',
1158 required : want_glib == 'true')
1159 have = libglib.found() and libgobject.found() and libgio.found()
1166 conf.set10('HAVE_GLIB', have)
1168 want_dbus = get_option('dbus')
1169 if want_dbus != 'false' and not skip_deps
1170 libdbus = dependency('dbus-1',
1171 version : '>= 1.3.2',
1172 required : want_dbus == 'true')
1173 have = libdbus.found()
1178 conf.set10('HAVE_DBUS', have)
1180 default_dnssec = get_option('default-dnssec')
1182 default_dnssec = 'no'
1184 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1185 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1186 default_dnssec = 'no'
1188 conf.set('DEFAULT_DNSSEC_MODE',
1189 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1190 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1192 dns_over_tls = get_option('dns-over-tls')
1193 if dns_over_tls != 'false'
1194 if dns_over_tls == 'openssl'
1197 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1198 if dns_over_tls == 'gnutls' and not have_gnutls
1199 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1202 if dns_over_tls == 'gnutls' or have_gnutls
1203 have_openssl = false
1205 have_openssl = conf.get('HAVE_OPENSSL') == 1
1206 if dns_over_tls != 'auto' and not have_openssl
1207 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1208 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1211 have = have_gnutls or have_openssl
1215 have_openssl = false
1217 conf.set10('ENABLE_DNS_OVER_TLS', have)
1218 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1219 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1221 default_dns_over_tls = get_option('default-dns-over-tls')
1223 default_dns_over_tls = 'no'
1225 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1226 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.')
1227 default_dns_over_tls = 'no'
1229 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1230 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1231 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1233 want_importd = get_option('importd')
1234 if want_importd != 'false'
1235 have = (conf.get('HAVE_LIBCURL') == 1 and
1236 conf.get('HAVE_ZLIB') == 1 and
1237 conf.get('HAVE_XZ') == 1 and
1238 conf.get('HAVE_GCRYPT') == 1)
1239 if want_importd == 'true' and not have
1240 error('importd support was requested, but dependencies are not available')
1245 conf.set10('ENABLE_IMPORTD', have)
1247 want_remote = get_option('remote')
1248 if want_remote != 'false'
1249 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1250 conf.get('HAVE_LIBCURL') == 1]
1251 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1252 # it's possible to build one without the other. Complain only if
1253 # support was explicitly requested. The auxiliary files like sysusers
1254 # config should be installed when any of the programs are built.
1255 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1256 error('remote support was requested, but dependencies are not available')
1258 have = have_deps[0] or have_deps[1]
1262 conf.set10('ENABLE_REMOTE', have)
1264 foreach term : ['utmp',
1297 have = get_option(term)
1298 name = 'ENABLE_' + term.underscorify().to_upper()
1299 conf.set10(name, have)
1302 foreach tuple : [['nss-mymachines', 'machined'],
1303 ['nss-resolve', 'resolve']]
1304 want = get_option(tuple[0])
1306 have = get_option(tuple[1])
1307 if want == 'true' and not have
1308 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1313 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1314 conf.set10(name, have)
1318 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1319 'ENABLE_NSS_MYMACHINES',
1320 'ENABLE_NSS_RESOLVE',
1321 'ENABLE_NSS_SYSTEMD']
1322 if conf.get(term) == 1
1326 conf.set10('ENABLE_NSS', enable_nss)
1328 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1333 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1335 #####################################################################
1337 if get_option('efi')
1338 efi_arch = host_machine.cpu_family()
1340 if efi_arch == 'x86'
1341 EFI_MACHINE_TYPE_NAME = 'ia32'
1342 gnu_efi_arch = 'ia32'
1343 elif efi_arch == 'x86_64'
1344 EFI_MACHINE_TYPE_NAME = 'x64'
1345 gnu_efi_arch = 'x86_64'
1346 elif efi_arch == 'arm'
1347 EFI_MACHINE_TYPE_NAME = 'arm'
1348 gnu_efi_arch = 'arm'
1349 elif efi_arch == 'aarch64'
1350 EFI_MACHINE_TYPE_NAME = 'aa64'
1351 gnu_efi_arch = 'aarch64'
1353 EFI_MACHINE_TYPE_NAME = ''
1358 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1360 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1364 conf.set10('ENABLE_EFI', have)
1366 #####################################################################
1368 config_h = configure_file(
1369 output : 'config.h',
1370 configuration : conf)
1372 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1374 includes = include_directories('src/basic',
1379 'src/journal-remote',
1383 'src/time-wait-sync',
1389 'src/libsystemd/sd-bus',
1390 'src/libsystemd/sd-device',
1391 'src/libsystemd/sd-event',
1392 'src/libsystemd/sd-hwdb',
1393 'src/libsystemd/sd-id128',
1394 'src/libsystemd/sd-netlink',
1395 'src/libsystemd/sd-network',
1396 'src/libsystemd/sd-resolve',
1397 'src/libsystemd-network',
1400 add_project_arguments('-include', 'config.h', language : 'c')
1402 generate_gperfs = find_program('tools/generate-gperfs.py')
1406 subdir('src/systemd')
1408 subdir('src/libsystemd')
1409 subdir('src/libsystemd-network')
1410 subdir('src/journal')
1413 libjournal_core = static_library(
1415 libjournal_core_sources,
1417 include_directories : includes,
1420 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1421 libsystemd = shared_library(
1424 version : libsystemd_version,
1425 include_directories : includes,
1426 link_args : ['-shared',
1427 '-Wl,--version-script=' + libsystemd_sym_path],
1428 link_with : [libbasic,
1430 link_whole : [libsystemd_static,
1432 dependencies : [threads,
1436 link_depends : libsystemd_sym,
1438 install_dir : rootlibdir)
1440 static_libsystemd = get_option('static-libsystemd')
1441 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1443 install_libsystemd_static = static_library(
1446 journal_client_sources,
1448 basic_gcrypt_sources,
1450 include_directories : includes,
1451 build_by_default : static_libsystemd != 'false',
1452 install : static_libsystemd != 'false',
1453 install_dir : rootlibdir,
1454 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1455 dependencies : [threads,
1464 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1466 ############################################################
1468 # binaries that have --help and are intended for use by humans,
1469 # usually, but not always, installed in /bin.
1470 public_programs = []
1472 subdir('src/libudev')
1473 subdir('src/shared')
1475 subdir('src/shutdown')
1477 subdir('src/network')
1479 subdir('src/analyze')
1480 subdir('src/journal-remote')
1481 subdir('src/coredump')
1482 subdir('src/pstore')
1483 subdir('src/hostname')
1484 subdir('src/import')
1485 subdir('src/kernel-install')
1486 subdir('src/locale')
1487 subdir('src/machine')
1488 subdir('src/portable')
1489 subdir('src/nspawn')
1490 subdir('src/resolve')
1491 subdir('src/timedate')
1492 subdir('src/timesync')
1493 subdir('src/vconsole')
1494 subdir('src/boot/efi')
1501 ############################################################
1503 # only static linking apart from libdl, to make sure that the
1504 # module is linked to all libraries that it uses.
1505 test_dlopen = executable(
1509 include_directories : includes,
1510 link_with : [libbasic],
1511 dependencies : [libdl],
1512 build_by_default : want_tests != 'false')
1514 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1515 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1516 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1517 ['resolve', 'ENABLE_NSS_RESOLVE']]
1519 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1523 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1524 version_script_arg = join_paths(project_source_root, sym)
1526 nss = shared_library(
1528 'src/nss-@0@/nss-@0@.c'.format(module),
1531 include_directories : includes,
1532 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1533 link_args : ['-Wl,-z,nodelete',
1535 '-Wl,--version-script=' + version_script_arg],
1536 link_with : [libsystemd_static,
1539 dependencies : [threads,
1543 install_dir : rootlibdir)
1545 # We cannot use shared_module because it does not support version suffix.
1546 # Unfortunately shared_library insists on creating the symlink…
1547 meson.add_install_script('sh', '-c',
1548 'rm $DESTDIR@0@/libnss_@1@.so'
1549 .format(rootlibdir, module))
1551 if want_tests != 'false'
1552 test('dlopen-nss_' + module,
1554 # path to dlopen must include a slash
1555 args : nss.full_path())
1560 ############################################################
1562 executable('systemd',
1564 include_directories : includes,
1565 link_with : [libcore,
1567 dependencies : [versiondep,
1574 install_rpath : rootlibexecdir,
1576 install_dir : rootlibexecdir)
1578 meson.add_install_script(meson_make_symlink,
1579 join_paths(rootlibexecdir, 'systemd'),
1580 join_paths(rootsbindir, 'init'))
1582 exe = executable('systemd-analyze',
1583 systemd_analyze_sources,
1584 include_directories : includes,
1585 link_with : [libcore,
1587 dependencies : [versiondep,
1594 install_rpath : rootlibexecdir,
1596 public_programs += exe
1598 executable('systemd-journald',
1599 systemd_journald_sources,
1600 include_directories : includes,
1601 link_with : [libjournal_core,
1603 dependencies : [threads,
1607 install_rpath : rootlibexecdir,
1609 install_dir : rootlibexecdir)
1611 exe = executable('systemd-cat',
1612 systemd_cat_sources,
1613 include_directories : includes,
1614 link_with : [libjournal_core,
1616 dependencies : [threads],
1617 install_rpath : rootlibexecdir,
1619 public_programs += exe
1621 exe = executable('journalctl',
1623 include_directories : includes,
1624 link_with : [libshared],
1625 dependencies : [threads,
1630 install_rpath : rootlibexecdir,
1632 install_dir : rootbindir)
1633 public_programs += exe
1635 executable('systemd-getty-generator',
1636 'src/getty-generator/getty-generator.c',
1637 include_directories : includes,
1638 link_with : [libshared],
1639 install_rpath : rootlibexecdir,
1641 install_dir : systemgeneratordir)
1643 executable('systemd-debug-generator',
1644 'src/debug-generator/debug-generator.c',
1645 include_directories : includes,
1646 link_with : [libshared],
1647 install_rpath : rootlibexecdir,
1649 install_dir : systemgeneratordir)
1651 executable('systemd-run-generator',
1652 'src/run-generator/run-generator.c',
1653 include_directories : includes,
1654 link_with : [libshared],
1655 install_rpath : rootlibexecdir,
1657 install_dir : systemgeneratordir)
1659 executable('systemd-fstab-generator',
1660 'src/fstab-generator/fstab-generator.c',
1661 include_directories : includes,
1662 link_with : [libcore_shared,
1664 install_rpath : rootlibexecdir,
1666 install_dir : systemgeneratordir)
1668 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1669 executable('30-systemd-environment-d-generator',
1670 'src/environment-d-generator/environment-d-generator.c',
1671 include_directories : includes,
1672 link_with : [libshared],
1673 install_rpath : rootlibexecdir,
1675 install_dir : userenvgeneratordir)
1677 meson.add_install_script(meson_make_symlink,
1678 join_paths(sysconfdir, 'environment'),
1679 join_paths(environmentdir, '99-environment.conf'))
1682 if conf.get('ENABLE_HIBERNATE') == 1
1683 executable('systemd-hibernate-resume-generator',
1684 'src/hibernate-resume/hibernate-resume-generator.c',
1685 include_directories : includes,
1686 link_with : [libshared],
1687 install_rpath : rootlibexecdir,
1689 install_dir : systemgeneratordir)
1691 executable('systemd-hibernate-resume',
1692 'src/hibernate-resume/hibernate-resume.c',
1693 include_directories : includes,
1694 link_with : [libshared],
1695 install_rpath : rootlibexecdir,
1697 install_dir : rootlibexecdir)
1700 if conf.get('HAVE_BLKID') == 1
1701 executable('systemd-gpt-auto-generator',
1702 'src/gpt-auto-generator/gpt-auto-generator.c',
1703 'src/shared/blkid-util.h',
1704 include_directories : includes,
1705 link_with : [libshared],
1706 dependencies : libblkid,
1707 install_rpath : rootlibexecdir,
1709 install_dir : systemgeneratordir)
1711 exe = executable('systemd-dissect',
1712 'src/dissect/dissect.c',
1713 include_directories : includes,
1714 link_with : [libshared],
1715 install_rpath : rootlibexecdir,
1717 install_dir : rootlibexecdir)
1718 public_programs += exe
1721 if conf.get('ENABLE_RESOLVE') == 1
1722 executable('systemd-resolved',
1723 systemd_resolved_sources,
1724 include_directories : includes,
1725 link_with : [libshared,
1727 libsystemd_resolve_core],
1728 dependencies : systemd_resolved_dependencies,
1729 install_rpath : rootlibexecdir,
1731 install_dir : rootlibexecdir)
1733 exe = executable('resolvectl',
1735 include_directories : includes,
1736 link_with : [libshared,
1738 libsystemd_resolve_core],
1739 dependencies : [threads,
1743 install_rpath : rootlibexecdir,
1745 public_programs += exe
1747 meson.add_install_script(meson_make_symlink,
1748 join_paths(bindir, 'resolvectl'),
1749 join_paths(rootsbindir, 'resolvconf'))
1751 meson.add_install_script(meson_make_symlink,
1752 join_paths(bindir, 'resolvectl'),
1753 join_paths(bindir, 'systemd-resolve'))
1756 if conf.get('ENABLE_LOGIND') == 1
1757 executable('systemd-logind',
1758 systemd_logind_sources,
1759 include_directories : includes,
1760 link_with : [liblogind_core,
1762 dependencies : [threads,
1764 install_rpath : rootlibexecdir,
1766 install_dir : rootlibexecdir)
1768 exe = executable('loginctl',
1770 include_directories : includes,
1771 link_with : [libshared],
1772 dependencies : [threads,
1775 install_rpath : rootlibexecdir,
1777 install_dir : rootbindir)
1778 public_programs += exe
1780 exe = executable('systemd-inhibit',
1781 'src/login/inhibit.c',
1782 include_directories : includes,
1783 link_with : [libshared],
1784 install_rpath : rootlibexecdir,
1786 install_dir : rootbindir)
1787 public_programs += exe
1789 if conf.get('HAVE_PAM') == 1
1790 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1791 pam_systemd = shared_library(
1795 include_directories : includes,
1796 link_args : ['-shared',
1797 '-Wl,--version-script=' + version_script_arg],
1798 link_with : [libsystemd_static,
1800 dependencies : [threads,
1803 link_depends : pam_systemd_sym,
1805 install_dir : pamlibdir)
1807 if want_tests != 'false'
1808 test('dlopen-pam_systemd',
1810 # path to dlopen must include a slash
1811 args : pam_systemd.full_path())
1815 executable('systemd-user-runtime-dir',
1816 user_runtime_dir_sources,
1817 include_directories : includes,
1818 link_with : [libshared],
1819 install_rpath : rootlibexecdir,
1821 install_dir : rootlibexecdir)
1824 if conf.get('HAVE_PAM') == 1
1825 executable('systemd-user-sessions',
1826 'src/user-sessions/user-sessions.c',
1827 include_directories : includes,
1828 link_with : [libshared],
1829 install_rpath : rootlibexecdir,
1831 install_dir : rootlibexecdir)
1834 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1835 exe = executable('bootctl',
1836 'src/boot/bootctl.c',
1837 include_directories : includes,
1838 link_with : [libshared],
1839 dependencies : [libblkid],
1840 install_rpath : rootlibexecdir,
1842 public_programs += exe
1844 executable('systemd-bless-boot',
1845 'src/boot/bless-boot.c',
1846 include_directories : includes,
1847 link_with : [libshared],
1848 dependencies : [libblkid],
1849 install_rpath : rootlibexecdir,
1851 install_dir : rootlibexecdir)
1853 executable('systemd-bless-boot-generator',
1854 'src/boot/bless-boot-generator.c',
1855 include_directories : includes,
1856 link_with : [libshared],
1857 install_rpath : rootlibexecdir,
1859 install_dir : systemgeneratordir)
1862 executable('systemd-boot-check-no-failures',
1863 'src/boot/boot-check-no-failures.c',
1864 include_directories : includes,
1865 link_with : [libshared],
1866 dependencies : [libblkid],
1867 install_rpath : rootlibexecdir,
1869 install_dir : rootlibexecdir)
1871 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1872 include_directories : includes,
1873 link_with : [libshared],
1874 dependencies : [threads],
1875 install_rpath : rootlibexecdir,
1877 public_programs += exe
1880 if get_option('link-systemctl-shared')
1881 systemctl_link_with = [libshared]
1883 systemctl_link_with = [libsystemd_static,
1889 exe = executable('systemctl',
1890 'src/systemctl/systemctl.c',
1891 'src/systemctl/sysv-compat.h',
1892 'src/systemctl/sysv-compat.c',
1893 include_directories : includes,
1894 link_with : systemctl_link_with,
1895 dependencies : [threads,
1900 install_rpath : rootlibexecdir,
1902 install_dir : rootbindir)
1903 public_programs += exe
1905 if conf.get('ENABLE_PORTABLED') == 1
1906 executable('systemd-portabled',
1907 systemd_portabled_sources,
1908 include_directories : includes,
1909 link_with : [libshared],
1910 dependencies : [threads],
1911 install_rpath : rootlibexecdir,
1913 install_dir : rootlibexecdir)
1915 exe = executable('portablectl', 'src/portable/portablectl.c',
1916 include_directories : includes,
1917 link_with : [libshared],
1918 dependencies : [threads],
1919 install_rpath : rootlibexecdir,
1921 install_dir : rootbindir)
1922 public_programs += exe
1925 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1926 meson.add_install_script(meson_make_symlink,
1927 join_paths(rootbindir, 'systemctl'),
1928 join_paths(rootsbindir, alias))
1931 if conf.get('ENABLE_BACKLIGHT') == 1
1932 executable('systemd-backlight',
1933 'src/backlight/backlight.c',
1934 include_directories : includes,
1935 link_with : [libshared],
1936 install_rpath : rootlibexecdir,
1938 install_dir : rootlibexecdir)
1941 if conf.get('ENABLE_RFKILL') == 1
1942 executable('systemd-rfkill',
1943 'src/rfkill/rfkill.c',
1944 include_directories : includes,
1945 link_with : [libshared],
1946 install_rpath : rootlibexecdir,
1948 install_dir : rootlibexecdir)
1951 executable('systemd-system-update-generator',
1952 'src/system-update-generator/system-update-generator.c',
1953 include_directories : includes,
1954 link_with : [libshared],
1955 install_rpath : rootlibexecdir,
1957 install_dir : systemgeneratordir)
1959 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1960 executable('systemd-cryptsetup',
1961 'src/cryptsetup/cryptsetup.c',
1962 include_directories : includes,
1963 link_with : [libshared],
1964 dependencies : [libcryptsetup],
1965 install_rpath : rootlibexecdir,
1967 install_dir : rootlibexecdir)
1969 executable('systemd-cryptsetup-generator',
1970 'src/cryptsetup/cryptsetup-generator.c',
1971 include_directories : includes,
1972 link_with : [libshared],
1973 dependencies : [libcryptsetup],
1974 install_rpath : rootlibexecdir,
1976 install_dir : systemgeneratordir)
1978 executable('systemd-veritysetup',
1979 'src/veritysetup/veritysetup.c',
1980 include_directories : includes,
1981 link_with : [libshared],
1982 dependencies : [libcryptsetup],
1983 install_rpath : rootlibexecdir,
1985 install_dir : rootlibexecdir)
1987 executable('systemd-veritysetup-generator',
1988 'src/veritysetup/veritysetup-generator.c',
1989 include_directories : includes,
1990 link_with : [libshared],
1991 dependencies : [libcryptsetup],
1992 install_rpath : rootlibexecdir,
1994 install_dir : systemgeneratordir)
1997 if conf.get('HAVE_SYSV_COMPAT') == 1
1998 executable('systemd-sysv-generator',
1999 'src/sysv-generator/sysv-generator.c',
2000 include_directories : includes,
2001 link_with : [libshared],
2002 install_rpath : rootlibexecdir,
2004 install_dir : systemgeneratordir)
2006 executable('systemd-rc-local-generator',
2007 'src/rc-local-generator/rc-local-generator.c',
2008 include_directories : includes,
2009 link_with : [libshared],
2010 install_rpath : rootlibexecdir,
2012 install_dir : systemgeneratordir)
2015 if conf.get('ENABLE_HOSTNAMED') == 1
2016 executable('systemd-hostnamed',
2017 'src/hostname/hostnamed.c',
2018 include_directories : includes,
2019 link_with : [libshared],
2020 install_rpath : rootlibexecdir,
2022 install_dir : rootlibexecdir)
2024 exe = executable('hostnamectl',
2025 'src/hostname/hostnamectl.c',
2026 include_directories : includes,
2027 link_with : [libshared],
2028 install_rpath : rootlibexecdir,
2030 public_programs += exe
2033 if conf.get('ENABLE_LOCALED') == 1
2034 if conf.get('HAVE_XKBCOMMON') == 1
2035 # logind will load libxkbcommon.so dynamically on its own
2041 executable('systemd-localed',
2042 systemd_localed_sources,
2043 include_directories : includes,
2044 link_with : [libshared],
2045 dependencies : deps,
2046 install_rpath : rootlibexecdir,
2048 install_dir : rootlibexecdir)
2050 exe = executable('localectl',
2052 include_directories : includes,
2053 link_with : [libshared],
2054 install_rpath : rootlibexecdir,
2056 public_programs += exe
2059 if conf.get('ENABLE_TIMEDATED') == 1
2060 executable('systemd-timedated',
2061 'src/timedate/timedated.c',
2062 include_directories : includes,
2063 link_with : [libshared],
2064 install_rpath : rootlibexecdir,
2066 install_dir : rootlibexecdir)
2069 if conf.get('ENABLE_TIMEDATECTL') == 1
2070 exe = executable('timedatectl',
2071 'src/timedate/timedatectl.c',
2072 include_directories : includes,
2073 install_rpath : rootlibexecdir,
2074 link_with : [libshared],
2075 dependencies : [libm],
2077 public_programs += exe
2080 if conf.get('ENABLE_TIMESYNCD') == 1
2081 executable('systemd-timesyncd',
2082 systemd_timesyncd_sources,
2083 include_directories : includes,
2084 link_with : [libshared],
2085 dependencies : [threads,
2087 install_rpath : rootlibexecdir,
2089 install_dir : rootlibexecdir)
2091 executable('systemd-time-wait-sync',
2092 'src/time-wait-sync/time-wait-sync.c',
2093 include_directories : includes,
2094 link_with : [libshared],
2095 install_rpath : rootlibexecdir,
2097 install_dir : rootlibexecdir)
2100 if conf.get('ENABLE_MACHINED') == 1
2101 executable('systemd-machined',
2102 systemd_machined_sources,
2103 include_directories : includes,
2104 link_with : [libmachine_core,
2106 install_rpath : rootlibexecdir,
2108 install_dir : rootlibexecdir)
2110 exe = executable('machinectl',
2111 'src/machine/machinectl.c',
2112 include_directories : includes,
2113 link_with : [libshared],
2114 dependencies : [threads,
2117 install_rpath : rootlibexecdir,
2119 install_dir : rootbindir)
2120 public_programs += exe
2123 if conf.get('ENABLE_IMPORTD') == 1
2124 executable('systemd-importd',
2125 systemd_importd_sources,
2126 include_directories : includes,
2127 link_with : [libshared],
2128 dependencies : [threads],
2129 install_rpath : rootlibexecdir,
2131 install_dir : rootlibexecdir)
2133 systemd_pull = executable('systemd-pull',
2134 systemd_pull_sources,
2135 include_directories : includes,
2136 link_with : [libshared],
2137 dependencies : [versiondep,
2143 install_rpath : rootlibexecdir,
2145 install_dir : rootlibexecdir)
2147 systemd_import = executable('systemd-import',
2148 systemd_import_sources,
2149 include_directories : includes,
2150 link_with : [libshared],
2151 dependencies : [libcurl,
2155 install_rpath : rootlibexecdir,
2157 install_dir : rootlibexecdir)
2159 systemd_import_fs = executable('systemd-import-fs',
2160 systemd_import_fs_sources,
2161 include_directories : includes,
2162 link_with : [libshared],
2163 install_rpath : rootlibexecdir,
2165 install_dir : rootlibexecdir)
2167 systemd_export = executable('systemd-export',
2168 systemd_export_sources,
2169 include_directories : includes,
2170 link_with : [libshared],
2171 dependencies : [libcurl,
2175 install_rpath : rootlibexecdir,
2177 install_dir : rootlibexecdir)
2179 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2182 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2183 exe = executable('systemd-journal-upload',
2184 systemd_journal_upload_sources,
2185 include_directories : includes,
2186 link_with : [libshared],
2187 dependencies : [versiondep,
2193 install_rpath : rootlibexecdir,
2195 install_dir : rootlibexecdir)
2196 public_programs += exe
2199 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2200 s_j_remote = executable('systemd-journal-remote',
2201 systemd_journal_remote_sources,
2202 include_directories : includes,
2203 link_with : [libshared,
2204 libsystemd_journal_remote],
2205 dependencies : [threads,
2210 install_rpath : rootlibexecdir,
2212 install_dir : rootlibexecdir)
2214 s_j_gatewayd = executable('systemd-journal-gatewayd',
2215 systemd_journal_gatewayd_sources,
2216 include_directories : includes,
2217 link_with : [libshared],
2218 dependencies : [threads,
2223 install_rpath : rootlibexecdir,
2225 install_dir : rootlibexecdir)
2226 public_programs += [s_j_remote, s_j_gatewayd]
2229 if conf.get('ENABLE_COREDUMP') == 1
2230 executable('systemd-coredump',
2231 systemd_coredump_sources,
2232 include_directories : includes,
2233 link_with : [libshared],
2234 dependencies : [threads,
2239 install_rpath : rootlibexecdir,
2241 install_dir : rootlibexecdir)
2243 exe = executable('coredumpctl',
2244 coredumpctl_sources,
2245 include_directories : includes,
2246 link_with : [libshared],
2247 dependencies : [threads,
2250 install_rpath : rootlibexecdir,
2252 public_programs += exe
2255 if conf.get('ENABLE_PSTORE') == 1
2256 executable('systemd-pstore',
2257 systemd_pstore_sources,
2258 include_directories : includes,
2259 link_with : [libshared],
2260 dependencies : [threads,
2265 install_rpath : rootlibexecdir,
2267 install_dir : rootlibexecdir)
2270 if conf.get('ENABLE_BINFMT') == 1
2271 exe = executable('systemd-binfmt',
2272 'src/binfmt/binfmt.c',
2273 include_directories : includes,
2274 link_with : [libshared],
2275 install_rpath : rootlibexecdir,
2277 install_dir : rootlibexecdir)
2278 public_programs += exe
2280 meson.add_install_script('sh', '-c',
2281 mkdir_p.format(binfmtdir))
2282 meson.add_install_script('sh', '-c',
2283 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2286 if conf.get('ENABLE_VCONSOLE') == 1
2287 executable('systemd-vconsole-setup',
2288 'src/vconsole/vconsole-setup.c',
2289 include_directories : includes,
2290 link_with : [libshared],
2291 install_rpath : rootlibexecdir,
2293 install_dir : rootlibexecdir)
2296 if conf.get('ENABLE_RANDOMSEED') == 1
2297 executable('systemd-random-seed',
2298 'src/random-seed/random-seed.c',
2299 include_directories : includes,
2300 link_with : [libshared],
2301 install_rpath : rootlibexecdir,
2303 install_dir : rootlibexecdir)
2306 if conf.get('ENABLE_FIRSTBOOT') == 1
2307 executable('systemd-firstboot',
2308 'src/firstboot/firstboot.c',
2309 include_directories : includes,
2310 link_with : [libshared],
2311 dependencies : [libcrypt],
2312 install_rpath : rootlibexecdir,
2314 install_dir : rootbindir)
2317 executable('systemd-remount-fs',
2318 'src/remount-fs/remount-fs.c',
2319 include_directories : includes,
2320 link_with : [libcore_shared,
2322 install_rpath : rootlibexecdir,
2324 install_dir : rootlibexecdir)
2326 executable('systemd-machine-id-setup',
2327 'src/machine-id-setup/machine-id-setup-main.c',
2328 include_directories : includes,
2329 link_with : [libcore_shared,
2331 install_rpath : rootlibexecdir,
2333 install_dir : rootbindir)
2335 executable('systemd-fsck',
2337 include_directories : includes,
2338 link_with : [libshared],
2339 install_rpath : rootlibexecdir,
2341 install_dir : rootlibexecdir)
2343 executable('systemd-growfs',
2344 'src/partition/growfs.c',
2345 include_directories : includes,
2346 link_with : [libshared],
2347 dependencies : [libcryptsetup],
2348 install_rpath : rootlibexecdir,
2350 install_dir : rootlibexecdir)
2352 executable('systemd-makefs',
2353 'src/partition/makefs.c',
2354 include_directories : includes,
2355 link_with : [libshared],
2356 install_rpath : rootlibexecdir,
2358 install_dir : rootlibexecdir)
2360 executable('systemd-sleep',
2361 'src/sleep/sleep.c',
2362 include_directories : includes,
2363 link_with : [libshared],
2364 install_rpath : rootlibexecdir,
2366 install_dir : rootlibexecdir)
2368 install_data('src/sleep/sleep.conf',
2369 install_dir : pkgsysconfdir)
2371 exe = executable('systemd-sysctl',
2372 'src/sysctl/sysctl.c',
2373 include_directories : includes,
2374 link_with : [libshared],
2375 install_rpath : rootlibexecdir,
2377 install_dir : rootlibexecdir)
2378 public_programs += exe
2380 executable('systemd-ac-power',
2381 'src/ac-power/ac-power.c',
2382 include_directories : includes,
2383 link_with : [libshared],
2384 install_rpath : rootlibexecdir,
2386 install_dir : rootlibexecdir)
2388 exe = executable('systemd-detect-virt',
2389 'src/detect-virt/detect-virt.c',
2390 include_directories : includes,
2391 link_with : [libshared],
2392 install_rpath : rootlibexecdir,
2394 public_programs += exe
2396 exe = executable('systemd-delta',
2397 'src/delta/delta.c',
2398 include_directories : includes,
2399 link_with : [libshared],
2400 install_rpath : rootlibexecdir,
2402 public_programs += exe
2404 exe = executable('systemd-escape',
2405 'src/escape/escape.c',
2406 include_directories : includes,
2407 link_with : [libshared],
2408 install_rpath : rootlibexecdir,
2410 install_dir : rootbindir)
2411 public_programs += exe
2413 exe = executable('systemd-notify',
2414 'src/notify/notify.c',
2415 include_directories : includes,
2416 link_with : [libshared],
2417 install_rpath : rootlibexecdir,
2419 install_dir : rootbindir)
2420 public_programs += exe
2422 executable('systemd-volatile-root',
2423 'src/volatile-root/volatile-root.c',
2424 include_directories : includes,
2425 link_with : [libshared],
2426 install_rpath : rootlibexecdir,
2428 install_dir : rootlibexecdir)
2430 executable('systemd-cgroups-agent',
2431 'src/cgroups-agent/cgroups-agent.c',
2432 include_directories : includes,
2433 link_with : [libshared],
2434 install_rpath : rootlibexecdir,
2436 install_dir : rootlibexecdir)
2438 exe = executable('systemd-id128',
2439 'src/id128/id128.c',
2440 include_directories : includes,
2441 link_with : [libshared],
2442 install_rpath : rootlibexecdir,
2444 public_programs += exe
2446 exe = executable('systemd-path',
2448 include_directories : includes,
2449 link_with : [libshared],
2450 install_rpath : rootlibexecdir,
2452 public_programs += exe
2454 exe = executable('systemd-ask-password',
2455 'src/ask-password/ask-password.c',
2456 include_directories : includes,
2457 link_with : [libshared],
2458 install_rpath : rootlibexecdir,
2460 install_dir : rootbindir)
2461 public_programs += exe
2463 executable('systemd-reply-password',
2464 'src/reply-password/reply-password.c',
2465 include_directories : includes,
2466 link_with : [libshared],
2467 install_rpath : rootlibexecdir,
2469 install_dir : rootlibexecdir)
2471 exe = executable('systemd-tty-ask-password-agent',
2472 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2473 include_directories : includes,
2474 link_with : [libshared],
2475 install_rpath : rootlibexecdir,
2477 install_dir : rootbindir)
2478 public_programs += exe
2480 exe = executable('systemd-cgls',
2482 include_directories : includes,
2483 link_with : [libshared],
2484 install_rpath : rootlibexecdir,
2486 public_programs += exe
2488 exe = executable('systemd-cgtop',
2489 'src/cgtop/cgtop.c',
2490 include_directories : includes,
2491 link_with : [libshared],
2492 install_rpath : rootlibexecdir,
2494 public_programs += exe
2496 executable('systemd-initctl',
2497 'src/initctl/initctl.c',
2498 include_directories : includes,
2499 link_with : [libshared],
2500 install_rpath : rootlibexecdir,
2502 install_dir : rootlibexecdir)
2504 exe = executable('systemd-mount',
2505 'src/mount/mount-tool.c',
2506 include_directories : includes,
2507 link_with : [libshared],
2508 dependencies: [libmount],
2509 install_rpath : rootlibexecdir,
2511 public_programs += exe
2513 meson.add_install_script(meson_make_symlink,
2514 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2516 exe = executable('systemd-run',
2518 include_directories : includes,
2519 link_with : [libshared],
2520 install_rpath : rootlibexecdir,
2522 public_programs += exe
2524 exe = executable('systemd-stdio-bridge',
2525 'src/stdio-bridge/stdio-bridge.c',
2526 include_directories : includes,
2527 link_with : [libshared],
2528 dependencies : [versiondep],
2529 install_rpath : rootlibexecdir,
2531 public_programs += exe
2533 exe = executable('busctl',
2534 'src/busctl/busctl.c',
2535 'src/busctl/busctl-introspect.c',
2536 'src/busctl/busctl-introspect.h',
2537 include_directories : includes,
2538 link_with : [libshared],
2539 install_rpath : rootlibexecdir,
2541 public_programs += exe
2543 if conf.get('ENABLE_SYSUSERS') == 1
2544 exe = executable('systemd-sysusers',
2545 'src/sysusers/sysusers.c',
2546 include_directories : includes,
2547 link_with : [libshared],
2548 install_rpath : rootlibexecdir,
2550 install_dir : rootbindir)
2551 public_programs += exe
2554 if conf.get('ENABLE_TMPFILES') == 1
2555 exe = executable('systemd-tmpfiles',
2556 'src/tmpfiles/tmpfiles.c',
2557 include_directories : includes,
2558 link_with : [libshared],
2559 dependencies : [libacl],
2560 install_rpath : rootlibexecdir,
2562 install_dir : rootbindir)
2563 public_programs += exe
2565 if want_tests != 'false'
2566 test('test-systemd-tmpfiles',
2567 test_systemd_tmpfiles_py,
2568 # https://github.com/mesonbuild/meson/issues/2681
2569 args : exe.full_path())
2573 if conf.get('ENABLE_HWDB') == 1
2574 exe = executable('systemd-hwdb',
2576 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2577 include_directories : includes,
2578 link_with : [libudev_static],
2579 install_rpath : udev_rpath,
2581 install_dir : rootbindir)
2582 public_programs += exe
2585 if conf.get('ENABLE_QUOTACHECK') == 1
2586 executable('systemd-quotacheck',
2587 'src/quotacheck/quotacheck.c',
2588 include_directories : includes,
2589 link_with : [libshared],
2590 install_rpath : rootlibexecdir,
2592 install_dir : rootlibexecdir)
2595 exe = executable('systemd-socket-proxyd',
2596 'src/socket-proxy/socket-proxyd.c',
2597 include_directories : includes,
2598 link_with : [libshared],
2599 dependencies : [threads],
2600 install_rpath : rootlibexecdir,
2602 install_dir : rootlibexecdir)
2603 public_programs += exe
2605 exe = executable('systemd-udevd',
2606 systemd_udevd_sources,
2607 include_directories : includes,
2608 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2609 link_with : [libudev_core,
2612 dependencies : [versiondep,
2618 install_rpath : udev_rpath,
2620 install_dir : rootlibexecdir)
2621 public_programs += exe
2623 exe = executable('udevadm',
2625 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2626 include_directories : includes,
2627 link_with : [libudev_core,
2630 dependencies : [versiondep,
2636 install_rpath : udev_rpath,
2638 install_dir : rootbindir)
2639 public_programs += exe
2641 executable('systemd-shutdown',
2642 systemd_shutdown_sources,
2643 include_directories : includes,
2644 link_with : [libcore_shared,
2646 dependencies : [libmount],
2647 install_rpath : rootlibexecdir,
2649 install_dir : rootlibexecdir)
2651 executable('systemd-update-done',
2652 'src/update-done/update-done.c',
2653 include_directories : includes,
2654 link_with : [libshared],
2655 install_rpath : rootlibexecdir,
2657 install_dir : rootlibexecdir)
2659 executable('systemd-update-utmp',
2660 'src/update-utmp/update-utmp.c',
2661 include_directories : includes,
2662 link_with : [libshared],
2663 dependencies : [libaudit],
2664 install_rpath : rootlibexecdir,
2666 install_dir : rootlibexecdir)
2668 if conf.get('HAVE_KMOD') == 1
2669 executable('systemd-modules-load',
2670 'src/modules-load/modules-load.c',
2671 include_directories : includes,
2672 link_with : [libshared],
2673 dependencies : [libkmod],
2674 install_rpath : rootlibexecdir,
2676 install_dir : rootlibexecdir)
2678 meson.add_install_script('sh', '-c',
2679 mkdir_p.format(modulesloaddir))
2680 meson.add_install_script('sh', '-c',
2681 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2684 exe = executable('systemd-nspawn',
2685 systemd_nspawn_sources,
2686 include_directories : includes,
2687 link_with : [libcore_shared,
2690 dependencies : [libblkid,
2692 install_rpath : rootlibexecdir,
2694 public_programs += exe
2696 if conf.get('ENABLE_NETWORKD') == 1
2697 executable('systemd-networkd',
2698 systemd_networkd_sources,
2699 include_directories : includes,
2700 link_with : [libnetworkd_core,
2704 dependencies : [threads],
2705 install_rpath : rootlibexecdir,
2707 install_dir : rootlibexecdir)
2709 executable('systemd-networkd-wait-online',
2710 systemd_networkd_wait_online_sources,
2711 include_directories : includes,
2712 link_with : [libnetworkd_core,
2714 install_rpath : rootlibexecdir,
2716 install_dir : rootlibexecdir)
2718 exe = executable('networkctl',
2720 include_directories : includes,
2721 link_with : [libsystemd_network,
2723 install_rpath : rootlibexecdir,
2725 install_dir : rootbindir)
2726 public_programs += exe
2728 executable('systemd-network-generator',
2729 network_generator_sources,
2730 include_directories : includes,
2731 link_with : [libshared],
2732 install_rpath : rootlibexecdir,
2734 install_dir : rootlibexecdir)
2737 executable('systemd-sulogin-shell',
2738 ['src/sulogin-shell/sulogin-shell.c'],
2739 include_directories : includes,
2740 link_with : [libshared],
2741 install_rpath : rootlibexecdir,
2743 install_dir : rootlibexecdir)
2745 ############################################################
2748 'systemd-runtest.env',
2749 output : 'systemd-runtest.env',
2750 command : ['sh', '-c', '{ ' +
2751 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2752 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2754 build_by_default : true)
2756 foreach tuple : tests
2758 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2759 dependencies = tuple[2]
2760 condition = tuple.length() >= 4 ? tuple[3] : ''
2761 type = tuple.length() >= 5 ? tuple[4] : ''
2762 defs = tuple.length() >= 6 ? tuple[5] : []
2763 incs = tuple.length() >= 7 ? tuple[6] : includes
2766 name = sources[0].split('/')[-1].split('.')[0]
2767 if type.startswith('timeout=')
2768 timeout = type.split('=')[1].to_int()
2772 if condition == '' or conf.get(condition) == 1
2776 include_directories : incs,
2777 link_with : link_with,
2778 dependencies : [versiondep,
2781 build_by_default : want_tests != 'false',
2782 install_rpath : rootlibexecdir,
2783 install : install_tests,
2784 install_dir : join_paths(testsdir, type))
2787 message('@0@ is a manual test'.format(name))
2788 elif type == 'unsafe' and want_tests != 'unsafe'
2789 message('@0@ is an unsafe test'.format(name))
2790 elif want_tests != 'false'
2796 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2801 'test-libsystemd-sym',
2802 test_libsystemd_sym_c,
2803 include_directories : includes,
2804 link_with : [libsystemd],
2805 build_by_default : want_tests != 'false',
2806 install : install_tests,
2807 install_dir : testsdir)
2808 if want_tests != 'false'
2809 test('test-libsystemd-sym', exe)
2813 'test-libsystemd-static-sym',
2814 test_libsystemd_sym_c,
2815 include_directories : includes,
2816 link_with : [install_libsystemd_static],
2817 dependencies : [threads], # threads is already included in dependencies on the library,
2818 # but does not seem to get propagated. Add here as a work-around.
2819 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2820 install : install_tests and static_libsystemd_pic,
2821 install_dir : testsdir)
2822 if want_tests != 'false' and static_libsystemd_pic
2823 test('test-libsystemd-static-sym', exe)
2829 include_directories : includes,
2830 c_args : '-Wno-deprecated-declarations',
2831 link_with : [libudev],
2832 build_by_default : want_tests != 'false',
2833 install : install_tests,
2834 install_dir : testsdir)
2835 if want_tests != 'false'
2836 test('test-libudev-sym', exe)
2840 'test-libudev-static-sym',
2842 include_directories : includes,
2843 c_args : '-Wno-deprecated-declarations',
2844 link_with : [install_libudev_static],
2845 build_by_default : want_tests != 'false' and static_libudev_pic,
2846 install : install_tests and static_libudev_pic,
2847 install_dir : testsdir)
2848 if want_tests != 'false' and static_libudev_pic
2849 test('test-libudev-static-sym', exe)
2852 ############################################################
2856 if get_option('tests') != 'false'
2857 foreach tuple : fuzzers
2859 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2860 dependencies = tuple[2]
2861 defs = tuple.length() >= 4 ? tuple[3] : []
2862 incs = tuple.length() >= 5 ? tuple[4] : includes
2865 if want_ossfuzz or want_fuzzbuzz
2866 dependencies += fuzzing_engine
2868 if fuzzing_engine.found()
2869 dependencies += fuzzing_engine
2871 link_args += ['-fsanitize=fuzzer']
2874 sources += 'src/fuzz/fuzz-main.c'
2878 sources += 'src/fuzz/fuzzer-entry-point.c'
2881 name = sources[0].split('/')[-1].split('.')[0]
2883 fuzzer_exes += executable(
2886 include_directories : [incs, include_directories('src/fuzz')],
2887 link_with : link_with,
2888 dependencies : dependencies,
2890 link_args: link_args,
2895 run_target('fuzzers',
2896 depends : fuzzer_exes,
2899 ############################################################
2901 make_directive_index_py = find_program('tools/make-directive-index.py')
2902 make_man_index_py = find_program('tools/make-man-index.py')
2903 xml_helper_py = find_program('tools/xml_helper.py')
2904 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2908 subdir('sysusers.d')
2909 subdir('tmpfiles.d')
2914 subdir('shell-completion/bash')
2915 subdir('shell-completion/zsh')
2916 subdir('docs/sysvinit')
2917 subdir('docs/var-log')
2919 install_subdir('factory/etc',
2920 install_dir : factorydir)
2922 install_data('xorg/50-systemd-user.sh',
2923 install_dir : xinitrcdir)
2924 install_data('modprobe.d/systemd.conf',
2925 install_dir : modprobedir)
2926 install_data('LICENSE.GPL2',
2930 'docs/CODING_STYLE.md',
2931 'docs/DISTRO_PORTING.md',
2932 'docs/ENVIRONMENT.md',
2934 'docs/TRANSIENT-SETTINGS.md',
2935 'docs/TRANSLATORS.md',
2936 'docs/UIDS-GIDS.md',
2937 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2938 install_dir : docdir)
2940 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2941 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2943 ############################################################
2945 meson_check_help = find_program('tools/meson-check-help.sh')
2947 foreach exec : public_programs
2948 name = exec.full_path().split('/')[-1]
2949 if want_tests != 'false'
2950 test('check-help-' + name,
2952 args : exec.full_path())
2956 ############################################################
2958 check_directives_sh = find_program('tools/check-directives.sh')
2960 if want_tests != 'false'
2961 test('check-directives',
2962 check_directives_sh,
2963 args : project_source_root)
2966 ############################################################
2968 # Enable tests for all supported sanitizers
2969 foreach tuple : sanitizers
2970 sanitizer = tuple[0]
2973 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2975 foreach p : fuzz_regression_tests
2976 b = p.split('/')[-2]
2977 c = p.split('/')[-1]
2979 name = '@0@:@1@'.format(b, sanitizer)
2982 if want_tests == 'false'
2983 message('Not compiling @0@ because tests is set to false'.format(name))
2985 exe = custom_target(
2989 command : [env, 'ln', '-fs',
2990 join_paths(build.full_path(), b),
2992 build_by_default : true)
2994 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2999 if want_tests != 'false' and slow_tests
3000 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3002 args : [exe.full_path(),
3003 join_paths(project_source_root, p)])
3010 ############################################################
3013 all_files = run_command(
3015 ['--git-dir=@0@/.git'.format(project_source_root),
3018 all_files = files(all_files.stdout().split())
3023 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3026 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3030 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3033 command : [meson_git_contrib_sh])
3037 git_head = run_command(
3039 ['--git-dir=@0@/.git'.format(project_source_root),
3040 'rev-parse', 'HEAD']).stdout().strip()
3041 git_head_short = run_command(
3043 ['--git-dir=@0@/.git'.format(project_source_root),
3044 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3048 command : ['git', 'archive',
3049 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3051 '--prefix', 'systemd-@0@/'.format(git_head),
3055 ############################################################
3057 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3060 depends : [man, libsystemd, libudev],
3061 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3063 ############################################################
3066 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3068 'split /usr: @0@'.format(split_usr),
3069 'split bin-sbin: @0@'.format(split_bin),
3070 'prefix directory: @0@'.format(prefixdir),
3071 'rootprefix directory: @0@'.format(rootprefixdir),
3072 'sysconf directory: @0@'.format(sysconfdir),
3073 'include directory: @0@'.format(includedir),
3074 'lib directory: @0@'.format(libdir),
3075 'rootlib directory: @0@'.format(rootlibdir),
3076 'SysV init scripts: @0@'.format(sysvinit_path),
3077 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3078 'PAM modules directory: @0@'.format(pamlibdir),
3079 'PAM configuration directory: @0@'.format(pamconfdir),
3080 'RPM macros directory: @0@'.format(rpmmacrosdir),
3081 'modprobe.d directory: @0@'.format(modprobedir),
3082 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3083 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3084 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3085 'bash completions directory: @0@'.format(bashcompletiondir),
3086 'zsh completions directory: @0@'.format(zshcompletiondir),
3087 'extra start script: @0@'.format(get_option('rc-local')),
3088 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3089 get_option('debug-tty')),
3090 'TTY GID: @0@'.format(tty_gid),
3091 'users GID: @0@'.format(substs.get('USERS_GID')),
3092 'maximum system UID: @0@'.format(system_uid_max),
3093 'maximum system GID: @0@'.format(system_gid_max),
3094 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3095 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3096 'minimum container UID base: @0@'.format(container_uid_base_min),
3097 'maximum container UID base: @0@'.format(container_uid_base_max),
3098 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3099 'render group access mode: @0@'.format(get_option('group-render-mode')),
3100 'certificate root directory: @0@'.format(get_option('certificate-root')),
3101 'support URL: @0@'.format(support_url),
3102 'nobody user name: @0@'.format(nobody_user),
3103 'nobody group name: @0@'.format(nobody_group),
3104 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3105 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3107 'default DNSSEC mode: @0@'.format(default_dnssec),
3108 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3109 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3110 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3111 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3112 'default locale: @0@'.format(default_locale)]
3114 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3115 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3117 'default DNS servers: @0@'.format(alt_dns_servers),
3118 'default NTP servers: @0@'.format(alt_ntp_servers)]
3120 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3121 '@@0@'.format(time_epoch)).stdout().strip()
3123 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3126 'static libsystemd: @0@'.format(static_libsystemd),
3127 'static libudev: @0@'.format(static_libudev)]
3130 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3131 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3132 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3134 if conf.get('ENABLE_EFI') == 1
3135 status += 'efi arch: @0@'.format(efi_arch)
3139 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3140 'EFI CC @0@'.format(' '.join(efi_cc)),
3141 'EFI lib directory: @0@'.format(efi_libdir),
3142 'EFI lds directory: @0@'.format(efi_ldsdir),
3143 'EFI include directory: @0@'.format(efi_incdir)]
3195 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3196 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3200 ['legacy pkla', install_polkit_pkla],
3202 ['gnu-efi', have_gnu_efi],
3215 ['man pages', want_man],
3216 ['html pages', want_html],
3217 ['man page indices', want_man and have_lxml],
3222 ['adm group', get_option('adm-group')],
3223 ['wheel group', get_option('wheel-group')],
3226 ['debug mmap cache'],
3228 ['valgrind', conf.get('VALGRIND') == 1],
3229 ['trace logging', conf.get('LOG_TRACE') == 1],
3230 ['link-udev-shared', get_option('link-udev-shared')],
3231 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3234 if tuple.length() >= 2
3237 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3238 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3239 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3250 'enabled features: @0@'.format(', '.join(found)),
3252 'disabled features: @0@'.format(', '.join(missing)),
3254 message('\n '.join(status))
3256 if rootprefixdir != rootprefix_default
3258 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3259 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3260 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))