1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
12 meson_version : '>= 0.46',
15 libsystemd_version = '0.26.0'
16 libudev_version = '1.6.14'
18 # We need the same data in two different formats, ugh!
19 # Also, for hysterical reasons, we use different variable
20 # names, sometimes. Not all variables are included in every
22 conf = configuration_data()
23 conf.set('PROJECT_VERSION', meson.project_version())
25 substs = configuration_data()
26 substs.set('PROJECT_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
27 substs.set('PROJECT_VERSION', meson.project_version())
29 # This is to be used instead of meson.source_root(), as the latter will return
30 # the wrong result when systemd is being built as a meson subproject
31 project_source_root = meson.current_source_dir()
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')
161 docdir = get_option('docdir')
163 docdir = join_paths(datadir, 'doc/systemd')
166 dbuspolicydir = get_option('dbuspolicydir')
167 if dbuspolicydir == ''
168 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
171 dbussessionservicedir = get_option('dbussessionservicedir')
172 if dbussessionservicedir == ''
173 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
176 dbussystemservicedir = get_option('dbussystemservicedir')
177 if dbussystemservicedir == ''
178 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
181 pamlibdir = get_option('pamlibdir')
183 pamlibdir = join_paths(rootlibdir, 'security')
186 pamconfdir = get_option('pamconfdir')
188 pamconfdir = join_paths(sysconfdir, 'pam.d')
191 memory_accounting_default = get_option('memory-accounting-default')
192 status_unit_format_default = get_option('status-unit-format-default')
194 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
195 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
196 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
197 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
198 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
199 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
201 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
203 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
204 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
205 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
206 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
207 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
208 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
209 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
210 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
211 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
212 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
213 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
214 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
215 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
216 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
217 conf.set_quoted('ROOTPREFIX', rootprefixdir)
218 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
219 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
220 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
221 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
222 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
223 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
224 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
225 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
226 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
227 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
228 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
229 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
230 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
231 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
232 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
233 conf.set_quoted('LIBDIR', libdir)
234 conf.set_quoted('ROOTLIBDIR', rootlibdir)
235 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
236 conf.set_quoted('BOOTLIBDIR', bootlibdir)
237 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
238 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
239 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
240 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
241 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
242 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
243 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
244 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
245 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
246 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
248 substs.set('prefix', prefixdir)
249 substs.set('rootprefix', rootprefixdir)
250 substs.set('rootprefix_noslash', rootprefixdir_noslash)
251 substs.set('exec_prefix', prefixdir)
252 substs.set('libdir', libdir)
253 substs.set('rootlibdir', rootlibdir)
254 substs.set('includedir', includedir)
255 substs.set('sysconfdir', sysconfdir)
256 substs.set('bindir', bindir)
257 substs.set('rootbindir', rootbindir)
258 substs.set('rootlibexecdir', rootlibexecdir)
259 substs.set('systemunitdir', systemunitdir)
260 substs.set('userunitdir', userunitdir)
261 substs.set('systempresetdir', systempresetdir)
262 substs.set('userpresetdir', userpresetdir)
263 substs.set('udevhwdbdir', udevhwdbdir)
264 substs.set('udevrulesdir', udevrulesdir)
265 substs.set('udevlibexecdir', udevlibexecdir)
266 substs.set('environmentdir', environmentdir)
267 substs.set('catalogdir', catalogdir)
268 substs.set('tmpfilesdir', tmpfilesdir)
269 substs.set('sysusersdir', sysusersdir)
270 substs.set('sysctldir', sysctldir)
271 substs.set('binfmtdir', binfmtdir)
272 substs.set('modulesloaddir', modulesloaddir)
273 substs.set('modprobedir', modprobedir)
274 substs.set('systemgeneratordir', systemgeneratordir)
275 substs.set('usergeneratordir', usergeneratordir)
276 substs.set('systemenvgeneratordir', systemenvgeneratordir)
277 substs.set('userenvgeneratordir', userenvgeneratordir)
278 substs.set('systemshutdowndir', systemshutdowndir)
279 substs.set('systemsleepdir', systemsleepdir)
280 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
281 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
282 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
283 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
284 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
285 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
286 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
287 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
288 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
289 substs.set('BUILD_ROOT', meson.current_build_dir())
291 #####################################################################
293 cc = meson.get_compiler('c')
294 pkgconfig = import('pkgconfig')
295 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
296 meson_build_sh = find_program('tools/meson-build.sh')
298 want_tests = get_option('tests')
299 slow_tests = want_tests != 'false' and get_option('slow-tests')
300 install_tests = get_option('install-tests')
302 if add_languages('cpp', required : fuzzer_build)
303 # Used only for tests
304 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
310 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
311 if fuzzing_engine.found()
312 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
313 elif cc.has_argument('-fsanitize=fuzzer-no-link')
314 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
316 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
319 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
321 fuzzing_engine = meson.get_compiler('cpp').find_library(get_option('fuzzbuzz-engine'), dirs: get_option('fuzzbuzz-engine-dir'))
324 possible_cc_flags = [
328 '-Wmissing-include-dirs',
329 '-Wold-style-definition',
333 '-Wsuggest-attribute=noreturn',
334 '-Werror=missing-prototypes',
335 '-Werror=implicit-function-declaration',
336 '-Werror=missing-declarations',
337 '-Werror=return-type',
338 '-Werror=incompatible-pointer-types',
340 '-Wstrict-prototypes',
342 '-Wmissing-noreturn',
343 '-Wimplicit-fallthrough=5',
346 '-Wstrict-aliasing=2',
349 '-Werror=shift-count-overflow',
350 '-Werror=shift-overflow=2',
354 # negative arguments are correctly detected starting with meson 0.46.
355 '-Wno-unused-parameter',
356 '-Wno-missing-field-initializers',
357 '-Wno-unused-result',
358 '-Wno-format-signedness',
359 '-Wno-error=#warnings', # clang
360 '-Wno-string-plus-int', # clang
362 # work-around for gcc 7.1 turning this on on its own.
363 '-Wno-error=nonnull',
365 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
366 # optimizations enabled, producing essentially false positives.
367 '-Wno-maybe-uninitialized',
371 '-fdiagnostics-show-option',
372 '-fno-strict-aliasing',
373 '-fvisibility=hidden',
375 '-fstack-protector-strong',
376 '--param=ssp-buffer-size=4',
379 # --as-needed and --no-undefined are provided by meson by default,
380 # run mesonconf to see what is enabled
381 possible_link_flags = [
386 if cc.get_id() == 'clang'
387 possible_cc_flags += [
388 '-Wno-typedef-redefinition',
389 '-Wno-gnu-variable-sized-type-not-at-end',
393 if get_option('buildtype') != 'debug'
394 possible_cc_flags += [
395 '-ffunction-sections',
399 possible_link_flags += '-Wl,--gc-sections'
402 if get_option('b_ndebug') == 'true'
403 # With asserts disabled with get a bunch of warnings about variables which
404 # are used only in the asserts. This is not useful at all, so let's just silence
406 possible_cc_flags += [
407 '-Wno-unused-variable',
408 '-Wno-unused-but-set-variable',
412 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
413 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
417 #include <inttypes.h>
418 typedef uint64_t usec_t;
419 usec_t now(clockid_t clock);
424 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
425 add_project_arguments('-Werror=shadow', language : 'c')
428 cpp = ' '.join(cc.cmd_array()) + ' -E'
430 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
432 #####################################################################
433 # compilation result tests
435 conf.set('_GNU_SOURCE', true)
436 conf.set('__SANE_USERSPACE_TYPES__', true)
437 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
439 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
440 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
441 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
442 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
443 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
444 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
445 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
449 #include <sys/stat.h>
452 foreach decl : ['char16_t',
457 # We get -1 if the size cannot be determined
458 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
460 if decl == 'struct statx'
462 want_linux_stat_h = false
464 have = cc.sizeof(decl,
465 prefix : decl_headers + '#include <linux/stat.h>',
466 args : '-D_GNU_SOURCE') > 0
467 want_linux_stat_h = have
471 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
474 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
476 foreach ident : ['secure_getenv', '__secure_getenv']
477 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
481 ['memfd_create', '''#include <sys/mman.h>'''],
482 ['gettid', '''#include <sys/types.h>
483 #include <unistd.h>'''],
484 ['pivot_root', '''#include <stdlib.h>
485 #include <unistd.h>'''], # no known header declares pivot_root
486 ['name_to_handle_at', '''#include <sys/types.h>
487 #include <sys/stat.h>
488 #include <fcntl.h>'''],
489 ['setns', '''#include <sched.h>'''],
490 ['renameat2', '''#include <stdio.h>
491 #include <fcntl.h>'''],
492 ['kcmp', '''#include <linux/kcmp.h>'''],
493 ['keyctl', '''#include <sys/types.h>
494 #include <keyutils.h>'''],
495 ['copy_file_range', '''#include <sys/syscall.h>
496 #include <unistd.h>'''],
497 ['bpf', '''#include <sys/syscall.h>
498 #include <unistd.h>'''],
499 ['statx', '''#include <sys/types.h>
500 #include <sys/stat.h>
501 #include <unistd.h>'''],
502 ['explicit_bzero' , '''#include <string.h>'''],
503 ['reallocarray', '''#include <malloc.h>'''],
504 ['set_mempolicy', '''#include <stdlib.h>
505 #include <unistd.h>'''],
506 ['get_mempolicy', '''#include <stdlib.h>
507 #include <unistd.h>'''],
510 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
511 conf.set10('HAVE_' + ident[0].to_upper(), have)
514 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
515 conf.set10('USE_SYS_RANDOM_H', true)
516 conf.set10('HAVE_GETRANDOM', true)
518 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
519 conf.set10('USE_SYS_RANDOM_H', false)
520 conf.set10('HAVE_GETRANDOM', have)
523 #####################################################################
525 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
527 get_option('version-tag'),
528 meson.project_version()]
531 input : 'src/version/version.h.in',
532 output : 'version.h',
535 versiondep = declare_dependency(sources: version_h)
537 sed = find_program('sed')
538 awk = find_program('awk')
539 m4 = find_program('m4')
540 stat = find_program('stat')
541 git = find_program('git', required : false)
542 env = find_program('env')
543 perl = find_program('perl', required : false)
545 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
546 mkdir_p = 'mkdir -p $DESTDIR/@0@'
547 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
548 splash_bmp = files('test/splash.bmp')
550 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
551 # /usr/sbin, /sbin, and fall back to the default from middle column.
552 progs = [['quotaon', '/usr/sbin/quotaon' ],
553 ['quotacheck', '/usr/sbin/quotacheck' ],
554 ['kmod', '/usr/bin/kmod' ],
555 ['kexec', '/usr/sbin/kexec' ],
556 ['sulogin', '/usr/sbin/sulogin' ],
557 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
558 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
559 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
560 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
561 ['nologin', '/usr/sbin/nologin', ],
564 path = get_option(prog[0] + '-path')
566 message('Using @1@ for @0@'.format(prog[0], path))
568 exe = find_program(prog[0],
569 '/usr/sbin/' + prog[0],
572 path = exe.found() ? exe.path() : prog[1]
574 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
575 conf.set_quoted(name, path)
576 substs.set(name, path)
579 conf.set_quoted('TELINIT', get_option('telinit-path'))
581 if run_command('ln', '--relative', '--help').returncode() != 0
582 error('ln does not support --relative (added in coreutils 8.16)')
585 ############################################################
587 gperf = find_program('gperf')
589 gperf_test_format = '''
591 const char * in_word_set(const char *, @0@);
594 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
595 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
596 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
597 if cc.compiles(gperf_test)
598 gperf_len_type = 'size_t'
600 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
601 if cc.compiles(gperf_test)
602 gperf_len_type = 'unsigned'
604 error('unable to determine gperf len type')
607 message('gperf len type is @0@'.format(gperf_len_type))
608 conf.set('GPERF_LEN_TYPE', gperf_len_type,
609 description : 'The type of gperf "len" parameter')
611 ############################################################
613 if not cc.has_header('sys/capability.h')
614 error('POSIX caps headers not found')
616 foreach header : ['crypt.h',
618 'linux/vm_sockets.h',
620 'valgrind/memcheck.h',
621 'valgrind/valgrind.h',
624 conf.set10('HAVE_' + header.underscorify().to_upper(),
625 cc.has_header(header))
628 ############################################################
630 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
631 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
632 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
634 default_hierarchy = get_option('default-hierarchy')
635 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
636 description : 'default cgroup hierarchy as string')
637 if default_hierarchy == 'legacy'
638 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
639 elif default_hierarchy == 'hybrid'
640 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
642 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
645 default_net_naming_scheme = get_option('default-net-naming-scheme')
646 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
648 time_epoch = get_option('time-epoch')
651 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
653 conf.set('TIME_EPOCH', time_epoch)
655 system_uid_max = get_option('system-uid-max')
656 if system_uid_max == -1
657 system_uid_max = run_command(
659 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
660 '/etc/login.defs').stdout().strip()
661 if system_uid_max == ''
664 system_uid_max = system_uid_max.to_int()
667 conf.set('SYSTEM_UID_MAX', system_uid_max)
668 substs.set('systemuidmax', system_uid_max)
670 system_gid_max = get_option('system-gid-max')
671 if system_gid_max == -1
672 system_gid_max = run_command(
674 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
675 '/etc/login.defs').stdout().strip()
676 if system_gid_max == ''
679 system_gid_max = system_gid_max.to_int()
682 conf.set('SYSTEM_GID_MAX', system_gid_max)
683 substs.set('systemgidmax', system_gid_max)
685 dynamic_uid_min = get_option('dynamic-uid-min')
686 dynamic_uid_max = get_option('dynamic-uid-max')
687 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
688 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
689 substs.set('dynamicuidmin', dynamic_uid_min)
690 substs.set('dynamicuidmax', dynamic_uid_max)
692 container_uid_base_min = get_option('container-uid-base-min')
693 container_uid_base_max = get_option('container-uid-base-max')
694 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
695 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
696 substs.set('containeruidbasemin', container_uid_base_min)
697 substs.set('containeruidbasemax', container_uid_base_max)
699 nobody_user = get_option('nobody-user')
700 nobody_group = get_option('nobody-group')
702 if not meson.is_cross_build()
703 getent_result = run_command('getent', 'passwd', '65534')
704 if getent_result.returncode() == 0
705 name = getent_result.stdout().split(':')[0]
706 if name != nobody_user
708 '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) +
709 'Your build will result in an user table setup that is incompatible with the local system.')
712 id_result = run_command('id', '-u', nobody_user)
713 if id_result.returncode() == 0
714 id = id_result.stdout().to_int()
717 '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) +
718 'Your build will result in an user table setup that is incompatible with the local system.')
722 getent_result = run_command('getent', 'group', '65534')
723 if getent_result.returncode() == 0
724 name = getent_result.stdout().split(':')[0]
725 if name != nobody_group
727 '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) +
728 'Your build will result in an group table setup that is incompatible with the local system.')
731 id_result = run_command('id', '-g', nobody_group)
732 if id_result.returncode() == 0
733 id = id_result.stdout().to_int()
736 '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) +
737 'Your build will result in an group table setup that is incompatible with the local system.')
741 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
743 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
744 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
747 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
748 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
749 substs.set('NOBODY_USER_NAME', nobody_user)
750 substs.set('NOBODY_GROUP_NAME', nobody_group)
752 tty_gid = get_option('tty-gid')
753 conf.set('TTY_GID', tty_gid)
754 substs.set('TTY_GID', tty_gid)
756 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
757 users_gid = get_option('users-gid')
758 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
760 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
761 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
763 dev_kvm_mode = get_option('dev-kvm-mode')
764 substs.set('DEV_KVM_MODE', dev_kvm_mode)
765 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
766 group_render_mode = get_option('group-render-mode')
767 substs.set('GROUP_RENDER_MODE', group_render_mode)
768 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
770 kill_user_processes = get_option('default-kill-user-processes')
771 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
772 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
773 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
775 dns_servers = get_option('dns-servers')
776 conf.set_quoted('DNS_SERVERS', dns_servers)
777 substs.set('DNS_SERVERS', dns_servers)
779 ntp_servers = get_option('ntp-servers')
780 conf.set_quoted('NTP_SERVERS', ntp_servers)
781 substs.set('NTP_SERVERS', ntp_servers)
783 default_locale = get_option('default-locale')
784 if default_locale == ''
785 if not meson.is_cross_build()
786 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
787 default_locale = run_command(choose_default_locale_sh).stdout().strip()
789 default_locale = 'C.UTF-8'
792 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
794 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
796 substs.set('SUSHELL', get_option('debug-shell'))
797 substs.set('DEBUGTTY', get_option('debug-tty'))
798 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
800 enable_debug_hashmap = false
801 enable_debug_mmap_cache = false
802 enable_debug_siphash = false
803 foreach name : get_option('debug-extra')
805 enable_debug_hashmap = true
806 elif name == 'mmap-cache'
807 enable_debug_mmap_cache = true
808 elif name == 'siphash'
809 enable_debug_siphash = true
811 message('unknown debug option "@0@", ignoring'.format(name))
814 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
815 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
816 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
818 conf.set10('VALGRIND', get_option('valgrind'))
819 conf.set10('LOG_TRACE', get_option('log-trace'))
821 #####################################################################
823 threads = dependency('threads')
824 librt = cc.find_library('rt')
825 libm = cc.find_library('m')
826 libdl = cc.find_library('dl')
827 libcrypt = cc.find_library('crypt')
829 libcap = dependency('libcap', required : false)
830 if not libcap.found()
831 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
832 libcap = cc.find_library('cap')
835 libmount = dependency('mount',
836 version : fuzzer_build ? '>= 0' : '>= 2.30')
838 want_seccomp = get_option('seccomp')
839 if want_seccomp != 'false' and not skip_deps
840 libseccomp = dependency('libseccomp',
841 version : '>= 2.3.1',
842 required : want_seccomp == 'true')
843 have = libseccomp.found()
848 conf.set10('HAVE_SECCOMP', have)
850 want_selinux = get_option('selinux')
851 if want_selinux != 'false' and not skip_deps
852 libselinux = dependency('libselinux',
853 version : '>= 2.1.9',
854 required : want_selinux == 'true')
855 have = libselinux.found()
860 conf.set10('HAVE_SELINUX', have)
862 want_apparmor = get_option('apparmor')
863 if want_apparmor != 'false' and not skip_deps
864 libapparmor = dependency('libapparmor',
865 required : want_apparmor == 'true')
866 have = libapparmor.found()
871 conf.set10('HAVE_APPARMOR', have)
873 smack_run_label = get_option('smack-run-label')
874 if smack_run_label != ''
875 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
878 want_polkit = get_option('polkit')
879 install_polkit = false
880 install_polkit_pkla = false
881 if want_polkit != 'false' and not skip_deps
882 install_polkit = true
884 libpolkit = dependency('polkit-gobject-1',
886 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
887 message('Old polkit detected, will install pkla files')
888 install_polkit_pkla = true
891 conf.set10('ENABLE_POLKIT', install_polkit)
893 want_acl = get_option('acl')
894 if want_acl != 'false' and not skip_deps
895 libacl = cc.find_library('acl', required : want_acl == 'true')
896 have = libacl.found()
901 conf.set10('HAVE_ACL', have)
903 want_audit = get_option('audit')
904 if want_audit != 'false' and not skip_deps
905 libaudit = dependency('audit', required : want_audit == 'true')
906 have = libaudit.found()
911 conf.set10('HAVE_AUDIT', have)
913 want_blkid = get_option('blkid')
914 if want_blkid != 'false' and not skip_deps
915 libblkid = dependency('blkid', required : want_blkid == 'true')
916 have = libblkid.found()
921 conf.set10('HAVE_BLKID', have)
923 want_kmod = get_option('kmod')
924 if want_kmod != 'false' and not skip_deps
925 libkmod = dependency('libkmod',
927 required : want_kmod == 'true')
928 have = libkmod.found()
933 conf.set10('HAVE_KMOD', have)
935 want_pam = get_option('pam')
936 if want_pam != 'false' and not skip_deps
937 libpam = cc.find_library('pam', required : want_pam == 'true')
938 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
939 have = libpam.found() and libpam_misc.found()
945 conf.set10('HAVE_PAM', have)
947 want_microhttpd = get_option('microhttpd')
948 if want_microhttpd != 'false' and not skip_deps
949 libmicrohttpd = dependency('libmicrohttpd',
950 version : '>= 0.9.33',
951 required : want_microhttpd == 'true')
952 have = libmicrohttpd.found()
957 conf.set10('HAVE_MICROHTTPD', have)
959 want_libcryptsetup = get_option('libcryptsetup')
960 if want_libcryptsetup != 'false' and not skip_deps
961 libcryptsetup = dependency('libcryptsetup',
962 version : '>= 1.6.0',
963 required : want_libcryptsetup == 'true')
964 have = libcryptsetup.found()
965 have_sector = cc.has_member(
966 'struct crypt_params_plain',
968 prefix : '#include <libcryptsetup.h>')
974 conf.set10('HAVE_LIBCRYPTSETUP', have)
975 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
977 want_libcurl = get_option('libcurl')
978 if want_libcurl != 'false' and not skip_deps
979 libcurl = dependency('libcurl',
980 version : '>= 7.32.0',
981 required : want_libcurl == 'true')
982 have = libcurl.found()
987 conf.set10('HAVE_LIBCURL', have)
989 want_libidn = get_option('libidn')
990 want_libidn2 = get_option('libidn2')
991 if want_libidn == 'true' and want_libidn2 == 'true'
992 error('libidn and libidn2 cannot be requested simultaneously')
995 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
996 libidn = dependency('libidn2',
997 required : want_libidn2 == 'true')
998 have = libidn.found()
1003 conf.set10('HAVE_LIBIDN2', have)
1004 if not have and want_libidn != 'false' and not skip_deps
1005 # libidn is used for both libidn and libidn2 objects
1006 libidn = dependency('libidn',
1007 required : want_libidn == 'true')
1008 have = libidn.found()
1012 conf.set10('HAVE_LIBIDN', have)
1014 want_libiptc = get_option('libiptc')
1015 if want_libiptc != 'false' and not skip_deps
1016 libiptc = dependency('libiptc',
1017 required : want_libiptc == 'true')
1018 have = libiptc.found()
1023 conf.set10('HAVE_LIBIPTC', have)
1025 want_qrencode = get_option('qrencode')
1026 if want_qrencode != 'false' and not skip_deps
1027 libqrencode = dependency('libqrencode',
1028 required : want_qrencode == 'true')
1029 have = libqrencode.found()
1034 conf.set10('HAVE_QRENCODE', have)
1036 want_gcrypt = get_option('gcrypt')
1037 if want_gcrypt != 'false' and not skip_deps
1038 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1039 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1040 have = libgcrypt.found() and libgpg_error.found()
1045 # link to neither of the libs if one is not found
1049 conf.set10('HAVE_GCRYPT', have)
1051 want_gnutls = get_option('gnutls')
1052 if want_gnutls != 'false' and not skip_deps
1053 libgnutls = dependency('gnutls',
1054 version : '>= 3.1.4',
1055 required : want_gnutls == 'true')
1056 have = libgnutls.found()
1061 conf.set10('HAVE_GNUTLS', have)
1063 want_openssl = get_option('openssl')
1064 if want_openssl != 'false' and not skip_deps
1065 libopenssl = dependency('openssl',
1066 version : '>= 1.1.0',
1067 required : want_openssl == 'true')
1068 have = libopenssl.found()
1073 conf.set10('HAVE_OPENSSL', have)
1075 want_elfutils = get_option('elfutils')
1076 if want_elfutils != 'false' and not skip_deps
1077 libdw = dependency('libdw',
1078 required : want_elfutils == 'true')
1079 have = libdw.found()
1084 conf.set10('HAVE_ELFUTILS', have)
1086 want_zlib = get_option('zlib')
1087 if want_zlib != 'false' and not skip_deps
1088 libz = dependency('zlib',
1089 required : want_zlib == 'true')
1095 conf.set10('HAVE_ZLIB', have)
1097 want_bzip2 = get_option('bzip2')
1098 if want_bzip2 != 'false' and not skip_deps
1099 libbzip2 = cc.find_library('bz2',
1100 required : want_bzip2 == 'true')
1101 have = libbzip2.found()
1106 conf.set10('HAVE_BZIP2', have)
1108 want_xz = get_option('xz')
1109 if want_xz != 'false' and not skip_deps
1110 libxz = dependency('liblzma',
1111 required : want_xz == 'true')
1112 have = libxz.found()
1117 conf.set10('HAVE_XZ', have)
1119 want_lz4 = get_option('lz4')
1120 if want_lz4 != 'false' and not skip_deps
1121 liblz4 = dependency('liblz4',
1122 version : '>= 1.3.0',
1123 required : want_lz4 == 'true')
1124 have = liblz4.found()
1129 conf.set10('HAVE_LZ4', have)
1131 want_xkbcommon = get_option('xkbcommon')
1132 if want_xkbcommon != 'false' and not skip_deps
1133 libxkbcommon = dependency('xkbcommon',
1134 version : '>= 0.3.0',
1135 required : want_xkbcommon == 'true')
1136 have = libxkbcommon.found()
1141 conf.set10('HAVE_XKBCOMMON', have)
1143 want_pcre2 = get_option('pcre2')
1144 if want_pcre2 != 'false'
1145 libpcre2 = dependency('libpcre2-8',
1146 required : want_pcre2 == 'true')
1147 have = libpcre2.found()
1152 conf.set10('HAVE_PCRE2', have)
1154 want_glib = get_option('glib')
1155 if want_glib != 'false' and not skip_deps
1156 libglib = dependency('glib-2.0',
1157 version : '>= 2.22.0',
1158 required : want_glib == 'true')
1159 libgobject = dependency('gobject-2.0',
1160 version : '>= 2.22.0',
1161 required : want_glib == 'true')
1162 libgio = dependency('gio-2.0',
1163 required : want_glib == 'true')
1164 have = libglib.found() and libgobject.found() and libgio.found()
1171 conf.set10('HAVE_GLIB', have)
1173 want_dbus = get_option('dbus')
1174 if want_dbus != 'false' and not skip_deps
1175 libdbus = dependency('dbus-1',
1176 version : '>= 1.3.2',
1177 required : want_dbus == 'true')
1178 have = libdbus.found()
1183 conf.set10('HAVE_DBUS', have)
1185 default_dnssec = get_option('default-dnssec')
1187 default_dnssec = 'no'
1189 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1190 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1191 default_dnssec = 'no'
1193 conf.set('DEFAULT_DNSSEC_MODE',
1194 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1195 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1197 dns_over_tls = get_option('dns-over-tls')
1198 if dns_over_tls != 'false'
1199 if dns_over_tls == 'openssl'
1202 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1203 if dns_over_tls == 'gnutls' and not have_gnutls
1204 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1207 if dns_over_tls == 'gnutls' or have_gnutls
1208 have_openssl = false
1210 have_openssl = conf.get('HAVE_OPENSSL') == 1
1211 if dns_over_tls != 'auto' and not have_openssl
1212 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1213 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1216 have = have_gnutls or have_openssl
1220 have_openssl = false
1222 conf.set10('ENABLE_DNS_OVER_TLS', have)
1223 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1224 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1226 default_dns_over_tls = get_option('default-dns-over-tls')
1228 default_dns_over_tls = 'no'
1230 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1231 message('default-dns-over-tls cannot be enabled or set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1232 default_dns_over_tls = 'no'
1234 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1235 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1236 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1238 want_importd = get_option('importd')
1239 if want_importd != 'false'
1240 have = (conf.get('HAVE_LIBCURL') == 1 and
1241 conf.get('HAVE_ZLIB') == 1 and
1242 conf.get('HAVE_XZ') == 1 and
1243 conf.get('HAVE_GCRYPT') == 1)
1244 if want_importd == 'true' and not have
1245 error('importd support was requested, but dependencies are not available')
1250 conf.set10('ENABLE_IMPORTD', have)
1252 want_remote = get_option('remote')
1253 if want_remote != 'false'
1254 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1255 conf.get('HAVE_LIBCURL') == 1]
1256 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1257 # it's possible to build one without the other. Complain only if
1258 # support was explicitly requested. The auxiliary files like sysusers
1259 # config should be installed when any of the programs are built.
1260 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1261 error('remote support was requested, but dependencies are not available')
1263 have = have_deps[0] or have_deps[1]
1267 conf.set10('ENABLE_REMOTE', have)
1269 foreach term : ['utmp',
1302 have = get_option(term)
1303 name = 'ENABLE_' + term.underscorify().to_upper()
1304 conf.set10(name, have)
1307 foreach tuple : [['nss-mymachines', 'machined'],
1308 ['nss-resolve', 'resolve']]
1309 want = get_option(tuple[0])
1311 have = get_option(tuple[1])
1312 if want == 'true' and not have
1313 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1318 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1319 conf.set10(name, have)
1323 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1324 'ENABLE_NSS_MYMACHINES',
1325 'ENABLE_NSS_RESOLVE',
1326 'ENABLE_NSS_SYSTEMD']
1327 if conf.get(term) == 1
1331 conf.set10('ENABLE_NSS', enable_nss)
1333 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1338 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1340 #####################################################################
1342 if get_option('efi')
1343 efi_arch = host_machine.cpu_family()
1345 if efi_arch == 'x86'
1346 EFI_MACHINE_TYPE_NAME = 'ia32'
1347 gnu_efi_arch = 'ia32'
1348 elif efi_arch == 'x86_64'
1349 EFI_MACHINE_TYPE_NAME = 'x64'
1350 gnu_efi_arch = 'x86_64'
1351 elif efi_arch == 'arm'
1352 EFI_MACHINE_TYPE_NAME = 'arm'
1353 gnu_efi_arch = 'arm'
1354 elif efi_arch == 'aarch64'
1355 EFI_MACHINE_TYPE_NAME = 'aa64'
1356 gnu_efi_arch = 'aarch64'
1358 EFI_MACHINE_TYPE_NAME = ''
1363 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1365 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1369 conf.set10('ENABLE_EFI', have)
1371 #####################################################################
1373 config_h = configure_file(
1374 output : 'config.h',
1375 configuration : conf)
1377 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1379 includes = include_directories('src/basic',
1384 'src/journal-remote',
1388 'src/time-wait-sync',
1394 'src/libsystemd/sd-bus',
1395 'src/libsystemd/sd-device',
1396 'src/libsystemd/sd-event',
1397 'src/libsystemd/sd-hwdb',
1398 'src/libsystemd/sd-id128',
1399 'src/libsystemd/sd-netlink',
1400 'src/libsystemd/sd-network',
1401 'src/libsystemd/sd-resolve',
1402 'src/libsystemd-network',
1405 add_project_arguments('-include', 'config.h', language : 'c')
1407 generate_gperfs = find_program('tools/generate-gperfs.py')
1411 subdir('src/systemd')
1413 subdir('src/libsystemd')
1414 subdir('src/libsystemd-network')
1415 subdir('src/journal')
1418 libjournal_core = static_library(
1420 libjournal_core_sources,
1422 include_directories : includes,
1425 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1426 libsystemd = shared_library(
1429 version : libsystemd_version,
1430 include_directories : includes,
1431 link_args : ['-shared',
1432 '-Wl,--version-script=' + libsystemd_sym_path],
1433 link_with : [libbasic,
1435 link_whole : [libsystemd_static,
1437 dependencies : [threads,
1441 link_depends : libsystemd_sym,
1443 install_dir : rootlibdir)
1445 static_libsystemd = get_option('static-libsystemd')
1446 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1448 install_libsystemd_static = static_library(
1451 journal_client_sources,
1453 basic_gcrypt_sources,
1455 include_directories : includes,
1456 build_by_default : static_libsystemd != 'false',
1457 install : static_libsystemd != 'false',
1458 install_dir : rootlibdir,
1459 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1460 dependencies : [threads,
1469 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1471 ############################################################
1473 # binaries that have --help and are intended for use by humans,
1474 # usually, but not always, installed in /bin.
1475 public_programs = []
1477 subdir('src/libudev')
1478 subdir('src/shared')
1480 subdir('src/shutdown')
1482 subdir('src/network')
1484 subdir('src/analyze')
1485 subdir('src/journal-remote')
1486 subdir('src/coredump')
1487 subdir('src/pstore')
1488 subdir('src/hostname')
1489 subdir('src/import')
1490 subdir('src/kernel-install')
1491 subdir('src/locale')
1492 subdir('src/machine')
1493 subdir('src/portable')
1494 subdir('src/nspawn')
1495 subdir('src/resolve')
1496 subdir('src/timedate')
1497 subdir('src/timesync')
1498 subdir('src/vconsole')
1499 subdir('src/boot/efi')
1506 ############################################################
1508 # only static linking apart from libdl, to make sure that the
1509 # module is linked to all libraries that it uses.
1510 test_dlopen = executable(
1514 include_directories : includes,
1515 link_with : [libbasic],
1516 dependencies : [libdl],
1517 build_by_default : want_tests != 'false')
1519 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1520 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1521 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1522 ['resolve', 'ENABLE_NSS_RESOLVE']]
1524 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1528 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1529 version_script_arg = join_paths(project_source_root, sym)
1531 nss = shared_library(
1533 'src/nss-@0@/nss-@0@.c'.format(module),
1536 include_directories : includes,
1537 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1538 link_args : ['-Wl,-z,nodelete',
1540 '-Wl,--version-script=' + version_script_arg],
1541 link_with : [libsystemd_static,
1543 dependencies : [threads,
1547 install_dir : rootlibdir)
1549 # We cannot use shared_module because it does not support version suffix.
1550 # Unfortunately shared_library insists on creating the symlink…
1551 meson.add_install_script('sh', '-c',
1552 'rm $DESTDIR@0@/libnss_@1@.so'
1553 .format(rootlibdir, module))
1555 if want_tests != 'false'
1556 test('dlopen-nss_' + module,
1558 # path to dlopen must include a slash
1559 args : nss.full_path())
1564 ############################################################
1566 executable('systemd',
1568 include_directories : includes,
1569 link_with : [libcore,
1571 dependencies : [versiondep,
1578 install_rpath : rootlibexecdir,
1580 install_dir : rootlibexecdir)
1582 meson.add_install_script(meson_make_symlink,
1583 join_paths(rootlibexecdir, 'systemd'),
1584 join_paths(rootsbindir, 'init'))
1586 exe = executable('systemd-analyze',
1587 systemd_analyze_sources,
1588 include_directories : includes,
1589 link_with : [libcore,
1591 dependencies : [versiondep,
1598 install_rpath : rootlibexecdir,
1600 public_programs += exe
1602 executable('systemd-journald',
1603 systemd_journald_sources,
1604 include_directories : includes,
1605 link_with : [libjournal_core,
1607 dependencies : [threads,
1611 install_rpath : rootlibexecdir,
1613 install_dir : rootlibexecdir)
1615 exe = executable('systemd-cat',
1616 systemd_cat_sources,
1617 include_directories : includes,
1618 link_with : [libjournal_core,
1620 dependencies : [threads],
1621 install_rpath : rootlibexecdir,
1623 public_programs += exe
1625 exe = executable('journalctl',
1627 include_directories : includes,
1628 link_with : [libshared],
1629 dependencies : [threads,
1634 install_rpath : rootlibexecdir,
1636 install_dir : rootbindir)
1637 public_programs += exe
1639 executable('systemd-getty-generator',
1640 'src/getty-generator/getty-generator.c',
1641 include_directories : includes,
1642 link_with : [libshared],
1643 install_rpath : rootlibexecdir,
1645 install_dir : systemgeneratordir)
1647 executable('systemd-debug-generator',
1648 'src/debug-generator/debug-generator.c',
1649 include_directories : includes,
1650 link_with : [libshared],
1651 install_rpath : rootlibexecdir,
1653 install_dir : systemgeneratordir)
1655 executable('systemd-run-generator',
1656 'src/run-generator/run-generator.c',
1657 include_directories : includes,
1658 link_with : [libshared],
1659 install_rpath : rootlibexecdir,
1661 install_dir : systemgeneratordir)
1663 executable('systemd-fstab-generator',
1664 'src/fstab-generator/fstab-generator.c',
1665 include_directories : includes,
1666 link_with : [libcore_shared,
1668 install_rpath : rootlibexecdir,
1670 install_dir : systemgeneratordir)
1672 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1673 executable('30-systemd-environment-d-generator',
1674 'src/environment-d-generator/environment-d-generator.c',
1675 include_directories : includes,
1676 link_with : [libshared],
1677 install_rpath : rootlibexecdir,
1679 install_dir : userenvgeneratordir)
1681 meson.add_install_script(meson_make_symlink,
1682 join_paths(sysconfdir, 'environment'),
1683 join_paths(environmentdir, '99-environment.conf'))
1686 if conf.get('ENABLE_HIBERNATE') == 1
1687 executable('systemd-hibernate-resume-generator',
1688 'src/hibernate-resume/hibernate-resume-generator.c',
1689 include_directories : includes,
1690 link_with : [libshared],
1691 install_rpath : rootlibexecdir,
1693 install_dir : systemgeneratordir)
1695 executable('systemd-hibernate-resume',
1696 'src/hibernate-resume/hibernate-resume.c',
1697 include_directories : includes,
1698 link_with : [libshared],
1699 install_rpath : rootlibexecdir,
1701 install_dir : rootlibexecdir)
1704 if conf.get('HAVE_BLKID') == 1
1705 executable('systemd-gpt-auto-generator',
1706 'src/gpt-auto-generator/gpt-auto-generator.c',
1707 'src/shared/blkid-util.h',
1708 include_directories : includes,
1709 link_with : [libshared],
1710 dependencies : libblkid,
1711 install_rpath : rootlibexecdir,
1713 install_dir : systemgeneratordir)
1715 exe = executable('systemd-dissect',
1716 'src/dissect/dissect.c',
1717 include_directories : includes,
1718 link_with : [libshared],
1719 install_rpath : rootlibexecdir,
1721 install_dir : rootlibexecdir)
1722 public_programs += exe
1725 if conf.get('ENABLE_RESOLVE') == 1
1726 executable('systemd-resolved',
1727 systemd_resolved_sources,
1728 include_directories : includes,
1729 link_with : [libshared,
1731 libsystemd_resolve_core],
1732 dependencies : systemd_resolved_dependencies,
1733 install_rpath : rootlibexecdir,
1735 install_dir : rootlibexecdir)
1737 exe = executable('resolvectl',
1739 include_directories : includes,
1740 link_with : [libshared,
1742 libsystemd_resolve_core],
1743 dependencies : [threads,
1747 install_rpath : rootlibexecdir,
1749 public_programs += exe
1751 meson.add_install_script(meson_make_symlink,
1752 join_paths(bindir, 'resolvectl'),
1753 join_paths(rootsbindir, 'resolvconf'))
1755 meson.add_install_script(meson_make_symlink,
1756 join_paths(bindir, 'resolvectl'),
1757 join_paths(bindir, 'systemd-resolve'))
1760 if conf.get('ENABLE_LOGIND') == 1
1761 executable('systemd-logind',
1762 systemd_logind_sources,
1763 include_directories : includes,
1764 link_with : [liblogind_core,
1766 dependencies : [threads,
1768 install_rpath : rootlibexecdir,
1770 install_dir : rootlibexecdir)
1772 exe = executable('loginctl',
1774 include_directories : includes,
1775 link_with : [libshared],
1776 dependencies : [threads,
1779 install_rpath : rootlibexecdir,
1781 install_dir : rootbindir)
1782 public_programs += exe
1784 exe = executable('systemd-inhibit',
1785 'src/login/inhibit.c',
1786 include_directories : includes,
1787 link_with : [libshared],
1788 install_rpath : rootlibexecdir,
1790 install_dir : rootbindir)
1791 public_programs += exe
1793 if conf.get('HAVE_PAM') == 1
1794 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1795 pam_systemd = shared_library(
1799 include_directories : includes,
1800 link_args : ['-shared',
1801 '-Wl,--version-script=' + version_script_arg],
1802 link_with : [libsystemd_static,
1804 dependencies : [threads,
1807 link_depends : pam_systemd_sym,
1809 install_dir : pamlibdir)
1811 if want_tests != 'false'
1812 test('dlopen-pam_systemd',
1814 # path to dlopen must include a slash
1815 args : pam_systemd.full_path())
1819 executable('systemd-user-runtime-dir',
1820 user_runtime_dir_sources,
1821 include_directories : includes,
1822 link_with : [libshared],
1823 install_rpath : rootlibexecdir,
1825 install_dir : rootlibexecdir)
1828 if conf.get('HAVE_PAM') == 1
1829 executable('systemd-user-sessions',
1830 'src/user-sessions/user-sessions.c',
1831 include_directories : includes,
1832 link_with : [libshared],
1833 install_rpath : rootlibexecdir,
1835 install_dir : rootlibexecdir)
1838 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1839 exe = executable('bootctl',
1840 'src/boot/bootctl.c',
1841 include_directories : includes,
1842 link_with : [libshared],
1843 dependencies : [libblkid],
1844 install_rpath : rootlibexecdir,
1846 public_programs += exe
1848 executable('systemd-bless-boot',
1849 'src/boot/bless-boot.c',
1850 include_directories : includes,
1851 link_with : [libshared],
1852 dependencies : [libblkid],
1853 install_rpath : rootlibexecdir,
1855 install_dir : rootlibexecdir)
1857 executable('systemd-bless-boot-generator',
1858 'src/boot/bless-boot-generator.c',
1859 include_directories : includes,
1860 link_with : [libshared],
1861 install_rpath : rootlibexecdir,
1863 install_dir : systemgeneratordir)
1866 executable('systemd-boot-check-no-failures',
1867 'src/boot/boot-check-no-failures.c',
1868 include_directories : includes,
1869 link_with : [libshared],
1870 dependencies : [libblkid],
1871 install_rpath : rootlibexecdir,
1873 install_dir : rootlibexecdir)
1875 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1876 include_directories : includes,
1877 link_with : [libshared],
1878 dependencies : [threads],
1879 install_rpath : rootlibexecdir,
1881 public_programs += exe
1884 if get_option('link-systemctl-shared')
1885 systemctl_link_with = [libshared]
1887 systemctl_link_with = [libsystemd_static,
1893 exe = executable('systemctl',
1894 'src/systemctl/systemctl.c',
1895 'src/systemctl/sysv-compat.h',
1896 'src/systemctl/sysv-compat.c',
1897 include_directories : includes,
1898 link_with : systemctl_link_with,
1899 dependencies : [threads,
1904 install_rpath : rootlibexecdir,
1906 install_dir : rootbindir)
1907 public_programs += exe
1909 if conf.get('ENABLE_PORTABLED') == 1
1910 executable('systemd-portabled',
1911 systemd_portabled_sources,
1912 include_directories : includes,
1913 link_with : [libshared],
1914 dependencies : [threads],
1915 install_rpath : rootlibexecdir,
1917 install_dir : rootlibexecdir)
1919 exe = executable('portablectl', 'src/portable/portablectl.c',
1920 include_directories : includes,
1921 link_with : [libshared],
1922 dependencies : [threads],
1923 install_rpath : rootlibexecdir,
1925 install_dir : rootbindir)
1926 public_programs += exe
1929 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1930 meson.add_install_script(meson_make_symlink,
1931 join_paths(rootbindir, 'systemctl'),
1932 join_paths(rootsbindir, alias))
1935 if conf.get('ENABLE_BACKLIGHT') == 1
1936 executable('systemd-backlight',
1937 'src/backlight/backlight.c',
1938 include_directories : includes,
1939 link_with : [libshared],
1940 install_rpath : rootlibexecdir,
1942 install_dir : rootlibexecdir)
1945 if conf.get('ENABLE_RFKILL') == 1
1946 executable('systemd-rfkill',
1947 'src/rfkill/rfkill.c',
1948 include_directories : includes,
1949 link_with : [libshared],
1950 install_rpath : rootlibexecdir,
1952 install_dir : rootlibexecdir)
1955 executable('systemd-system-update-generator',
1956 'src/system-update-generator/system-update-generator.c',
1957 include_directories : includes,
1958 link_with : [libshared],
1959 install_rpath : rootlibexecdir,
1961 install_dir : systemgeneratordir)
1963 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1964 executable('systemd-cryptsetup',
1965 'src/cryptsetup/cryptsetup.c',
1966 include_directories : includes,
1967 link_with : [libshared],
1968 dependencies : [libcryptsetup],
1969 install_rpath : rootlibexecdir,
1971 install_dir : rootlibexecdir)
1973 executable('systemd-cryptsetup-generator',
1974 'src/cryptsetup/cryptsetup-generator.c',
1975 include_directories : includes,
1976 link_with : [libshared],
1977 dependencies : [libcryptsetup],
1978 install_rpath : rootlibexecdir,
1980 install_dir : systemgeneratordir)
1982 executable('systemd-veritysetup',
1983 'src/veritysetup/veritysetup.c',
1984 include_directories : includes,
1985 link_with : [libshared],
1986 dependencies : [libcryptsetup],
1987 install_rpath : rootlibexecdir,
1989 install_dir : rootlibexecdir)
1991 executable('systemd-veritysetup-generator',
1992 'src/veritysetup/veritysetup-generator.c',
1993 include_directories : includes,
1994 link_with : [libshared],
1995 dependencies : [libcryptsetup],
1996 install_rpath : rootlibexecdir,
1998 install_dir : systemgeneratordir)
2001 if conf.get('HAVE_SYSV_COMPAT') == 1
2002 executable('systemd-sysv-generator',
2003 'src/sysv-generator/sysv-generator.c',
2004 include_directories : includes,
2005 link_with : [libshared],
2006 install_rpath : rootlibexecdir,
2008 install_dir : systemgeneratordir)
2010 executable('systemd-rc-local-generator',
2011 'src/rc-local-generator/rc-local-generator.c',
2012 include_directories : includes,
2013 link_with : [libshared],
2014 install_rpath : rootlibexecdir,
2016 install_dir : systemgeneratordir)
2019 if conf.get('ENABLE_HOSTNAMED') == 1
2020 executable('systemd-hostnamed',
2021 'src/hostname/hostnamed.c',
2022 include_directories : includes,
2023 link_with : [libshared],
2024 install_rpath : rootlibexecdir,
2026 install_dir : rootlibexecdir)
2028 exe = executable('hostnamectl',
2029 'src/hostname/hostnamectl.c',
2030 include_directories : includes,
2031 link_with : [libshared],
2032 install_rpath : rootlibexecdir,
2034 public_programs += exe
2037 if conf.get('ENABLE_LOCALED') == 1
2038 if conf.get('HAVE_XKBCOMMON') == 1
2039 # logind will load libxkbcommon.so dynamically on its own
2045 executable('systemd-localed',
2046 systemd_localed_sources,
2047 include_directories : includes,
2048 link_with : [libshared],
2049 dependencies : deps,
2050 install_rpath : rootlibexecdir,
2052 install_dir : rootlibexecdir)
2054 exe = executable('localectl',
2056 include_directories : includes,
2057 link_with : [libshared],
2058 install_rpath : rootlibexecdir,
2060 public_programs += exe
2063 if conf.get('ENABLE_TIMEDATED') == 1
2064 executable('systemd-timedated',
2065 'src/timedate/timedated.c',
2066 include_directories : includes,
2067 link_with : [libshared],
2068 install_rpath : rootlibexecdir,
2070 install_dir : rootlibexecdir)
2073 if conf.get('ENABLE_TIMEDATECTL') == 1
2074 exe = executable('timedatectl',
2075 'src/timedate/timedatectl.c',
2076 include_directories : includes,
2077 install_rpath : rootlibexecdir,
2078 link_with : [libshared],
2079 dependencies : [libm],
2081 public_programs += exe
2084 if conf.get('ENABLE_TIMESYNCD') == 1
2085 executable('systemd-timesyncd',
2086 systemd_timesyncd_sources,
2087 include_directories : includes,
2088 link_with : [libshared],
2089 dependencies : [threads,
2091 install_rpath : rootlibexecdir,
2093 install_dir : rootlibexecdir)
2095 executable('systemd-time-wait-sync',
2096 'src/time-wait-sync/time-wait-sync.c',
2097 include_directories : includes,
2098 link_with : [libshared],
2099 install_rpath : rootlibexecdir,
2101 install_dir : rootlibexecdir)
2104 if conf.get('ENABLE_MACHINED') == 1
2105 executable('systemd-machined',
2106 systemd_machined_sources,
2107 include_directories : includes,
2108 link_with : [libmachine_core,
2110 install_rpath : rootlibexecdir,
2112 install_dir : rootlibexecdir)
2114 exe = executable('machinectl',
2115 'src/machine/machinectl.c',
2116 include_directories : includes,
2117 link_with : [libshared],
2118 dependencies : [threads,
2121 install_rpath : rootlibexecdir,
2123 install_dir : rootbindir)
2124 public_programs += exe
2127 if conf.get('ENABLE_IMPORTD') == 1
2128 executable('systemd-importd',
2129 systemd_importd_sources,
2130 include_directories : includes,
2131 link_with : [libshared],
2132 dependencies : [threads],
2133 install_rpath : rootlibexecdir,
2135 install_dir : rootlibexecdir)
2137 systemd_pull = executable('systemd-pull',
2138 systemd_pull_sources,
2139 include_directories : includes,
2140 link_with : [libshared],
2141 dependencies : [versiondep,
2147 install_rpath : rootlibexecdir,
2149 install_dir : rootlibexecdir)
2151 systemd_import = executable('systemd-import',
2152 systemd_import_sources,
2153 include_directories : includes,
2154 link_with : [libshared],
2155 dependencies : [libcurl,
2159 install_rpath : rootlibexecdir,
2161 install_dir : rootlibexecdir)
2163 systemd_import_fs = executable('systemd-import-fs',
2164 systemd_import_fs_sources,
2165 include_directories : includes,
2166 link_with : [libshared],
2167 install_rpath : rootlibexecdir,
2169 install_dir : rootlibexecdir)
2171 systemd_export = executable('systemd-export',
2172 systemd_export_sources,
2173 include_directories : includes,
2174 link_with : [libshared],
2175 dependencies : [libcurl,
2179 install_rpath : rootlibexecdir,
2181 install_dir : rootlibexecdir)
2183 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2186 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2187 exe = executable('systemd-journal-upload',
2188 systemd_journal_upload_sources,
2189 include_directories : includes,
2190 link_with : [libshared],
2191 dependencies : [versiondep,
2197 install_rpath : rootlibexecdir,
2199 install_dir : rootlibexecdir)
2200 public_programs += exe
2203 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2204 s_j_remote = executable('systemd-journal-remote',
2205 systemd_journal_remote_sources,
2206 include_directories : includes,
2207 link_with : [libshared,
2208 libsystemd_journal_remote],
2209 dependencies : [threads,
2214 install_rpath : rootlibexecdir,
2216 install_dir : rootlibexecdir)
2218 s_j_gatewayd = executable('systemd-journal-gatewayd',
2219 systemd_journal_gatewayd_sources,
2220 include_directories : includes,
2221 link_with : [libshared],
2222 dependencies : [threads,
2227 install_rpath : rootlibexecdir,
2229 install_dir : rootlibexecdir)
2230 public_programs += [s_j_remote, s_j_gatewayd]
2233 if conf.get('ENABLE_COREDUMP') == 1
2234 executable('systemd-coredump',
2235 systemd_coredump_sources,
2236 include_directories : includes,
2237 link_with : [libshared],
2238 dependencies : [threads,
2243 install_rpath : rootlibexecdir,
2245 install_dir : rootlibexecdir)
2247 exe = executable('coredumpctl',
2248 coredumpctl_sources,
2249 include_directories : includes,
2250 link_with : [libshared],
2251 dependencies : [threads,
2254 install_rpath : rootlibexecdir,
2256 public_programs += exe
2259 if conf.get('ENABLE_PSTORE') == 1
2260 executable('systemd-pstore',
2261 systemd_pstore_sources,
2262 include_directories : includes,
2263 link_with : [libshared],
2264 dependencies : [threads,
2269 install_rpath : rootlibexecdir,
2271 install_dir : rootlibexecdir)
2274 if conf.get('ENABLE_BINFMT') == 1
2275 exe = executable('systemd-binfmt',
2276 'src/binfmt/binfmt.c',
2277 include_directories : includes,
2278 link_with : [libshared],
2279 install_rpath : rootlibexecdir,
2281 install_dir : rootlibexecdir)
2282 public_programs += exe
2284 meson.add_install_script('sh', '-c',
2285 mkdir_p.format(binfmtdir))
2286 meson.add_install_script('sh', '-c',
2287 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2290 if conf.get('ENABLE_VCONSOLE') == 1
2291 executable('systemd-vconsole-setup',
2292 'src/vconsole/vconsole-setup.c',
2293 include_directories : includes,
2294 link_with : [libshared],
2295 install_rpath : rootlibexecdir,
2297 install_dir : rootlibexecdir)
2300 if conf.get('ENABLE_RANDOMSEED') == 1
2301 executable('systemd-random-seed',
2302 'src/random-seed/random-seed.c',
2303 include_directories : includes,
2304 link_with : [libshared],
2305 install_rpath : rootlibexecdir,
2307 install_dir : rootlibexecdir)
2310 if conf.get('ENABLE_FIRSTBOOT') == 1
2311 executable('systemd-firstboot',
2312 'src/firstboot/firstboot.c',
2313 include_directories : includes,
2314 link_with : [libshared],
2315 dependencies : [libcrypt],
2316 install_rpath : rootlibexecdir,
2318 install_dir : rootbindir)
2321 executable('systemd-remount-fs',
2322 'src/remount-fs/remount-fs.c',
2323 include_directories : includes,
2324 link_with : [libcore_shared,
2326 install_rpath : rootlibexecdir,
2328 install_dir : rootlibexecdir)
2330 executable('systemd-machine-id-setup',
2331 'src/machine-id-setup/machine-id-setup-main.c',
2332 include_directories : includes,
2333 link_with : [libcore_shared,
2335 install_rpath : rootlibexecdir,
2337 install_dir : rootbindir)
2339 executable('systemd-fsck',
2341 include_directories : includes,
2342 link_with : [libshared],
2343 install_rpath : rootlibexecdir,
2345 install_dir : rootlibexecdir)
2347 executable('systemd-growfs',
2348 'src/partition/growfs.c',
2349 include_directories : includes,
2350 link_with : [libshared],
2351 dependencies : [libcryptsetup],
2352 install_rpath : rootlibexecdir,
2354 install_dir : rootlibexecdir)
2356 executable('systemd-makefs',
2357 'src/partition/makefs.c',
2358 include_directories : includes,
2359 link_with : [libshared],
2360 install_rpath : rootlibexecdir,
2362 install_dir : rootlibexecdir)
2364 executable('systemd-sleep',
2365 'src/sleep/sleep.c',
2366 include_directories : includes,
2367 link_with : [libshared],
2368 install_rpath : rootlibexecdir,
2370 install_dir : rootlibexecdir)
2372 install_data('src/sleep/sleep.conf',
2373 install_dir : pkgsysconfdir)
2375 exe = executable('systemd-sysctl',
2376 'src/sysctl/sysctl.c',
2377 include_directories : includes,
2378 link_with : [libshared],
2379 install_rpath : rootlibexecdir,
2381 install_dir : rootlibexecdir)
2382 public_programs += exe
2384 executable('systemd-ac-power',
2385 'src/ac-power/ac-power.c',
2386 include_directories : includes,
2387 link_with : [libshared],
2388 install_rpath : rootlibexecdir,
2390 install_dir : rootlibexecdir)
2392 exe = executable('systemd-detect-virt',
2393 'src/detect-virt/detect-virt.c',
2394 include_directories : includes,
2395 link_with : [libshared],
2396 install_rpath : rootlibexecdir,
2398 public_programs += exe
2400 exe = executable('systemd-delta',
2401 'src/delta/delta.c',
2402 include_directories : includes,
2403 link_with : [libshared],
2404 install_rpath : rootlibexecdir,
2406 public_programs += exe
2408 exe = executable('systemd-escape',
2409 'src/escape/escape.c',
2410 include_directories : includes,
2411 link_with : [libshared],
2412 install_rpath : rootlibexecdir,
2414 install_dir : rootbindir)
2415 public_programs += exe
2417 exe = executable('systemd-notify',
2418 'src/notify/notify.c',
2419 include_directories : includes,
2420 link_with : [libshared],
2421 install_rpath : rootlibexecdir,
2423 install_dir : rootbindir)
2424 public_programs += exe
2426 executable('systemd-volatile-root',
2427 'src/volatile-root/volatile-root.c',
2428 include_directories : includes,
2429 link_with : [libshared],
2430 install_rpath : rootlibexecdir,
2432 install_dir : rootlibexecdir)
2434 executable('systemd-cgroups-agent',
2435 'src/cgroups-agent/cgroups-agent.c',
2436 include_directories : includes,
2437 link_with : [libshared],
2438 install_rpath : rootlibexecdir,
2440 install_dir : rootlibexecdir)
2442 exe = executable('systemd-id128',
2443 'src/id128/id128.c',
2444 include_directories : includes,
2445 link_with : [libshared],
2446 install_rpath : rootlibexecdir,
2448 public_programs += exe
2450 exe = executable('systemd-path',
2452 include_directories : includes,
2453 link_with : [libshared],
2454 install_rpath : rootlibexecdir,
2456 public_programs += exe
2458 exe = executable('systemd-ask-password',
2459 'src/ask-password/ask-password.c',
2460 include_directories : includes,
2461 link_with : [libshared],
2462 install_rpath : rootlibexecdir,
2464 install_dir : rootbindir)
2465 public_programs += exe
2467 executable('systemd-reply-password',
2468 'src/reply-password/reply-password.c',
2469 include_directories : includes,
2470 link_with : [libshared],
2471 install_rpath : rootlibexecdir,
2473 install_dir : rootlibexecdir)
2475 exe = executable('systemd-tty-ask-password-agent',
2476 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2477 include_directories : includes,
2478 link_with : [libshared],
2479 install_rpath : rootlibexecdir,
2481 install_dir : rootbindir)
2482 public_programs += exe
2484 exe = executable('systemd-cgls',
2486 include_directories : includes,
2487 link_with : [libshared],
2488 install_rpath : rootlibexecdir,
2490 public_programs += exe
2492 exe = executable('systemd-cgtop',
2493 'src/cgtop/cgtop.c',
2494 include_directories : includes,
2495 link_with : [libshared],
2496 install_rpath : rootlibexecdir,
2498 public_programs += exe
2500 executable('systemd-initctl',
2501 'src/initctl/initctl.c',
2502 include_directories : includes,
2503 link_with : [libshared],
2504 install_rpath : rootlibexecdir,
2506 install_dir : rootlibexecdir)
2508 exe = executable('systemd-mount',
2509 'src/mount/mount-tool.c',
2510 include_directories : includes,
2511 link_with : [libshared],
2512 dependencies: [libmount],
2513 install_rpath : rootlibexecdir,
2515 public_programs += exe
2517 meson.add_install_script(meson_make_symlink,
2518 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2520 exe = executable('systemd-run',
2522 include_directories : includes,
2523 link_with : [libshared],
2524 install_rpath : rootlibexecdir,
2526 public_programs += exe
2528 exe = executable('systemd-stdio-bridge',
2529 'src/stdio-bridge/stdio-bridge.c',
2530 include_directories : includes,
2531 link_with : [libshared],
2532 dependencies : [versiondep],
2533 install_rpath : rootlibexecdir,
2535 public_programs += exe
2537 exe = executable('busctl',
2538 'src/busctl/busctl.c',
2539 'src/busctl/busctl-introspect.c',
2540 'src/busctl/busctl-introspect.h',
2541 include_directories : includes,
2542 link_with : [libshared],
2543 install_rpath : rootlibexecdir,
2545 public_programs += exe
2547 if conf.get('ENABLE_SYSUSERS') == 1
2548 exe = executable('systemd-sysusers',
2549 'src/sysusers/sysusers.c',
2550 include_directories : includes,
2551 link_with : [libshared],
2552 install_rpath : rootlibexecdir,
2554 install_dir : rootbindir)
2555 public_programs += exe
2558 if conf.get('ENABLE_TMPFILES') == 1
2559 exe = executable('systemd-tmpfiles',
2560 'src/tmpfiles/tmpfiles.c',
2561 include_directories : includes,
2562 link_with : [libshared],
2563 dependencies : [libacl],
2564 install_rpath : rootlibexecdir,
2566 install_dir : rootbindir)
2567 public_programs += exe
2569 if want_tests != 'false'
2570 test('test-systemd-tmpfiles',
2571 test_systemd_tmpfiles_py,
2572 # https://github.com/mesonbuild/meson/issues/2681
2573 args : exe.full_path())
2577 if conf.get('ENABLE_HWDB') == 1
2578 exe = executable('systemd-hwdb',
2580 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2581 include_directories : includes,
2582 link_with : [libudev_static],
2583 install_rpath : udev_rpath,
2585 install_dir : rootbindir)
2586 public_programs += exe
2589 if conf.get('ENABLE_QUOTACHECK') == 1
2590 executable('systemd-quotacheck',
2591 'src/quotacheck/quotacheck.c',
2592 include_directories : includes,
2593 link_with : [libshared],
2594 install_rpath : rootlibexecdir,
2596 install_dir : rootlibexecdir)
2599 exe = executable('systemd-socket-proxyd',
2600 'src/socket-proxy/socket-proxyd.c',
2601 include_directories : includes,
2602 link_with : [libshared],
2603 dependencies : [threads],
2604 install_rpath : rootlibexecdir,
2606 install_dir : rootlibexecdir)
2607 public_programs += exe
2609 exe = executable('systemd-udevd',
2610 systemd_udevd_sources,
2611 include_directories : includes,
2612 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2613 link_with : [libudev_core,
2616 dependencies : [versiondep,
2622 install_rpath : udev_rpath,
2624 install_dir : rootlibexecdir)
2625 public_programs += exe
2627 exe = executable('udevadm',
2629 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2630 include_directories : includes,
2631 link_with : [libudev_core,
2634 dependencies : [versiondep,
2640 install_rpath : udev_rpath,
2642 install_dir : rootbindir)
2643 public_programs += exe
2645 executable('systemd-shutdown',
2646 systemd_shutdown_sources,
2647 include_directories : includes,
2648 link_with : [libcore_shared,
2650 dependencies : [libmount],
2651 install_rpath : rootlibexecdir,
2653 install_dir : rootlibexecdir)
2655 executable('systemd-update-done',
2656 'src/update-done/update-done.c',
2657 include_directories : includes,
2658 link_with : [libshared],
2659 install_rpath : rootlibexecdir,
2661 install_dir : rootlibexecdir)
2663 executable('systemd-update-utmp',
2664 'src/update-utmp/update-utmp.c',
2665 include_directories : includes,
2666 link_with : [libshared],
2667 dependencies : [libaudit],
2668 install_rpath : rootlibexecdir,
2670 install_dir : rootlibexecdir)
2672 if conf.get('HAVE_KMOD') == 1
2673 executable('systemd-modules-load',
2674 'src/modules-load/modules-load.c',
2675 include_directories : includes,
2676 link_with : [libshared],
2677 dependencies : [libkmod],
2678 install_rpath : rootlibexecdir,
2680 install_dir : rootlibexecdir)
2682 meson.add_install_script('sh', '-c',
2683 mkdir_p.format(modulesloaddir))
2684 meson.add_install_script('sh', '-c',
2685 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2688 exe = executable('systemd-nspawn',
2689 systemd_nspawn_sources,
2690 include_directories : includes,
2691 link_with : [libcore_shared,
2694 dependencies : [libblkid,
2696 install_rpath : rootlibexecdir,
2698 public_programs += exe
2700 if conf.get('ENABLE_NETWORKD') == 1
2701 executable('systemd-networkd',
2702 systemd_networkd_sources,
2703 include_directories : includes,
2704 link_with : [libnetworkd_core,
2708 dependencies : [threads],
2709 install_rpath : rootlibexecdir,
2711 install_dir : rootlibexecdir)
2713 executable('systemd-networkd-wait-online',
2714 systemd_networkd_wait_online_sources,
2715 include_directories : includes,
2716 link_with : [libnetworkd_core,
2718 install_rpath : rootlibexecdir,
2720 install_dir : rootlibexecdir)
2722 exe = executable('networkctl',
2724 include_directories : includes,
2725 link_with : [libsystemd_network,
2727 install_rpath : rootlibexecdir,
2729 install_dir : rootbindir)
2730 public_programs += exe
2732 executable('systemd-network-generator',
2733 network_generator_sources,
2734 include_directories : includes,
2735 link_with : [libshared],
2736 install_rpath : rootlibexecdir,
2738 install_dir : rootlibexecdir)
2741 executable('systemd-sulogin-shell',
2742 ['src/sulogin-shell/sulogin-shell.c'],
2743 include_directories : includes,
2744 link_with : [libshared],
2745 install_rpath : rootlibexecdir,
2747 install_dir : rootlibexecdir)
2749 ############################################################
2752 'systemd-runtest.env',
2753 output : 'systemd-runtest.env',
2754 command : ['sh', '-c', '{ ' +
2755 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2756 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2758 build_by_default : true)
2760 foreach tuple : tests
2762 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2763 dependencies = tuple[2]
2764 condition = tuple.length() >= 4 ? tuple[3] : ''
2765 type = tuple.length() >= 5 ? tuple[4] : ''
2766 defs = tuple.length() >= 6 ? tuple[5] : []
2767 incs = tuple.length() >= 7 ? tuple[6] : includes
2770 name = sources[0].split('/')[-1].split('.')[0]
2771 if type.startswith('timeout=')
2772 timeout = type.split('=')[1].to_int()
2776 if condition == '' or conf.get(condition) == 1
2780 include_directories : incs,
2781 link_with : link_with,
2782 dependencies : [versiondep,
2785 build_by_default : want_tests != 'false',
2786 install_rpath : rootlibexecdir,
2787 install : install_tests,
2788 install_dir : join_paths(testsdir, type))
2791 message('@0@ is a manual test'.format(name))
2792 elif type == 'unsafe' and want_tests != 'unsafe'
2793 message('@0@ is an unsafe test'.format(name))
2794 elif want_tests != 'false'
2800 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2805 'test-libsystemd-sym',
2806 test_libsystemd_sym_c,
2807 include_directories : includes,
2808 link_with : [libsystemd],
2809 build_by_default : want_tests != 'false',
2810 install : install_tests,
2811 install_dir : testsdir)
2812 if want_tests != 'false'
2813 test('test-libsystemd-sym', exe)
2817 'test-libsystemd-static-sym',
2818 test_libsystemd_sym_c,
2819 include_directories : includes,
2820 link_with : [install_libsystemd_static],
2821 dependencies : [threads], # threads is already included in dependencies on the library,
2822 # but does not seem to get propagated. Add here as a work-around.
2823 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2824 install : install_tests and static_libsystemd_pic,
2825 install_dir : testsdir)
2826 if want_tests != 'false' and static_libsystemd_pic
2827 test('test-libsystemd-static-sym', exe)
2833 include_directories : includes,
2834 c_args : '-Wno-deprecated-declarations',
2835 link_with : [libudev],
2836 build_by_default : want_tests != 'false',
2837 install : install_tests,
2838 install_dir : testsdir)
2839 if want_tests != 'false'
2840 test('test-libudev-sym', exe)
2844 'test-libudev-static-sym',
2846 include_directories : includes,
2847 c_args : '-Wno-deprecated-declarations',
2848 link_with : [install_libudev_static],
2849 build_by_default : want_tests != 'false' and static_libudev_pic,
2850 install : install_tests and static_libudev_pic,
2851 install_dir : testsdir)
2852 if want_tests != 'false' and static_libudev_pic
2853 test('test-libudev-static-sym', exe)
2856 ############################################################
2860 if get_option('tests') != 'false'
2861 foreach tuple : fuzzers
2863 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2864 dependencies = tuple[2]
2865 defs = tuple.length() >= 4 ? tuple[3] : []
2866 incs = tuple.length() >= 5 ? tuple[4] : includes
2869 if want_ossfuzz or want_fuzzbuzz
2870 dependencies += fuzzing_engine
2872 if fuzzing_engine.found()
2873 dependencies += fuzzing_engine
2875 link_args += ['-fsanitize=fuzzer']
2878 sources += 'src/fuzz/fuzz-main.c'
2882 sources += 'src/fuzz/fuzzer-entry-point.c'
2885 name = sources[0].split('/')[-1].split('.')[0]
2887 fuzzer_exes += executable(
2890 include_directories : [incs, include_directories('src/fuzz')],
2891 link_with : link_with,
2892 dependencies : dependencies,
2894 link_args: link_args,
2899 run_target('fuzzers',
2900 depends : fuzzer_exes,
2903 ############################################################
2905 make_directive_index_py = find_program('tools/make-directive-index.py')
2906 make_man_index_py = find_program('tools/make-man-index.py')
2907 xml_helper_py = find_program('tools/xml_helper.py')
2908 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2912 subdir('sysusers.d')
2913 subdir('tmpfiles.d')
2918 subdir('shell-completion/bash')
2919 subdir('shell-completion/zsh')
2920 subdir('docs/sysvinit')
2921 subdir('docs/var-log')
2923 install_subdir('factory/etc',
2924 install_dir : factorydir)
2926 install_data('xorg/50-systemd-user.sh',
2927 install_dir : xinitrcdir)
2928 install_data('modprobe.d/systemd.conf',
2929 install_dir : modprobedir)
2930 install_data('LICENSE.GPL2',
2934 'docs/CODING_STYLE.md',
2935 'docs/DISTRO_PORTING.md',
2936 'docs/ENVIRONMENT.md',
2938 'docs/TRANSIENT-SETTINGS.md',
2939 'docs/TRANSLATORS.md',
2940 'docs/UIDS-GIDS.md',
2941 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2942 install_dir : docdir)
2944 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2945 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2947 ############################################################
2949 meson_check_help = find_program('tools/meson-check-help.sh')
2951 foreach exec : public_programs
2952 name = exec.full_path().split('/')[-1]
2953 if want_tests != 'false'
2954 test('check-help-' + name,
2956 args : exec.full_path())
2960 ############################################################
2962 check_directives_sh = find_program('tools/check-directives.sh')
2964 if want_tests != 'false'
2965 test('check-directives',
2966 check_directives_sh,
2967 args : project_source_root)
2970 ############################################################
2972 # Enable tests for all supported sanitizers
2973 foreach tuple : sanitizers
2974 sanitizer = tuple[0]
2977 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2979 foreach p : fuzz_regression_tests
2980 b = p.split('/')[-2]
2981 c = p.split('/')[-1]
2983 name = '@0@:@1@'.format(b, sanitizer)
2986 if want_tests == 'false'
2987 message('Not compiling @0@ because tests is set to false'.format(name))
2989 exe = custom_target(
2993 command : [env, 'ln', '-fs',
2994 join_paths(build.full_path(), b),
2996 build_by_default : true)
2998 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3003 if want_tests != 'false' and slow_tests
3004 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3006 args : [exe.full_path(),
3007 join_paths(project_source_root, p)])
3014 ############################################################
3017 all_files = run_command(
3019 ['--git-dir=@0@/.git'.format(project_source_root),
3022 all_files = files(all_files.stdout().split())
3027 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3030 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3034 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3037 command : [meson_git_contrib_sh])
3041 git_head = run_command(
3043 ['--git-dir=@0@/.git'.format(project_source_root),
3044 'rev-parse', 'HEAD']).stdout().strip()
3045 git_head_short = run_command(
3047 ['--git-dir=@0@/.git'.format(project_source_root),
3048 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3052 command : ['git', 'archive',
3053 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3055 '--prefix', 'systemd-@0@/'.format(git_head),
3059 ############################################################
3061 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3064 depends : [man, libsystemd, libudev],
3065 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3067 ############################################################
3070 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3072 'split /usr: @0@'.format(split_usr),
3073 'split bin-sbin: @0@'.format(split_bin),
3074 'prefix directory: @0@'.format(prefixdir),
3075 'rootprefix directory: @0@'.format(rootprefixdir),
3076 'sysconf directory: @0@'.format(sysconfdir),
3077 'include directory: @0@'.format(includedir),
3078 'lib directory: @0@'.format(libdir),
3079 'rootlib directory: @0@'.format(rootlibdir),
3080 'SysV init scripts: @0@'.format(sysvinit_path),
3081 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3082 'PAM modules directory: @0@'.format(pamlibdir),
3083 'PAM configuration directory: @0@'.format(pamconfdir),
3084 'RPM macros directory: @0@'.format(rpmmacrosdir),
3085 'modprobe.d directory: @0@'.format(modprobedir),
3086 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3087 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3088 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3089 'bash completions directory: @0@'.format(bashcompletiondir),
3090 'zsh completions directory: @0@'.format(zshcompletiondir),
3091 'extra start script: @0@'.format(get_option('rc-local')),
3092 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3093 get_option('debug-tty')),
3094 'TTY GID: @0@'.format(tty_gid),
3095 'users GID: @0@'.format(substs.get('USERS_GID')),
3096 'maximum system UID: @0@'.format(system_uid_max),
3097 'maximum system GID: @0@'.format(system_gid_max),
3098 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3099 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3100 'minimum container UID base: @0@'.format(container_uid_base_min),
3101 'maximum container UID base: @0@'.format(container_uid_base_max),
3102 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3103 'render group access mode: @0@'.format(get_option('group-render-mode')),
3104 'certificate root directory: @0@'.format(get_option('certificate-root')),
3105 'support URL: @0@'.format(support_url),
3106 'nobody user name: @0@'.format(nobody_user),
3107 'nobody group name: @0@'.format(nobody_group),
3108 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3109 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3111 'default DNSSEC mode: @0@'.format(default_dnssec),
3112 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3113 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3114 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3115 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3116 'default locale: @0@'.format(default_locale)]
3118 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3119 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3121 'default DNS servers: @0@'.format(alt_dns_servers),
3122 'default NTP servers: @0@'.format(alt_ntp_servers)]
3124 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3125 '@@0@'.format(time_epoch)).stdout().strip()
3127 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3130 'static libsystemd: @0@'.format(static_libsystemd),
3131 'static libudev: @0@'.format(static_libudev)]
3134 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3135 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3136 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3138 if conf.get('ENABLE_EFI') == 1
3139 status += 'efi arch: @0@'.format(efi_arch)
3143 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3144 'EFI CC @0@'.format(' '.join(efi_cc)),
3145 'EFI lib directory: @0@'.format(efi_libdir),
3146 'EFI lds directory: @0@'.format(efi_ldsdir),
3147 'EFI include directory: @0@'.format(efi_incdir)]
3199 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3200 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3204 ['legacy pkla', install_polkit_pkla],
3206 ['gnu-efi', have_gnu_efi],
3219 ['man pages', want_man],
3220 ['html pages', want_html],
3221 ['man page indices', want_man and have_lxml],
3226 ['adm group', get_option('adm-group')],
3227 ['wheel group', get_option('wheel-group')],
3230 ['debug mmap cache'],
3232 ['valgrind', conf.get('VALGRIND') == 1],
3233 ['trace logging', conf.get('LOG_TRACE') == 1],
3234 ['link-udev-shared', get_option('link-udev-shared')],
3235 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3238 if tuple.length() >= 2
3241 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3242 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3243 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3254 'enabled features: @0@'.format(', '.join(found)),
3256 'disabled features: @0@'.format(', '.join(missing)),
3258 message('\n '.join(status))
3260 if rootprefixdir != rootprefix_default
3262 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3263 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3264 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))