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()
33 want_ossfuzz = get_option('oss-fuzz')
34 want_libfuzzer = get_option('llvm-fuzz')
35 want_fuzzbuzz = get_option('fuzzbuzz')
36 if want_ossfuzz + want_libfuzzer + want_fuzzbuzz > 1
37 error('only one of oss-fuzz, llvm-fuzz or fuzzbuzz can be specified')
40 skip_deps = want_ossfuzz or want_libfuzzer
41 fuzzer_build = want_ossfuzz or want_libfuzzer or want_fuzzbuzz
43 #####################################################################
45 # Try to install the git pre-commit hook
46 git_hook = run_command(join_paths(project_source_root, 'tools/add-git-hook.sh'))
47 if git_hook.returncode() == 0
48 message(git_hook.stdout().strip())
51 #####################################################################
53 if get_option('split-usr') == 'auto'
54 split_usr = run_command('test', '-L', '/bin').returncode() != 0
56 split_usr = get_option('split-usr') == 'true'
58 conf.set10('HAVE_SPLIT_USR', split_usr,
59 description : '/usr/bin and /bin directories are separate')
61 if get_option('split-bin') == 'auto'
62 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
64 split_bin = get_option('split-bin') == 'true'
66 conf.set10('HAVE_SPLIT_BIN', split_bin,
67 description : 'bin and sbin directories are separate')
69 rootprefixdir = get_option('rootprefix')
70 # Unusual rootprefixdir values are used by some distros
71 # (see https://github.com/systemd/systemd/pull/7461).
72 rootprefix_default = split_usr ? '/' : '/usr'
73 if rootprefixdir == ''
74 rootprefixdir = rootprefix_default
76 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
78 sysvinit_path = get_option('sysvinit-path')
79 sysvrcnd_path = get_option('sysvrcnd-path')
80 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
81 description : 'SysV init scripts and rcN.d links are supported')
83 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
84 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
85 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
87 # join_paths ignores the preceding arguments if an absolute component is
88 # encountered, so this should canonicalize various paths when they are
89 # absolute or relative.
90 prefixdir = get_option('prefix')
91 if not prefixdir.startswith('/')
92 error('Prefix is not absolute: "@0@"'.format(prefixdir))
94 bindir = join_paths(prefixdir, get_option('bindir'))
95 libdir = join_paths(prefixdir, get_option('libdir'))
96 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
97 includedir = join_paths(prefixdir, get_option('includedir'))
98 datadir = join_paths(prefixdir, get_option('datadir'))
99 localstatedir = join_paths('/', get_option('localstatedir'))
101 rootbindir = join_paths(rootprefixdir, 'bin')
102 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
103 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
105 rootlibdir = get_option('rootlibdir')
107 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
110 # Dirs of external packages
111 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
112 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
113 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
114 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
115 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
116 varlogdir = join_paths(localstatedir, 'log')
117 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
118 rpmmacrosdir = get_option('rpmmacrosdir')
119 if rpmmacrosdir != 'no'
120 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
122 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
125 pkgdatadir = join_paths(datadir, 'systemd')
126 environmentdir = join_paths(prefixdir, 'lib/environment.d')
127 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
128 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
129 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
130 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
131 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
132 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
133 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
134 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
135 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
136 pkgincludedir = join_paths(includedir, 'systemd')
137 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
138 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
139 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
140 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
141 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
142 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
143 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
144 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
145 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
146 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
147 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
148 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
149 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
150 factorydir = join_paths(datadir, 'factory')
151 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
152 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
153 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
154 catalogstatedir = join_paths(systemdstatedir, 'catalog')
155 randomseeddir = join_paths(localstatedir, 'lib/systemd')
156 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
158 docdir = get_option('docdir')
160 docdir = join_paths(datadir, 'doc/systemd')
163 dbuspolicydir = get_option('dbuspolicydir')
164 if dbuspolicydir == ''
165 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
168 dbussessionservicedir = get_option('dbussessionservicedir')
169 if dbussessionservicedir == ''
170 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
173 dbussystemservicedir = get_option('dbussystemservicedir')
174 if dbussystemservicedir == ''
175 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
178 pamlibdir = get_option('pamlibdir')
180 pamlibdir = join_paths(rootlibdir, 'security')
183 pamconfdir = get_option('pamconfdir')
185 pamconfdir = join_paths(sysconfdir, 'pam.d')
188 memory_accounting_default = get_option('memory-accounting-default')
190 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
191 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
192 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
193 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
194 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
195 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
197 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
199 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
200 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
201 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
202 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
203 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
204 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
205 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
206 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
207 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
208 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
209 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
210 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
211 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
212 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
213 conf.set_quoted('ROOTPREFIX', rootprefixdir)
214 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
215 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
216 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
217 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
218 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
219 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
220 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
221 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
222 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
223 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
224 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
225 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
226 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
227 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
228 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
229 conf.set_quoted('LIBDIR', libdir)
230 conf.set_quoted('ROOTLIBDIR', rootlibdir)
231 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
232 conf.set_quoted('BOOTLIBDIR', bootlibdir)
233 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
234 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
235 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
236 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
237 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
238 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
239 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
240 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
241 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
243 substs.set('prefix', prefixdir)
244 substs.set('rootprefix', rootprefixdir)
245 substs.set('rootprefix_noslash', rootprefixdir_noslash)
246 substs.set('exec_prefix', prefixdir)
247 substs.set('libdir', libdir)
248 substs.set('rootlibdir', rootlibdir)
249 substs.set('includedir', includedir)
250 substs.set('sysconfdir', sysconfdir)
251 substs.set('bindir', bindir)
252 substs.set('rootbindir', rootbindir)
253 substs.set('rootlibexecdir', rootlibexecdir)
254 substs.set('systemunitdir', systemunitdir)
255 substs.set('userunitdir', userunitdir)
256 substs.set('systempresetdir', systempresetdir)
257 substs.set('userpresetdir', userpresetdir)
258 substs.set('udevhwdbdir', udevhwdbdir)
259 substs.set('udevrulesdir', udevrulesdir)
260 substs.set('udevlibexecdir', udevlibexecdir)
261 substs.set('environmentdir', environmentdir)
262 substs.set('catalogdir', catalogdir)
263 substs.set('tmpfilesdir', tmpfilesdir)
264 substs.set('sysusersdir', sysusersdir)
265 substs.set('sysctldir', sysctldir)
266 substs.set('binfmtdir', binfmtdir)
267 substs.set('modulesloaddir', modulesloaddir)
268 substs.set('modprobedir', modprobedir)
269 substs.set('systemgeneratordir', systemgeneratordir)
270 substs.set('usergeneratordir', usergeneratordir)
271 substs.set('systemenvgeneratordir', systemenvgeneratordir)
272 substs.set('userenvgeneratordir', userenvgeneratordir)
273 substs.set('systemshutdowndir', systemshutdowndir)
274 substs.set('systemsleepdir', systemsleepdir)
275 substs.set('VARLOGDIR', varlogdir)
276 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
277 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
278 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
279 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
280 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
281 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
282 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
283 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
284 substs.set('BUILD_ROOT', meson.current_build_dir())
286 #####################################################################
288 cc = meson.get_compiler('c')
289 pkgconfig = import('pkgconfig')
290 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
291 meson_build_sh = find_program('tools/meson-build.sh')
293 want_tests = get_option('tests')
294 slow_tests = want_tests != 'false' and get_option('slow-tests')
295 install_tests = get_option('install-tests')
297 if add_languages('cpp', required : fuzzer_build)
298 # Used only for tests
299 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
305 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
306 if fuzzing_engine.found()
307 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
308 elif cc.has_argument('-fsanitize=fuzzer-no-link')
309 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
311 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
314 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
316 fuzzing_engine = meson.get_compiler('cpp').find_library(get_option('fuzzbuzz-engine'), dirs: get_option('fuzzbuzz-engine-dir'))
319 possible_cc_flags = [
323 '-Wmissing-include-dirs',
324 '-Wold-style-definition',
328 '-Wsuggest-attribute=noreturn',
329 '-Werror=missing-prototypes',
330 '-Werror=implicit-function-declaration',
331 '-Werror=missing-declarations',
332 '-Werror=return-type',
333 '-Werror=incompatible-pointer-types',
335 '-Wstrict-prototypes',
337 '-Wmissing-noreturn',
338 '-Wimplicit-fallthrough=5',
341 '-Wstrict-aliasing=2',
344 '-Werror=shift-count-overflow',
345 '-Werror=shift-overflow=2',
349 # negative arguments are correctly detected starting with meson 0.46.
350 '-Wno-unused-parameter',
351 '-Wno-missing-field-initializers',
352 '-Wno-unused-result',
353 '-Wno-format-signedness',
354 '-Wno-error=#warnings', # clang
355 '-Wno-string-plus-int', # clang
357 # work-around for gcc 7.1 turning this on on its own.
358 '-Wno-error=nonnull',
360 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
361 # optimizations enabled, producing essentially false positives.
362 '-Wno-maybe-uninitialized',
366 '-fdiagnostics-show-option',
367 '-fno-strict-aliasing',
368 '-fvisibility=hidden',
370 '-fstack-protector-strong',
371 '--param=ssp-buffer-size=4',
374 # --as-needed and --no-undefined are provided by meson by default,
375 # run mesonconf to see what is enabled
376 possible_link_flags = [
381 if cc.get_id() == 'clang'
382 possible_cc_flags += [
383 '-Wno-typedef-redefinition',
384 '-Wno-gnu-variable-sized-type-not-at-end',
388 if get_option('buildtype') != 'debug'
389 possible_cc_flags += [
390 '-ffunction-sections',
394 possible_link_flags += '-Wl,--gc-sections'
397 if get_option('b_ndebug') == 'true'
398 # With asserts disabled with get a bunch of warnings about variables which
399 # are used only in the asserts. This is not useful at all, so let's just silence
401 possible_cc_flags += [
402 '-Wno-unused-variable',
403 '-Wno-unused-but-set-variable',
407 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
408 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
412 #include <inttypes.h>
413 typedef uint64_t usec_t;
414 usec_t now(clockid_t clock);
419 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
420 add_project_arguments('-Werror=shadow', language : 'c')
423 cpp = ' '.join(cc.cmd_array()) + ' -E'
425 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
427 #####################################################################
428 # compilation result tests
430 conf.set('_GNU_SOURCE', true)
431 conf.set('__SANE_USERSPACE_TYPES__', true)
432 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
434 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
435 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
436 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
437 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
438 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
439 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
440 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
444 #include <sys/stat.h>
447 foreach decl : ['char16_t',
452 # We get -1 if the size cannot be determined
453 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
455 if decl == 'struct statx'
457 want_linux_stat_h = false
459 have = cc.sizeof(decl,
460 prefix : decl_headers + '#include <linux/stat.h>',
461 args : '-D_GNU_SOURCE') > 0
462 want_linux_stat_h = have
466 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
469 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
471 foreach ident : ['secure_getenv', '__secure_getenv']
472 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
476 ['memfd_create', '''#include <sys/mman.h>'''],
477 ['gettid', '''#include <sys/types.h>
478 #include <unistd.h>'''],
479 ['pivot_root', '''#include <stdlib.h>
480 #include <unistd.h>'''], # no known header declares pivot_root
481 ['name_to_handle_at', '''#include <sys/types.h>
482 #include <sys/stat.h>
483 #include <fcntl.h>'''],
484 ['setns', '''#include <sched.h>'''],
485 ['renameat2', '''#include <stdio.h>
486 #include <fcntl.h>'''],
487 ['kcmp', '''#include <linux/kcmp.h>'''],
488 ['keyctl', '''#include <sys/types.h>
489 #include <keyutils.h>'''],
490 ['copy_file_range', '''#include <sys/syscall.h>
491 #include <unistd.h>'''],
492 ['bpf', '''#include <sys/syscall.h>
493 #include <unistd.h>'''],
494 ['statx', '''#include <sys/types.h>
495 #include <sys/stat.h>
496 #include <unistd.h>'''],
497 ['explicit_bzero' , '''#include <string.h>'''],
498 ['reallocarray', '''#include <malloc.h>'''],
501 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
502 conf.set10('HAVE_' + ident[0].to_upper(), have)
505 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
506 conf.set10('USE_SYS_RANDOM_H', true)
507 conf.set10('HAVE_GETRANDOM', true)
509 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
510 conf.set10('USE_SYS_RANDOM_H', false)
511 conf.set10('HAVE_GETRANDOM', have)
514 #####################################################################
516 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
518 get_option('version-tag'),
519 meson.project_version()]
522 input : 'src/version/version.h.in',
523 output : 'version.h',
526 versiondep = declare_dependency(sources: version_h)
528 sed = find_program('sed')
529 awk = find_program('awk')
530 m4 = find_program('m4')
531 stat = find_program('stat')
532 git = find_program('git', required : false)
533 env = find_program('env')
534 perl = find_program('perl', required : false)
536 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
537 mkdir_p = 'mkdir -p $DESTDIR/@0@'
538 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
539 splash_bmp = files('test/splash.bmp')
541 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
542 # /usr/sbin, /sbin, and fall back to the default from middle column.
543 progs = [['quotaon', '/usr/sbin/quotaon' ],
544 ['quotacheck', '/usr/sbin/quotacheck' ],
545 ['kmod', '/usr/bin/kmod' ],
546 ['kexec', '/usr/sbin/kexec' ],
547 ['sulogin', '/usr/sbin/sulogin' ],
548 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
549 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
550 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
551 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
554 path = get_option(prog[0] + '-path')
556 message('Using @1@ for @0@'.format(prog[0], path))
558 exe = find_program(prog[0],
559 '/usr/sbin/' + prog[0],
562 path = exe.found() ? exe.path() : prog[1]
564 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
565 conf.set_quoted(name, path)
566 substs.set(name, path)
569 conf.set_quoted('TELINIT', get_option('telinit-path'))
571 if run_command('ln', '--relative', '--help').returncode() != 0
572 error('ln does not support --relative (added in coreutils 8.16)')
575 ############################################################
577 gperf = find_program('gperf')
579 gperf_test_format = '''
581 const char * in_word_set(const char *, @0@);
584 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
585 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
586 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
587 if cc.compiles(gperf_test)
588 gperf_len_type = 'size_t'
590 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
591 if cc.compiles(gperf_test)
592 gperf_len_type = 'unsigned'
594 error('unable to determine gperf len type')
597 message('gperf len type is @0@'.format(gperf_len_type))
598 conf.set('GPERF_LEN_TYPE', gperf_len_type,
599 description : 'The type of gperf "len" parameter')
601 ############################################################
603 if not cc.has_header('sys/capability.h')
604 error('POSIX caps headers not found')
606 foreach header : ['crypt.h',
608 'linux/vm_sockets.h',
610 'valgrind/memcheck.h',
611 'valgrind/valgrind.h',
614 conf.set10('HAVE_' + header.underscorify().to_upper(),
615 cc.has_header(header))
618 ############################################################
620 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
621 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
622 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
624 default_hierarchy = get_option('default-hierarchy')
625 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
626 description : 'default cgroup hierarchy as string')
627 if default_hierarchy == 'legacy'
628 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
629 elif default_hierarchy == 'hybrid'
630 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
632 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
635 default_net_naming_scheme = get_option('default-net-naming-scheme')
636 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
638 time_epoch = get_option('time-epoch')
641 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
643 conf.set('TIME_EPOCH', time_epoch)
645 system_uid_max = get_option('system-uid-max')
646 if system_uid_max == -1
647 system_uid_max = run_command(
649 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
650 '/etc/login.defs').stdout().strip()
651 if system_uid_max == ''
654 system_uid_max = system_uid_max.to_int()
657 conf.set('SYSTEM_UID_MAX', system_uid_max)
658 substs.set('systemuidmax', system_uid_max)
660 system_gid_max = get_option('system-gid-max')
661 if system_gid_max == -1
662 system_gid_max = run_command(
664 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
665 '/etc/login.defs').stdout().strip()
666 if system_gid_max == ''
669 system_gid_max = system_gid_max.to_int()
672 conf.set('SYSTEM_GID_MAX', system_gid_max)
673 substs.set('systemgidmax', system_gid_max)
675 dynamic_uid_min = get_option('dynamic-uid-min')
676 dynamic_uid_max = get_option('dynamic-uid-max')
677 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
678 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
679 substs.set('dynamicuidmin', dynamic_uid_min)
680 substs.set('dynamicuidmax', dynamic_uid_max)
682 container_uid_base_min = get_option('container-uid-base-min')
683 container_uid_base_max = get_option('container-uid-base-max')
684 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
685 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
686 substs.set('containeruidbasemin', container_uid_base_min)
687 substs.set('containeruidbasemax', container_uid_base_max)
689 nobody_user = get_option('nobody-user')
690 nobody_group = get_option('nobody-group')
692 if not meson.is_cross_build()
693 getent_result = run_command('getent', 'passwd', '65534')
694 if getent_result.returncode() == 0
695 name = getent_result.stdout().split(':')[0]
696 if name != nobody_user
698 '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) +
699 'Your build will result in an user table setup that is incompatible with the local system.')
702 id_result = run_command('id', '-u', nobody_user)
703 if id_result.returncode() == 0
704 id = id_result.stdout().to_int()
707 '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) +
708 'Your build will result in an user table setup that is incompatible with the local system.')
712 getent_result = run_command('getent', 'group', '65534')
713 if getent_result.returncode() == 0
714 name = getent_result.stdout().split(':')[0]
715 if name != nobody_group
717 '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) +
718 'Your build will result in an group table setup that is incompatible with the local system.')
721 id_result = run_command('id', '-g', nobody_group)
722 if id_result.returncode() == 0
723 id = id_result.stdout().to_int()
726 '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) +
727 'Your build will result in an group table setup that is incompatible with the local system.')
731 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
733 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
734 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
737 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
738 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
739 substs.set('NOBODY_USER_NAME', nobody_user)
740 substs.set('NOBODY_GROUP_NAME', nobody_group)
742 tty_gid = get_option('tty-gid')
743 conf.set('TTY_GID', tty_gid)
744 substs.set('TTY_GID', tty_gid)
746 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
747 users_gid = get_option('users-gid')
748 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
750 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
751 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
753 dev_kvm_mode = get_option('dev-kvm-mode')
754 substs.set('DEV_KVM_MODE', dev_kvm_mode)
755 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
756 group_render_mode = get_option('group-render-mode')
757 substs.set('GROUP_RENDER_MODE', group_render_mode)
758 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
760 kill_user_processes = get_option('default-kill-user-processes')
761 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
762 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
763 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
765 dns_servers = get_option('dns-servers')
766 conf.set_quoted('DNS_SERVERS', dns_servers)
767 substs.set('DNS_SERVERS', dns_servers)
769 ntp_servers = get_option('ntp-servers')
770 conf.set_quoted('NTP_SERVERS', ntp_servers)
771 substs.set('NTP_SERVERS', ntp_servers)
773 default_locale = get_option('default-locale')
774 if default_locale == ''
775 if not meson.is_cross_build()
776 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
777 default_locale = run_command(choose_default_locale_sh).stdout().strip()
779 default_locale = 'C.UTF-8'
782 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
784 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
786 substs.set('SUSHELL', get_option('debug-shell'))
787 substs.set('DEBUGTTY', get_option('debug-tty'))
789 enable_debug_hashmap = false
790 enable_debug_mmap_cache = false
791 enable_debug_siphash = false
792 enable_debug_udev = false
793 foreach name : get_option('debug-extra')
795 enable_debug_hashmap = true
796 elif name == 'mmap-cache'
797 enable_debug_mmap_cache = true
798 elif name == 'siphash'
799 enable_debug_siphash = true
801 enable_debug_udev = true
803 message('unknown debug option "@0@", ignoring'.format(name))
806 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
807 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
808 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
809 conf.set10('ENABLE_DEBUG_UDEV', enable_debug_udev)
811 conf.set10('VALGRIND', get_option('valgrind'))
812 conf.set10('LOG_TRACE', get_option('log-trace'))
814 #####################################################################
816 threads = dependency('threads')
817 librt = cc.find_library('rt')
818 libm = cc.find_library('m')
819 libdl = cc.find_library('dl')
820 libcrypt = cc.find_library('crypt')
822 libcap = dependency('libcap', required : false)
823 if not libcap.found()
824 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
825 libcap = cc.find_library('cap')
828 libmount = dependency('mount',
829 version : fuzzer_build ? '>= 0' : '>= 2.30')
831 want_seccomp = get_option('seccomp')
832 if want_seccomp != 'false' and not skip_deps
833 libseccomp = dependency('libseccomp',
834 version : '>= 2.3.1',
835 required : want_seccomp == 'true')
836 have = libseccomp.found()
841 conf.set10('HAVE_SECCOMP', have)
843 want_selinux = get_option('selinux')
844 if want_selinux != 'false' and not skip_deps
845 libselinux = dependency('libselinux',
846 version : '>= 2.1.9',
847 required : want_selinux == 'true')
848 have = libselinux.found()
853 conf.set10('HAVE_SELINUX', have)
855 want_apparmor = get_option('apparmor')
856 if want_apparmor != 'false' and not skip_deps
857 libapparmor = dependency('libapparmor',
858 required : want_apparmor == 'true')
859 have = libapparmor.found()
864 conf.set10('HAVE_APPARMOR', have)
866 smack_run_label = get_option('smack-run-label')
867 if smack_run_label != ''
868 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
871 want_polkit = get_option('polkit')
872 install_polkit = false
873 install_polkit_pkla = false
874 if want_polkit != 'false' and not skip_deps
875 install_polkit = true
877 libpolkit = dependency('polkit-gobject-1',
879 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
880 message('Old polkit detected, will install pkla files')
881 install_polkit_pkla = true
884 conf.set10('ENABLE_POLKIT', install_polkit)
886 want_acl = get_option('acl')
887 if want_acl != 'false' and not skip_deps
888 libacl = cc.find_library('acl', required : want_acl == 'true')
889 have = libacl.found()
894 conf.set10('HAVE_ACL', have)
896 want_audit = get_option('audit')
897 if want_audit != 'false' and not skip_deps
898 libaudit = dependency('audit', required : want_audit == 'true')
899 have = libaudit.found()
904 conf.set10('HAVE_AUDIT', have)
906 want_blkid = get_option('blkid')
907 if want_blkid != 'false' and not skip_deps
908 libblkid = dependency('blkid', required : want_blkid == 'true')
909 have = libblkid.found()
914 conf.set10('HAVE_BLKID', have)
916 want_kmod = get_option('kmod')
917 if want_kmod != 'false' and not skip_deps
918 libkmod = dependency('libkmod',
920 required : want_kmod == 'true')
921 have = libkmod.found()
926 conf.set10('HAVE_KMOD', have)
928 want_pam = get_option('pam')
929 if want_pam != 'false' and not skip_deps
930 libpam = cc.find_library('pam', required : want_pam == 'true')
931 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
932 have = libpam.found() and libpam_misc.found()
938 conf.set10('HAVE_PAM', have)
940 want_microhttpd = get_option('microhttpd')
941 if want_microhttpd != 'false' and not skip_deps
942 libmicrohttpd = dependency('libmicrohttpd',
943 version : '>= 0.9.33',
944 required : want_microhttpd == 'true')
945 have = libmicrohttpd.found()
950 conf.set10('HAVE_MICROHTTPD', have)
952 want_libcryptsetup = get_option('libcryptsetup')
953 if want_libcryptsetup != 'false' and not skip_deps
954 libcryptsetup = dependency('libcryptsetup',
955 version : '>= 1.6.0',
956 required : want_libcryptsetup == 'true')
957 have = libcryptsetup.found()
958 have_sector = cc.has_member(
959 'struct crypt_params_plain',
961 prefix : '#include <libcryptsetup.h>')
967 conf.set10('HAVE_LIBCRYPTSETUP', have)
968 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
970 want_libcurl = get_option('libcurl')
971 if want_libcurl != 'false' and not skip_deps
972 libcurl = dependency('libcurl',
973 version : '>= 7.32.0',
974 required : want_libcurl == 'true')
975 have = libcurl.found()
980 conf.set10('HAVE_LIBCURL', have)
982 want_libidn = get_option('libidn')
983 want_libidn2 = get_option('libidn2')
984 if want_libidn == 'true' and want_libidn2 == 'true'
985 error('libidn and libidn2 cannot be requested simultaneously')
988 if want_libidn != 'false' and want_libidn2 != 'true' and not skip_deps
989 libidn = dependency('libidn',
990 required : want_libidn == 'true')
991 have = libidn.found()
996 conf.set10('HAVE_LIBIDN', have)
997 if not have and want_libidn2 != 'false' and not skip_deps
998 # libidn is used for both libidn and libidn2 objects
999 libidn = dependency('libidn2',
1000 required : want_libidn2 == 'true')
1001 have = libidn.found()
1005 conf.set10('HAVE_LIBIDN2', have)
1007 want_libiptc = get_option('libiptc')
1008 if want_libiptc != 'false' and not skip_deps
1009 libiptc = dependency('libiptc',
1010 required : want_libiptc == 'true')
1011 have = libiptc.found()
1016 conf.set10('HAVE_LIBIPTC', have)
1018 want_qrencode = get_option('qrencode')
1019 if want_qrencode != 'false' and not skip_deps
1020 libqrencode = dependency('libqrencode',
1021 required : want_qrencode == 'true')
1022 have = libqrencode.found()
1027 conf.set10('HAVE_QRENCODE', have)
1029 want_gcrypt = get_option('gcrypt')
1030 if want_gcrypt != 'false' and not skip_deps
1031 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1032 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1033 have = libgcrypt.found() and libgpg_error.found()
1038 # link to neither of the libs if one is not found
1042 conf.set10('HAVE_GCRYPT', have)
1044 want_gnutls = get_option('gnutls')
1045 if want_gnutls != 'false' and not skip_deps
1046 libgnutls = dependency('gnutls',
1047 version : '>= 3.1.4',
1048 required : want_gnutls == 'true')
1049 have = libgnutls.found()
1054 conf.set10('HAVE_GNUTLS', have)
1056 want_openssl = get_option('openssl')
1057 if want_openssl != 'false' and not skip_deps
1058 libopenssl = dependency('openssl',
1059 version : '>= 1.1.0',
1060 required : want_openssl == 'true')
1061 have = libopenssl.found()
1066 conf.set10('HAVE_OPENSSL', have)
1068 want_elfutils = get_option('elfutils')
1069 if want_elfutils != 'false' and not skip_deps
1070 libdw = dependency('libdw',
1071 required : want_elfutils == 'true')
1072 have = libdw.found()
1077 conf.set10('HAVE_ELFUTILS', have)
1079 want_zlib = get_option('zlib')
1080 if want_zlib != 'false' and not skip_deps
1081 libz = dependency('zlib',
1082 required : want_zlib == 'true')
1088 conf.set10('HAVE_ZLIB', have)
1090 want_bzip2 = get_option('bzip2')
1091 if want_bzip2 != 'false' and not skip_deps
1092 libbzip2 = cc.find_library('bz2',
1093 required : want_bzip2 == 'true')
1094 have = libbzip2.found()
1099 conf.set10('HAVE_BZIP2', have)
1101 want_xz = get_option('xz')
1102 if want_xz != 'false' and not skip_deps
1103 libxz = dependency('liblzma',
1104 required : want_xz == 'true')
1105 have = libxz.found()
1110 conf.set10('HAVE_XZ', have)
1112 want_lz4 = get_option('lz4')
1113 if want_lz4 != 'false' and not skip_deps
1114 liblz4 = dependency('liblz4',
1115 version : '>= 1.3.0',
1116 required : want_lz4 == 'true')
1117 have = liblz4.found()
1122 conf.set10('HAVE_LZ4', have)
1124 want_xkbcommon = get_option('xkbcommon')
1125 if want_xkbcommon != 'false' and not skip_deps
1126 libxkbcommon = dependency('xkbcommon',
1127 version : '>= 0.3.0',
1128 required : want_xkbcommon == 'true')
1129 have = libxkbcommon.found()
1134 conf.set10('HAVE_XKBCOMMON', have)
1136 want_pcre2 = get_option('pcre2')
1137 if want_pcre2 != 'false'
1138 libpcre2 = dependency('libpcre2-8',
1139 required : want_pcre2 == 'true')
1140 have = libpcre2.found()
1145 conf.set10('HAVE_PCRE2', have)
1147 want_glib = get_option('glib')
1148 if want_glib != 'false' and not skip_deps
1149 libglib = dependency('glib-2.0',
1150 version : '>= 2.22.0',
1151 required : want_glib == 'true')
1152 libgobject = dependency('gobject-2.0',
1153 version : '>= 2.22.0',
1154 required : want_glib == 'true')
1155 libgio = dependency('gio-2.0',
1156 required : want_glib == 'true')
1157 have = libglib.found() and libgobject.found() and libgio.found()
1164 conf.set10('HAVE_GLIB', have)
1166 want_dbus = get_option('dbus')
1167 if want_dbus != 'false' and not skip_deps
1168 libdbus = dependency('dbus-1',
1169 version : '>= 1.3.2',
1170 required : want_dbus == 'true')
1171 have = libdbus.found()
1176 conf.set10('HAVE_DBUS', have)
1178 default_dnssec = get_option('default-dnssec')
1180 default_dnssec = 'no'
1182 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1183 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1184 default_dnssec = 'no'
1186 conf.set('DEFAULT_DNSSEC_MODE',
1187 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1188 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1190 dns_over_tls = get_option('dns-over-tls')
1191 if dns_over_tls != 'false'
1192 if dns_over_tls == 'openssl'
1195 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1196 if dns_over_tls == 'gnutls' and not have_gnutls
1197 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1200 if dns_over_tls == 'gnutls' or have_gnutls
1201 have_openssl = false
1203 have_openssl = conf.get('HAVE_OPENSSL') == 1
1204 if dns_over_tls != 'auto' and not have_openssl
1205 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1206 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1209 have = have_gnutls or have_openssl
1213 have_openssl = false
1215 conf.set10('ENABLE_DNS_OVER_TLS', have)
1216 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1217 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1219 default_dns_over_tls = get_option('default-dns-over-tls')
1221 default_dns_over_tls = 'no'
1223 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1224 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1225 default_dns_over_tls = 'no'
1227 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1228 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1229 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1231 want_importd = get_option('importd')
1232 if want_importd != 'false'
1233 have = (conf.get('HAVE_LIBCURL') == 1 and
1234 conf.get('HAVE_ZLIB') == 1 and
1235 conf.get('HAVE_XZ') == 1 and
1236 conf.get('HAVE_GCRYPT') == 1)
1237 if want_importd == 'true' and not have
1238 error('importd support was requested, but dependencies are not available')
1243 conf.set10('ENABLE_IMPORTD', have)
1245 want_remote = get_option('remote')
1246 if want_remote != 'false'
1247 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1248 conf.get('HAVE_LIBCURL') == 1]
1249 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1250 # it's possible to build one without the other. Complain only if
1251 # support was explicitly requested. The auxiliary files like sysusers
1252 # config should be installed when any of the programs are built.
1253 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1254 error('remote support was requested, but dependencies are not available')
1256 have = have_deps[0] or have_deps[1]
1260 conf.set10('ENABLE_REMOTE', have)
1262 foreach term : ['utmp',
1294 have = get_option(term)
1295 name = 'ENABLE_' + term.underscorify().to_upper()
1296 conf.set10(name, have)
1299 foreach tuple : [['nss-mymachines', 'machined'],
1300 ['nss-resolve', 'resolve']]
1301 want = get_option(tuple[0])
1303 have = get_option(tuple[1])
1304 if want == 'true' and not have
1305 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1310 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1311 conf.set10(name, have)
1315 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1316 'ENABLE_NSS_MYMACHINES',
1317 'ENABLE_NSS_RESOLVE',
1318 'ENABLE_NSS_SYSTEMD']
1319 if conf.get(term) == 1
1323 conf.set10('ENABLE_NSS', enable_nss)
1325 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1330 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1332 #####################################################################
1334 if get_option('efi')
1335 efi_arch = host_machine.cpu_family()
1337 if efi_arch == 'x86'
1338 EFI_MACHINE_TYPE_NAME = 'ia32'
1339 gnu_efi_arch = 'ia32'
1340 elif efi_arch == 'x86_64'
1341 EFI_MACHINE_TYPE_NAME = 'x64'
1342 gnu_efi_arch = 'x86_64'
1343 elif efi_arch == 'arm'
1344 EFI_MACHINE_TYPE_NAME = 'arm'
1345 gnu_efi_arch = 'arm'
1346 elif efi_arch == 'aarch64'
1347 EFI_MACHINE_TYPE_NAME = 'aa64'
1348 gnu_efi_arch = 'aarch64'
1350 EFI_MACHINE_TYPE_NAME = ''
1355 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1357 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1361 conf.set10('ENABLE_EFI', have)
1363 #####################################################################
1365 config_h = configure_file(
1366 output : 'config.h',
1367 configuration : conf)
1369 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1371 includes = include_directories('src/basic',
1375 'src/journal-remote',
1379 'src/time-wait-sync',
1385 'src/libsystemd/sd-bus',
1386 'src/libsystemd/sd-device',
1387 'src/libsystemd/sd-event',
1388 'src/libsystemd/sd-hwdb',
1389 'src/libsystemd/sd-id128',
1390 'src/libsystemd/sd-netlink',
1391 'src/libsystemd/sd-network',
1392 'src/libsystemd/sd-resolve',
1393 'src/libsystemd-network',
1396 add_project_arguments('-include', 'config.h', language : 'c')
1398 generate_gperfs = find_program('tools/generate-gperfs.py')
1402 subdir('src/systemd')
1404 subdir('src/libsystemd')
1405 subdir('src/libsystemd-network')
1406 subdir('src/journal')
1409 libjournal_core = static_library(
1411 libjournal_core_sources,
1413 include_directories : includes,
1416 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1417 libsystemd = shared_library(
1420 version : libsystemd_version,
1421 include_directories : includes,
1422 link_args : ['-shared',
1423 '-Wl,--version-script=' + libsystemd_sym_path],
1424 link_with : [libbasic,
1426 link_whole : [libsystemd_static,
1428 dependencies : [threads,
1432 link_depends : libsystemd_sym,
1434 install_dir : rootlibdir)
1436 static_libsystemd = get_option('static-libsystemd')
1437 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1439 install_libsystemd_static = static_library(
1442 journal_client_sources,
1444 basic_gcrypt_sources,
1446 include_directories : includes,
1447 build_by_default : static_libsystemd != 'false',
1448 install : static_libsystemd != 'false',
1449 install_dir : rootlibdir,
1450 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1451 dependencies : [threads,
1460 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1462 ############################################################
1464 # binaries that have --help and are intended for use by humans,
1465 # usually, but not always, installed in /bin.
1466 public_programs = []
1468 subdir('src/libudev')
1469 subdir('src/shared')
1471 subdir('src/shutdown')
1473 subdir('src/network')
1475 subdir('src/analyze')
1476 subdir('src/journal-remote')
1477 subdir('src/coredump')
1478 subdir('src/hostname')
1479 subdir('src/import')
1480 subdir('src/kernel-install')
1481 subdir('src/locale')
1482 subdir('src/machine')
1483 subdir('src/portable')
1484 subdir('src/nspawn')
1485 subdir('src/resolve')
1486 subdir('src/timedate')
1487 subdir('src/timesync')
1488 subdir('src/vconsole')
1489 subdir('src/boot/efi')
1496 ############################################################
1498 # only static linking apart from libdl, to make sure that the
1499 # module is linked to all libraries that it uses.
1500 test_dlopen = executable(
1504 include_directories : includes,
1505 link_with : [libbasic],
1506 dependencies : [libdl],
1507 build_by_default : want_tests != 'false')
1509 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1510 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1511 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1512 ['resolve', 'ENABLE_NSS_RESOLVE']]
1514 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1518 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1519 version_script_arg = join_paths(project_source_root, sym)
1521 nss = shared_library(
1523 'src/nss-@0@/nss-@0@.c'.format(module),
1526 include_directories : includes,
1527 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1528 link_args : ['-Wl,-z,nodelete',
1530 '-Wl,--version-script=' + version_script_arg],
1531 link_with : [libsystemd_static,
1533 dependencies : [threads,
1537 install_dir : rootlibdir)
1539 # We cannot use shared_module because it does not support version suffix.
1540 # Unfortunately shared_library insists on creating the symlink…
1541 meson.add_install_script('sh', '-c',
1542 'rm $DESTDIR@0@/libnss_@1@.so'
1543 .format(rootlibdir, module))
1545 if want_tests != 'false'
1546 test('dlopen-nss_' + module,
1548 # path to dlopen must include a slash
1549 args : nss.full_path())
1554 ############################################################
1556 executable('systemd',
1558 include_directories : includes,
1559 link_with : [libcore,
1561 dependencies : [versiondep,
1568 install_rpath : rootlibexecdir,
1570 install_dir : rootlibexecdir)
1572 meson.add_install_script(meson_make_symlink,
1573 join_paths(rootlibexecdir, 'systemd'),
1574 join_paths(rootsbindir, 'init'))
1576 exe = executable('systemd-analyze',
1577 systemd_analyze_sources,
1578 include_directories : includes,
1579 link_with : [libcore,
1581 dependencies : [versiondep,
1588 install_rpath : rootlibexecdir,
1590 public_programs += exe
1592 executable('systemd-journald',
1593 systemd_journald_sources,
1594 include_directories : includes,
1595 link_with : [libjournal_core,
1597 dependencies : [threads,
1601 install_rpath : rootlibexecdir,
1603 install_dir : rootlibexecdir)
1605 exe = executable('systemd-cat',
1606 systemd_cat_sources,
1607 include_directories : includes,
1608 link_with : [libjournal_core,
1610 dependencies : [threads],
1611 install_rpath : rootlibexecdir,
1613 public_programs += exe
1615 exe = executable('journalctl',
1617 include_directories : includes,
1618 link_with : [libshared],
1619 dependencies : [threads,
1624 install_rpath : rootlibexecdir,
1626 install_dir : rootbindir)
1627 public_programs += exe
1629 executable('systemd-getty-generator',
1630 'src/getty-generator/getty-generator.c',
1631 include_directories : includes,
1632 link_with : [libshared],
1633 install_rpath : rootlibexecdir,
1635 install_dir : systemgeneratordir)
1637 executable('systemd-debug-generator',
1638 'src/debug-generator/debug-generator.c',
1639 include_directories : includes,
1640 link_with : [libshared],
1641 install_rpath : rootlibexecdir,
1643 install_dir : systemgeneratordir)
1645 executable('systemd-run-generator',
1646 'src/run-generator/run-generator.c',
1647 include_directories : includes,
1648 link_with : [libshared],
1649 install_rpath : rootlibexecdir,
1651 install_dir : systemgeneratordir)
1653 executable('systemd-fstab-generator',
1654 'src/fstab-generator/fstab-generator.c',
1655 include_directories : includes,
1656 link_with : [libcore_shared,
1658 install_rpath : rootlibexecdir,
1660 install_dir : systemgeneratordir)
1662 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1663 executable('30-systemd-environment-d-generator',
1664 'src/environment-d-generator/environment-d-generator.c',
1665 include_directories : includes,
1666 link_with : [libshared],
1667 install_rpath : rootlibexecdir,
1669 install_dir : userenvgeneratordir)
1671 meson.add_install_script(meson_make_symlink,
1672 join_paths(sysconfdir, 'environment'),
1673 join_paths(environmentdir, '99-environment.conf'))
1676 if conf.get('ENABLE_HIBERNATE') == 1
1677 executable('systemd-hibernate-resume-generator',
1678 'src/hibernate-resume/hibernate-resume-generator.c',
1679 include_directories : includes,
1680 link_with : [libshared],
1681 install_rpath : rootlibexecdir,
1683 install_dir : systemgeneratordir)
1685 executable('systemd-hibernate-resume',
1686 'src/hibernate-resume/hibernate-resume.c',
1687 include_directories : includes,
1688 link_with : [libshared],
1689 install_rpath : rootlibexecdir,
1691 install_dir : rootlibexecdir)
1694 if conf.get('HAVE_BLKID') == 1
1695 executable('systemd-gpt-auto-generator',
1696 'src/gpt-auto-generator/gpt-auto-generator.c',
1697 'src/shared/blkid-util.h',
1698 include_directories : includes,
1699 link_with : [libshared],
1700 dependencies : libblkid,
1701 install_rpath : rootlibexecdir,
1703 install_dir : systemgeneratordir)
1705 exe = executable('systemd-dissect',
1706 'src/dissect/dissect.c',
1707 include_directories : includes,
1708 link_with : [libshared],
1709 install_rpath : rootlibexecdir,
1711 install_dir : rootlibexecdir)
1712 public_programs += exe
1715 if conf.get('ENABLE_RESOLVE') == 1
1716 executable('systemd-resolved',
1717 systemd_resolved_sources,
1718 include_directories : includes,
1719 link_with : [libshared,
1721 libsystemd_resolve_core],
1722 dependencies : systemd_resolved_dependencies,
1723 install_rpath : rootlibexecdir,
1725 install_dir : rootlibexecdir)
1727 exe = executable('resolvectl',
1729 include_directories : includes,
1730 link_with : [libshared,
1732 libsystemd_resolve_core],
1733 dependencies : [threads,
1737 install_rpath : rootlibexecdir,
1739 public_programs += exe
1741 meson.add_install_script(meson_make_symlink,
1742 join_paths(bindir, 'resolvectl'),
1743 join_paths(rootsbindir, 'resolvconf'))
1745 meson.add_install_script(meson_make_symlink,
1746 join_paths(bindir, 'resolvectl'),
1747 join_paths(bindir, 'systemd-resolve'))
1750 if conf.get('ENABLE_LOGIND') == 1
1751 executable('systemd-logind',
1752 systemd_logind_sources,
1753 include_directories : includes,
1754 link_with : [liblogind_core,
1756 dependencies : [threads,
1758 install_rpath : rootlibexecdir,
1760 install_dir : rootlibexecdir)
1762 exe = executable('loginctl',
1764 include_directories : includes,
1765 link_with : [libshared],
1766 dependencies : [threads,
1769 install_rpath : rootlibexecdir,
1771 install_dir : rootbindir)
1772 public_programs += exe
1774 exe = executable('systemd-inhibit',
1775 'src/login/inhibit.c',
1776 include_directories : includes,
1777 link_with : [libshared],
1778 install_rpath : rootlibexecdir,
1780 install_dir : rootbindir)
1781 public_programs += exe
1783 if conf.get('HAVE_PAM') == 1
1784 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1785 pam_systemd = shared_library(
1789 include_directories : includes,
1790 link_args : ['-shared',
1791 '-Wl,--version-script=' + version_script_arg],
1792 link_with : [libsystemd_static,
1794 dependencies : [threads,
1797 link_depends : pam_systemd_sym,
1799 install_dir : pamlibdir)
1801 if want_tests != 'false'
1802 test('dlopen-pam_systemd',
1804 # path to dlopen must include a slash
1805 args : pam_systemd.full_path())
1809 executable('systemd-user-runtime-dir',
1810 user_runtime_dir_sources,
1811 include_directories : includes,
1812 link_with : [libshared],
1813 install_rpath : rootlibexecdir,
1815 install_dir : rootlibexecdir)
1818 if conf.get('HAVE_PAM') == 1
1819 executable('systemd-user-sessions',
1820 'src/user-sessions/user-sessions.c',
1821 include_directories : includes,
1822 link_with : [libshared],
1823 install_rpath : rootlibexecdir,
1825 install_dir : rootlibexecdir)
1828 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1829 exe = executable('bootctl',
1830 'src/boot/bootctl.c',
1831 include_directories : includes,
1832 link_with : [libshared],
1833 dependencies : [libblkid],
1834 install_rpath : rootlibexecdir,
1836 public_programs += exe
1838 executable('systemd-bless-boot',
1839 'src/boot/bless-boot.c',
1840 include_directories : includes,
1841 link_with : [libshared],
1842 dependencies : [libblkid],
1843 install_rpath : rootlibexecdir,
1845 install_dir : rootlibexecdir)
1847 executable('systemd-bless-boot-generator',
1848 'src/boot/bless-boot-generator.c',
1849 include_directories : includes,
1850 link_with : [libshared],
1851 install_rpath : rootlibexecdir,
1853 install_dir : systemgeneratordir)
1856 executable('systemd-boot-check-no-failures',
1857 'src/boot/boot-check-no-failures.c',
1858 include_directories : includes,
1859 link_with : [libshared],
1860 dependencies : [libblkid],
1861 install_rpath : rootlibexecdir,
1863 install_dir : rootlibexecdir)
1865 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1866 include_directories : includes,
1867 link_with : [libshared],
1868 dependencies : [threads],
1869 install_rpath : rootlibexecdir,
1871 public_programs += exe
1874 if get_option('link-systemctl-shared')
1875 systemctl_link_with = [libshared]
1877 systemctl_link_with = [libsystemd_static,
1883 exe = executable('systemctl',
1884 'src/systemctl/systemctl.c',
1885 'src/systemctl/sysv-compat.h',
1886 'src/systemctl/sysv-compat.c',
1887 include_directories : includes,
1888 link_with : systemctl_link_with,
1889 dependencies : [threads,
1894 install_rpath : rootlibexecdir,
1896 install_dir : rootbindir)
1897 public_programs += exe
1899 if conf.get('ENABLE_PORTABLED') == 1
1900 executable('systemd-portabled',
1901 systemd_portabled_sources,
1902 include_directories : includes,
1903 link_with : [libshared],
1904 dependencies : [threads],
1905 install_rpath : rootlibexecdir,
1907 install_dir : rootlibexecdir)
1909 exe = executable('portablectl', 'src/portable/portablectl.c',
1910 include_directories : includes,
1911 link_with : [libshared],
1912 dependencies : [threads],
1913 install_rpath : rootlibexecdir,
1915 install_dir : rootbindir)
1916 public_programs += exe
1919 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1920 meson.add_install_script(meson_make_symlink,
1921 join_paths(rootbindir, 'systemctl'),
1922 join_paths(rootsbindir, alias))
1925 if conf.get('ENABLE_BACKLIGHT') == 1
1926 executable('systemd-backlight',
1927 'src/backlight/backlight.c',
1928 include_directories : includes,
1929 link_with : [libshared],
1930 install_rpath : rootlibexecdir,
1932 install_dir : rootlibexecdir)
1935 if conf.get('ENABLE_RFKILL') == 1
1936 executable('systemd-rfkill',
1937 'src/rfkill/rfkill.c',
1938 include_directories : includes,
1939 link_with : [libshared],
1940 install_rpath : rootlibexecdir,
1942 install_dir : rootlibexecdir)
1945 executable('systemd-system-update-generator',
1946 'src/system-update-generator/system-update-generator.c',
1947 include_directories : includes,
1948 link_with : [libshared],
1949 install_rpath : rootlibexecdir,
1951 install_dir : systemgeneratordir)
1953 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1954 executable('systemd-cryptsetup',
1955 'src/cryptsetup/cryptsetup.c',
1956 include_directories : includes,
1957 link_with : [libshared],
1958 dependencies : [libcryptsetup],
1959 install_rpath : rootlibexecdir,
1961 install_dir : rootlibexecdir)
1963 executable('systemd-cryptsetup-generator',
1964 'src/cryptsetup/cryptsetup-generator.c',
1965 include_directories : includes,
1966 link_with : [libshared],
1967 dependencies : [libcryptsetup],
1968 install_rpath : rootlibexecdir,
1970 install_dir : systemgeneratordir)
1972 executable('systemd-veritysetup',
1973 'src/veritysetup/veritysetup.c',
1974 include_directories : includes,
1975 link_with : [libshared],
1976 dependencies : [libcryptsetup],
1977 install_rpath : rootlibexecdir,
1979 install_dir : rootlibexecdir)
1981 executable('systemd-veritysetup-generator',
1982 'src/veritysetup/veritysetup-generator.c',
1983 include_directories : includes,
1984 link_with : [libshared],
1985 dependencies : [libcryptsetup],
1986 install_rpath : rootlibexecdir,
1988 install_dir : systemgeneratordir)
1991 if conf.get('HAVE_SYSV_COMPAT') == 1
1992 executable('systemd-sysv-generator',
1993 'src/sysv-generator/sysv-generator.c',
1994 include_directories : includes,
1995 link_with : [libshared],
1996 install_rpath : rootlibexecdir,
1998 install_dir : systemgeneratordir)
2000 executable('systemd-rc-local-generator',
2001 'src/rc-local-generator/rc-local-generator.c',
2002 include_directories : includes,
2003 link_with : [libshared],
2004 install_rpath : rootlibexecdir,
2006 install_dir : systemgeneratordir)
2009 if conf.get('ENABLE_HOSTNAMED') == 1
2010 executable('systemd-hostnamed',
2011 'src/hostname/hostnamed.c',
2012 include_directories : includes,
2013 link_with : [libshared],
2014 install_rpath : rootlibexecdir,
2016 install_dir : rootlibexecdir)
2018 exe = executable('hostnamectl',
2019 'src/hostname/hostnamectl.c',
2020 include_directories : includes,
2021 link_with : [libshared],
2022 install_rpath : rootlibexecdir,
2024 public_programs += exe
2027 if conf.get('ENABLE_LOCALED') == 1
2028 if conf.get('HAVE_XKBCOMMON') == 1
2029 # logind will load libxkbcommon.so dynamically on its own
2035 executable('systemd-localed',
2036 systemd_localed_sources,
2037 include_directories : includes,
2038 link_with : [libshared],
2039 dependencies : deps,
2040 install_rpath : rootlibexecdir,
2042 install_dir : rootlibexecdir)
2044 exe = executable('localectl',
2046 include_directories : includes,
2047 link_with : [libshared],
2048 install_rpath : rootlibexecdir,
2050 public_programs += exe
2053 if conf.get('ENABLE_TIMEDATED') == 1
2054 executable('systemd-timedated',
2055 'src/timedate/timedated.c',
2056 include_directories : includes,
2057 link_with : [libshared],
2058 install_rpath : rootlibexecdir,
2060 install_dir : rootlibexecdir)
2063 if conf.get('ENABLE_TIMEDATECTL') == 1
2064 exe = executable('timedatectl',
2065 'src/timedate/timedatectl.c',
2066 include_directories : includes,
2067 install_rpath : rootlibexecdir,
2068 link_with : [libshared],
2069 dependencies : [libm],
2071 public_programs += exe
2074 if conf.get('ENABLE_TIMESYNCD') == 1
2075 executable('systemd-timesyncd',
2076 systemd_timesyncd_sources,
2077 include_directories : includes,
2078 link_with : [libshared],
2079 dependencies : [threads,
2081 install_rpath : rootlibexecdir,
2083 install_dir : rootlibexecdir)
2085 executable('systemd-time-wait-sync',
2086 'src/time-wait-sync/time-wait-sync.c',
2087 include_directories : includes,
2088 link_with : [libshared],
2089 install_rpath : rootlibexecdir,
2091 install_dir : rootlibexecdir)
2094 if conf.get('ENABLE_MACHINED') == 1
2095 executable('systemd-machined',
2096 systemd_machined_sources,
2097 include_directories : includes,
2098 link_with : [libmachine_core,
2100 install_rpath : rootlibexecdir,
2102 install_dir : rootlibexecdir)
2104 exe = executable('machinectl',
2105 'src/machine/machinectl.c',
2106 include_directories : includes,
2107 link_with : [libshared],
2108 dependencies : [threads,
2111 install_rpath : rootlibexecdir,
2113 install_dir : rootbindir)
2114 public_programs += exe
2117 if conf.get('ENABLE_IMPORTD') == 1
2118 executable('systemd-importd',
2119 systemd_importd_sources,
2120 include_directories : includes,
2121 link_with : [libshared],
2122 dependencies : [threads],
2123 install_rpath : rootlibexecdir,
2125 install_dir : rootlibexecdir)
2127 systemd_pull = executable('systemd-pull',
2128 systemd_pull_sources,
2129 include_directories : includes,
2130 link_with : [libshared],
2131 dependencies : [versiondep,
2137 install_rpath : rootlibexecdir,
2139 install_dir : rootlibexecdir)
2141 systemd_import = executable('systemd-import',
2142 systemd_import_sources,
2143 include_directories : includes,
2144 link_with : [libshared],
2145 dependencies : [libcurl,
2149 install_rpath : rootlibexecdir,
2151 install_dir : rootlibexecdir)
2153 systemd_import_fs = executable('systemd-import-fs',
2154 systemd_import_fs_sources,
2155 include_directories : includes,
2156 link_with : [libshared],
2157 install_rpath : rootlibexecdir,
2159 install_dir : rootlibexecdir)
2161 systemd_export = executable('systemd-export',
2162 systemd_export_sources,
2163 include_directories : includes,
2164 link_with : [libshared],
2165 dependencies : [libcurl,
2169 install_rpath : rootlibexecdir,
2171 install_dir : rootlibexecdir)
2173 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2176 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2177 exe = executable('systemd-journal-upload',
2178 systemd_journal_upload_sources,
2179 include_directories : includes,
2180 link_with : [libshared],
2181 dependencies : [versiondep,
2187 install_rpath : rootlibexecdir,
2189 install_dir : rootlibexecdir)
2190 public_programs += exe
2193 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2194 s_j_remote = executable('systemd-journal-remote',
2195 systemd_journal_remote_sources,
2196 include_directories : includes,
2197 link_with : [libshared,
2198 libsystemd_journal_remote],
2199 dependencies : [threads,
2204 install_rpath : rootlibexecdir,
2206 install_dir : rootlibexecdir)
2208 s_j_gatewayd = executable('systemd-journal-gatewayd',
2209 systemd_journal_gatewayd_sources,
2210 include_directories : includes,
2211 link_with : [libshared],
2212 dependencies : [threads,
2217 install_rpath : rootlibexecdir,
2219 install_dir : rootlibexecdir)
2220 public_programs += [s_j_remote, s_j_gatewayd]
2223 if conf.get('ENABLE_COREDUMP') == 1
2224 executable('systemd-coredump',
2225 systemd_coredump_sources,
2226 include_directories : includes,
2227 link_with : [libshared],
2228 dependencies : [threads,
2233 install_rpath : rootlibexecdir,
2235 install_dir : rootlibexecdir)
2237 exe = executable('coredumpctl',
2238 coredumpctl_sources,
2239 include_directories : includes,
2240 link_with : [libshared],
2241 dependencies : [threads,
2244 install_rpath : rootlibexecdir,
2246 public_programs += exe
2249 if conf.get('ENABLE_BINFMT') == 1
2250 exe = executable('systemd-binfmt',
2251 'src/binfmt/binfmt.c',
2252 include_directories : includes,
2253 link_with : [libshared],
2254 install_rpath : rootlibexecdir,
2256 install_dir : rootlibexecdir)
2257 public_programs += exe
2259 meson.add_install_script('sh', '-c',
2260 mkdir_p.format(binfmtdir))
2261 meson.add_install_script('sh', '-c',
2262 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2265 if conf.get('ENABLE_VCONSOLE') == 1
2266 executable('systemd-vconsole-setup',
2267 'src/vconsole/vconsole-setup.c',
2268 include_directories : includes,
2269 link_with : [libshared],
2270 install_rpath : rootlibexecdir,
2272 install_dir : rootlibexecdir)
2275 if conf.get('ENABLE_RANDOMSEED') == 1
2276 executable('systemd-random-seed',
2277 'src/random-seed/random-seed.c',
2278 include_directories : includes,
2279 link_with : [libshared],
2280 install_rpath : rootlibexecdir,
2282 install_dir : rootlibexecdir)
2285 if conf.get('ENABLE_FIRSTBOOT') == 1
2286 executable('systemd-firstboot',
2287 'src/firstboot/firstboot.c',
2288 include_directories : includes,
2289 link_with : [libshared],
2290 dependencies : [libcrypt],
2291 install_rpath : rootlibexecdir,
2293 install_dir : rootbindir)
2296 executable('systemd-remount-fs',
2297 'src/remount-fs/remount-fs.c',
2298 include_directories : includes,
2299 link_with : [libcore_shared,
2301 install_rpath : rootlibexecdir,
2303 install_dir : rootlibexecdir)
2305 executable('systemd-machine-id-setup',
2306 'src/machine-id-setup/machine-id-setup-main.c',
2307 include_directories : includes,
2308 link_with : [libcore_shared,
2310 install_rpath : rootlibexecdir,
2312 install_dir : rootbindir)
2314 executable('systemd-fsck',
2316 include_directories : includes,
2317 link_with : [libshared],
2318 install_rpath : rootlibexecdir,
2320 install_dir : rootlibexecdir)
2322 executable('systemd-growfs',
2323 'src/partition/growfs.c',
2324 include_directories : includes,
2325 link_with : [libshared],
2326 dependencies : [libcryptsetup],
2327 install_rpath : rootlibexecdir,
2329 install_dir : rootlibexecdir)
2331 executable('systemd-makefs',
2332 'src/partition/makefs.c',
2333 include_directories : includes,
2334 link_with : [libshared],
2335 install_rpath : rootlibexecdir,
2337 install_dir : rootlibexecdir)
2339 executable('systemd-sleep',
2340 'src/sleep/sleep.c',
2341 include_directories : includes,
2342 link_with : [libshared],
2343 install_rpath : rootlibexecdir,
2345 install_dir : rootlibexecdir)
2347 install_data('src/sleep/sleep.conf',
2348 install_dir : pkgsysconfdir)
2350 exe = executable('systemd-sysctl',
2351 'src/sysctl/sysctl.c',
2352 include_directories : includes,
2353 link_with : [libshared],
2354 install_rpath : rootlibexecdir,
2356 install_dir : rootlibexecdir)
2357 public_programs += exe
2359 executable('systemd-ac-power',
2360 'src/ac-power/ac-power.c',
2361 include_directories : includes,
2362 link_with : [libshared],
2363 install_rpath : rootlibexecdir,
2365 install_dir : rootlibexecdir)
2367 exe = executable('systemd-detect-virt',
2368 'src/detect-virt/detect-virt.c',
2369 include_directories : includes,
2370 link_with : [libshared],
2371 install_rpath : rootlibexecdir,
2373 public_programs += exe
2375 exe = executable('systemd-delta',
2376 'src/delta/delta.c',
2377 include_directories : includes,
2378 link_with : [libshared],
2379 install_rpath : rootlibexecdir,
2381 public_programs += exe
2383 exe = executable('systemd-escape',
2384 'src/escape/escape.c',
2385 include_directories : includes,
2386 link_with : [libshared],
2387 install_rpath : rootlibexecdir,
2389 install_dir : rootbindir)
2390 public_programs += exe
2392 exe = executable('systemd-notify',
2393 'src/notify/notify.c',
2394 include_directories : includes,
2395 link_with : [libshared],
2396 install_rpath : rootlibexecdir,
2398 install_dir : rootbindir)
2399 public_programs += exe
2401 executable('systemd-volatile-root',
2402 'src/volatile-root/volatile-root.c',
2403 include_directories : includes,
2404 link_with : [libshared],
2405 install_rpath : rootlibexecdir,
2407 install_dir : rootlibexecdir)
2409 executable('systemd-cgroups-agent',
2410 'src/cgroups-agent/cgroups-agent.c',
2411 include_directories : includes,
2412 link_with : [libshared],
2413 install_rpath : rootlibexecdir,
2415 install_dir : rootlibexecdir)
2417 exe = executable('systemd-id128',
2418 'src/id128/id128.c',
2419 include_directories : includes,
2420 link_with : [libshared],
2421 install_rpath : rootlibexecdir,
2423 public_programs += exe
2425 exe = executable('systemd-path',
2427 include_directories : includes,
2428 link_with : [libshared],
2429 install_rpath : rootlibexecdir,
2431 public_programs += exe
2433 exe = executable('systemd-ask-password',
2434 'src/ask-password/ask-password.c',
2435 include_directories : includes,
2436 link_with : [libshared],
2437 install_rpath : rootlibexecdir,
2439 install_dir : rootbindir)
2440 public_programs += exe
2442 executable('systemd-reply-password',
2443 'src/reply-password/reply-password.c',
2444 include_directories : includes,
2445 link_with : [libshared],
2446 install_rpath : rootlibexecdir,
2448 install_dir : rootlibexecdir)
2450 exe = executable('systemd-tty-ask-password-agent',
2451 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2452 include_directories : includes,
2453 link_with : [libshared],
2454 install_rpath : rootlibexecdir,
2456 install_dir : rootbindir)
2457 public_programs += exe
2459 exe = executable('systemd-cgls',
2461 include_directories : includes,
2462 link_with : [libshared],
2463 install_rpath : rootlibexecdir,
2465 public_programs += exe
2467 exe = executable('systemd-cgtop',
2468 'src/cgtop/cgtop.c',
2469 include_directories : includes,
2470 link_with : [libshared],
2471 install_rpath : rootlibexecdir,
2473 public_programs += exe
2475 executable('systemd-initctl',
2476 'src/initctl/initctl.c',
2477 include_directories : includes,
2478 link_with : [libshared],
2479 install_rpath : rootlibexecdir,
2481 install_dir : rootlibexecdir)
2483 exe = executable('systemd-mount',
2484 'src/mount/mount-tool.c',
2485 include_directories : includes,
2486 link_with : [libshared],
2487 dependencies: [libmount],
2488 install_rpath : rootlibexecdir,
2490 public_programs += exe
2492 meson.add_install_script(meson_make_symlink,
2493 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2495 exe = executable('systemd-run',
2497 include_directories : includes,
2498 link_with : [libshared],
2499 install_rpath : rootlibexecdir,
2501 public_programs += exe
2503 exe = executable('systemd-stdio-bridge',
2504 'src/stdio-bridge/stdio-bridge.c',
2505 include_directories : includes,
2506 link_with : [libshared],
2507 dependencies : [versiondep],
2508 install_rpath : rootlibexecdir,
2510 public_programs += exe
2512 exe = executable('busctl',
2513 'src/busctl/busctl.c',
2514 'src/busctl/busctl-introspect.c',
2515 'src/busctl/busctl-introspect.h',
2516 include_directories : includes,
2517 link_with : [libshared],
2518 install_rpath : rootlibexecdir,
2520 public_programs += exe
2522 if conf.get('ENABLE_SYSUSERS') == 1
2523 exe = executable('systemd-sysusers',
2524 'src/sysusers/sysusers.c',
2525 include_directories : includes,
2526 link_with : [libshared],
2527 install_rpath : rootlibexecdir,
2529 install_dir : rootbindir)
2530 public_programs += exe
2533 if conf.get('ENABLE_TMPFILES') == 1
2534 exe = executable('systemd-tmpfiles',
2535 'src/tmpfiles/tmpfiles.c',
2536 include_directories : includes,
2537 link_with : [libshared],
2538 dependencies : [libacl],
2539 install_rpath : rootlibexecdir,
2541 install_dir : rootbindir)
2542 public_programs += exe
2544 if want_tests != 'false'
2545 test('test-systemd-tmpfiles',
2546 test_systemd_tmpfiles_py,
2547 # https://github.com/mesonbuild/meson/issues/2681
2548 args : exe.full_path())
2552 if conf.get('ENABLE_HWDB') == 1
2553 exe = executable('systemd-hwdb',
2555 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2556 include_directories : includes,
2557 link_with : [libudev_static],
2558 install_rpath : udev_rpath,
2560 install_dir : rootbindir)
2561 public_programs += exe
2564 if conf.get('ENABLE_QUOTACHECK') == 1
2565 executable('systemd-quotacheck',
2566 'src/quotacheck/quotacheck.c',
2567 include_directories : includes,
2568 link_with : [libshared],
2569 install_rpath : rootlibexecdir,
2571 install_dir : rootlibexecdir)
2574 exe = executable('systemd-socket-proxyd',
2575 'src/socket-proxy/socket-proxyd.c',
2576 include_directories : includes,
2577 link_with : [libshared],
2578 dependencies : [threads],
2579 install_rpath : rootlibexecdir,
2581 install_dir : rootlibexecdir)
2582 public_programs += exe
2584 exe = executable('systemd-udevd',
2585 systemd_udevd_sources,
2586 include_directories : includes,
2587 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2588 link_with : [libudev_core,
2591 dependencies : [versiondep,
2597 install_rpath : udev_rpath,
2599 install_dir : rootlibexecdir)
2600 public_programs += exe
2602 exe = executable('udevadm',
2604 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2605 include_directories : includes,
2606 link_with : [libudev_core,
2609 dependencies : [versiondep,
2615 install_rpath : udev_rpath,
2617 install_dir : rootbindir)
2618 public_programs += exe
2620 executable('systemd-shutdown',
2621 systemd_shutdown_sources,
2622 include_directories : includes,
2623 link_with : [libcore_shared,
2625 dependencies : [libmount],
2626 install_rpath : rootlibexecdir,
2628 install_dir : rootlibexecdir)
2630 executable('systemd-update-done',
2631 'src/update-done/update-done.c',
2632 include_directories : includes,
2633 link_with : [libshared],
2634 install_rpath : rootlibexecdir,
2636 install_dir : rootlibexecdir)
2638 executable('systemd-update-utmp',
2639 'src/update-utmp/update-utmp.c',
2640 include_directories : includes,
2641 link_with : [libshared],
2642 dependencies : [libaudit],
2643 install_rpath : rootlibexecdir,
2645 install_dir : rootlibexecdir)
2647 if conf.get('HAVE_KMOD') == 1
2648 executable('systemd-modules-load',
2649 'src/modules-load/modules-load.c',
2650 include_directories : includes,
2651 link_with : [libshared],
2652 dependencies : [libkmod],
2653 install_rpath : rootlibexecdir,
2655 install_dir : rootlibexecdir)
2657 meson.add_install_script('sh', '-c',
2658 mkdir_p.format(modulesloaddir))
2659 meson.add_install_script('sh', '-c',
2660 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2663 exe = executable('systemd-nspawn',
2664 systemd_nspawn_sources,
2665 include_directories : includes,
2666 link_with : [libcore_shared,
2669 dependencies : [libblkid,
2671 install_rpath : rootlibexecdir,
2673 public_programs += exe
2675 if conf.get('ENABLE_NETWORKD') == 1
2676 executable('systemd-networkd',
2677 systemd_networkd_sources,
2678 include_directories : includes,
2679 link_with : [libnetworkd_core,
2683 dependencies : [threads],
2684 install_rpath : rootlibexecdir,
2686 install_dir : rootlibexecdir)
2688 executable('systemd-networkd-wait-online',
2689 systemd_networkd_wait_online_sources,
2690 include_directories : includes,
2691 link_with : [libnetworkd_core,
2693 install_rpath : rootlibexecdir,
2695 install_dir : rootlibexecdir)
2697 exe = executable('networkctl',
2699 include_directories : includes,
2700 link_with : [libsystemd_network,
2702 install_rpath : rootlibexecdir,
2704 install_dir : rootbindir)
2705 public_programs += exe
2708 executable('systemd-sulogin-shell',
2709 ['src/sulogin-shell/sulogin-shell.c'],
2710 include_directories : includes,
2711 link_with : [libshared],
2712 install_rpath : rootlibexecdir,
2714 install_dir : rootlibexecdir)
2716 ############################################################
2719 'systemd-runtest.env',
2720 output : 'systemd-runtest.env',
2721 command : ['sh', '-c', '{ ' +
2722 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2723 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2725 build_by_default : true)
2727 foreach tuple : tests
2729 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2730 dependencies = tuple[2]
2731 condition = tuple.length() >= 4 ? tuple[3] : ''
2732 type = tuple.length() >= 5 ? tuple[4] : ''
2733 defs = tuple.length() >= 6 ? tuple[5] : []
2734 incs = tuple.length() >= 7 ? tuple[6] : includes
2737 name = sources[0].split('/')[-1].split('.')[0]
2738 if type.startswith('timeout=')
2739 timeout = type.split('=')[1].to_int()
2743 if condition == '' or conf.get(condition) == 1
2747 include_directories : incs,
2748 link_with : link_with,
2749 dependencies : [versiondep,
2752 build_by_default : want_tests != 'false',
2753 install_rpath : rootlibexecdir,
2754 install : install_tests,
2755 install_dir : join_paths(testsdir, type))
2758 message('@0@ is a manual test'.format(name))
2759 elif type == 'unsafe' and want_tests != 'unsafe'
2760 message('@0@ is an unsafe test'.format(name))
2761 elif want_tests != 'false'
2767 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2772 'test-libsystemd-sym',
2773 test_libsystemd_sym_c,
2774 include_directories : includes,
2775 link_with : [libsystemd],
2776 build_by_default : want_tests != 'false',
2777 install : install_tests,
2778 install_dir : testsdir)
2779 if want_tests != 'false'
2780 test('test-libsystemd-sym', exe)
2784 'test-libsystemd-static-sym',
2785 test_libsystemd_sym_c,
2786 include_directories : includes,
2787 link_with : [install_libsystemd_static],
2788 dependencies : [threads], # threads is already included in dependencies on the library,
2789 # but does not seem to get propagated. Add here as a work-around.
2790 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2791 install : install_tests and static_libsystemd_pic,
2792 install_dir : testsdir)
2793 if want_tests != 'false' and static_libsystemd_pic
2794 test('test-libsystemd-static-sym', exe)
2800 include_directories : includes,
2801 c_args : '-Wno-deprecated-declarations',
2802 link_with : [libudev],
2803 build_by_default : want_tests != 'false',
2804 install : install_tests,
2805 install_dir : testsdir)
2806 if want_tests != 'false'
2807 test('test-libudev-sym', exe)
2811 'test-libudev-static-sym',
2813 include_directories : includes,
2814 c_args : '-Wno-deprecated-declarations',
2815 link_with : [install_libudev_static],
2816 build_by_default : want_tests != 'false' and static_libudev_pic,
2817 install : install_tests and static_libudev_pic,
2818 install_dir : testsdir)
2819 if want_tests != 'false' and static_libudev_pic
2820 test('test-libudev-static-sym', exe)
2823 ############################################################
2827 if get_option('tests') != 'false'
2828 foreach tuple : fuzzers
2830 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2831 dependencies = tuple[2]
2832 defs = tuple.length() >= 4 ? tuple[3] : []
2833 incs = tuple.length() >= 5 ? tuple[4] : includes
2836 if want_ossfuzz or want_fuzzbuzz
2837 dependencies += fuzzing_engine
2839 if fuzzing_engine.found()
2840 dependencies += fuzzing_engine
2842 link_args += ['-fsanitize=fuzzer']
2845 sources += 'src/fuzz/fuzz-main.c'
2849 sources += 'src/fuzz/fuzzer-entry-point.c'
2852 name = sources[0].split('/')[-1].split('.')[0]
2854 fuzzer_exes += executable(
2857 include_directories : [incs, include_directories('src/fuzz')],
2858 link_with : link_with,
2859 dependencies : dependencies,
2861 link_args: link_args,
2866 run_target('fuzzers',
2867 depends : fuzzer_exes,
2870 ############################################################
2872 make_directive_index_py = find_program('tools/make-directive-index.py')
2873 make_man_index_py = find_program('tools/make-man-index.py')
2874 xml_helper_py = find_program('tools/xml_helper.py')
2875 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2879 subdir('sysusers.d')
2880 subdir('tmpfiles.d')
2885 subdir('shell-completion/bash')
2886 subdir('shell-completion/zsh')
2887 subdir('docs/sysvinit')
2888 subdir('docs/var-log')
2890 install_subdir('factory/etc',
2891 install_dir : factorydir)
2893 install_data('xorg/50-systemd-user.sh',
2894 install_dir : xinitrcdir)
2895 install_data('modprobe.d/systemd.conf',
2896 install_dir : modprobedir)
2897 install_data('LICENSE.GPL2',
2901 'docs/CODING_STYLE.md',
2902 'docs/DISTRO_PORTING.md',
2903 'docs/ENVIRONMENT.md',
2905 'docs/TRANSIENT-SETTINGS.md',
2906 'docs/TRANSLATORS.md',
2907 'docs/UIDS-GIDS.md',
2908 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2909 install_dir : docdir)
2911 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2912 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2914 ############################################################
2916 meson_check_help = find_program('tools/meson-check-help.sh')
2918 foreach exec : public_programs
2919 name = exec.full_path().split('/')[-1]
2920 if want_tests != 'false'
2921 test('check-help-' + name,
2923 args : exec.full_path())
2927 ############################################################
2929 check_directives_sh = find_program('tools/check-directives.sh')
2931 if want_tests != 'false'
2932 test('check-directives',
2933 check_directives_sh,
2934 args : project_source_root)
2937 ############################################################
2939 # Enable tests for all supported sanitizers
2940 foreach tuple : sanitizers
2941 sanitizer = tuple[0]
2944 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2946 foreach p : fuzz_regression_tests
2947 b = p.split('/')[-2]
2948 c = p.split('/')[-1]
2950 name = '@0@:@1@'.format(b, sanitizer)
2953 if want_tests == 'false'
2954 message('Not compiling @0@ because tests is set to false'.format(name))
2956 exe = custom_target(
2960 command : [env, 'ln', '-fs',
2961 join_paths(build.full_path(), b),
2963 build_by_default : true)
2965 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2970 if want_tests != 'false' and slow_tests
2971 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2973 args : [exe.full_path(),
2974 join_paths(project_source_root, p)])
2981 ############################################################
2984 all_files = run_command(
2986 ['--git-dir=@0@/.git'.format(project_source_root),
2989 all_files = files(all_files.stdout().split())
2994 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
2997 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3001 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3004 command : [meson_git_contrib_sh])
3008 git_head = run_command(
3010 ['--git-dir=@0@/.git'.format(project_source_root),
3011 'rev-parse', 'HEAD']).stdout().strip()
3012 git_head_short = run_command(
3014 ['--git-dir=@0@/.git'.format(project_source_root),
3015 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3019 command : ['git', 'archive',
3020 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3022 '--prefix', 'systemd-@0@/'.format(git_head),
3026 ############################################################
3028 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3031 depends : [man, libsystemd, libudev],
3032 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3034 ############################################################
3037 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3039 'split /usr: @0@'.format(split_usr),
3040 'split bin-sbin: @0@'.format(split_bin),
3041 'prefix directory: @0@'.format(prefixdir),
3042 'rootprefix directory: @0@'.format(rootprefixdir),
3043 'sysconf directory: @0@'.format(sysconfdir),
3044 'include directory: @0@'.format(includedir),
3045 'lib directory: @0@'.format(libdir),
3046 'rootlib directory: @0@'.format(rootlibdir),
3047 'SysV init scripts: @0@'.format(sysvinit_path),
3048 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3049 'PAM modules directory: @0@'.format(pamlibdir),
3050 'PAM configuration directory: @0@'.format(pamconfdir),
3051 'RPM macros directory: @0@'.format(rpmmacrosdir),
3052 'modprobe.d directory: @0@'.format(modprobedir),
3053 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3054 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3055 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3056 'bash completions directory: @0@'.format(bashcompletiondir),
3057 'zsh completions directory: @0@'.format(zshcompletiondir),
3058 'extra start script: @0@'.format(get_option('rc-local')),
3059 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3060 get_option('debug-tty')),
3061 'TTY GID: @0@'.format(tty_gid),
3062 'users GID: @0@'.format(substs.get('USERS_GID')),
3063 'maximum system UID: @0@'.format(system_uid_max),
3064 'maximum system GID: @0@'.format(system_gid_max),
3065 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3066 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3067 'minimum container UID base: @0@'.format(container_uid_base_min),
3068 'maximum container UID base: @0@'.format(container_uid_base_max),
3069 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3070 'render group access mode: @0@'.format(get_option('group-render-mode')),
3071 'certificate root directory: @0@'.format(get_option('certificate-root')),
3072 'support URL: @0@'.format(support_url),
3073 'nobody user name: @0@'.format(nobody_user),
3074 'nobody group name: @0@'.format(nobody_group),
3075 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3076 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3078 'default DNSSEC mode: @0@'.format(default_dnssec),
3079 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3080 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3081 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3082 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3083 'default locale: @0@'.format(default_locale)]
3085 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3086 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3088 'default DNS servers: @0@'.format(alt_dns_servers),
3089 'default NTP servers: @0@'.format(alt_ntp_servers)]
3091 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3092 '@@0@'.format(time_epoch)).stdout().strip()
3094 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3097 'static libsystemd: @0@'.format(static_libsystemd),
3098 'static libudev: @0@'.format(static_libudev)]
3101 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3102 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3103 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3105 if conf.get('ENABLE_EFI') == 1
3106 status += 'efi arch: @0@'.format(efi_arch)
3110 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3111 'EFI CC @0@'.format(' '.join(efi_cc)),
3112 'EFI lib directory: @0@'.format(efi_libdir),
3113 'EFI lds directory: @0@'.format(efi_ldsdir),
3114 'EFI include directory: @0@'.format(efi_incdir)]
3166 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3167 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3170 ['legacy pkla', install_polkit_pkla],
3172 ['gnu-efi', have_gnu_efi],
3185 ['man pages', want_man],
3186 ['html pages', want_html],
3187 ['man page indices', want_man and have_lxml],
3192 ['adm group', get_option('adm-group')],
3193 ['wheel group', get_option('wheel-group')],
3196 ['debug mmap cache'],
3199 ['valgrind', conf.get('VALGRIND') == 1],
3200 ['trace logging', conf.get('LOG_TRACE') == 1],
3201 ['link-udev-shared', get_option('link-udev-shared')],
3202 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3205 if tuple.length() >= 2
3208 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3209 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3210 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3221 'enabled features: @0@'.format(', '.join(found)),
3223 'disabled features: @0@'.format(', '.join(missing)),
3225 message('\n '.join(status))
3227 if rootprefixdir != rootprefix_default
3229 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3230 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3231 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))