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'],
563 path = get_option(prog[0] + '-path')
565 message('Using @1@ for @0@'.format(prog[0], path))
567 exe = find_program(prog[0],
568 '/usr/sbin/' + prog[0],
571 path = exe.found() ? exe.path() : prog[1]
573 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
574 conf.set_quoted(name, path)
575 substs.set(name, path)
578 conf.set_quoted('TELINIT', get_option('telinit-path'))
580 if run_command('ln', '--relative', '--help').returncode() != 0
581 error('ln does not support --relative (added in coreutils 8.16)')
584 ############################################################
586 gperf = find_program('gperf')
588 gperf_test_format = '''
590 const char * in_word_set(const char *, @0@);
593 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
594 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
595 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
596 if cc.compiles(gperf_test)
597 gperf_len_type = 'size_t'
599 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
600 if cc.compiles(gperf_test)
601 gperf_len_type = 'unsigned'
603 error('unable to determine gperf len type')
606 message('gperf len type is @0@'.format(gperf_len_type))
607 conf.set('GPERF_LEN_TYPE', gperf_len_type,
608 description : 'The type of gperf "len" parameter')
610 ############################################################
612 if not cc.has_header('sys/capability.h')
613 error('POSIX caps headers not found')
615 foreach header : ['crypt.h',
617 'linux/vm_sockets.h',
619 'valgrind/memcheck.h',
620 'valgrind/valgrind.h',
623 conf.set10('HAVE_' + header.underscorify().to_upper(),
624 cc.has_header(header))
627 ############################################################
629 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
630 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
631 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
633 default_hierarchy = get_option('default-hierarchy')
634 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
635 description : 'default cgroup hierarchy as string')
636 if default_hierarchy == 'legacy'
637 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
638 elif default_hierarchy == 'hybrid'
639 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
641 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
644 default_net_naming_scheme = get_option('default-net-naming-scheme')
645 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
647 time_epoch = get_option('time-epoch')
650 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
652 conf.set('TIME_EPOCH', time_epoch)
654 system_uid_max = get_option('system-uid-max')
655 if system_uid_max == -1
656 system_uid_max = run_command(
658 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
659 '/etc/login.defs').stdout().strip()
660 if system_uid_max == ''
663 system_uid_max = system_uid_max.to_int()
666 conf.set('SYSTEM_UID_MAX', system_uid_max)
667 substs.set('systemuidmax', system_uid_max)
669 system_gid_max = get_option('system-gid-max')
670 if system_gid_max == -1
671 system_gid_max = run_command(
673 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
674 '/etc/login.defs').stdout().strip()
675 if system_gid_max == ''
678 system_gid_max = system_gid_max.to_int()
681 conf.set('SYSTEM_GID_MAX', system_gid_max)
682 substs.set('systemgidmax', system_gid_max)
684 dynamic_uid_min = get_option('dynamic-uid-min')
685 dynamic_uid_max = get_option('dynamic-uid-max')
686 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
687 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
688 substs.set('dynamicuidmin', dynamic_uid_min)
689 substs.set('dynamicuidmax', dynamic_uid_max)
691 container_uid_base_min = get_option('container-uid-base-min')
692 container_uid_base_max = get_option('container-uid-base-max')
693 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
694 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
695 substs.set('containeruidbasemin', container_uid_base_min)
696 substs.set('containeruidbasemax', container_uid_base_max)
698 nobody_user = get_option('nobody-user')
699 nobody_group = get_option('nobody-group')
701 if not meson.is_cross_build()
702 getent_result = run_command('getent', 'passwd', '65534')
703 if getent_result.returncode() == 0
704 name = getent_result.stdout().split(':')[0]
705 if name != nobody_user
707 '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) +
708 'Your build will result in an user table setup that is incompatible with the local system.')
711 id_result = run_command('id', '-u', nobody_user)
712 if id_result.returncode() == 0
713 id = id_result.stdout().to_int()
716 '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) +
717 'Your build will result in an user table setup that is incompatible with the local system.')
721 getent_result = run_command('getent', 'group', '65534')
722 if getent_result.returncode() == 0
723 name = getent_result.stdout().split(':')[0]
724 if name != nobody_group
726 '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) +
727 'Your build will result in an group table setup that is incompatible with the local system.')
730 id_result = run_command('id', '-g', nobody_group)
731 if id_result.returncode() == 0
732 id = id_result.stdout().to_int()
735 '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) +
736 'Your build will result in an group table setup that is incompatible with the local system.')
740 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
742 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
743 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
746 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
747 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
748 substs.set('NOBODY_USER_NAME', nobody_user)
749 substs.set('NOBODY_GROUP_NAME', nobody_group)
751 tty_gid = get_option('tty-gid')
752 conf.set('TTY_GID', tty_gid)
753 substs.set('TTY_GID', tty_gid)
755 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
756 users_gid = get_option('users-gid')
757 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
759 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
760 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
762 dev_kvm_mode = get_option('dev-kvm-mode')
763 substs.set('DEV_KVM_MODE', dev_kvm_mode)
764 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
765 group_render_mode = get_option('group-render-mode')
766 substs.set('GROUP_RENDER_MODE', group_render_mode)
767 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
769 kill_user_processes = get_option('default-kill-user-processes')
770 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
771 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
772 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
774 dns_servers = get_option('dns-servers')
775 conf.set_quoted('DNS_SERVERS', dns_servers)
776 substs.set('DNS_SERVERS', dns_servers)
778 ntp_servers = get_option('ntp-servers')
779 conf.set_quoted('NTP_SERVERS', ntp_servers)
780 substs.set('NTP_SERVERS', ntp_servers)
782 default_locale = get_option('default-locale')
783 if default_locale == ''
784 if not meson.is_cross_build()
785 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
786 default_locale = run_command(choose_default_locale_sh).stdout().strip()
788 default_locale = 'C.UTF-8'
791 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
793 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
795 substs.set('SUSHELL', get_option('debug-shell'))
796 substs.set('DEBUGTTY', get_option('debug-tty'))
797 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
799 enable_debug_hashmap = false
800 enable_debug_mmap_cache = false
801 enable_debug_siphash = false
802 foreach name : get_option('debug-extra')
804 enable_debug_hashmap = true
805 elif name == 'mmap-cache'
806 enable_debug_mmap_cache = true
807 elif name == 'siphash'
808 enable_debug_siphash = true
810 message('unknown debug option "@0@", ignoring'.format(name))
813 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
814 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
815 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
817 conf.set10('VALGRIND', get_option('valgrind'))
818 conf.set10('LOG_TRACE', get_option('log-trace'))
820 #####################################################################
822 threads = dependency('threads')
823 librt = cc.find_library('rt')
824 libm = cc.find_library('m')
825 libdl = cc.find_library('dl')
826 libcrypt = cc.find_library('crypt')
828 libcap = dependency('libcap', required : false)
829 if not libcap.found()
830 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
831 libcap = cc.find_library('cap')
834 libmount = dependency('mount',
835 version : fuzzer_build ? '>= 0' : '>= 2.30')
837 want_seccomp = get_option('seccomp')
838 if want_seccomp != 'false' and not skip_deps
839 libseccomp = dependency('libseccomp',
840 version : '>= 2.3.1',
841 required : want_seccomp == 'true')
842 have = libseccomp.found()
847 conf.set10('HAVE_SECCOMP', have)
849 want_selinux = get_option('selinux')
850 if want_selinux != 'false' and not skip_deps
851 libselinux = dependency('libselinux',
852 version : '>= 2.1.9',
853 required : want_selinux == 'true')
854 have = libselinux.found()
859 conf.set10('HAVE_SELINUX', have)
861 want_apparmor = get_option('apparmor')
862 if want_apparmor != 'false' and not skip_deps
863 libapparmor = dependency('libapparmor',
864 required : want_apparmor == 'true')
865 have = libapparmor.found()
870 conf.set10('HAVE_APPARMOR', have)
872 smack_run_label = get_option('smack-run-label')
873 if smack_run_label != ''
874 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
877 want_polkit = get_option('polkit')
878 install_polkit = false
879 install_polkit_pkla = false
880 if want_polkit != 'false' and not skip_deps
881 install_polkit = true
883 libpolkit = dependency('polkit-gobject-1',
885 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
886 message('Old polkit detected, will install pkla files')
887 install_polkit_pkla = true
890 conf.set10('ENABLE_POLKIT', install_polkit)
892 want_acl = get_option('acl')
893 if want_acl != 'false' and not skip_deps
894 libacl = cc.find_library('acl', required : want_acl == 'true')
895 have = libacl.found()
900 conf.set10('HAVE_ACL', have)
902 want_audit = get_option('audit')
903 if want_audit != 'false' and not skip_deps
904 libaudit = dependency('audit', required : want_audit == 'true')
905 have = libaudit.found()
910 conf.set10('HAVE_AUDIT', have)
912 want_blkid = get_option('blkid')
913 if want_blkid != 'false' and not skip_deps
914 libblkid = dependency('blkid', required : want_blkid == 'true')
915 have = libblkid.found()
920 conf.set10('HAVE_BLKID', have)
922 want_kmod = get_option('kmod')
923 if want_kmod != 'false' and not skip_deps
924 libkmod = dependency('libkmod',
926 required : want_kmod == 'true')
927 have = libkmod.found()
932 conf.set10('HAVE_KMOD', have)
934 want_pam = get_option('pam')
935 if want_pam != 'false' and not skip_deps
936 libpam = cc.find_library('pam', required : want_pam == 'true')
937 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
938 have = libpam.found() and libpam_misc.found()
944 conf.set10('HAVE_PAM', have)
946 want_microhttpd = get_option('microhttpd')
947 if want_microhttpd != 'false' and not skip_deps
948 libmicrohttpd = dependency('libmicrohttpd',
949 version : '>= 0.9.33',
950 required : want_microhttpd == 'true')
951 have = libmicrohttpd.found()
956 conf.set10('HAVE_MICROHTTPD', have)
958 want_libcryptsetup = get_option('libcryptsetup')
959 if want_libcryptsetup != 'false' and not skip_deps
960 libcryptsetup = dependency('libcryptsetup',
961 version : '>= 1.6.0',
962 required : want_libcryptsetup == 'true')
963 have = libcryptsetup.found()
964 have_sector = cc.has_member(
965 'struct crypt_params_plain',
967 prefix : '#include <libcryptsetup.h>')
973 conf.set10('HAVE_LIBCRYPTSETUP', have)
974 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
976 want_libcurl = get_option('libcurl')
977 if want_libcurl != 'false' and not skip_deps
978 libcurl = dependency('libcurl',
979 version : '>= 7.32.0',
980 required : want_libcurl == 'true')
981 have = libcurl.found()
986 conf.set10('HAVE_LIBCURL', have)
988 want_libidn = get_option('libidn')
989 want_libidn2 = get_option('libidn2')
990 if want_libidn == 'true' and want_libidn2 == 'true'
991 error('libidn and libidn2 cannot be requested simultaneously')
994 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
995 libidn = dependency('libidn2',
996 required : want_libidn2 == 'true')
997 have = libidn.found()
1002 conf.set10('HAVE_LIBIDN2', have)
1003 if not have and want_libidn != 'false' and not skip_deps
1004 # libidn is used for both libidn and libidn2 objects
1005 libidn = dependency('libidn',
1006 required : want_libidn == 'true')
1007 have = libidn.found()
1011 conf.set10('HAVE_LIBIDN', have)
1013 want_libiptc = get_option('libiptc')
1014 if want_libiptc != 'false' and not skip_deps
1015 libiptc = dependency('libiptc',
1016 required : want_libiptc == 'true')
1017 have = libiptc.found()
1022 conf.set10('HAVE_LIBIPTC', have)
1024 want_qrencode = get_option('qrencode')
1025 if want_qrencode != 'false' and not skip_deps
1026 libqrencode = dependency('libqrencode',
1027 required : want_qrencode == 'true')
1028 have = libqrencode.found()
1033 conf.set10('HAVE_QRENCODE', have)
1035 want_gcrypt = get_option('gcrypt')
1036 if want_gcrypt != 'false' and not skip_deps
1037 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1038 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1039 have = libgcrypt.found() and libgpg_error.found()
1044 # link to neither of the libs if one is not found
1048 conf.set10('HAVE_GCRYPT', have)
1050 want_gnutls = get_option('gnutls')
1051 if want_gnutls != 'false' and not skip_deps
1052 libgnutls = dependency('gnutls',
1053 version : '>= 3.1.4',
1054 required : want_gnutls == 'true')
1055 have = libgnutls.found()
1060 conf.set10('HAVE_GNUTLS', have)
1062 want_openssl = get_option('openssl')
1063 if want_openssl != 'false' and not skip_deps
1064 libopenssl = dependency('openssl',
1065 version : '>= 1.1.0',
1066 required : want_openssl == 'true')
1067 have = libopenssl.found()
1072 conf.set10('HAVE_OPENSSL', have)
1074 want_elfutils = get_option('elfutils')
1075 if want_elfutils != 'false' and not skip_deps
1076 libdw = dependency('libdw',
1077 required : want_elfutils == 'true')
1078 have = libdw.found()
1083 conf.set10('HAVE_ELFUTILS', have)
1085 want_zlib = get_option('zlib')
1086 if want_zlib != 'false' and not skip_deps
1087 libz = dependency('zlib',
1088 required : want_zlib == 'true')
1094 conf.set10('HAVE_ZLIB', have)
1096 want_bzip2 = get_option('bzip2')
1097 if want_bzip2 != 'false' and not skip_deps
1098 libbzip2 = cc.find_library('bz2',
1099 required : want_bzip2 == 'true')
1100 have = libbzip2.found()
1105 conf.set10('HAVE_BZIP2', have)
1107 want_xz = get_option('xz')
1108 if want_xz != 'false' and not skip_deps
1109 libxz = dependency('liblzma',
1110 required : want_xz == 'true')
1111 have = libxz.found()
1116 conf.set10('HAVE_XZ', have)
1118 want_lz4 = get_option('lz4')
1119 if want_lz4 != 'false' and not skip_deps
1120 liblz4 = dependency('liblz4',
1121 version : '>= 1.3.0',
1122 required : want_lz4 == 'true')
1123 have = liblz4.found()
1128 conf.set10('HAVE_LZ4', have)
1130 want_xkbcommon = get_option('xkbcommon')
1131 if want_xkbcommon != 'false' and not skip_deps
1132 libxkbcommon = dependency('xkbcommon',
1133 version : '>= 0.3.0',
1134 required : want_xkbcommon == 'true')
1135 have = libxkbcommon.found()
1140 conf.set10('HAVE_XKBCOMMON', have)
1142 want_pcre2 = get_option('pcre2')
1143 if want_pcre2 != 'false'
1144 libpcre2 = dependency('libpcre2-8',
1145 required : want_pcre2 == 'true')
1146 have = libpcre2.found()
1151 conf.set10('HAVE_PCRE2', have)
1153 want_glib = get_option('glib')
1154 if want_glib != 'false' and not skip_deps
1155 libglib = dependency('glib-2.0',
1156 version : '>= 2.22.0',
1157 required : want_glib == 'true')
1158 libgobject = dependency('gobject-2.0',
1159 version : '>= 2.22.0',
1160 required : want_glib == 'true')
1161 libgio = dependency('gio-2.0',
1162 required : want_glib == 'true')
1163 have = libglib.found() and libgobject.found() and libgio.found()
1170 conf.set10('HAVE_GLIB', have)
1172 want_dbus = get_option('dbus')
1173 if want_dbus != 'false' and not skip_deps
1174 libdbus = dependency('dbus-1',
1175 version : '>= 1.3.2',
1176 required : want_dbus == 'true')
1177 have = libdbus.found()
1182 conf.set10('HAVE_DBUS', have)
1184 default_dnssec = get_option('default-dnssec')
1186 default_dnssec = 'no'
1188 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1189 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1190 default_dnssec = 'no'
1192 conf.set('DEFAULT_DNSSEC_MODE',
1193 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1194 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1196 dns_over_tls = get_option('dns-over-tls')
1197 if dns_over_tls != 'false'
1198 if dns_over_tls == 'openssl'
1201 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1202 if dns_over_tls == 'gnutls' and not have_gnutls
1203 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1206 if dns_over_tls == 'gnutls' or have_gnutls
1207 have_openssl = false
1209 have_openssl = conf.get('HAVE_OPENSSL') == 1
1210 if dns_over_tls != 'auto' and not have_openssl
1211 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1212 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1215 have = have_gnutls or have_openssl
1219 have_openssl = false
1221 conf.set10('ENABLE_DNS_OVER_TLS', have)
1222 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1223 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1225 default_dns_over_tls = get_option('default-dns-over-tls')
1227 default_dns_over_tls = 'no'
1229 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1230 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.')
1231 default_dns_over_tls = 'no'
1233 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1234 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1235 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1237 want_importd = get_option('importd')
1238 if want_importd != 'false'
1239 have = (conf.get('HAVE_LIBCURL') == 1 and
1240 conf.get('HAVE_ZLIB') == 1 and
1241 conf.get('HAVE_XZ') == 1 and
1242 conf.get('HAVE_GCRYPT') == 1)
1243 if want_importd == 'true' and not have
1244 error('importd support was requested, but dependencies are not available')
1249 conf.set10('ENABLE_IMPORTD', have)
1251 want_remote = get_option('remote')
1252 if want_remote != 'false'
1253 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1254 conf.get('HAVE_LIBCURL') == 1]
1255 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1256 # it's possible to build one without the other. Complain only if
1257 # support was explicitly requested. The auxiliary files like sysusers
1258 # config should be installed when any of the programs are built.
1259 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1260 error('remote support was requested, but dependencies are not available')
1262 have = have_deps[0] or have_deps[1]
1266 conf.set10('ENABLE_REMOTE', have)
1268 foreach term : ['utmp',
1300 have = get_option(term)
1301 name = 'ENABLE_' + term.underscorify().to_upper()
1302 conf.set10(name, have)
1305 foreach tuple : [['nss-mymachines', 'machined'],
1306 ['nss-resolve', 'resolve']]
1307 want = get_option(tuple[0])
1309 have = get_option(tuple[1])
1310 if want == 'true' and not have
1311 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1316 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1317 conf.set10(name, have)
1321 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1322 'ENABLE_NSS_MYMACHINES',
1323 'ENABLE_NSS_RESOLVE',
1324 'ENABLE_NSS_SYSTEMD']
1325 if conf.get(term) == 1
1329 conf.set10('ENABLE_NSS', enable_nss)
1331 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1336 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1338 #####################################################################
1340 if get_option('efi')
1341 efi_arch = host_machine.cpu_family()
1343 if efi_arch == 'x86'
1344 EFI_MACHINE_TYPE_NAME = 'ia32'
1345 gnu_efi_arch = 'ia32'
1346 elif efi_arch == 'x86_64'
1347 EFI_MACHINE_TYPE_NAME = 'x64'
1348 gnu_efi_arch = 'x86_64'
1349 elif efi_arch == 'arm'
1350 EFI_MACHINE_TYPE_NAME = 'arm'
1351 gnu_efi_arch = 'arm'
1352 elif efi_arch == 'aarch64'
1353 EFI_MACHINE_TYPE_NAME = 'aa64'
1354 gnu_efi_arch = 'aarch64'
1356 EFI_MACHINE_TYPE_NAME = ''
1361 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1363 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1367 conf.set10('ENABLE_EFI', have)
1369 #####################################################################
1371 config_h = configure_file(
1372 output : 'config.h',
1373 configuration : conf)
1375 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1377 includes = include_directories('src/basic',
1382 'src/journal-remote',
1386 'src/time-wait-sync',
1392 'src/libsystemd/sd-bus',
1393 'src/libsystemd/sd-device',
1394 'src/libsystemd/sd-event',
1395 'src/libsystemd/sd-hwdb',
1396 'src/libsystemd/sd-id128',
1397 'src/libsystemd/sd-netlink',
1398 'src/libsystemd/sd-network',
1399 'src/libsystemd/sd-resolve',
1400 'src/libsystemd-network',
1403 add_project_arguments('-include', 'config.h', language : 'c')
1405 generate_gperfs = find_program('tools/generate-gperfs.py')
1409 subdir('src/systemd')
1411 subdir('src/libsystemd')
1412 subdir('src/libsystemd-network')
1413 subdir('src/journal')
1416 libjournal_core = static_library(
1418 libjournal_core_sources,
1420 include_directories : includes,
1423 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1424 libsystemd = shared_library(
1427 version : libsystemd_version,
1428 include_directories : includes,
1429 link_args : ['-shared',
1430 '-Wl,--version-script=' + libsystemd_sym_path],
1431 link_with : [libbasic,
1433 link_whole : [libsystemd_static,
1435 dependencies : [threads,
1439 link_depends : libsystemd_sym,
1441 install_dir : rootlibdir)
1443 static_libsystemd = get_option('static-libsystemd')
1444 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1446 install_libsystemd_static = static_library(
1449 journal_client_sources,
1451 basic_gcrypt_sources,
1453 include_directories : includes,
1454 build_by_default : static_libsystemd != 'false',
1455 install : static_libsystemd != 'false',
1456 install_dir : rootlibdir,
1457 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1458 dependencies : [threads,
1467 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1469 ############################################################
1471 # binaries that have --help and are intended for use by humans,
1472 # usually, but not always, installed in /bin.
1473 public_programs = []
1475 subdir('src/libudev')
1476 subdir('src/shared')
1478 subdir('src/shutdown')
1480 subdir('src/network')
1482 subdir('src/analyze')
1483 subdir('src/journal-remote')
1484 subdir('src/coredump')
1485 subdir('src/hostname')
1486 subdir('src/import')
1487 subdir('src/kernel-install')
1488 subdir('src/locale')
1489 subdir('src/machine')
1490 subdir('src/portable')
1491 subdir('src/nspawn')
1492 subdir('src/resolve')
1493 subdir('src/timedate')
1494 subdir('src/timesync')
1495 subdir('src/vconsole')
1496 subdir('src/boot/efi')
1503 ############################################################
1505 # only static linking apart from libdl, to make sure that the
1506 # module is linked to all libraries that it uses.
1507 test_dlopen = executable(
1511 include_directories : includes,
1512 link_with : [libbasic],
1513 dependencies : [libdl],
1514 build_by_default : want_tests != 'false')
1516 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1517 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1518 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1519 ['resolve', 'ENABLE_NSS_RESOLVE']]
1521 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1525 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1526 version_script_arg = join_paths(project_source_root, sym)
1528 nss = shared_library(
1530 'src/nss-@0@/nss-@0@.c'.format(module),
1533 include_directories : includes,
1534 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1535 link_args : ['-Wl,-z,nodelete',
1537 '-Wl,--version-script=' + version_script_arg],
1538 link_with : [libsystemd_static,
1540 dependencies : [threads,
1544 install_dir : rootlibdir)
1546 # We cannot use shared_module because it does not support version suffix.
1547 # Unfortunately shared_library insists on creating the symlink…
1548 meson.add_install_script('sh', '-c',
1549 'rm $DESTDIR@0@/libnss_@1@.so'
1550 .format(rootlibdir, module))
1552 if want_tests != 'false'
1553 test('dlopen-nss_' + module,
1555 # path to dlopen must include a slash
1556 args : nss.full_path())
1561 ############################################################
1563 executable('systemd',
1565 include_directories : includes,
1566 link_with : [libcore,
1568 dependencies : [versiondep,
1575 install_rpath : rootlibexecdir,
1577 install_dir : rootlibexecdir)
1579 meson.add_install_script(meson_make_symlink,
1580 join_paths(rootlibexecdir, 'systemd'),
1581 join_paths(rootsbindir, 'init'))
1583 exe = executable('systemd-analyze',
1584 systemd_analyze_sources,
1585 include_directories : includes,
1586 link_with : [libcore,
1588 dependencies : [versiondep,
1595 install_rpath : rootlibexecdir,
1597 public_programs += exe
1599 executable('systemd-journald',
1600 systemd_journald_sources,
1601 include_directories : includes,
1602 link_with : [libjournal_core,
1604 dependencies : [threads,
1608 install_rpath : rootlibexecdir,
1610 install_dir : rootlibexecdir)
1612 exe = executable('systemd-cat',
1613 systemd_cat_sources,
1614 include_directories : includes,
1615 link_with : [libjournal_core,
1617 dependencies : [threads],
1618 install_rpath : rootlibexecdir,
1620 public_programs += exe
1622 exe = executable('journalctl',
1624 include_directories : includes,
1625 link_with : [libshared],
1626 dependencies : [threads,
1631 install_rpath : rootlibexecdir,
1633 install_dir : rootbindir)
1634 public_programs += exe
1636 executable('systemd-getty-generator',
1637 'src/getty-generator/getty-generator.c',
1638 include_directories : includes,
1639 link_with : [libshared],
1640 install_rpath : rootlibexecdir,
1642 install_dir : systemgeneratordir)
1644 executable('systemd-debug-generator',
1645 'src/debug-generator/debug-generator.c',
1646 include_directories : includes,
1647 link_with : [libshared],
1648 install_rpath : rootlibexecdir,
1650 install_dir : systemgeneratordir)
1652 executable('systemd-run-generator',
1653 'src/run-generator/run-generator.c',
1654 include_directories : includes,
1655 link_with : [libshared],
1656 install_rpath : rootlibexecdir,
1658 install_dir : systemgeneratordir)
1660 executable('systemd-fstab-generator',
1661 'src/fstab-generator/fstab-generator.c',
1662 include_directories : includes,
1663 link_with : [libcore_shared,
1665 install_rpath : rootlibexecdir,
1667 install_dir : systemgeneratordir)
1669 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1670 executable('30-systemd-environment-d-generator',
1671 'src/environment-d-generator/environment-d-generator.c',
1672 include_directories : includes,
1673 link_with : [libshared],
1674 install_rpath : rootlibexecdir,
1676 install_dir : userenvgeneratordir)
1678 meson.add_install_script(meson_make_symlink,
1679 join_paths(sysconfdir, 'environment'),
1680 join_paths(environmentdir, '99-environment.conf'))
1683 if conf.get('ENABLE_HIBERNATE') == 1
1684 executable('systemd-hibernate-resume-generator',
1685 'src/hibernate-resume/hibernate-resume-generator.c',
1686 include_directories : includes,
1687 link_with : [libshared],
1688 install_rpath : rootlibexecdir,
1690 install_dir : systemgeneratordir)
1692 executable('systemd-hibernate-resume',
1693 'src/hibernate-resume/hibernate-resume.c',
1694 include_directories : includes,
1695 link_with : [libshared],
1696 install_rpath : rootlibexecdir,
1698 install_dir : rootlibexecdir)
1701 if conf.get('HAVE_BLKID') == 1
1702 executable('systemd-gpt-auto-generator',
1703 'src/gpt-auto-generator/gpt-auto-generator.c',
1704 'src/shared/blkid-util.h',
1705 include_directories : includes,
1706 link_with : [libshared],
1707 dependencies : libblkid,
1708 install_rpath : rootlibexecdir,
1710 install_dir : systemgeneratordir)
1712 exe = executable('systemd-dissect',
1713 'src/dissect/dissect.c',
1714 include_directories : includes,
1715 link_with : [libshared],
1716 install_rpath : rootlibexecdir,
1718 install_dir : rootlibexecdir)
1719 public_programs += exe
1722 if conf.get('ENABLE_RESOLVE') == 1
1723 executable('systemd-resolved',
1724 systemd_resolved_sources,
1725 include_directories : includes,
1726 link_with : [libshared,
1728 libsystemd_resolve_core],
1729 dependencies : systemd_resolved_dependencies,
1730 install_rpath : rootlibexecdir,
1732 install_dir : rootlibexecdir)
1734 exe = executable('resolvectl',
1736 include_directories : includes,
1737 link_with : [libshared,
1739 libsystemd_resolve_core],
1740 dependencies : [threads,
1744 install_rpath : rootlibexecdir,
1746 public_programs += exe
1748 meson.add_install_script(meson_make_symlink,
1749 join_paths(bindir, 'resolvectl'),
1750 join_paths(rootsbindir, 'resolvconf'))
1752 meson.add_install_script(meson_make_symlink,
1753 join_paths(bindir, 'resolvectl'),
1754 join_paths(bindir, 'systemd-resolve'))
1757 if conf.get('ENABLE_LOGIND') == 1
1758 executable('systemd-logind',
1759 systemd_logind_sources,
1760 include_directories : includes,
1761 link_with : [liblogind_core,
1763 dependencies : [threads,
1765 install_rpath : rootlibexecdir,
1767 install_dir : rootlibexecdir)
1769 exe = executable('loginctl',
1771 include_directories : includes,
1772 link_with : [libshared],
1773 dependencies : [threads,
1776 install_rpath : rootlibexecdir,
1778 install_dir : rootbindir)
1779 public_programs += exe
1781 exe = executable('systemd-inhibit',
1782 'src/login/inhibit.c',
1783 include_directories : includes,
1784 link_with : [libshared],
1785 install_rpath : rootlibexecdir,
1787 install_dir : rootbindir)
1788 public_programs += exe
1790 if conf.get('HAVE_PAM') == 1
1791 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1792 pam_systemd = shared_library(
1796 include_directories : includes,
1797 link_args : ['-shared',
1798 '-Wl,--version-script=' + version_script_arg],
1799 link_with : [libsystemd_static,
1801 dependencies : [threads,
1804 link_depends : pam_systemd_sym,
1806 install_dir : pamlibdir)
1808 if want_tests != 'false'
1809 test('dlopen-pam_systemd',
1811 # path to dlopen must include a slash
1812 args : pam_systemd.full_path())
1816 executable('systemd-user-runtime-dir',
1817 user_runtime_dir_sources,
1818 include_directories : includes,
1819 link_with : [libshared],
1820 install_rpath : rootlibexecdir,
1822 install_dir : rootlibexecdir)
1825 if conf.get('HAVE_PAM') == 1
1826 executable('systemd-user-sessions',
1827 'src/user-sessions/user-sessions.c',
1828 include_directories : includes,
1829 link_with : [libshared],
1830 install_rpath : rootlibexecdir,
1832 install_dir : rootlibexecdir)
1835 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1836 exe = executable('bootctl',
1837 'src/boot/bootctl.c',
1838 include_directories : includes,
1839 link_with : [libshared],
1840 dependencies : [libblkid],
1841 install_rpath : rootlibexecdir,
1843 public_programs += exe
1845 executable('systemd-bless-boot',
1846 'src/boot/bless-boot.c',
1847 include_directories : includes,
1848 link_with : [libshared],
1849 dependencies : [libblkid],
1850 install_rpath : rootlibexecdir,
1852 install_dir : rootlibexecdir)
1854 executable('systemd-bless-boot-generator',
1855 'src/boot/bless-boot-generator.c',
1856 include_directories : includes,
1857 link_with : [libshared],
1858 install_rpath : rootlibexecdir,
1860 install_dir : systemgeneratordir)
1863 executable('systemd-boot-check-no-failures',
1864 'src/boot/boot-check-no-failures.c',
1865 include_directories : includes,
1866 link_with : [libshared],
1867 dependencies : [libblkid],
1868 install_rpath : rootlibexecdir,
1870 install_dir : rootlibexecdir)
1872 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1873 include_directories : includes,
1874 link_with : [libshared],
1875 dependencies : [threads],
1876 install_rpath : rootlibexecdir,
1878 public_programs += exe
1881 if get_option('link-systemctl-shared')
1882 systemctl_link_with = [libshared]
1884 systemctl_link_with = [libsystemd_static,
1890 exe = executable('systemctl',
1891 'src/systemctl/systemctl.c',
1892 'src/systemctl/sysv-compat.h',
1893 'src/systemctl/sysv-compat.c',
1894 include_directories : includes,
1895 link_with : systemctl_link_with,
1896 dependencies : [threads,
1901 install_rpath : rootlibexecdir,
1903 install_dir : rootbindir)
1904 public_programs += exe
1906 if conf.get('ENABLE_PORTABLED') == 1
1907 executable('systemd-portabled',
1908 systemd_portabled_sources,
1909 include_directories : includes,
1910 link_with : [libshared],
1911 dependencies : [threads],
1912 install_rpath : rootlibexecdir,
1914 install_dir : rootlibexecdir)
1916 exe = executable('portablectl', 'src/portable/portablectl.c',
1917 include_directories : includes,
1918 link_with : [libshared],
1919 dependencies : [threads],
1920 install_rpath : rootlibexecdir,
1922 install_dir : rootbindir)
1923 public_programs += exe
1926 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1927 meson.add_install_script(meson_make_symlink,
1928 join_paths(rootbindir, 'systemctl'),
1929 join_paths(rootsbindir, alias))
1932 if conf.get('ENABLE_BACKLIGHT') == 1
1933 executable('systemd-backlight',
1934 'src/backlight/backlight.c',
1935 include_directories : includes,
1936 link_with : [libshared],
1937 install_rpath : rootlibexecdir,
1939 install_dir : rootlibexecdir)
1942 if conf.get('ENABLE_RFKILL') == 1
1943 executable('systemd-rfkill',
1944 'src/rfkill/rfkill.c',
1945 include_directories : includes,
1946 link_with : [libshared],
1947 install_rpath : rootlibexecdir,
1949 install_dir : rootlibexecdir)
1952 executable('systemd-system-update-generator',
1953 'src/system-update-generator/system-update-generator.c',
1954 include_directories : includes,
1955 link_with : [libshared],
1956 install_rpath : rootlibexecdir,
1958 install_dir : systemgeneratordir)
1960 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1961 executable('systemd-cryptsetup',
1962 'src/cryptsetup/cryptsetup.c',
1963 include_directories : includes,
1964 link_with : [libshared],
1965 dependencies : [libcryptsetup],
1966 install_rpath : rootlibexecdir,
1968 install_dir : rootlibexecdir)
1970 executable('systemd-cryptsetup-generator',
1971 'src/cryptsetup/cryptsetup-generator.c',
1972 include_directories : includes,
1973 link_with : [libshared],
1974 dependencies : [libcryptsetup],
1975 install_rpath : rootlibexecdir,
1977 install_dir : systemgeneratordir)
1979 executable('systemd-veritysetup',
1980 'src/veritysetup/veritysetup.c',
1981 include_directories : includes,
1982 link_with : [libshared],
1983 dependencies : [libcryptsetup],
1984 install_rpath : rootlibexecdir,
1986 install_dir : rootlibexecdir)
1988 executable('systemd-veritysetup-generator',
1989 'src/veritysetup/veritysetup-generator.c',
1990 include_directories : includes,
1991 link_with : [libshared],
1992 dependencies : [libcryptsetup],
1993 install_rpath : rootlibexecdir,
1995 install_dir : systemgeneratordir)
1998 if conf.get('HAVE_SYSV_COMPAT') == 1
1999 executable('systemd-sysv-generator',
2000 'src/sysv-generator/sysv-generator.c',
2001 include_directories : includes,
2002 link_with : [libshared],
2003 install_rpath : rootlibexecdir,
2005 install_dir : systemgeneratordir)
2007 executable('systemd-rc-local-generator',
2008 'src/rc-local-generator/rc-local-generator.c',
2009 include_directories : includes,
2010 link_with : [libshared],
2011 install_rpath : rootlibexecdir,
2013 install_dir : systemgeneratordir)
2016 if conf.get('ENABLE_HOSTNAMED') == 1
2017 executable('systemd-hostnamed',
2018 'src/hostname/hostnamed.c',
2019 include_directories : includes,
2020 link_with : [libshared],
2021 install_rpath : rootlibexecdir,
2023 install_dir : rootlibexecdir)
2025 exe = executable('hostnamectl',
2026 'src/hostname/hostnamectl.c',
2027 include_directories : includes,
2028 link_with : [libshared],
2029 install_rpath : rootlibexecdir,
2031 public_programs += exe
2034 if conf.get('ENABLE_LOCALED') == 1
2035 if conf.get('HAVE_XKBCOMMON') == 1
2036 # logind will load libxkbcommon.so dynamically on its own
2042 executable('systemd-localed',
2043 systemd_localed_sources,
2044 include_directories : includes,
2045 link_with : [libshared],
2046 dependencies : deps,
2047 install_rpath : rootlibexecdir,
2049 install_dir : rootlibexecdir)
2051 exe = executable('localectl',
2053 include_directories : includes,
2054 link_with : [libshared],
2055 install_rpath : rootlibexecdir,
2057 public_programs += exe
2060 if conf.get('ENABLE_TIMEDATED') == 1
2061 executable('systemd-timedated',
2062 'src/timedate/timedated.c',
2063 include_directories : includes,
2064 link_with : [libshared],
2065 install_rpath : rootlibexecdir,
2067 install_dir : rootlibexecdir)
2070 if conf.get('ENABLE_TIMEDATECTL') == 1
2071 exe = executable('timedatectl',
2072 'src/timedate/timedatectl.c',
2073 include_directories : includes,
2074 install_rpath : rootlibexecdir,
2075 link_with : [libshared],
2076 dependencies : [libm],
2078 public_programs += exe
2081 if conf.get('ENABLE_TIMESYNCD') == 1
2082 executable('systemd-timesyncd',
2083 systemd_timesyncd_sources,
2084 include_directories : includes,
2085 link_with : [libshared],
2086 dependencies : [threads,
2088 install_rpath : rootlibexecdir,
2090 install_dir : rootlibexecdir)
2092 executable('systemd-time-wait-sync',
2093 'src/time-wait-sync/time-wait-sync.c',
2094 include_directories : includes,
2095 link_with : [libshared],
2096 install_rpath : rootlibexecdir,
2098 install_dir : rootlibexecdir)
2101 if conf.get('ENABLE_MACHINED') == 1
2102 executable('systemd-machined',
2103 systemd_machined_sources,
2104 include_directories : includes,
2105 link_with : [libmachine_core,
2107 install_rpath : rootlibexecdir,
2109 install_dir : rootlibexecdir)
2111 exe = executable('machinectl',
2112 'src/machine/machinectl.c',
2113 include_directories : includes,
2114 link_with : [libshared],
2115 dependencies : [threads,
2118 install_rpath : rootlibexecdir,
2120 install_dir : rootbindir)
2121 public_programs += exe
2124 if conf.get('ENABLE_IMPORTD') == 1
2125 executable('systemd-importd',
2126 systemd_importd_sources,
2127 include_directories : includes,
2128 link_with : [libshared],
2129 dependencies : [threads],
2130 install_rpath : rootlibexecdir,
2132 install_dir : rootlibexecdir)
2134 systemd_pull = executable('systemd-pull',
2135 systemd_pull_sources,
2136 include_directories : includes,
2137 link_with : [libshared],
2138 dependencies : [versiondep,
2144 install_rpath : rootlibexecdir,
2146 install_dir : rootlibexecdir)
2148 systemd_import = executable('systemd-import',
2149 systemd_import_sources,
2150 include_directories : includes,
2151 link_with : [libshared],
2152 dependencies : [libcurl,
2156 install_rpath : rootlibexecdir,
2158 install_dir : rootlibexecdir)
2160 systemd_import_fs = executable('systemd-import-fs',
2161 systemd_import_fs_sources,
2162 include_directories : includes,
2163 link_with : [libshared],
2164 install_rpath : rootlibexecdir,
2166 install_dir : rootlibexecdir)
2168 systemd_export = executable('systemd-export',
2169 systemd_export_sources,
2170 include_directories : includes,
2171 link_with : [libshared],
2172 dependencies : [libcurl,
2176 install_rpath : rootlibexecdir,
2178 install_dir : rootlibexecdir)
2180 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2183 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2184 exe = executable('systemd-journal-upload',
2185 systemd_journal_upload_sources,
2186 include_directories : includes,
2187 link_with : [libshared],
2188 dependencies : [versiondep,
2194 install_rpath : rootlibexecdir,
2196 install_dir : rootlibexecdir)
2197 public_programs += exe
2200 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2201 s_j_remote = executable('systemd-journal-remote',
2202 systemd_journal_remote_sources,
2203 include_directories : includes,
2204 link_with : [libshared,
2205 libsystemd_journal_remote],
2206 dependencies : [threads,
2211 install_rpath : rootlibexecdir,
2213 install_dir : rootlibexecdir)
2215 s_j_gatewayd = executable('systemd-journal-gatewayd',
2216 systemd_journal_gatewayd_sources,
2217 include_directories : includes,
2218 link_with : [libshared],
2219 dependencies : [threads,
2224 install_rpath : rootlibexecdir,
2226 install_dir : rootlibexecdir)
2227 public_programs += [s_j_remote, s_j_gatewayd]
2230 if conf.get('ENABLE_COREDUMP') == 1
2231 executable('systemd-coredump',
2232 systemd_coredump_sources,
2233 include_directories : includes,
2234 link_with : [libshared],
2235 dependencies : [threads,
2240 install_rpath : rootlibexecdir,
2242 install_dir : rootlibexecdir)
2244 exe = executable('coredumpctl',
2245 coredumpctl_sources,
2246 include_directories : includes,
2247 link_with : [libshared],
2248 dependencies : [threads,
2251 install_rpath : rootlibexecdir,
2253 public_programs += exe
2256 if conf.get('ENABLE_BINFMT') == 1
2257 exe = executable('systemd-binfmt',
2258 'src/binfmt/binfmt.c',
2259 include_directories : includes,
2260 link_with : [libshared],
2261 install_rpath : rootlibexecdir,
2263 install_dir : rootlibexecdir)
2264 public_programs += exe
2266 meson.add_install_script('sh', '-c',
2267 mkdir_p.format(binfmtdir))
2268 meson.add_install_script('sh', '-c',
2269 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2272 if conf.get('ENABLE_VCONSOLE') == 1
2273 executable('systemd-vconsole-setup',
2274 'src/vconsole/vconsole-setup.c',
2275 include_directories : includes,
2276 link_with : [libshared],
2277 install_rpath : rootlibexecdir,
2279 install_dir : rootlibexecdir)
2282 if conf.get('ENABLE_RANDOMSEED') == 1
2283 executable('systemd-random-seed',
2284 'src/random-seed/random-seed.c',
2285 include_directories : includes,
2286 link_with : [libshared],
2287 install_rpath : rootlibexecdir,
2289 install_dir : rootlibexecdir)
2292 if conf.get('ENABLE_FIRSTBOOT') == 1
2293 executable('systemd-firstboot',
2294 'src/firstboot/firstboot.c',
2295 include_directories : includes,
2296 link_with : [libshared],
2297 dependencies : [libcrypt],
2298 install_rpath : rootlibexecdir,
2300 install_dir : rootbindir)
2303 executable('systemd-remount-fs',
2304 'src/remount-fs/remount-fs.c',
2305 include_directories : includes,
2306 link_with : [libcore_shared,
2308 install_rpath : rootlibexecdir,
2310 install_dir : rootlibexecdir)
2312 executable('systemd-machine-id-setup',
2313 'src/machine-id-setup/machine-id-setup-main.c',
2314 include_directories : includes,
2315 link_with : [libcore_shared,
2317 install_rpath : rootlibexecdir,
2319 install_dir : rootbindir)
2321 executable('systemd-fsck',
2323 include_directories : includes,
2324 link_with : [libshared],
2325 install_rpath : rootlibexecdir,
2327 install_dir : rootlibexecdir)
2329 executable('systemd-growfs',
2330 'src/partition/growfs.c',
2331 include_directories : includes,
2332 link_with : [libshared],
2333 dependencies : [libcryptsetup],
2334 install_rpath : rootlibexecdir,
2336 install_dir : rootlibexecdir)
2338 executable('systemd-makefs',
2339 'src/partition/makefs.c',
2340 include_directories : includes,
2341 link_with : [libshared],
2342 install_rpath : rootlibexecdir,
2344 install_dir : rootlibexecdir)
2346 executable('systemd-sleep',
2347 'src/sleep/sleep.c',
2348 include_directories : includes,
2349 link_with : [libshared],
2350 install_rpath : rootlibexecdir,
2352 install_dir : rootlibexecdir)
2354 install_data('src/sleep/sleep.conf',
2355 install_dir : pkgsysconfdir)
2357 exe = executable('systemd-sysctl',
2358 'src/sysctl/sysctl.c',
2359 include_directories : includes,
2360 link_with : [libshared],
2361 install_rpath : rootlibexecdir,
2363 install_dir : rootlibexecdir)
2364 public_programs += exe
2366 executable('systemd-ac-power',
2367 'src/ac-power/ac-power.c',
2368 include_directories : includes,
2369 link_with : [libshared],
2370 install_rpath : rootlibexecdir,
2372 install_dir : rootlibexecdir)
2374 exe = executable('systemd-detect-virt',
2375 'src/detect-virt/detect-virt.c',
2376 include_directories : includes,
2377 link_with : [libshared],
2378 install_rpath : rootlibexecdir,
2380 public_programs += exe
2382 exe = executable('systemd-delta',
2383 'src/delta/delta.c',
2384 include_directories : includes,
2385 link_with : [libshared],
2386 install_rpath : rootlibexecdir,
2388 public_programs += exe
2390 exe = executable('systemd-escape',
2391 'src/escape/escape.c',
2392 include_directories : includes,
2393 link_with : [libshared],
2394 install_rpath : rootlibexecdir,
2396 install_dir : rootbindir)
2397 public_programs += exe
2399 exe = executable('systemd-notify',
2400 'src/notify/notify.c',
2401 include_directories : includes,
2402 link_with : [libshared],
2403 install_rpath : rootlibexecdir,
2405 install_dir : rootbindir)
2406 public_programs += exe
2408 executable('systemd-volatile-root',
2409 'src/volatile-root/volatile-root.c',
2410 include_directories : includes,
2411 link_with : [libshared],
2412 install_rpath : rootlibexecdir,
2414 install_dir : rootlibexecdir)
2416 executable('systemd-cgroups-agent',
2417 'src/cgroups-agent/cgroups-agent.c',
2418 include_directories : includes,
2419 link_with : [libshared],
2420 install_rpath : rootlibexecdir,
2422 install_dir : rootlibexecdir)
2424 exe = executable('systemd-id128',
2425 'src/id128/id128.c',
2426 include_directories : includes,
2427 link_with : [libshared],
2428 install_rpath : rootlibexecdir,
2430 public_programs += exe
2432 exe = executable('systemd-path',
2434 include_directories : includes,
2435 link_with : [libshared],
2436 install_rpath : rootlibexecdir,
2438 public_programs += exe
2440 exe = executable('systemd-ask-password',
2441 'src/ask-password/ask-password.c',
2442 include_directories : includes,
2443 link_with : [libshared],
2444 install_rpath : rootlibexecdir,
2446 install_dir : rootbindir)
2447 public_programs += exe
2449 executable('systemd-reply-password',
2450 'src/reply-password/reply-password.c',
2451 include_directories : includes,
2452 link_with : [libshared],
2453 install_rpath : rootlibexecdir,
2455 install_dir : rootlibexecdir)
2457 exe = executable('systemd-tty-ask-password-agent',
2458 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2459 include_directories : includes,
2460 link_with : [libshared],
2461 install_rpath : rootlibexecdir,
2463 install_dir : rootbindir)
2464 public_programs += exe
2466 exe = executable('systemd-cgls',
2468 include_directories : includes,
2469 link_with : [libshared],
2470 install_rpath : rootlibexecdir,
2472 public_programs += exe
2474 exe = executable('systemd-cgtop',
2475 'src/cgtop/cgtop.c',
2476 include_directories : includes,
2477 link_with : [libshared],
2478 install_rpath : rootlibexecdir,
2480 public_programs += exe
2482 executable('systemd-initctl',
2483 'src/initctl/initctl.c',
2484 include_directories : includes,
2485 link_with : [libshared],
2486 install_rpath : rootlibexecdir,
2488 install_dir : rootlibexecdir)
2490 exe = executable('systemd-mount',
2491 'src/mount/mount-tool.c',
2492 include_directories : includes,
2493 link_with : [libshared],
2494 dependencies: [libmount],
2495 install_rpath : rootlibexecdir,
2497 public_programs += exe
2499 meson.add_install_script(meson_make_symlink,
2500 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2502 exe = executable('systemd-run',
2504 include_directories : includes,
2505 link_with : [libshared],
2506 install_rpath : rootlibexecdir,
2508 public_programs += exe
2510 exe = executable('systemd-stdio-bridge',
2511 'src/stdio-bridge/stdio-bridge.c',
2512 include_directories : includes,
2513 link_with : [libshared],
2514 dependencies : [versiondep],
2515 install_rpath : rootlibexecdir,
2517 public_programs += exe
2519 exe = executable('busctl',
2520 'src/busctl/busctl.c',
2521 'src/busctl/busctl-introspect.c',
2522 'src/busctl/busctl-introspect.h',
2523 include_directories : includes,
2524 link_with : [libshared],
2525 install_rpath : rootlibexecdir,
2527 public_programs += exe
2529 if conf.get('ENABLE_SYSUSERS') == 1
2530 exe = executable('systemd-sysusers',
2531 'src/sysusers/sysusers.c',
2532 include_directories : includes,
2533 link_with : [libshared],
2534 install_rpath : rootlibexecdir,
2536 install_dir : rootbindir)
2537 public_programs += exe
2540 if conf.get('ENABLE_TMPFILES') == 1
2541 exe = executable('systemd-tmpfiles',
2542 'src/tmpfiles/tmpfiles.c',
2543 include_directories : includes,
2544 link_with : [libshared],
2545 dependencies : [libacl],
2546 install_rpath : rootlibexecdir,
2548 install_dir : rootbindir)
2549 public_programs += exe
2551 if want_tests != 'false'
2552 test('test-systemd-tmpfiles',
2553 test_systemd_tmpfiles_py,
2554 # https://github.com/mesonbuild/meson/issues/2681
2555 args : exe.full_path())
2559 if conf.get('ENABLE_HWDB') == 1
2560 exe = executable('systemd-hwdb',
2562 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2563 include_directories : includes,
2564 link_with : [libudev_static],
2565 install_rpath : udev_rpath,
2567 install_dir : rootbindir)
2568 public_programs += exe
2571 if conf.get('ENABLE_QUOTACHECK') == 1
2572 executable('systemd-quotacheck',
2573 'src/quotacheck/quotacheck.c',
2574 include_directories : includes,
2575 link_with : [libshared],
2576 install_rpath : rootlibexecdir,
2578 install_dir : rootlibexecdir)
2581 exe = executable('systemd-socket-proxyd',
2582 'src/socket-proxy/socket-proxyd.c',
2583 include_directories : includes,
2584 link_with : [libshared],
2585 dependencies : [threads],
2586 install_rpath : rootlibexecdir,
2588 install_dir : rootlibexecdir)
2589 public_programs += exe
2591 exe = executable('systemd-udevd',
2592 systemd_udevd_sources,
2593 include_directories : includes,
2594 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2595 link_with : [libudev_core,
2598 dependencies : [versiondep,
2604 install_rpath : udev_rpath,
2606 install_dir : rootlibexecdir)
2607 public_programs += exe
2609 exe = executable('udevadm',
2611 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2612 include_directories : includes,
2613 link_with : [libudev_core,
2616 dependencies : [versiondep,
2622 install_rpath : udev_rpath,
2624 install_dir : rootbindir)
2625 public_programs += exe
2627 executable('systemd-shutdown',
2628 systemd_shutdown_sources,
2629 include_directories : includes,
2630 link_with : [libcore_shared,
2632 dependencies : [libmount],
2633 install_rpath : rootlibexecdir,
2635 install_dir : rootlibexecdir)
2637 executable('systemd-update-done',
2638 'src/update-done/update-done.c',
2639 include_directories : includes,
2640 link_with : [libshared],
2641 install_rpath : rootlibexecdir,
2643 install_dir : rootlibexecdir)
2645 executable('systemd-update-utmp',
2646 'src/update-utmp/update-utmp.c',
2647 include_directories : includes,
2648 link_with : [libshared],
2649 dependencies : [libaudit],
2650 install_rpath : rootlibexecdir,
2652 install_dir : rootlibexecdir)
2654 if conf.get('HAVE_KMOD') == 1
2655 executable('systemd-modules-load',
2656 'src/modules-load/modules-load.c',
2657 include_directories : includes,
2658 link_with : [libshared],
2659 dependencies : [libkmod],
2660 install_rpath : rootlibexecdir,
2662 install_dir : rootlibexecdir)
2664 meson.add_install_script('sh', '-c',
2665 mkdir_p.format(modulesloaddir))
2666 meson.add_install_script('sh', '-c',
2667 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2670 exe = executable('systemd-nspawn',
2671 systemd_nspawn_sources,
2672 include_directories : includes,
2673 link_with : [libcore_shared,
2676 dependencies : [libblkid,
2678 install_rpath : rootlibexecdir,
2680 public_programs += exe
2682 if conf.get('ENABLE_NETWORKD') == 1
2683 executable('systemd-networkd',
2684 systemd_networkd_sources,
2685 include_directories : includes,
2686 link_with : [libnetworkd_core,
2690 dependencies : [threads],
2691 install_rpath : rootlibexecdir,
2693 install_dir : rootlibexecdir)
2695 executable('systemd-networkd-wait-online',
2696 systemd_networkd_wait_online_sources,
2697 include_directories : includes,
2698 link_with : [libnetworkd_core,
2700 install_rpath : rootlibexecdir,
2702 install_dir : rootlibexecdir)
2704 exe = executable('networkctl',
2706 include_directories : includes,
2707 link_with : [libsystemd_network,
2709 install_rpath : rootlibexecdir,
2711 install_dir : rootbindir)
2712 public_programs += exe
2714 executable('systemd-network-generator',
2715 network_generator_sources,
2716 include_directories : includes,
2717 link_with : [libshared],
2718 install_rpath : rootlibexecdir,
2720 install_dir : rootlibexecdir)
2723 executable('systemd-sulogin-shell',
2724 ['src/sulogin-shell/sulogin-shell.c'],
2725 include_directories : includes,
2726 link_with : [libshared],
2727 install_rpath : rootlibexecdir,
2729 install_dir : rootlibexecdir)
2731 ############################################################
2734 'systemd-runtest.env',
2735 output : 'systemd-runtest.env',
2736 command : ['sh', '-c', '{ ' +
2737 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2738 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2740 build_by_default : true)
2742 foreach tuple : tests
2744 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2745 dependencies = tuple[2]
2746 condition = tuple.length() >= 4 ? tuple[3] : ''
2747 type = tuple.length() >= 5 ? tuple[4] : ''
2748 defs = tuple.length() >= 6 ? tuple[5] : []
2749 incs = tuple.length() >= 7 ? tuple[6] : includes
2752 name = sources[0].split('/')[-1].split('.')[0]
2753 if type.startswith('timeout=')
2754 timeout = type.split('=')[1].to_int()
2758 if condition == '' or conf.get(condition) == 1
2762 include_directories : incs,
2763 link_with : link_with,
2764 dependencies : [versiondep,
2767 build_by_default : want_tests != 'false',
2768 install_rpath : rootlibexecdir,
2769 install : install_tests,
2770 install_dir : join_paths(testsdir, type))
2773 message('@0@ is a manual test'.format(name))
2774 elif type == 'unsafe' and want_tests != 'unsafe'
2775 message('@0@ is an unsafe test'.format(name))
2776 elif want_tests != 'false'
2782 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2787 'test-libsystemd-sym',
2788 test_libsystemd_sym_c,
2789 include_directories : includes,
2790 link_with : [libsystemd],
2791 build_by_default : want_tests != 'false',
2792 install : install_tests,
2793 install_dir : testsdir)
2794 if want_tests != 'false'
2795 test('test-libsystemd-sym', exe)
2799 'test-libsystemd-static-sym',
2800 test_libsystemd_sym_c,
2801 include_directories : includes,
2802 link_with : [install_libsystemd_static],
2803 dependencies : [threads], # threads is already included in dependencies on the library,
2804 # but does not seem to get propagated. Add here as a work-around.
2805 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2806 install : install_tests and static_libsystemd_pic,
2807 install_dir : testsdir)
2808 if want_tests != 'false' and static_libsystemd_pic
2809 test('test-libsystemd-static-sym', exe)
2815 include_directories : includes,
2816 c_args : '-Wno-deprecated-declarations',
2817 link_with : [libudev],
2818 build_by_default : want_tests != 'false',
2819 install : install_tests,
2820 install_dir : testsdir)
2821 if want_tests != 'false'
2822 test('test-libudev-sym', exe)
2826 'test-libudev-static-sym',
2828 include_directories : includes,
2829 c_args : '-Wno-deprecated-declarations',
2830 link_with : [install_libudev_static],
2831 build_by_default : want_tests != 'false' and static_libudev_pic,
2832 install : install_tests and static_libudev_pic,
2833 install_dir : testsdir)
2834 if want_tests != 'false' and static_libudev_pic
2835 test('test-libudev-static-sym', exe)
2838 ############################################################
2842 if get_option('tests') != 'false'
2843 foreach tuple : fuzzers
2845 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2846 dependencies = tuple[2]
2847 defs = tuple.length() >= 4 ? tuple[3] : []
2848 incs = tuple.length() >= 5 ? tuple[4] : includes
2851 if want_ossfuzz or want_fuzzbuzz
2852 dependencies += fuzzing_engine
2854 if fuzzing_engine.found()
2855 dependencies += fuzzing_engine
2857 link_args += ['-fsanitize=fuzzer']
2860 sources += 'src/fuzz/fuzz-main.c'
2864 sources += 'src/fuzz/fuzzer-entry-point.c'
2867 name = sources[0].split('/')[-1].split('.')[0]
2869 fuzzer_exes += executable(
2872 include_directories : [incs, include_directories('src/fuzz')],
2873 link_with : link_with,
2874 dependencies : dependencies,
2876 link_args: link_args,
2881 run_target('fuzzers',
2882 depends : fuzzer_exes,
2885 ############################################################
2887 make_directive_index_py = find_program('tools/make-directive-index.py')
2888 make_man_index_py = find_program('tools/make-man-index.py')
2889 xml_helper_py = find_program('tools/xml_helper.py')
2890 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2894 subdir('sysusers.d')
2895 subdir('tmpfiles.d')
2900 subdir('shell-completion/bash')
2901 subdir('shell-completion/zsh')
2902 subdir('docs/sysvinit')
2903 subdir('docs/var-log')
2905 install_subdir('factory/etc',
2906 install_dir : factorydir)
2908 install_data('xorg/50-systemd-user.sh',
2909 install_dir : xinitrcdir)
2910 install_data('modprobe.d/systemd.conf',
2911 install_dir : modprobedir)
2912 install_data('LICENSE.GPL2',
2916 'docs/CODING_STYLE.md',
2917 'docs/DISTRO_PORTING.md',
2918 'docs/ENVIRONMENT.md',
2920 'docs/TRANSIENT-SETTINGS.md',
2921 'docs/TRANSLATORS.md',
2922 'docs/UIDS-GIDS.md',
2923 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2924 install_dir : docdir)
2926 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2927 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2929 ############################################################
2931 meson_check_help = find_program('tools/meson-check-help.sh')
2933 foreach exec : public_programs
2934 name = exec.full_path().split('/')[-1]
2935 if want_tests != 'false'
2936 test('check-help-' + name,
2938 args : exec.full_path())
2942 ############################################################
2944 check_directives_sh = find_program('tools/check-directives.sh')
2946 if want_tests != 'false'
2947 test('check-directives',
2948 check_directives_sh,
2949 args : project_source_root)
2952 ############################################################
2954 # Enable tests for all supported sanitizers
2955 foreach tuple : sanitizers
2956 sanitizer = tuple[0]
2959 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2961 foreach p : fuzz_regression_tests
2962 b = p.split('/')[-2]
2963 c = p.split('/')[-1]
2965 name = '@0@:@1@'.format(b, sanitizer)
2968 if want_tests == 'false'
2969 message('Not compiling @0@ because tests is set to false'.format(name))
2971 exe = custom_target(
2975 command : [env, 'ln', '-fs',
2976 join_paths(build.full_path(), b),
2978 build_by_default : true)
2980 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2985 if want_tests != 'false' and slow_tests
2986 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2988 args : [exe.full_path(),
2989 join_paths(project_source_root, p)])
2996 ############################################################
2999 all_files = run_command(
3001 ['--git-dir=@0@/.git'.format(project_source_root),
3004 all_files = files(all_files.stdout().split())
3009 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3012 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3016 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3019 command : [meson_git_contrib_sh])
3023 git_head = run_command(
3025 ['--git-dir=@0@/.git'.format(project_source_root),
3026 'rev-parse', 'HEAD']).stdout().strip()
3027 git_head_short = run_command(
3029 ['--git-dir=@0@/.git'.format(project_source_root),
3030 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3034 command : ['git', 'archive',
3035 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3037 '--prefix', 'systemd-@0@/'.format(git_head),
3041 ############################################################
3043 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3046 depends : [man, libsystemd, libudev],
3047 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3049 ############################################################
3052 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3054 'split /usr: @0@'.format(split_usr),
3055 'split bin-sbin: @0@'.format(split_bin),
3056 'prefix directory: @0@'.format(prefixdir),
3057 'rootprefix directory: @0@'.format(rootprefixdir),
3058 'sysconf directory: @0@'.format(sysconfdir),
3059 'include directory: @0@'.format(includedir),
3060 'lib directory: @0@'.format(libdir),
3061 'rootlib directory: @0@'.format(rootlibdir),
3062 'SysV init scripts: @0@'.format(sysvinit_path),
3063 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3064 'PAM modules directory: @0@'.format(pamlibdir),
3065 'PAM configuration directory: @0@'.format(pamconfdir),
3066 'RPM macros directory: @0@'.format(rpmmacrosdir),
3067 'modprobe.d directory: @0@'.format(modprobedir),
3068 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3069 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3070 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3071 'bash completions directory: @0@'.format(bashcompletiondir),
3072 'zsh completions directory: @0@'.format(zshcompletiondir),
3073 'extra start script: @0@'.format(get_option('rc-local')),
3074 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3075 get_option('debug-tty')),
3076 'TTY GID: @0@'.format(tty_gid),
3077 'users GID: @0@'.format(substs.get('USERS_GID')),
3078 'maximum system UID: @0@'.format(system_uid_max),
3079 'maximum system GID: @0@'.format(system_gid_max),
3080 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3081 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3082 'minimum container UID base: @0@'.format(container_uid_base_min),
3083 'maximum container UID base: @0@'.format(container_uid_base_max),
3084 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3085 'render group access mode: @0@'.format(get_option('group-render-mode')),
3086 'certificate root directory: @0@'.format(get_option('certificate-root')),
3087 'support URL: @0@'.format(support_url),
3088 'nobody user name: @0@'.format(nobody_user),
3089 'nobody group name: @0@'.format(nobody_group),
3090 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3091 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3093 'default DNSSEC mode: @0@'.format(default_dnssec),
3094 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3095 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3096 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3097 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3098 'default locale: @0@'.format(default_locale)]
3100 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3101 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3103 'default DNS servers: @0@'.format(alt_dns_servers),
3104 'default NTP servers: @0@'.format(alt_ntp_servers)]
3106 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3107 '@@0@'.format(time_epoch)).stdout().strip()
3109 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3112 'static libsystemd: @0@'.format(static_libsystemd),
3113 'static libudev: @0@'.format(static_libudev)]
3116 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3117 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3118 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3120 if conf.get('ENABLE_EFI') == 1
3121 status += 'efi arch: @0@'.format(efi_arch)
3125 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3126 'EFI CC @0@'.format(' '.join(efi_cc)),
3127 'EFI lib directory: @0@'.format(efi_libdir),
3128 'EFI lds directory: @0@'.format(efi_ldsdir),
3129 'EFI include directory: @0@'.format(efi_incdir)]
3181 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3182 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3185 ['legacy pkla', install_polkit_pkla],
3187 ['gnu-efi', have_gnu_efi],
3200 ['man pages', want_man],
3201 ['html pages', want_html],
3202 ['man page indices', want_man and have_lxml],
3207 ['adm group', get_option('adm-group')],
3208 ['wheel group', get_option('wheel-group')],
3211 ['debug mmap cache'],
3213 ['valgrind', conf.get('VALGRIND') == 1],
3214 ['trace logging', conf.get('LOG_TRACE') == 1],
3215 ['link-udev-shared', get_option('link-udev-shared')],
3216 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3219 if tuple.length() >= 2
3222 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3223 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3224 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3235 'enabled features: @0@'.format(', '.join(found)),
3237 'disabled features: @0@'.format(', '.join(missing)),
3239 message('\n '.join(status))
3241 if rootprefixdir != rootprefix_default
3243 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3244 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3245 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))