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 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
117 rpmmacrosdir = get_option('rpmmacrosdir')
118 if rpmmacrosdir != 'no'
119 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
121 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
124 pkgdatadir = join_paths(datadir, 'systemd')
125 environmentdir = join_paths(prefixdir, 'lib/environment.d')
126 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
127 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
128 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
129 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
130 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
131 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
132 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
133 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
134 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
135 pkgincludedir = join_paths(includedir, 'systemd')
136 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
137 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
138 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
139 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
140 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
141 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
142 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
143 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
144 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
145 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
146 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
147 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
148 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
149 factorydir = join_paths(datadir, 'factory')
150 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
151 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
152 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
153 catalogstatedir = join_paths(systemdstatedir, 'catalog')
154 randomseeddir = join_paths(localstatedir, 'lib/systemd')
155 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
157 docdir = get_option('docdir')
159 docdir = join_paths(datadir, 'doc/systemd')
162 dbuspolicydir = get_option('dbuspolicydir')
163 if dbuspolicydir == ''
164 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
167 dbussessionservicedir = get_option('dbussessionservicedir')
168 if dbussessionservicedir == ''
169 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
172 dbussystemservicedir = get_option('dbussystemservicedir')
173 if dbussystemservicedir == ''
174 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
177 pamlibdir = get_option('pamlibdir')
179 pamlibdir = join_paths(rootlibdir, 'security')
182 pamconfdir = get_option('pamconfdir')
184 pamconfdir = join_paths(sysconfdir, 'pam.d')
187 memory_accounting_default = get_option('memory-accounting-default')
189 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
190 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
191 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
192 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
193 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
194 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
196 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
198 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
199 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
200 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
201 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
202 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
203 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
204 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
205 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
206 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
207 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
208 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
209 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
210 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
211 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
212 conf.set_quoted('ROOTPREFIX', rootprefixdir)
213 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
214 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
215 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
216 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
217 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
218 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
219 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
220 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
221 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
222 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
223 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
224 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
225 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
226 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
227 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
228 conf.set_quoted('LIBDIR', libdir)
229 conf.set_quoted('ROOTLIBDIR', rootlibdir)
230 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
231 conf.set_quoted('BOOTLIBDIR', bootlibdir)
232 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
233 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
234 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
235 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
236 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
237 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
238 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
239 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
240 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
242 substs.set('prefix', prefixdir)
243 substs.set('rootprefix', rootprefixdir)
244 substs.set('rootprefix_noslash', rootprefixdir_noslash)
245 substs.set('exec_prefix', prefixdir)
246 substs.set('libdir', libdir)
247 substs.set('rootlibdir', rootlibdir)
248 substs.set('includedir', includedir)
249 substs.set('sysconfdir', sysconfdir)
250 substs.set('bindir', bindir)
251 substs.set('rootbindir', rootbindir)
252 substs.set('rootlibexecdir', rootlibexecdir)
253 substs.set('systemunitdir', systemunitdir)
254 substs.set('userunitdir', userunitdir)
255 substs.set('systempresetdir', systempresetdir)
256 substs.set('userpresetdir', userpresetdir)
257 substs.set('udevhwdbdir', udevhwdbdir)
258 substs.set('udevrulesdir', udevrulesdir)
259 substs.set('udevlibexecdir', udevlibexecdir)
260 substs.set('environmentdir', environmentdir)
261 substs.set('catalogdir', catalogdir)
262 substs.set('tmpfilesdir', tmpfilesdir)
263 substs.set('sysusersdir', sysusersdir)
264 substs.set('sysctldir', sysctldir)
265 substs.set('binfmtdir', binfmtdir)
266 substs.set('modulesloaddir', modulesloaddir)
267 substs.set('modprobedir', modprobedir)
268 substs.set('systemgeneratordir', systemgeneratordir)
269 substs.set('usergeneratordir', usergeneratordir)
270 substs.set('systemenvgeneratordir', systemenvgeneratordir)
271 substs.set('userenvgeneratordir', userenvgeneratordir)
272 substs.set('systemshutdowndir', systemshutdowndir)
273 substs.set('systemsleepdir', systemsleepdir)
274 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
275 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
276 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
277 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
278 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
279 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
280 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
281 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
282 substs.set('BUILD_ROOT', meson.current_build_dir())
284 #####################################################################
286 cc = meson.get_compiler('c')
287 pkgconfig = import('pkgconfig')
288 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
289 meson_build_sh = find_program('tools/meson-build.sh')
291 want_tests = get_option('tests')
292 slow_tests = want_tests != 'false' and get_option('slow-tests')
293 install_tests = get_option('install-tests')
295 if add_languages('cpp', required : fuzzer_build)
296 # Used only for tests
297 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
303 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
304 if fuzzing_engine.found()
305 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
306 elif cc.has_argument('-fsanitize=fuzzer-no-link')
307 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
309 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
312 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
314 fuzzing_engine = meson.get_compiler('cpp').find_library(get_option('fuzzbuzz-engine'), dirs: get_option('fuzzbuzz-engine-dir'))
317 possible_cc_flags = [
321 '-Wmissing-include-dirs',
322 '-Wold-style-definition',
326 '-Wsuggest-attribute=noreturn',
327 '-Werror=missing-prototypes',
328 '-Werror=implicit-function-declaration',
329 '-Werror=missing-declarations',
330 '-Werror=return-type',
331 '-Werror=incompatible-pointer-types',
333 '-Wstrict-prototypes',
335 '-Wmissing-noreturn',
336 '-Wimplicit-fallthrough=5',
339 '-Wstrict-aliasing=2',
342 '-Werror=shift-count-overflow',
343 '-Werror=shift-overflow=2',
347 # negative arguments are correctly detected starting with meson 0.46.
348 '-Wno-unused-parameter',
349 '-Wno-missing-field-initializers',
350 '-Wno-unused-result',
351 '-Wno-format-signedness',
352 '-Wno-error=#warnings', # clang
353 '-Wno-string-plus-int', # clang
355 # work-around for gcc 7.1 turning this on on its own.
356 '-Wno-error=nonnull',
358 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
359 # optimizations enabled, producing essentially false positives.
360 '-Wno-maybe-uninitialized',
364 '-fdiagnostics-show-option',
365 '-fno-strict-aliasing',
366 '-fvisibility=hidden',
368 '-fstack-protector-strong',
369 '--param=ssp-buffer-size=4',
372 # --as-needed and --no-undefined are provided by meson by default,
373 # run mesonconf to see what is enabled
374 possible_link_flags = [
379 if cc.get_id() == 'clang'
380 possible_cc_flags += [
381 '-Wno-typedef-redefinition',
382 '-Wno-gnu-variable-sized-type-not-at-end',
386 if get_option('buildtype') != 'debug'
387 possible_cc_flags += [
388 '-ffunction-sections',
392 possible_link_flags += '-Wl,--gc-sections'
395 if get_option('b_ndebug') == 'true'
396 # With asserts disabled with get a bunch of warnings about variables which
397 # are used only in the asserts. This is not useful at all, so let's just silence
399 possible_cc_flags += [
400 '-Wno-unused-variable',
401 '-Wno-unused-but-set-variable',
405 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
406 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
410 #include <inttypes.h>
411 typedef uint64_t usec_t;
412 usec_t now(clockid_t clock);
417 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
418 add_project_arguments('-Werror=shadow', language : 'c')
421 cpp = ' '.join(cc.cmd_array()) + ' -E'
423 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
425 #####################################################################
426 # compilation result tests
428 conf.set('_GNU_SOURCE', true)
429 conf.set('__SANE_USERSPACE_TYPES__', true)
430 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
432 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
433 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
434 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
435 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
436 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
437 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
438 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
442 #include <sys/stat.h>
445 foreach decl : ['char16_t',
450 # We get -1 if the size cannot be determined
451 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
453 if decl == 'struct statx'
455 want_linux_stat_h = false
457 have = cc.sizeof(decl,
458 prefix : decl_headers + '#include <linux/stat.h>',
459 args : '-D_GNU_SOURCE') > 0
460 want_linux_stat_h = have
464 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
467 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
469 foreach ident : ['secure_getenv', '__secure_getenv']
470 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
474 ['memfd_create', '''#include <sys/mman.h>'''],
475 ['gettid', '''#include <sys/types.h>
476 #include <unistd.h>'''],
477 ['pivot_root', '''#include <stdlib.h>
478 #include <unistd.h>'''], # no known header declares pivot_root
479 ['name_to_handle_at', '''#include <sys/types.h>
480 #include <sys/stat.h>
481 #include <fcntl.h>'''],
482 ['setns', '''#include <sched.h>'''],
483 ['renameat2', '''#include <stdio.h>
484 #include <fcntl.h>'''],
485 ['kcmp', '''#include <linux/kcmp.h>'''],
486 ['keyctl', '''#include <sys/types.h>
487 #include <keyutils.h>'''],
488 ['copy_file_range', '''#include <sys/syscall.h>
489 #include <unistd.h>'''],
490 ['bpf', '''#include <sys/syscall.h>
491 #include <unistd.h>'''],
492 ['statx', '''#include <sys/types.h>
493 #include <sys/stat.h>
494 #include <unistd.h>'''],
495 ['explicit_bzero' , '''#include <string.h>'''],
496 ['reallocarray', '''#include <malloc.h>'''],
497 ['set_mempolicy', '''#include <stdlib.h>
498 #include <unistd.h>'''],
499 ['get_mempolicy', '''#include <stdlib.h>
500 #include <unistd.h>'''],
503 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
504 conf.set10('HAVE_' + ident[0].to_upper(), have)
507 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
508 conf.set10('USE_SYS_RANDOM_H', true)
509 conf.set10('HAVE_GETRANDOM', true)
511 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
512 conf.set10('USE_SYS_RANDOM_H', false)
513 conf.set10('HAVE_GETRANDOM', have)
516 #####################################################################
518 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
520 get_option('version-tag'),
521 meson.project_version()]
524 input : 'src/version/version.h.in',
525 output : 'version.h',
528 versiondep = declare_dependency(sources: version_h)
530 sed = find_program('sed')
531 awk = find_program('awk')
532 m4 = find_program('m4')
533 stat = find_program('stat')
534 git = find_program('git', required : false)
535 env = find_program('env')
536 perl = find_program('perl', required : false)
538 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
539 mkdir_p = 'mkdir -p $DESTDIR/@0@'
540 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
541 splash_bmp = files('test/splash.bmp')
543 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
544 # /usr/sbin, /sbin, and fall back to the default from middle column.
545 progs = [['quotaon', '/usr/sbin/quotaon' ],
546 ['quotacheck', '/usr/sbin/quotacheck' ],
547 ['kmod', '/usr/bin/kmod' ],
548 ['kexec', '/usr/sbin/kexec' ],
549 ['sulogin', '/usr/sbin/sulogin' ],
550 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
551 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
552 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
553 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
556 path = get_option(prog[0] + '-path')
558 message('Using @1@ for @0@'.format(prog[0], path))
560 exe = find_program(prog[0],
561 '/usr/sbin/' + prog[0],
564 path = exe.found() ? exe.path() : prog[1]
566 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
567 conf.set_quoted(name, path)
568 substs.set(name, path)
571 conf.set_quoted('TELINIT', get_option('telinit-path'))
573 if run_command('ln', '--relative', '--help').returncode() != 0
574 error('ln does not support --relative (added in coreutils 8.16)')
577 ############################################################
579 gperf = find_program('gperf')
581 gperf_test_format = '''
583 const char * in_word_set(const char *, @0@);
586 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
587 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
588 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
589 if cc.compiles(gperf_test)
590 gperf_len_type = 'size_t'
592 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
593 if cc.compiles(gperf_test)
594 gperf_len_type = 'unsigned'
596 error('unable to determine gperf len type')
599 message('gperf len type is @0@'.format(gperf_len_type))
600 conf.set('GPERF_LEN_TYPE', gperf_len_type,
601 description : 'The type of gperf "len" parameter')
603 ############################################################
605 if not cc.has_header('sys/capability.h')
606 error('POSIX caps headers not found')
608 foreach header : ['crypt.h',
610 'linux/vm_sockets.h',
612 'valgrind/memcheck.h',
613 'valgrind/valgrind.h',
616 conf.set10('HAVE_' + header.underscorify().to_upper(),
617 cc.has_header(header))
620 ############################################################
622 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
623 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
624 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
626 default_hierarchy = get_option('default-hierarchy')
627 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
628 description : 'default cgroup hierarchy as string')
629 if default_hierarchy == 'legacy'
630 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
631 elif default_hierarchy == 'hybrid'
632 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
634 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
637 default_net_naming_scheme = get_option('default-net-naming-scheme')
638 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
640 time_epoch = get_option('time-epoch')
643 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
645 conf.set('TIME_EPOCH', time_epoch)
647 system_uid_max = get_option('system-uid-max')
648 if system_uid_max == -1
649 system_uid_max = run_command(
651 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
652 '/etc/login.defs').stdout().strip()
653 if system_uid_max == ''
656 system_uid_max = system_uid_max.to_int()
659 conf.set('SYSTEM_UID_MAX', system_uid_max)
660 substs.set('systemuidmax', system_uid_max)
662 system_gid_max = get_option('system-gid-max')
663 if system_gid_max == -1
664 system_gid_max = run_command(
666 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
667 '/etc/login.defs').stdout().strip()
668 if system_gid_max == ''
671 system_gid_max = system_gid_max.to_int()
674 conf.set('SYSTEM_GID_MAX', system_gid_max)
675 substs.set('systemgidmax', system_gid_max)
677 dynamic_uid_min = get_option('dynamic-uid-min')
678 dynamic_uid_max = get_option('dynamic-uid-max')
679 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
680 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
681 substs.set('dynamicuidmin', dynamic_uid_min)
682 substs.set('dynamicuidmax', dynamic_uid_max)
684 container_uid_base_min = get_option('container-uid-base-min')
685 container_uid_base_max = get_option('container-uid-base-max')
686 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
687 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
688 substs.set('containeruidbasemin', container_uid_base_min)
689 substs.set('containeruidbasemax', container_uid_base_max)
691 nobody_user = get_option('nobody-user')
692 nobody_group = get_option('nobody-group')
694 if not meson.is_cross_build()
695 getent_result = run_command('getent', 'passwd', '65534')
696 if getent_result.returncode() == 0
697 name = getent_result.stdout().split(':')[0]
698 if name != nobody_user
700 '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) +
701 'Your build will result in an user table setup that is incompatible with the local system.')
704 id_result = run_command('id', '-u', nobody_user)
705 if id_result.returncode() == 0
706 id = id_result.stdout().to_int()
709 '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) +
710 'Your build will result in an user table setup that is incompatible with the local system.')
714 getent_result = run_command('getent', 'group', '65534')
715 if getent_result.returncode() == 0
716 name = getent_result.stdout().split(':')[0]
717 if name != nobody_group
719 '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) +
720 'Your build will result in an group table setup that is incompatible with the local system.')
723 id_result = run_command('id', '-g', nobody_group)
724 if id_result.returncode() == 0
725 id = id_result.stdout().to_int()
728 '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) +
729 'Your build will result in an group table setup that is incompatible with the local system.')
733 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
735 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
736 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
739 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
740 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
741 substs.set('NOBODY_USER_NAME', nobody_user)
742 substs.set('NOBODY_GROUP_NAME', nobody_group)
744 tty_gid = get_option('tty-gid')
745 conf.set('TTY_GID', tty_gid)
746 substs.set('TTY_GID', tty_gid)
748 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
749 users_gid = get_option('users-gid')
750 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
752 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
753 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
755 dev_kvm_mode = get_option('dev-kvm-mode')
756 substs.set('DEV_KVM_MODE', dev_kvm_mode)
757 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
758 group_render_mode = get_option('group-render-mode')
759 substs.set('GROUP_RENDER_MODE', group_render_mode)
760 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
762 kill_user_processes = get_option('default-kill-user-processes')
763 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
764 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
765 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
767 dns_servers = get_option('dns-servers')
768 conf.set_quoted('DNS_SERVERS', dns_servers)
769 substs.set('DNS_SERVERS', dns_servers)
771 ntp_servers = get_option('ntp-servers')
772 conf.set_quoted('NTP_SERVERS', ntp_servers)
773 substs.set('NTP_SERVERS', ntp_servers)
775 default_locale = get_option('default-locale')
776 if default_locale == ''
777 if not meson.is_cross_build()
778 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
779 default_locale = run_command(choose_default_locale_sh).stdout().strip()
781 default_locale = 'C.UTF-8'
784 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
786 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
788 substs.set('SUSHELL', get_option('debug-shell'))
789 substs.set('DEBUGTTY', get_option('debug-tty'))
790 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
792 enable_debug_hashmap = false
793 enable_debug_mmap_cache = false
794 enable_debug_siphash = false
795 foreach name : get_option('debug-extra')
797 enable_debug_hashmap = true
798 elif name == 'mmap-cache'
799 enable_debug_mmap_cache = true
800 elif name == 'siphash'
801 enable_debug_siphash = 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)
810 conf.set10('VALGRIND', get_option('valgrind'))
811 conf.set10('LOG_TRACE', get_option('log-trace'))
813 #####################################################################
815 threads = dependency('threads')
816 librt = cc.find_library('rt')
817 libm = cc.find_library('m')
818 libdl = cc.find_library('dl')
819 libcrypt = cc.find_library('crypt')
821 libcap = dependency('libcap', required : false)
822 if not libcap.found()
823 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
824 libcap = cc.find_library('cap')
827 libmount = dependency('mount',
828 version : fuzzer_build ? '>= 0' : '>= 2.30')
830 want_seccomp = get_option('seccomp')
831 if want_seccomp != 'false' and not skip_deps
832 libseccomp = dependency('libseccomp',
833 version : '>= 2.3.1',
834 required : want_seccomp == 'true')
835 have = libseccomp.found()
840 conf.set10('HAVE_SECCOMP', have)
842 want_selinux = get_option('selinux')
843 if want_selinux != 'false' and not skip_deps
844 libselinux = dependency('libselinux',
845 version : '>= 2.1.9',
846 required : want_selinux == 'true')
847 have = libselinux.found()
852 conf.set10('HAVE_SELINUX', have)
854 want_apparmor = get_option('apparmor')
855 if want_apparmor != 'false' and not skip_deps
856 libapparmor = dependency('libapparmor',
857 required : want_apparmor == 'true')
858 have = libapparmor.found()
863 conf.set10('HAVE_APPARMOR', have)
865 smack_run_label = get_option('smack-run-label')
866 if smack_run_label != ''
867 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
870 want_polkit = get_option('polkit')
871 install_polkit = false
872 install_polkit_pkla = false
873 if want_polkit != 'false' and not skip_deps
874 install_polkit = true
876 libpolkit = dependency('polkit-gobject-1',
878 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
879 message('Old polkit detected, will install pkla files')
880 install_polkit_pkla = true
883 conf.set10('ENABLE_POLKIT', install_polkit)
885 want_acl = get_option('acl')
886 if want_acl != 'false' and not skip_deps
887 libacl = cc.find_library('acl', required : want_acl == 'true')
888 have = libacl.found()
893 conf.set10('HAVE_ACL', have)
895 want_audit = get_option('audit')
896 if want_audit != 'false' and not skip_deps
897 libaudit = dependency('audit', required : want_audit == 'true')
898 have = libaudit.found()
903 conf.set10('HAVE_AUDIT', have)
905 want_blkid = get_option('blkid')
906 if want_blkid != 'false' and not skip_deps
907 libblkid = dependency('blkid', required : want_blkid == 'true')
908 have = libblkid.found()
913 conf.set10('HAVE_BLKID', have)
915 want_kmod = get_option('kmod')
916 if want_kmod != 'false' and not skip_deps
917 libkmod = dependency('libkmod',
919 required : want_kmod == 'true')
920 have = libkmod.found()
925 conf.set10('HAVE_KMOD', have)
927 want_pam = get_option('pam')
928 if want_pam != 'false' and not skip_deps
929 libpam = cc.find_library('pam', required : want_pam == 'true')
930 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
931 have = libpam.found() and libpam_misc.found()
937 conf.set10('HAVE_PAM', have)
939 want_microhttpd = get_option('microhttpd')
940 if want_microhttpd != 'false' and not skip_deps
941 libmicrohttpd = dependency('libmicrohttpd',
942 version : '>= 0.9.33',
943 required : want_microhttpd == 'true')
944 have = libmicrohttpd.found()
949 conf.set10('HAVE_MICROHTTPD', have)
951 want_libcryptsetup = get_option('libcryptsetup')
952 if want_libcryptsetup != 'false' and not skip_deps
953 libcryptsetup = dependency('libcryptsetup',
954 version : '>= 1.6.0',
955 required : want_libcryptsetup == 'true')
956 have = libcryptsetup.found()
957 have_sector = cc.has_member(
958 'struct crypt_params_plain',
960 prefix : '#include <libcryptsetup.h>')
966 conf.set10('HAVE_LIBCRYPTSETUP', have)
967 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
969 want_libcurl = get_option('libcurl')
970 if want_libcurl != 'false' and not skip_deps
971 libcurl = dependency('libcurl',
972 version : '>= 7.32.0',
973 required : want_libcurl == 'true')
974 have = libcurl.found()
979 conf.set10('HAVE_LIBCURL', have)
981 want_libidn = get_option('libidn')
982 want_libidn2 = get_option('libidn2')
983 if want_libidn == 'true' and want_libidn2 == 'true'
984 error('libidn and libidn2 cannot be requested simultaneously')
987 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
988 libidn = dependency('libidn2',
989 required : want_libidn2 == 'true')
990 have = libidn.found()
995 conf.set10('HAVE_LIBIDN2', have)
996 if not have and want_libidn != 'false' and not skip_deps
997 # libidn is used for both libidn and libidn2 objects
998 libidn = dependency('libidn',
999 required : want_libidn == 'true')
1000 have = libidn.found()
1004 conf.set10('HAVE_LIBIDN', have)
1006 want_libiptc = get_option('libiptc')
1007 if want_libiptc != 'false' and not skip_deps
1008 libiptc = dependency('libiptc',
1009 required : want_libiptc == 'true')
1010 have = libiptc.found()
1015 conf.set10('HAVE_LIBIPTC', have)
1017 want_qrencode = get_option('qrencode')
1018 if want_qrencode != 'false' and not skip_deps
1019 libqrencode = dependency('libqrencode',
1020 required : want_qrencode == 'true')
1021 have = libqrencode.found()
1026 conf.set10('HAVE_QRENCODE', have)
1028 want_gcrypt = get_option('gcrypt')
1029 if want_gcrypt != 'false' and not skip_deps
1030 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1031 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1032 have = libgcrypt.found() and libgpg_error.found()
1037 # link to neither of the libs if one is not found
1041 conf.set10('HAVE_GCRYPT', have)
1043 want_gnutls = get_option('gnutls')
1044 if want_gnutls != 'false' and not skip_deps
1045 libgnutls = dependency('gnutls',
1046 version : '>= 3.1.4',
1047 required : want_gnutls == 'true')
1048 have = libgnutls.found()
1053 conf.set10('HAVE_GNUTLS', have)
1055 want_openssl = get_option('openssl')
1056 if want_openssl != 'false' and not skip_deps
1057 libopenssl = dependency('openssl',
1058 version : '>= 1.1.0',
1059 required : want_openssl == 'true')
1060 have = libopenssl.found()
1065 conf.set10('HAVE_OPENSSL', have)
1067 want_elfutils = get_option('elfutils')
1068 if want_elfutils != 'false' and not skip_deps
1069 libdw = dependency('libdw',
1070 required : want_elfutils == 'true')
1071 have = libdw.found()
1076 conf.set10('HAVE_ELFUTILS', have)
1078 want_zlib = get_option('zlib')
1079 if want_zlib != 'false' and not skip_deps
1080 libz = dependency('zlib',
1081 required : want_zlib == 'true')
1087 conf.set10('HAVE_ZLIB', have)
1089 want_bzip2 = get_option('bzip2')
1090 if want_bzip2 != 'false' and not skip_deps
1091 libbzip2 = cc.find_library('bz2',
1092 required : want_bzip2 == 'true')
1093 have = libbzip2.found()
1098 conf.set10('HAVE_BZIP2', have)
1100 want_xz = get_option('xz')
1101 if want_xz != 'false' and not skip_deps
1102 libxz = dependency('liblzma',
1103 required : want_xz == 'true')
1104 have = libxz.found()
1109 conf.set10('HAVE_XZ', have)
1111 want_lz4 = get_option('lz4')
1112 if want_lz4 != 'false' and not skip_deps
1113 liblz4 = dependency('liblz4',
1114 version : '>= 1.3.0',
1115 required : want_lz4 == 'true')
1116 have = liblz4.found()
1121 conf.set10('HAVE_LZ4', have)
1123 want_xkbcommon = get_option('xkbcommon')
1124 if want_xkbcommon != 'false' and not skip_deps
1125 libxkbcommon = dependency('xkbcommon',
1126 version : '>= 0.3.0',
1127 required : want_xkbcommon == 'true')
1128 have = libxkbcommon.found()
1133 conf.set10('HAVE_XKBCOMMON', have)
1135 want_pcre2 = get_option('pcre2')
1136 if want_pcre2 != 'false'
1137 libpcre2 = dependency('libpcre2-8',
1138 required : want_pcre2 == 'true')
1139 have = libpcre2.found()
1144 conf.set10('HAVE_PCRE2', have)
1146 want_glib = get_option('glib')
1147 if want_glib != 'false' and not skip_deps
1148 libglib = dependency('glib-2.0',
1149 version : '>= 2.22.0',
1150 required : want_glib == 'true')
1151 libgobject = dependency('gobject-2.0',
1152 version : '>= 2.22.0',
1153 required : want_glib == 'true')
1154 libgio = dependency('gio-2.0',
1155 required : want_glib == 'true')
1156 have = libglib.found() and libgobject.found() and libgio.found()
1163 conf.set10('HAVE_GLIB', have)
1165 want_dbus = get_option('dbus')
1166 if want_dbus != 'false' and not skip_deps
1167 libdbus = dependency('dbus-1',
1168 version : '>= 1.3.2',
1169 required : want_dbus == 'true')
1170 have = libdbus.found()
1175 conf.set10('HAVE_DBUS', have)
1177 default_dnssec = get_option('default-dnssec')
1179 default_dnssec = 'no'
1181 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1182 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1183 default_dnssec = 'no'
1185 conf.set('DEFAULT_DNSSEC_MODE',
1186 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1187 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1189 dns_over_tls = get_option('dns-over-tls')
1190 if dns_over_tls != 'false'
1191 if dns_over_tls == 'openssl'
1194 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1195 if dns_over_tls == 'gnutls' and not have_gnutls
1196 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1199 if dns_over_tls == 'gnutls' or have_gnutls
1200 have_openssl = false
1202 have_openssl = conf.get('HAVE_OPENSSL') == 1
1203 if dns_over_tls != 'auto' and not have_openssl
1204 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1205 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1208 have = have_gnutls or have_openssl
1212 have_openssl = false
1214 conf.set10('ENABLE_DNS_OVER_TLS', have)
1215 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1216 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1218 default_dns_over_tls = get_option('default-dns-over-tls')
1220 default_dns_over_tls = 'no'
1222 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1223 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.')
1224 default_dns_over_tls = 'no'
1226 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1227 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1228 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1230 want_importd = get_option('importd')
1231 if want_importd != 'false'
1232 have = (conf.get('HAVE_LIBCURL') == 1 and
1233 conf.get('HAVE_ZLIB') == 1 and
1234 conf.get('HAVE_XZ') == 1 and
1235 conf.get('HAVE_GCRYPT') == 1)
1236 if want_importd == 'true' and not have
1237 error('importd support was requested, but dependencies are not available')
1242 conf.set10('ENABLE_IMPORTD', have)
1244 want_remote = get_option('remote')
1245 if want_remote != 'false'
1246 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1247 conf.get('HAVE_LIBCURL') == 1]
1248 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1249 # it's possible to build one without the other. Complain only if
1250 # support was explicitly requested. The auxiliary files like sysusers
1251 # config should be installed when any of the programs are built.
1252 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1253 error('remote support was requested, but dependencies are not available')
1255 have = have_deps[0] or have_deps[1]
1259 conf.set10('ENABLE_REMOTE', have)
1261 foreach term : ['utmp',
1293 have = get_option(term)
1294 name = 'ENABLE_' + term.underscorify().to_upper()
1295 conf.set10(name, have)
1298 foreach tuple : [['nss-mymachines', 'machined'],
1299 ['nss-resolve', 'resolve']]
1300 want = get_option(tuple[0])
1302 have = get_option(tuple[1])
1303 if want == 'true' and not have
1304 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1309 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1310 conf.set10(name, have)
1314 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1315 'ENABLE_NSS_MYMACHINES',
1316 'ENABLE_NSS_RESOLVE',
1317 'ENABLE_NSS_SYSTEMD']
1318 if conf.get(term) == 1
1322 conf.set10('ENABLE_NSS', enable_nss)
1324 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1329 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1331 #####################################################################
1333 if get_option('efi')
1334 efi_arch = host_machine.cpu_family()
1336 if efi_arch == 'x86'
1337 EFI_MACHINE_TYPE_NAME = 'ia32'
1338 gnu_efi_arch = 'ia32'
1339 elif efi_arch == 'x86_64'
1340 EFI_MACHINE_TYPE_NAME = 'x64'
1341 gnu_efi_arch = 'x86_64'
1342 elif efi_arch == 'arm'
1343 EFI_MACHINE_TYPE_NAME = 'arm'
1344 gnu_efi_arch = 'arm'
1345 elif efi_arch == 'aarch64'
1346 EFI_MACHINE_TYPE_NAME = 'aa64'
1347 gnu_efi_arch = 'aarch64'
1349 EFI_MACHINE_TYPE_NAME = ''
1354 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1356 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1360 conf.set10('ENABLE_EFI', have)
1362 #####################################################################
1364 config_h = configure_file(
1365 output : 'config.h',
1366 configuration : conf)
1368 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1370 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'],
3198 ['valgrind', conf.get('VALGRIND') == 1],
3199 ['trace logging', conf.get('LOG_TRACE') == 1],
3200 ['link-udev-shared', get_option('link-udev-shared')],
3201 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3204 if tuple.length() >= 2
3207 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3208 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3209 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3220 'enabled features: @0@'.format(', '.join(found)),
3222 'disabled features: @0@'.format(', '.join(missing)),
3224 message('\n '.join(status))
3226 if rootprefixdir != rootprefix_default
3228 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3229 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3230 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))