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',
1374 'src/journal-remote',
1378 'src/time-wait-sync',
1384 'src/libsystemd/sd-bus',
1385 'src/libsystemd/sd-device',
1386 'src/libsystemd/sd-event',
1387 'src/libsystemd/sd-hwdb',
1388 'src/libsystemd/sd-id128',
1389 'src/libsystemd/sd-netlink',
1390 'src/libsystemd/sd-network',
1391 'src/libsystemd/sd-resolve',
1392 'src/libsystemd-network',
1395 add_project_arguments('-include', 'config.h', language : 'c')
1397 generate_gperfs = find_program('tools/generate-gperfs.py')
1401 subdir('src/systemd')
1403 subdir('src/libsystemd')
1404 subdir('src/libsystemd-network')
1405 subdir('src/journal')
1408 libjournal_core = static_library(
1410 libjournal_core_sources,
1412 include_directories : includes,
1415 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1416 libsystemd = shared_library(
1419 version : libsystemd_version,
1420 include_directories : includes,
1421 link_args : ['-shared',
1422 '-Wl,--version-script=' + libsystemd_sym_path],
1423 link_with : [libbasic,
1425 link_whole : [libsystemd_static,
1427 dependencies : [threads,
1431 link_depends : libsystemd_sym,
1433 install_dir : rootlibdir)
1435 static_libsystemd = get_option('static-libsystemd')
1436 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1438 install_libsystemd_static = static_library(
1441 journal_client_sources,
1443 basic_gcrypt_sources,
1445 include_directories : includes,
1446 build_by_default : static_libsystemd != 'false',
1447 install : static_libsystemd != 'false',
1448 install_dir : rootlibdir,
1449 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1450 dependencies : [threads,
1459 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1461 ############################################################
1463 # binaries that have --help and are intended for use by humans,
1464 # usually, but not always, installed in /bin.
1465 public_programs = []
1467 subdir('src/libudev')
1468 subdir('src/shared')
1470 subdir('src/shutdown')
1472 subdir('src/network')
1474 subdir('src/analyze')
1475 subdir('src/journal-remote')
1476 subdir('src/coredump')
1477 subdir('src/hostname')
1478 subdir('src/import')
1479 subdir('src/kernel-install')
1480 subdir('src/locale')
1481 subdir('src/machine')
1482 subdir('src/portable')
1483 subdir('src/nspawn')
1484 subdir('src/resolve')
1485 subdir('src/timedate')
1486 subdir('src/timesync')
1487 subdir('src/vconsole')
1488 subdir('src/boot/efi')
1495 ############################################################
1497 # only static linking apart from libdl, to make sure that the
1498 # module is linked to all libraries that it uses.
1499 test_dlopen = executable(
1503 include_directories : includes,
1504 link_with : [libbasic],
1505 dependencies : [libdl],
1506 build_by_default : want_tests != 'false')
1508 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1509 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1510 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1511 ['resolve', 'ENABLE_NSS_RESOLVE']]
1513 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1517 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1518 version_script_arg = join_paths(project_source_root, sym)
1520 nss = shared_library(
1522 'src/nss-@0@/nss-@0@.c'.format(module),
1525 include_directories : includes,
1526 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1527 link_args : ['-Wl,-z,nodelete',
1529 '-Wl,--version-script=' + version_script_arg],
1530 link_with : [libsystemd_static,
1532 dependencies : [threads,
1536 install_dir : rootlibdir)
1538 # We cannot use shared_module because it does not support version suffix.
1539 # Unfortunately shared_library insists on creating the symlink…
1540 meson.add_install_script('sh', '-c',
1541 'rm $DESTDIR@0@/libnss_@1@.so'
1542 .format(rootlibdir, module))
1544 if want_tests != 'false'
1545 test('dlopen-nss_' + module,
1547 # path to dlopen must include a slash
1548 args : nss.full_path())
1553 ############################################################
1555 executable('systemd',
1557 include_directories : includes,
1558 link_with : [libcore,
1560 dependencies : [versiondep,
1567 install_rpath : rootlibexecdir,
1569 install_dir : rootlibexecdir)
1571 meson.add_install_script(meson_make_symlink,
1572 join_paths(rootlibexecdir, 'systemd'),
1573 join_paths(rootsbindir, 'init'))
1575 exe = executable('systemd-analyze',
1576 systemd_analyze_sources,
1577 include_directories : includes,
1578 link_with : [libcore,
1580 dependencies : [versiondep,
1587 install_rpath : rootlibexecdir,
1589 public_programs += exe
1591 executable('systemd-journald',
1592 systemd_journald_sources,
1593 include_directories : includes,
1594 link_with : [libjournal_core,
1596 dependencies : [threads,
1600 install_rpath : rootlibexecdir,
1602 install_dir : rootlibexecdir)
1604 exe = executable('systemd-cat',
1605 systemd_cat_sources,
1606 include_directories : includes,
1607 link_with : [libjournal_core,
1609 dependencies : [threads],
1610 install_rpath : rootlibexecdir,
1612 public_programs += exe
1614 exe = executable('journalctl',
1616 include_directories : includes,
1617 link_with : [libshared],
1618 dependencies : [threads,
1623 install_rpath : rootlibexecdir,
1625 install_dir : rootbindir)
1626 public_programs += exe
1628 executable('systemd-getty-generator',
1629 'src/getty-generator/getty-generator.c',
1630 include_directories : includes,
1631 link_with : [libshared],
1632 install_rpath : rootlibexecdir,
1634 install_dir : systemgeneratordir)
1636 executable('systemd-debug-generator',
1637 'src/debug-generator/debug-generator.c',
1638 include_directories : includes,
1639 link_with : [libshared],
1640 install_rpath : rootlibexecdir,
1642 install_dir : systemgeneratordir)
1644 executable('systemd-run-generator',
1645 'src/run-generator/run-generator.c',
1646 include_directories : includes,
1647 link_with : [libshared],
1648 install_rpath : rootlibexecdir,
1650 install_dir : systemgeneratordir)
1652 executable('systemd-fstab-generator',
1653 'src/fstab-generator/fstab-generator.c',
1654 include_directories : includes,
1655 link_with : [libcore_shared,
1657 install_rpath : rootlibexecdir,
1659 install_dir : systemgeneratordir)
1661 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1662 executable('30-systemd-environment-d-generator',
1663 'src/environment-d-generator/environment-d-generator.c',
1664 include_directories : includes,
1665 link_with : [libshared],
1666 install_rpath : rootlibexecdir,
1668 install_dir : userenvgeneratordir)
1670 meson.add_install_script(meson_make_symlink,
1671 join_paths(sysconfdir, 'environment'),
1672 join_paths(environmentdir, '99-environment.conf'))
1675 if conf.get('ENABLE_HIBERNATE') == 1
1676 executable('systemd-hibernate-resume-generator',
1677 'src/hibernate-resume/hibernate-resume-generator.c',
1678 include_directories : includes,
1679 link_with : [libshared],
1680 install_rpath : rootlibexecdir,
1682 install_dir : systemgeneratordir)
1684 executable('systemd-hibernate-resume',
1685 'src/hibernate-resume/hibernate-resume.c',
1686 include_directories : includes,
1687 link_with : [libshared],
1688 install_rpath : rootlibexecdir,
1690 install_dir : rootlibexecdir)
1693 if conf.get('HAVE_BLKID') == 1
1694 executable('systemd-gpt-auto-generator',
1695 'src/gpt-auto-generator/gpt-auto-generator.c',
1696 'src/shared/blkid-util.h',
1697 include_directories : includes,
1698 link_with : [libshared],
1699 dependencies : libblkid,
1700 install_rpath : rootlibexecdir,
1702 install_dir : systemgeneratordir)
1704 exe = executable('systemd-dissect',
1705 'src/dissect/dissect.c',
1706 include_directories : includes,
1707 link_with : [libshared],
1708 install_rpath : rootlibexecdir,
1710 install_dir : rootlibexecdir)
1711 public_programs += exe
1714 if conf.get('ENABLE_RESOLVE') == 1
1715 executable('systemd-resolved',
1716 systemd_resolved_sources,
1717 include_directories : includes,
1718 link_with : [libshared,
1720 libsystemd_resolve_core],
1721 dependencies : systemd_resolved_dependencies,
1722 install_rpath : rootlibexecdir,
1724 install_dir : rootlibexecdir)
1726 exe = executable('resolvectl',
1728 include_directories : includes,
1729 link_with : [libshared,
1731 libsystemd_resolve_core],
1732 dependencies : [threads,
1736 install_rpath : rootlibexecdir,
1738 public_programs += exe
1740 meson.add_install_script(meson_make_symlink,
1741 join_paths(bindir, 'resolvectl'),
1742 join_paths(rootsbindir, 'resolvconf'))
1744 meson.add_install_script(meson_make_symlink,
1745 join_paths(bindir, 'resolvectl'),
1746 join_paths(bindir, 'systemd-resolve'))
1749 if conf.get('ENABLE_LOGIND') == 1
1750 executable('systemd-logind',
1751 systemd_logind_sources,
1752 include_directories : includes,
1753 link_with : [liblogind_core,
1755 dependencies : [threads,
1757 install_rpath : rootlibexecdir,
1759 install_dir : rootlibexecdir)
1761 exe = executable('loginctl',
1763 include_directories : includes,
1764 link_with : [libshared],
1765 dependencies : [threads,
1768 install_rpath : rootlibexecdir,
1770 install_dir : rootbindir)
1771 public_programs += exe
1773 exe = executable('systemd-inhibit',
1774 'src/login/inhibit.c',
1775 include_directories : includes,
1776 link_with : [libshared],
1777 install_rpath : rootlibexecdir,
1779 install_dir : rootbindir)
1780 public_programs += exe
1782 if conf.get('HAVE_PAM') == 1
1783 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1784 pam_systemd = shared_library(
1788 include_directories : includes,
1789 link_args : ['-shared',
1790 '-Wl,--version-script=' + version_script_arg],
1791 link_with : [libsystemd_static,
1793 dependencies : [threads,
1796 link_depends : pam_systemd_sym,
1798 install_dir : pamlibdir)
1800 if want_tests != 'false'
1801 test('dlopen-pam_systemd',
1803 # path to dlopen must include a slash
1804 args : pam_systemd.full_path())
1808 executable('systemd-user-runtime-dir',
1809 user_runtime_dir_sources,
1810 include_directories : includes,
1811 link_with : [libshared],
1812 install_rpath : rootlibexecdir,
1814 install_dir : rootlibexecdir)
1817 if conf.get('HAVE_PAM') == 1
1818 executable('systemd-user-sessions',
1819 'src/user-sessions/user-sessions.c',
1820 include_directories : includes,
1821 link_with : [libshared],
1822 install_rpath : rootlibexecdir,
1824 install_dir : rootlibexecdir)
1827 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1828 exe = executable('bootctl',
1829 'src/boot/bootctl.c',
1830 include_directories : includes,
1831 link_with : [libshared],
1832 dependencies : [libblkid],
1833 install_rpath : rootlibexecdir,
1835 public_programs += exe
1837 executable('systemd-bless-boot',
1838 'src/boot/bless-boot.c',
1839 include_directories : includes,
1840 link_with : [libshared],
1841 dependencies : [libblkid],
1842 install_rpath : rootlibexecdir,
1844 install_dir : rootlibexecdir)
1846 executable('systemd-bless-boot-generator',
1847 'src/boot/bless-boot-generator.c',
1848 include_directories : includes,
1849 link_with : [libshared],
1850 install_rpath : rootlibexecdir,
1852 install_dir : systemgeneratordir)
1855 executable('systemd-boot-check-no-failures',
1856 'src/boot/boot-check-no-failures.c',
1857 include_directories : includes,
1858 link_with : [libshared],
1859 dependencies : [libblkid],
1860 install_rpath : rootlibexecdir,
1862 install_dir : rootlibexecdir)
1864 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1865 include_directories : includes,
1866 link_with : [libshared],
1867 dependencies : [threads],
1868 install_rpath : rootlibexecdir,
1870 public_programs += exe
1873 if get_option('link-systemctl-shared')
1874 systemctl_link_with = [libshared]
1876 systemctl_link_with = [libsystemd_static,
1882 exe = executable('systemctl',
1883 'src/systemctl/systemctl.c',
1884 'src/systemctl/sysv-compat.h',
1885 'src/systemctl/sysv-compat.c',
1886 include_directories : includes,
1887 link_with : systemctl_link_with,
1888 dependencies : [threads,
1893 install_rpath : rootlibexecdir,
1895 install_dir : rootbindir)
1896 public_programs += exe
1898 if conf.get('ENABLE_PORTABLED') == 1
1899 executable('systemd-portabled',
1900 systemd_portabled_sources,
1901 include_directories : includes,
1902 link_with : [libshared],
1903 dependencies : [threads],
1904 install_rpath : rootlibexecdir,
1906 install_dir : rootlibexecdir)
1908 exe = executable('portablectl', 'src/portable/portablectl.c',
1909 include_directories : includes,
1910 link_with : [libshared],
1911 dependencies : [threads],
1912 install_rpath : rootlibexecdir,
1914 install_dir : rootbindir)
1915 public_programs += exe
1918 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1919 meson.add_install_script(meson_make_symlink,
1920 join_paths(rootbindir, 'systemctl'),
1921 join_paths(rootsbindir, alias))
1924 if conf.get('ENABLE_BACKLIGHT') == 1
1925 executable('systemd-backlight',
1926 'src/backlight/backlight.c',
1927 include_directories : includes,
1928 link_with : [libshared],
1929 install_rpath : rootlibexecdir,
1931 install_dir : rootlibexecdir)
1934 if conf.get('ENABLE_RFKILL') == 1
1935 executable('systemd-rfkill',
1936 'src/rfkill/rfkill.c',
1937 include_directories : includes,
1938 link_with : [libshared],
1939 install_rpath : rootlibexecdir,
1941 install_dir : rootlibexecdir)
1944 executable('systemd-system-update-generator',
1945 'src/system-update-generator/system-update-generator.c',
1946 include_directories : includes,
1947 link_with : [libshared],
1948 install_rpath : rootlibexecdir,
1950 install_dir : systemgeneratordir)
1952 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1953 executable('systemd-cryptsetup',
1954 'src/cryptsetup/cryptsetup.c',
1955 include_directories : includes,
1956 link_with : [libshared],
1957 dependencies : [libcryptsetup],
1958 install_rpath : rootlibexecdir,
1960 install_dir : rootlibexecdir)
1962 executable('systemd-cryptsetup-generator',
1963 'src/cryptsetup/cryptsetup-generator.c',
1964 include_directories : includes,
1965 link_with : [libshared],
1966 dependencies : [libcryptsetup],
1967 install_rpath : rootlibexecdir,
1969 install_dir : systemgeneratordir)
1971 executable('systemd-veritysetup',
1972 'src/veritysetup/veritysetup.c',
1973 include_directories : includes,
1974 link_with : [libshared],
1975 dependencies : [libcryptsetup],
1976 install_rpath : rootlibexecdir,
1978 install_dir : rootlibexecdir)
1980 executable('systemd-veritysetup-generator',
1981 'src/veritysetup/veritysetup-generator.c',
1982 include_directories : includes,
1983 link_with : [libshared],
1984 dependencies : [libcryptsetup],
1985 install_rpath : rootlibexecdir,
1987 install_dir : systemgeneratordir)
1990 if conf.get('HAVE_SYSV_COMPAT') == 1
1991 executable('systemd-sysv-generator',
1992 'src/sysv-generator/sysv-generator.c',
1993 include_directories : includes,
1994 link_with : [libshared],
1995 install_rpath : rootlibexecdir,
1997 install_dir : systemgeneratordir)
1999 executable('systemd-rc-local-generator',
2000 'src/rc-local-generator/rc-local-generator.c',
2001 include_directories : includes,
2002 link_with : [libshared],
2003 install_rpath : rootlibexecdir,
2005 install_dir : systemgeneratordir)
2008 if conf.get('ENABLE_HOSTNAMED') == 1
2009 executable('systemd-hostnamed',
2010 'src/hostname/hostnamed.c',
2011 include_directories : includes,
2012 link_with : [libshared],
2013 install_rpath : rootlibexecdir,
2015 install_dir : rootlibexecdir)
2017 exe = executable('hostnamectl',
2018 'src/hostname/hostnamectl.c',
2019 include_directories : includes,
2020 link_with : [libshared],
2021 install_rpath : rootlibexecdir,
2023 public_programs += exe
2026 if conf.get('ENABLE_LOCALED') == 1
2027 if conf.get('HAVE_XKBCOMMON') == 1
2028 # logind will load libxkbcommon.so dynamically on its own
2034 executable('systemd-localed',
2035 systemd_localed_sources,
2036 include_directories : includes,
2037 link_with : [libshared],
2038 dependencies : deps,
2039 install_rpath : rootlibexecdir,
2041 install_dir : rootlibexecdir)
2043 exe = executable('localectl',
2045 include_directories : includes,
2046 link_with : [libshared],
2047 install_rpath : rootlibexecdir,
2049 public_programs += exe
2052 if conf.get('ENABLE_TIMEDATED') == 1
2053 executable('systemd-timedated',
2054 'src/timedate/timedated.c',
2055 include_directories : includes,
2056 link_with : [libshared],
2057 install_rpath : rootlibexecdir,
2059 install_dir : rootlibexecdir)
2062 if conf.get('ENABLE_TIMEDATECTL') == 1
2063 exe = executable('timedatectl',
2064 'src/timedate/timedatectl.c',
2065 include_directories : includes,
2066 install_rpath : rootlibexecdir,
2067 link_with : [libshared],
2068 dependencies : [libm],
2070 public_programs += exe
2073 if conf.get('ENABLE_TIMESYNCD') == 1
2074 executable('systemd-timesyncd',
2075 systemd_timesyncd_sources,
2076 include_directories : includes,
2077 link_with : [libshared],
2078 dependencies : [threads,
2080 install_rpath : rootlibexecdir,
2082 install_dir : rootlibexecdir)
2084 executable('systemd-time-wait-sync',
2085 'src/time-wait-sync/time-wait-sync.c',
2086 include_directories : includes,
2087 link_with : [libshared],
2088 install_rpath : rootlibexecdir,
2090 install_dir : rootlibexecdir)
2093 if conf.get('ENABLE_MACHINED') == 1
2094 executable('systemd-machined',
2095 systemd_machined_sources,
2096 include_directories : includes,
2097 link_with : [libmachine_core,
2099 install_rpath : rootlibexecdir,
2101 install_dir : rootlibexecdir)
2103 exe = executable('machinectl',
2104 'src/machine/machinectl.c',
2105 include_directories : includes,
2106 link_with : [libshared],
2107 dependencies : [threads,
2110 install_rpath : rootlibexecdir,
2112 install_dir : rootbindir)
2113 public_programs += exe
2116 if conf.get('ENABLE_IMPORTD') == 1
2117 executable('systemd-importd',
2118 systemd_importd_sources,
2119 include_directories : includes,
2120 link_with : [libshared],
2121 dependencies : [threads],
2122 install_rpath : rootlibexecdir,
2124 install_dir : rootlibexecdir)
2126 systemd_pull = executable('systemd-pull',
2127 systemd_pull_sources,
2128 include_directories : includes,
2129 link_with : [libshared],
2130 dependencies : [versiondep,
2136 install_rpath : rootlibexecdir,
2138 install_dir : rootlibexecdir)
2140 systemd_import = executable('systemd-import',
2141 systemd_import_sources,
2142 include_directories : includes,
2143 link_with : [libshared],
2144 dependencies : [libcurl,
2148 install_rpath : rootlibexecdir,
2150 install_dir : rootlibexecdir)
2152 systemd_import_fs = executable('systemd-import-fs',
2153 systemd_import_fs_sources,
2154 include_directories : includes,
2155 link_with : [libshared],
2156 install_rpath : rootlibexecdir,
2158 install_dir : rootlibexecdir)
2160 systemd_export = executable('systemd-export',
2161 systemd_export_sources,
2162 include_directories : includes,
2163 link_with : [libshared],
2164 dependencies : [libcurl,
2168 install_rpath : rootlibexecdir,
2170 install_dir : rootlibexecdir)
2172 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2175 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2176 exe = executable('systemd-journal-upload',
2177 systemd_journal_upload_sources,
2178 include_directories : includes,
2179 link_with : [libshared],
2180 dependencies : [versiondep,
2186 install_rpath : rootlibexecdir,
2188 install_dir : rootlibexecdir)
2189 public_programs += exe
2192 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2193 s_j_remote = executable('systemd-journal-remote',
2194 systemd_journal_remote_sources,
2195 include_directories : includes,
2196 link_with : [libshared,
2197 libsystemd_journal_remote],
2198 dependencies : [threads,
2203 install_rpath : rootlibexecdir,
2205 install_dir : rootlibexecdir)
2207 s_j_gatewayd = executable('systemd-journal-gatewayd',
2208 systemd_journal_gatewayd_sources,
2209 include_directories : includes,
2210 link_with : [libshared],
2211 dependencies : [threads,
2216 install_rpath : rootlibexecdir,
2218 install_dir : rootlibexecdir)
2219 public_programs += [s_j_remote, s_j_gatewayd]
2222 if conf.get('ENABLE_COREDUMP') == 1
2223 executable('systemd-coredump',
2224 systemd_coredump_sources,
2225 include_directories : includes,
2226 link_with : [libshared],
2227 dependencies : [threads,
2232 install_rpath : rootlibexecdir,
2234 install_dir : rootlibexecdir)
2236 exe = executable('coredumpctl',
2237 coredumpctl_sources,
2238 include_directories : includes,
2239 link_with : [libshared],
2240 dependencies : [threads,
2243 install_rpath : rootlibexecdir,
2245 public_programs += exe
2248 if conf.get('ENABLE_BINFMT') == 1
2249 exe = executable('systemd-binfmt',
2250 'src/binfmt/binfmt.c',
2251 include_directories : includes,
2252 link_with : [libshared],
2253 install_rpath : rootlibexecdir,
2255 install_dir : rootlibexecdir)
2256 public_programs += exe
2258 meson.add_install_script('sh', '-c',
2259 mkdir_p.format(binfmtdir))
2260 meson.add_install_script('sh', '-c',
2261 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2264 if conf.get('ENABLE_VCONSOLE') == 1
2265 executable('systemd-vconsole-setup',
2266 'src/vconsole/vconsole-setup.c',
2267 include_directories : includes,
2268 link_with : [libshared],
2269 install_rpath : rootlibexecdir,
2271 install_dir : rootlibexecdir)
2274 if conf.get('ENABLE_RANDOMSEED') == 1
2275 executable('systemd-random-seed',
2276 'src/random-seed/random-seed.c',
2277 include_directories : includes,
2278 link_with : [libshared],
2279 install_rpath : rootlibexecdir,
2281 install_dir : rootlibexecdir)
2284 if conf.get('ENABLE_FIRSTBOOT') == 1
2285 executable('systemd-firstboot',
2286 'src/firstboot/firstboot.c',
2287 include_directories : includes,
2288 link_with : [libshared],
2289 dependencies : [libcrypt],
2290 install_rpath : rootlibexecdir,
2292 install_dir : rootbindir)
2295 executable('systemd-remount-fs',
2296 'src/remount-fs/remount-fs.c',
2297 include_directories : includes,
2298 link_with : [libcore_shared,
2300 install_rpath : rootlibexecdir,
2302 install_dir : rootlibexecdir)
2304 executable('systemd-machine-id-setup',
2305 'src/machine-id-setup/machine-id-setup-main.c',
2306 include_directories : includes,
2307 link_with : [libcore_shared,
2309 install_rpath : rootlibexecdir,
2311 install_dir : rootbindir)
2313 executable('systemd-fsck',
2315 include_directories : includes,
2316 link_with : [libshared],
2317 install_rpath : rootlibexecdir,
2319 install_dir : rootlibexecdir)
2321 executable('systemd-growfs',
2322 'src/partition/growfs.c',
2323 include_directories : includes,
2324 link_with : [libshared],
2325 dependencies : [libcryptsetup],
2326 install_rpath : rootlibexecdir,
2328 install_dir : rootlibexecdir)
2330 executable('systemd-makefs',
2331 'src/partition/makefs.c',
2332 include_directories : includes,
2333 link_with : [libshared],
2334 install_rpath : rootlibexecdir,
2336 install_dir : rootlibexecdir)
2338 executable('systemd-sleep',
2339 'src/sleep/sleep.c',
2340 include_directories : includes,
2341 link_with : [libshared],
2342 install_rpath : rootlibexecdir,
2344 install_dir : rootlibexecdir)
2346 install_data('src/sleep/sleep.conf',
2347 install_dir : pkgsysconfdir)
2349 exe = executable('systemd-sysctl',
2350 'src/sysctl/sysctl.c',
2351 include_directories : includes,
2352 link_with : [libshared],
2353 install_rpath : rootlibexecdir,
2355 install_dir : rootlibexecdir)
2356 public_programs += exe
2358 executable('systemd-ac-power',
2359 'src/ac-power/ac-power.c',
2360 include_directories : includes,
2361 link_with : [libshared],
2362 install_rpath : rootlibexecdir,
2364 install_dir : rootlibexecdir)
2366 exe = executable('systemd-detect-virt',
2367 'src/detect-virt/detect-virt.c',
2368 include_directories : includes,
2369 link_with : [libshared],
2370 install_rpath : rootlibexecdir,
2372 public_programs += exe
2374 exe = executable('systemd-delta',
2375 'src/delta/delta.c',
2376 include_directories : includes,
2377 link_with : [libshared],
2378 install_rpath : rootlibexecdir,
2380 public_programs += exe
2382 exe = executable('systemd-escape',
2383 'src/escape/escape.c',
2384 include_directories : includes,
2385 link_with : [libshared],
2386 install_rpath : rootlibexecdir,
2388 install_dir : rootbindir)
2389 public_programs += exe
2391 exe = executable('systemd-notify',
2392 'src/notify/notify.c',
2393 include_directories : includes,
2394 link_with : [libshared],
2395 install_rpath : rootlibexecdir,
2397 install_dir : rootbindir)
2398 public_programs += exe
2400 executable('systemd-volatile-root',
2401 'src/volatile-root/volatile-root.c',
2402 include_directories : includes,
2403 link_with : [libshared],
2404 install_rpath : rootlibexecdir,
2406 install_dir : rootlibexecdir)
2408 executable('systemd-cgroups-agent',
2409 'src/cgroups-agent/cgroups-agent.c',
2410 include_directories : includes,
2411 link_with : [libshared],
2412 install_rpath : rootlibexecdir,
2414 install_dir : rootlibexecdir)
2416 exe = executable('systemd-id128',
2417 'src/id128/id128.c',
2418 include_directories : includes,
2419 link_with : [libshared],
2420 install_rpath : rootlibexecdir,
2422 public_programs += exe
2424 exe = executable('systemd-path',
2426 include_directories : includes,
2427 link_with : [libshared],
2428 install_rpath : rootlibexecdir,
2430 public_programs += exe
2432 exe = executable('systemd-ask-password',
2433 'src/ask-password/ask-password.c',
2434 include_directories : includes,
2435 link_with : [libshared],
2436 install_rpath : rootlibexecdir,
2438 install_dir : rootbindir)
2439 public_programs += exe
2441 executable('systemd-reply-password',
2442 'src/reply-password/reply-password.c',
2443 include_directories : includes,
2444 link_with : [libshared],
2445 install_rpath : rootlibexecdir,
2447 install_dir : rootlibexecdir)
2449 exe = executable('systemd-tty-ask-password-agent',
2450 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2451 include_directories : includes,
2452 link_with : [libshared],
2453 install_rpath : rootlibexecdir,
2455 install_dir : rootbindir)
2456 public_programs += exe
2458 exe = executable('systemd-cgls',
2460 include_directories : includes,
2461 link_with : [libshared],
2462 install_rpath : rootlibexecdir,
2464 public_programs += exe
2466 exe = executable('systemd-cgtop',
2467 'src/cgtop/cgtop.c',
2468 include_directories : includes,
2469 link_with : [libshared],
2470 install_rpath : rootlibexecdir,
2472 public_programs += exe
2474 executable('systemd-initctl',
2475 'src/initctl/initctl.c',
2476 include_directories : includes,
2477 link_with : [libshared],
2478 install_rpath : rootlibexecdir,
2480 install_dir : rootlibexecdir)
2482 exe = executable('systemd-mount',
2483 'src/mount/mount-tool.c',
2484 include_directories : includes,
2485 link_with : [libshared],
2486 dependencies: [libmount],
2487 install_rpath : rootlibexecdir,
2489 public_programs += exe
2491 meson.add_install_script(meson_make_symlink,
2492 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2494 exe = executable('systemd-run',
2496 include_directories : includes,
2497 link_with : [libshared],
2498 install_rpath : rootlibexecdir,
2500 public_programs += exe
2502 exe = executable('systemd-stdio-bridge',
2503 'src/stdio-bridge/stdio-bridge.c',
2504 include_directories : includes,
2505 link_with : [libshared],
2506 dependencies : [versiondep],
2507 install_rpath : rootlibexecdir,
2509 public_programs += exe
2511 exe = executable('busctl',
2512 'src/busctl/busctl.c',
2513 'src/busctl/busctl-introspect.c',
2514 'src/busctl/busctl-introspect.h',
2515 include_directories : includes,
2516 link_with : [libshared],
2517 install_rpath : rootlibexecdir,
2519 public_programs += exe
2521 if conf.get('ENABLE_SYSUSERS') == 1
2522 exe = executable('systemd-sysusers',
2523 'src/sysusers/sysusers.c',
2524 include_directories : includes,
2525 link_with : [libshared],
2526 install_rpath : rootlibexecdir,
2528 install_dir : rootbindir)
2529 public_programs += exe
2532 if conf.get('ENABLE_TMPFILES') == 1
2533 exe = executable('systemd-tmpfiles',
2534 'src/tmpfiles/tmpfiles.c',
2535 include_directories : includes,
2536 link_with : [libshared],
2537 dependencies : [libacl],
2538 install_rpath : rootlibexecdir,
2540 install_dir : rootbindir)
2541 public_programs += exe
2543 if want_tests != 'false'
2544 test('test-systemd-tmpfiles',
2545 test_systemd_tmpfiles_py,
2546 # https://github.com/mesonbuild/meson/issues/2681
2547 args : exe.full_path())
2551 if conf.get('ENABLE_HWDB') == 1
2552 exe = executable('systemd-hwdb',
2554 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2555 include_directories : includes,
2556 link_with : [libudev_static],
2557 install_rpath : udev_rpath,
2559 install_dir : rootbindir)
2560 public_programs += exe
2563 if conf.get('ENABLE_QUOTACHECK') == 1
2564 executable('systemd-quotacheck',
2565 'src/quotacheck/quotacheck.c',
2566 include_directories : includes,
2567 link_with : [libshared],
2568 install_rpath : rootlibexecdir,
2570 install_dir : rootlibexecdir)
2573 exe = executable('systemd-socket-proxyd',
2574 'src/socket-proxy/socket-proxyd.c',
2575 include_directories : includes,
2576 link_with : [libshared],
2577 dependencies : [threads],
2578 install_rpath : rootlibexecdir,
2580 install_dir : rootlibexecdir)
2581 public_programs += exe
2583 exe = executable('systemd-udevd',
2584 systemd_udevd_sources,
2585 include_directories : includes,
2586 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2587 link_with : [libudev_core,
2590 dependencies : [versiondep,
2596 install_rpath : udev_rpath,
2598 install_dir : rootlibexecdir)
2599 public_programs += exe
2601 exe = executable('udevadm',
2603 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2604 include_directories : includes,
2605 link_with : [libudev_core,
2608 dependencies : [versiondep,
2614 install_rpath : udev_rpath,
2616 install_dir : rootbindir)
2617 public_programs += exe
2619 executable('systemd-shutdown',
2620 systemd_shutdown_sources,
2621 include_directories : includes,
2622 link_with : [libcore_shared,
2624 dependencies : [libmount],
2625 install_rpath : rootlibexecdir,
2627 install_dir : rootlibexecdir)
2629 executable('systemd-update-done',
2630 'src/update-done/update-done.c',
2631 include_directories : includes,
2632 link_with : [libshared],
2633 install_rpath : rootlibexecdir,
2635 install_dir : rootlibexecdir)
2637 executable('systemd-update-utmp',
2638 'src/update-utmp/update-utmp.c',
2639 include_directories : includes,
2640 link_with : [libshared],
2641 dependencies : [libaudit],
2642 install_rpath : rootlibexecdir,
2644 install_dir : rootlibexecdir)
2646 if conf.get('HAVE_KMOD') == 1
2647 executable('systemd-modules-load',
2648 'src/modules-load/modules-load.c',
2649 include_directories : includes,
2650 link_with : [libshared],
2651 dependencies : [libkmod],
2652 install_rpath : rootlibexecdir,
2654 install_dir : rootlibexecdir)
2656 meson.add_install_script('sh', '-c',
2657 mkdir_p.format(modulesloaddir))
2658 meson.add_install_script('sh', '-c',
2659 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2662 exe = executable('systemd-nspawn',
2663 systemd_nspawn_sources,
2664 include_directories : includes,
2665 link_with : [libcore_shared,
2668 dependencies : [libblkid,
2670 install_rpath : rootlibexecdir,
2672 public_programs += exe
2674 if conf.get('ENABLE_NETWORKD') == 1
2675 executable('systemd-networkd',
2676 systemd_networkd_sources,
2677 include_directories : includes,
2678 link_with : [libnetworkd_core,
2682 dependencies : [threads],
2683 install_rpath : rootlibexecdir,
2685 install_dir : rootlibexecdir)
2687 executable('systemd-networkd-wait-online',
2688 systemd_networkd_wait_online_sources,
2689 include_directories : includes,
2690 link_with : [libnetworkd_core,
2692 install_rpath : rootlibexecdir,
2694 install_dir : rootlibexecdir)
2696 exe = executable('networkctl',
2698 include_directories : includes,
2699 link_with : [libsystemd_network,
2701 install_rpath : rootlibexecdir,
2703 install_dir : rootbindir)
2704 public_programs += exe
2707 executable('systemd-sulogin-shell',
2708 ['src/sulogin-shell/sulogin-shell.c'],
2709 include_directories : includes,
2710 link_with : [libshared],
2711 install_rpath : rootlibexecdir,
2713 install_dir : rootlibexecdir)
2715 ############################################################
2718 'systemd-runtest.env',
2719 output : 'systemd-runtest.env',
2720 command : ['sh', '-c', '{ ' +
2721 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2722 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2724 build_by_default : true)
2726 foreach tuple : tests
2728 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2729 dependencies = tuple[2]
2730 condition = tuple.length() >= 4 ? tuple[3] : ''
2731 type = tuple.length() >= 5 ? tuple[4] : ''
2732 defs = tuple.length() >= 6 ? tuple[5] : []
2733 incs = tuple.length() >= 7 ? tuple[6] : includes
2736 name = sources[0].split('/')[-1].split('.')[0]
2737 if type.startswith('timeout=')
2738 timeout = type.split('=')[1].to_int()
2742 if condition == '' or conf.get(condition) == 1
2746 include_directories : incs,
2747 link_with : link_with,
2748 dependencies : [versiondep,
2751 build_by_default : want_tests != 'false',
2752 install_rpath : rootlibexecdir,
2753 install : install_tests,
2754 install_dir : join_paths(testsdir, type))
2757 message('@0@ is a manual test'.format(name))
2758 elif type == 'unsafe' and want_tests != 'unsafe'
2759 message('@0@ is an unsafe test'.format(name))
2760 elif want_tests != 'false'
2766 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2771 'test-libsystemd-sym',
2772 test_libsystemd_sym_c,
2773 include_directories : includes,
2774 link_with : [libsystemd],
2775 build_by_default : want_tests != 'false',
2776 install : install_tests,
2777 install_dir : testsdir)
2778 if want_tests != 'false'
2779 test('test-libsystemd-sym', exe)
2783 'test-libsystemd-static-sym',
2784 test_libsystemd_sym_c,
2785 include_directories : includes,
2786 link_with : [install_libsystemd_static],
2787 dependencies : [threads], # threads is already included in dependencies on the library,
2788 # but does not seem to get propagated. Add here as a work-around.
2789 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2790 install : install_tests and static_libsystemd_pic,
2791 install_dir : testsdir)
2792 if want_tests != 'false' and static_libsystemd_pic
2793 test('test-libsystemd-static-sym', exe)
2799 include_directories : includes,
2800 c_args : '-Wno-deprecated-declarations',
2801 link_with : [libudev],
2802 build_by_default : want_tests != 'false',
2803 install : install_tests,
2804 install_dir : testsdir)
2805 if want_tests != 'false'
2806 test('test-libudev-sym', exe)
2810 'test-libudev-static-sym',
2812 include_directories : includes,
2813 c_args : '-Wno-deprecated-declarations',
2814 link_with : [install_libudev_static],
2815 build_by_default : want_tests != 'false' and static_libudev_pic,
2816 install : install_tests and static_libudev_pic,
2817 install_dir : testsdir)
2818 if want_tests != 'false' and static_libudev_pic
2819 test('test-libudev-static-sym', exe)
2822 ############################################################
2826 if get_option('tests') != 'false'
2827 foreach tuple : fuzzers
2829 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2830 dependencies = tuple[2]
2831 defs = tuple.length() >= 4 ? tuple[3] : []
2832 incs = tuple.length() >= 5 ? tuple[4] : includes
2835 if want_ossfuzz or want_fuzzbuzz
2836 dependencies += fuzzing_engine
2838 if fuzzing_engine.found()
2839 dependencies += fuzzing_engine
2841 link_args += ['-fsanitize=fuzzer']
2844 sources += 'src/fuzz/fuzz-main.c'
2848 sources += 'src/fuzz/fuzzer-entry-point.c'
2851 name = sources[0].split('/')[-1].split('.')[0]
2853 fuzzer_exes += executable(
2856 include_directories : [incs, include_directories('src/fuzz')],
2857 link_with : link_with,
2858 dependencies : dependencies,
2860 link_args: link_args,
2865 run_target('fuzzers',
2866 depends : fuzzer_exes,
2869 ############################################################
2871 make_directive_index_py = find_program('tools/make-directive-index.py')
2872 make_man_index_py = find_program('tools/make-man-index.py')
2873 xml_helper_py = find_program('tools/xml_helper.py')
2874 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2878 subdir('sysusers.d')
2879 subdir('tmpfiles.d')
2884 subdir('shell-completion/bash')
2885 subdir('shell-completion/zsh')
2886 subdir('docs/sysvinit')
2887 subdir('docs/var-log')
2889 install_subdir('factory/etc',
2890 install_dir : factorydir)
2892 install_data('xorg/50-systemd-user.sh',
2893 install_dir : xinitrcdir)
2894 install_data('modprobe.d/systemd.conf',
2895 install_dir : modprobedir)
2896 install_data('LICENSE.GPL2',
2900 'docs/CODING_STYLE.md',
2901 'docs/DISTRO_PORTING.md',
2902 'docs/ENVIRONMENT.md',
2904 'docs/TRANSIENT-SETTINGS.md',
2905 'docs/TRANSLATORS.md',
2906 'docs/UIDS-GIDS.md',
2907 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2908 install_dir : docdir)
2910 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2911 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2913 ############################################################
2915 meson_check_help = find_program('tools/meson-check-help.sh')
2917 foreach exec : public_programs
2918 name = exec.full_path().split('/')[-1]
2919 if want_tests != 'false'
2920 test('check-help-' + name,
2922 args : exec.full_path())
2926 ############################################################
2928 check_directives_sh = find_program('tools/check-directives.sh')
2930 if want_tests != 'false'
2931 test('check-directives',
2932 check_directives_sh,
2933 args : project_source_root)
2936 ############################################################
2938 # Enable tests for all supported sanitizers
2939 foreach tuple : sanitizers
2940 sanitizer = tuple[0]
2943 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2945 foreach p : fuzz_regression_tests
2946 b = p.split('/')[-2]
2947 c = p.split('/')[-1]
2949 name = '@0@:@1@'.format(b, sanitizer)
2952 if want_tests == 'false'
2953 message('Not compiling @0@ because tests is set to false'.format(name))
2955 exe = custom_target(
2959 command : [env, 'ln', '-fs',
2960 join_paths(build.full_path(), b),
2962 build_by_default : true)
2964 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2969 if want_tests != 'false' and slow_tests
2970 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2972 args : [exe.full_path(),
2973 join_paths(project_source_root, p)])
2980 ############################################################
2983 all_files = run_command(
2985 ['--git-dir=@0@/.git'.format(project_source_root),
2988 all_files = files(all_files.stdout().split())
2993 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
2996 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3000 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3003 command : [meson_git_contrib_sh])
3007 git_head = run_command(
3009 ['--git-dir=@0@/.git'.format(project_source_root),
3010 'rev-parse', 'HEAD']).stdout().strip()
3011 git_head_short = run_command(
3013 ['--git-dir=@0@/.git'.format(project_source_root),
3014 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3018 command : ['git', 'archive',
3019 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3021 '--prefix', 'systemd-@0@/'.format(git_head),
3025 ############################################################
3027 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3030 depends : [man, libsystemd, libudev],
3031 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3033 ############################################################
3036 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3038 'split /usr: @0@'.format(split_usr),
3039 'split bin-sbin: @0@'.format(split_bin),
3040 'prefix directory: @0@'.format(prefixdir),
3041 'rootprefix directory: @0@'.format(rootprefixdir),
3042 'sysconf directory: @0@'.format(sysconfdir),
3043 'include directory: @0@'.format(includedir),
3044 'lib directory: @0@'.format(libdir),
3045 'rootlib directory: @0@'.format(rootlibdir),
3046 'SysV init scripts: @0@'.format(sysvinit_path),
3047 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3048 'PAM modules directory: @0@'.format(pamlibdir),
3049 'PAM configuration directory: @0@'.format(pamconfdir),
3050 'RPM macros directory: @0@'.format(rpmmacrosdir),
3051 'modprobe.d directory: @0@'.format(modprobedir),
3052 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3053 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3054 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3055 'bash completions directory: @0@'.format(bashcompletiondir),
3056 'zsh completions directory: @0@'.format(zshcompletiondir),
3057 'extra start script: @0@'.format(get_option('rc-local')),
3058 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3059 get_option('debug-tty')),
3060 'TTY GID: @0@'.format(tty_gid),
3061 'users GID: @0@'.format(substs.get('USERS_GID')),
3062 'maximum system UID: @0@'.format(system_uid_max),
3063 'maximum system GID: @0@'.format(system_gid_max),
3064 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3065 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3066 'minimum container UID base: @0@'.format(container_uid_base_min),
3067 'maximum container UID base: @0@'.format(container_uid_base_max),
3068 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3069 'render group access mode: @0@'.format(get_option('group-render-mode')),
3070 'certificate root directory: @0@'.format(get_option('certificate-root')),
3071 'support URL: @0@'.format(support_url),
3072 'nobody user name: @0@'.format(nobody_user),
3073 'nobody group name: @0@'.format(nobody_group),
3074 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3075 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3077 'default DNSSEC mode: @0@'.format(default_dnssec),
3078 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3079 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3080 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3081 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3082 'default locale: @0@'.format(default_locale)]
3084 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3085 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3087 'default DNS servers: @0@'.format(alt_dns_servers),
3088 'default NTP servers: @0@'.format(alt_ntp_servers)]
3090 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3091 '@@0@'.format(time_epoch)).stdout().strip()
3093 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3096 'static libsystemd: @0@'.format(static_libsystemd),
3097 'static libudev: @0@'.format(static_libudev)]
3100 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3101 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3102 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3104 if conf.get('ENABLE_EFI') == 1
3105 status += 'efi arch: @0@'.format(efi_arch)
3109 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3110 'EFI CC @0@'.format(' '.join(efi_cc)),
3111 'EFI lib directory: @0@'.format(efi_libdir),
3112 'EFI lds directory: @0@'.format(efi_ldsdir),
3113 'EFI include directory: @0@'.format(efi_incdir)]
3165 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3166 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3169 ['legacy pkla', install_polkit_pkla],
3171 ['gnu-efi', have_gnu_efi],
3184 ['man pages', want_man],
3185 ['html pages', want_html],
3186 ['man page indices', want_man and have_lxml],
3191 ['adm group', get_option('adm-group')],
3192 ['wheel group', get_option('wheel-group')],
3195 ['debug mmap cache'],
3197 ['valgrind', conf.get('VALGRIND') == 1],
3198 ['trace logging', conf.get('LOG_TRACE') == 1],
3199 ['link-udev-shared', get_option('link-udev-shared')],
3200 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3203 if tuple.length() >= 2
3206 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3207 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3208 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3219 'enabled features: @0@'.format(', '.join(found)),
3221 'disabled features: @0@'.format(', '.join(missing)),
3223 message('\n '.join(status))
3225 if rootprefixdir != rootprefix_default
3227 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3228 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3229 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))