1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
12 meson_version : '>= 0.46',
15 libsystemd_version = '0.26.0'
16 libudev_version = '1.6.14'
18 # We need the same data in two different formats, ugh!
19 # Also, for hysterical reasons, we use different variable
20 # names, sometimes. Not all variables are included in every
22 conf = configuration_data()
23 conf.set('PROJECT_VERSION', meson.project_version())
25 substs = configuration_data()
26 substs.set('PROJECT_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
27 substs.set('PROJECT_VERSION', meson.project_version())
29 # This is to be used instead of meson.source_root(), as the latter will return
30 # the wrong result when systemd is being built as a meson subproject
31 project_source_root = meson.current_source_dir()
33 want_ossfuzz = get_option('oss-fuzz')
34 want_libfuzzer = get_option('llvm-fuzz')
35 want_fuzzbuzz = get_option('fuzzbuzz')
36 if want_ossfuzz + want_libfuzzer + want_fuzzbuzz > 1
37 error('only one of oss-fuzz, llvm-fuzz or fuzzbuzz can be specified')
40 skip_deps = want_ossfuzz or want_libfuzzer
41 fuzzer_build = want_ossfuzz or want_libfuzzer or want_fuzzbuzz
43 #####################################################################
45 # Try to install the git pre-commit hook
46 git_hook = run_command(join_paths(project_source_root, 'tools/add-git-hook.sh'))
47 if git_hook.returncode() == 0
48 message(git_hook.stdout().strip())
51 #####################################################################
53 if get_option('split-usr') == 'auto'
54 split_usr = run_command('test', '-L', '/bin').returncode() != 0
56 split_usr = get_option('split-usr') == 'true'
58 conf.set10('HAVE_SPLIT_USR', split_usr,
59 description : '/usr/bin and /bin directories are separate')
61 if get_option('split-bin') == 'auto'
62 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
64 split_bin = get_option('split-bin') == 'true'
66 conf.set10('HAVE_SPLIT_BIN', split_bin,
67 description : 'bin and sbin directories are separate')
69 rootprefixdir = get_option('rootprefix')
70 # Unusual rootprefixdir values are used by some distros
71 # (see https://github.com/systemd/systemd/pull/7461).
72 rootprefix_default = split_usr ? '/' : '/usr'
73 if rootprefixdir == ''
74 rootprefixdir = rootprefix_default
76 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
78 sysvinit_path = get_option('sysvinit-path')
79 sysvrcnd_path = get_option('sysvrcnd-path')
80 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
81 description : 'SysV init scripts and rcN.d links are supported')
83 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
84 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
85 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
87 # join_paths ignores the preceding arguments if an absolute component is
88 # encountered, so this should canonicalize various paths when they are
89 # absolute or relative.
90 prefixdir = get_option('prefix')
91 if not prefixdir.startswith('/')
92 error('Prefix is not absolute: "@0@"'.format(prefixdir))
94 bindir = join_paths(prefixdir, get_option('bindir'))
95 libdir = join_paths(prefixdir, get_option('libdir'))
96 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
97 includedir = join_paths(prefixdir, get_option('includedir'))
98 datadir = join_paths(prefixdir, get_option('datadir'))
99 localstatedir = join_paths('/', get_option('localstatedir'))
101 rootbindir = join_paths(rootprefixdir, 'bin')
102 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
103 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
105 rootlibdir = get_option('rootlibdir')
107 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
110 # Dirs of external packages
111 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
112 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
113 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
114 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
115 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
116 varlogdir = join_paths(localstatedir, 'log')
117 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
118 rpmmacrosdir = get_option('rpmmacrosdir')
119 if rpmmacrosdir != 'no'
120 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
122 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
125 pkgdatadir = join_paths(datadir, 'systemd')
126 environmentdir = join_paths(prefixdir, 'lib/environment.d')
127 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
128 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
129 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
130 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
131 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
132 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
133 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
134 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
135 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
136 pkgincludedir = join_paths(includedir, 'systemd')
137 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
138 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
139 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
140 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
141 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
142 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
143 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
144 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
145 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
146 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
147 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
148 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
149 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
150 factorydir = join_paths(datadir, 'factory')
151 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
152 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
153 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
154 catalogstatedir = join_paths(systemdstatedir, 'catalog')
155 randomseeddir = join_paths(localstatedir, 'lib/systemd')
156 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
158 docdir = get_option('docdir')
160 docdir = join_paths(datadir, 'doc/systemd')
163 dbuspolicydir = get_option('dbuspolicydir')
164 if dbuspolicydir == ''
165 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
168 dbussessionservicedir = get_option('dbussessionservicedir')
169 if dbussessionservicedir == ''
170 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
173 dbussystemservicedir = get_option('dbussystemservicedir')
174 if dbussystemservicedir == ''
175 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
178 pamlibdir = get_option('pamlibdir')
180 pamlibdir = join_paths(rootlibdir, 'security')
183 pamconfdir = get_option('pamconfdir')
185 pamconfdir = join_paths(sysconfdir, 'pam.d')
188 memory_accounting_default = get_option('memory-accounting-default')
190 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
191 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
192 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
193 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
194 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
195 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
196 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
198 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
200 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
201 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
202 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
203 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
204 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
205 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
206 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
207 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
208 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
209 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
210 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
211 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
212 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
213 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
214 conf.set_quoted('ROOTPREFIX', rootprefixdir)
215 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
216 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
217 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
218 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
219 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
220 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
221 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
222 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
223 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
224 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
225 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
226 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
227 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
228 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
229 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
230 conf.set_quoted('LIBDIR', libdir)
231 conf.set_quoted('ROOTLIBDIR', rootlibdir)
232 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
233 conf.set_quoted('BOOTLIBDIR', bootlibdir)
234 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
235 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
236 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
237 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
238 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
239 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
240 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
241 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
242 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
244 substs.set('prefix', prefixdir)
245 substs.set('rootprefix', rootprefixdir)
246 substs.set('rootprefix_noslash', rootprefixdir_noslash)
247 substs.set('exec_prefix', prefixdir)
248 substs.set('libdir', libdir)
249 substs.set('rootlibdir', rootlibdir)
250 substs.set('includedir', includedir)
251 substs.set('sysconfdir', sysconfdir)
252 substs.set('bindir', bindir)
253 substs.set('rootbindir', rootbindir)
254 substs.set('rootlibexecdir', rootlibexecdir)
255 substs.set('systemunitdir', systemunitdir)
256 substs.set('userunitdir', userunitdir)
257 substs.set('systempresetdir', systempresetdir)
258 substs.set('userpresetdir', userpresetdir)
259 substs.set('udevhwdbdir', udevhwdbdir)
260 substs.set('udevrulesdir', udevrulesdir)
261 substs.set('udevlibexecdir', udevlibexecdir)
262 substs.set('environmentdir', environmentdir)
263 substs.set('catalogdir', catalogdir)
264 substs.set('tmpfilesdir', tmpfilesdir)
265 substs.set('sysusersdir', sysusersdir)
266 substs.set('sysctldir', sysctldir)
267 substs.set('binfmtdir', binfmtdir)
268 substs.set('modulesloaddir', modulesloaddir)
269 substs.set('modprobedir', modprobedir)
270 substs.set('systemgeneratordir', systemgeneratordir)
271 substs.set('usergeneratordir', usergeneratordir)
272 substs.set('systemenvgeneratordir', systemenvgeneratordir)
273 substs.set('userenvgeneratordir', userenvgeneratordir)
274 substs.set('systemshutdowndir', systemshutdowndir)
275 substs.set('systemsleepdir', systemsleepdir)
276 substs.set('VARLOGDIR', varlogdir)
277 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
278 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
279 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
280 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
281 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
282 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
283 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
284 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
285 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
287 #####################################################################
289 cc = meson.get_compiler('c')
290 pkgconfig = import('pkgconfig')
291 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
292 meson_build_sh = find_program('tools/meson-build.sh')
294 want_tests = get_option('tests')
295 slow_tests = want_tests != 'false' and get_option('slow-tests')
296 install_tests = get_option('install-tests')
298 if add_languages('cpp', required : fuzzer_build)
299 # Used only for tests
300 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
306 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
308 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
310 fuzzing_engine = meson.get_compiler('cpp').find_library(get_option('fuzzbuzz-engine'), dirs: get_option('fuzzbuzz-engine-dir'))
313 possible_cc_flags = [
317 '-Wmissing-include-dirs',
318 '-Wold-style-definition',
322 '-Wsuggest-attribute=noreturn',
323 '-Werror=missing-prototypes',
324 '-Werror=implicit-function-declaration',
325 '-Werror=missing-declarations',
326 '-Werror=return-type',
327 '-Werror=incompatible-pointer-types',
329 '-Wstrict-prototypes',
331 '-Wmissing-noreturn',
332 '-Wimplicit-fallthrough=5',
335 '-Wstrict-aliasing=2',
338 '-Werror=shift-count-overflow',
339 '-Werror=shift-overflow=2',
343 # negative arguments are correctly detected starting with meson 0.46.
344 '-Wno-unused-parameter',
345 '-Wno-missing-field-initializers',
346 '-Wno-unused-result',
347 '-Wno-format-signedness',
348 '-Wno-error=#warnings', # clang
349 '-Wno-string-plus-int', # clang
351 # work-around for gcc 7.1 turning this on on its own.
352 '-Wno-error=nonnull',
354 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
355 # optimizations enabled, producing essentially false positives.
356 '-Wno-maybe-uninitialized',
360 '-fdiagnostics-show-option',
361 '-fno-strict-aliasing',
362 '-fvisibility=hidden',
364 '-fstack-protector-strong',
365 '--param=ssp-buffer-size=4',
368 # --as-needed and --no-undefined are provided by meson by default,
369 # run mesonconf to see what is enabled
370 possible_link_flags = [
375 if cc.get_id() == 'clang'
376 possible_cc_flags += [
377 '-Wno-typedef-redefinition',
378 '-Wno-gnu-variable-sized-type-not-at-end',
382 if get_option('buildtype') != 'debug'
383 possible_cc_flags += [
384 '-ffunction-sections',
388 possible_link_flags += '-Wl,--gc-sections'
391 if get_option('b_ndebug') == 'true'
392 # With asserts disabled with get a bunch of warnings about variables which
393 # are used only in the asserts. This is not useful at all, so let's just silence
395 possible_cc_flags += [
396 '-Wno-unused-variable',
397 '-Wno-unused-but-set-variable',
401 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
402 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
406 #include <inttypes.h>
407 typedef uint64_t usec_t;
408 usec_t now(clockid_t clock);
413 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
414 add_project_arguments('-Werror=shadow', language : 'c')
417 cpp = ' '.join(cc.cmd_array()) + ' -E'
419 #####################################################################
420 # compilation result tests
422 conf.set('_GNU_SOURCE', true)
423 conf.set('__SANE_USERSPACE_TYPES__', true)
425 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
426 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
427 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
428 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
429 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
430 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
431 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
435 #include <sys/stat.h>
438 foreach decl : ['char16_t',
443 # We get -1 if the size cannot be determined
444 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
446 if decl == 'struct statx'
448 want_linux_stat_h = false
450 have = cc.sizeof(decl,
451 prefix : decl_headers + '#include <linux/stat.h>',
452 args : '-D_GNU_SOURCE') > 0
453 want_linux_stat_h = have
457 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
460 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
462 foreach ident : ['secure_getenv', '__secure_getenv']
463 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
467 ['memfd_create', '''#include <sys/mman.h>'''],
468 ['gettid', '''#include <sys/types.h>
469 #include <unistd.h>'''],
470 ['pivot_root', '''#include <stdlib.h>
471 #include <unistd.h>'''], # no known header declares pivot_root
472 ['name_to_handle_at', '''#include <sys/types.h>
473 #include <sys/stat.h>
474 #include <fcntl.h>'''],
475 ['setns', '''#include <sched.h>'''],
476 ['renameat2', '''#include <stdio.h>
477 #include <fcntl.h>'''],
478 ['kcmp', '''#include <linux/kcmp.h>'''],
479 ['keyctl', '''#include <sys/types.h>
480 #include <keyutils.h>'''],
481 ['copy_file_range', '''#include <sys/syscall.h>
482 #include <unistd.h>'''],
483 ['bpf', '''#include <sys/syscall.h>
484 #include <unistd.h>'''],
485 ['statx', '''#include <sys/types.h>
486 #include <sys/stat.h>
487 #include <unistd.h>'''],
488 ['explicit_bzero' , '''#include <string.h>'''],
489 ['reallocarray', '''#include <malloc.h>'''],
492 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
493 conf.set10('HAVE_' + ident[0].to_upper(), have)
496 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
497 conf.set10('USE_SYS_RANDOM_H', true)
498 conf.set10('HAVE_GETRANDOM', true)
500 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
501 conf.set10('USE_SYS_RANDOM_H', false)
502 conf.set10('HAVE_GETRANDOM', have)
505 #####################################################################
507 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
509 get_option('version-tag'),
510 meson.project_version()]
513 input : 'src/version/version.h.in',
514 output : 'version.h',
517 versiondep = declare_dependency(sources: version_h)
519 sed = find_program('sed')
520 awk = find_program('awk')
521 m4 = find_program('m4')
522 stat = find_program('stat')
523 git = find_program('git', required : false)
524 env = find_program('env')
525 perl = find_program('perl', required : false)
527 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
528 mkdir_p = 'mkdir -p $DESTDIR/@0@'
529 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
530 splash_bmp = files('test/splash.bmp')
532 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
533 # /usr/sbin, /sbin, and fall back to the default from middle column.
534 progs = [['quotaon', '/usr/sbin/quotaon' ],
535 ['quotacheck', '/usr/sbin/quotacheck' ],
536 ['kmod', '/usr/bin/kmod' ],
537 ['kexec', '/usr/sbin/kexec' ],
538 ['sulogin', '/usr/sbin/sulogin' ],
539 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
540 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
541 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
542 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
545 path = get_option(prog[0] + '-path')
547 message('Using @1@ for @0@'.format(prog[0], path))
549 exe = find_program(prog[0],
550 '/usr/sbin/' + prog[0],
553 path = exe.found() ? exe.path() : prog[1]
555 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
556 conf.set_quoted(name, path)
557 substs.set(name, path)
560 conf.set_quoted('TELINIT', get_option('telinit-path'))
562 if run_command('ln', '--relative', '--help').returncode() != 0
563 error('ln does not support --relative (added in coreutils 8.16)')
566 ############################################################
568 gperf = find_program('gperf')
570 gperf_test_format = '''
572 const char * in_word_set(const char *, @0@);
575 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
576 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
577 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
578 if cc.compiles(gperf_test)
579 gperf_len_type = 'size_t'
581 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
582 if cc.compiles(gperf_test)
583 gperf_len_type = 'unsigned'
585 error('unable to determine gperf len type')
588 message('gperf len type is @0@'.format(gperf_len_type))
589 conf.set('GPERF_LEN_TYPE', gperf_len_type,
590 description : 'The type of gperf "len" parameter')
592 ############################################################
594 if not cc.has_header('sys/capability.h')
595 error('POSIX caps headers not found')
597 foreach header : ['crypt.h',
599 'linux/vm_sockets.h',
601 'valgrind/memcheck.h',
602 'valgrind/valgrind.h',
605 conf.set10('HAVE_' + header.underscorify().to_upper(),
606 cc.has_header(header))
609 ############################################################
611 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
612 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
613 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
615 default_hierarchy = get_option('default-hierarchy')
616 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
617 description : 'default cgroup hierarchy as string')
618 if default_hierarchy == 'legacy'
619 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
620 elif default_hierarchy == 'hybrid'
621 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
623 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
626 default_net_naming_scheme = get_option('default-net-naming-scheme')
627 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
629 time_epoch = get_option('time-epoch')
632 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
634 conf.set('TIME_EPOCH', time_epoch)
636 system_uid_max = get_option('system-uid-max')
637 if system_uid_max == -1
638 system_uid_max = run_command(
640 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
641 '/etc/login.defs').stdout().strip()
642 if system_uid_max == ''
645 system_uid_max = system_uid_max.to_int()
648 conf.set('SYSTEM_UID_MAX', system_uid_max)
649 substs.set('systemuidmax', system_uid_max)
651 system_gid_max = get_option('system-gid-max')
652 if system_gid_max == -1
653 system_gid_max = run_command(
655 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
656 '/etc/login.defs').stdout().strip()
657 if system_gid_max == ''
660 system_gid_max = system_gid_max.to_int()
663 conf.set('SYSTEM_GID_MAX', system_gid_max)
664 substs.set('systemgidmax', system_gid_max)
666 dynamic_uid_min = get_option('dynamic-uid-min')
667 dynamic_uid_max = get_option('dynamic-uid-max')
668 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
669 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
670 substs.set('dynamicuidmin', dynamic_uid_min)
671 substs.set('dynamicuidmax', dynamic_uid_max)
673 container_uid_base_min = get_option('container-uid-base-min')
674 container_uid_base_max = get_option('container-uid-base-max')
675 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
676 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
677 substs.set('containeruidbasemin', container_uid_base_min)
678 substs.set('containeruidbasemax', container_uid_base_max)
680 nobody_user = get_option('nobody-user')
681 nobody_group = get_option('nobody-group')
683 if not meson.is_cross_build()
684 getent_result = run_command('getent', 'passwd', '65534')
685 if getent_result.returncode() == 0
686 name = getent_result.stdout().split(':')[0]
687 if name != nobody_user
689 '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) +
690 'Your build will result in an user table setup that is incompatible with the local system.')
693 id_result = run_command('id', '-u', nobody_user)
694 if id_result.returncode() == 0
695 id = id_result.stdout().to_int()
698 '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) +
699 'Your build will result in an user table setup that is incompatible with the local system.')
703 getent_result = run_command('getent', 'group', '65534')
704 if getent_result.returncode() == 0
705 name = getent_result.stdout().split(':')[0]
706 if name != nobody_group
708 '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) +
709 'Your build will result in an group table setup that is incompatible with the local system.')
712 id_result = run_command('id', '-g', nobody_group)
713 if id_result.returncode() == 0
714 id = id_result.stdout().to_int()
717 '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) +
718 'Your build will result in an group table setup that is incompatible with the local system.')
722 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
724 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
725 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
728 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
729 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
730 substs.set('NOBODY_USER_NAME', nobody_user)
731 substs.set('NOBODY_GROUP_NAME', nobody_group)
733 tty_gid = get_option('tty-gid')
734 conf.set('TTY_GID', tty_gid)
735 substs.set('TTY_GID', tty_gid)
737 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
738 users_gid = get_option('users-gid')
739 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
741 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
742 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
744 dev_kvm_mode = get_option('dev-kvm-mode')
745 substs.set('DEV_KVM_MODE', dev_kvm_mode)
746 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
747 group_render_mode = get_option('group-render-mode')
748 substs.set('GROUP_RENDER_MODE', group_render_mode)
749 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
751 kill_user_processes = get_option('default-kill-user-processes')
752 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
753 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
754 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
756 dns_servers = get_option('dns-servers')
757 conf.set_quoted('DNS_SERVERS', dns_servers)
758 substs.set('DNS_SERVERS', dns_servers)
760 ntp_servers = get_option('ntp-servers')
761 conf.set_quoted('NTP_SERVERS', ntp_servers)
762 substs.set('NTP_SERVERS', ntp_servers)
764 default_locale = get_option('default-locale')
765 if default_locale == ''
766 if not meson.is_cross_build()
767 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
768 default_locale = run_command(choose_default_locale_sh).stdout().strip()
770 default_locale = 'C.UTF-8'
773 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
775 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
777 substs.set('SUSHELL', get_option('debug-shell'))
778 substs.set('DEBUGTTY', get_option('debug-tty'))
780 enable_debug_hashmap = false
781 enable_debug_mmap_cache = false
782 enable_debug_siphash = false
783 enable_debug_udev = false
784 foreach name : get_option('debug-extra')
786 enable_debug_hashmap = true
787 elif name == 'mmap-cache'
788 enable_debug_mmap_cache = true
789 elif name == 'siphash'
790 enable_debug_siphash = true
792 enable_debug_udev = true
794 message('unknown debug option "@0@", ignoring'.format(name))
797 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
798 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
799 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
800 conf.set10('ENABLE_DEBUG_UDEV', enable_debug_udev)
802 conf.set10('VALGRIND', get_option('valgrind'))
803 conf.set10('LOG_TRACE', get_option('log-trace'))
805 #####################################################################
807 threads = dependency('threads')
808 librt = cc.find_library('rt')
809 libm = cc.find_library('m')
810 libdl = cc.find_library('dl')
811 libcrypt = cc.find_library('crypt')
813 libcap = dependency('libcap', required : false)
814 if not libcap.found()
815 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
816 libcap = cc.find_library('cap')
819 libmount = dependency('mount',
820 version : fuzzer_build ? '>= 0' : '>= 2.30')
822 want_seccomp = get_option('seccomp')
823 if want_seccomp != 'false' and not skip_deps
824 libseccomp = dependency('libseccomp',
825 version : '>= 2.3.1',
826 required : want_seccomp == 'true')
827 have = libseccomp.found()
832 conf.set10('HAVE_SECCOMP', have)
834 want_selinux = get_option('selinux')
835 if want_selinux != 'false' and not skip_deps
836 libselinux = dependency('libselinux',
837 version : '>= 2.1.9',
838 required : want_selinux == 'true')
839 have = libselinux.found()
844 conf.set10('HAVE_SELINUX', have)
846 want_apparmor = get_option('apparmor')
847 if want_apparmor != 'false' and not skip_deps
848 libapparmor = dependency('libapparmor',
849 required : want_apparmor == 'true')
850 have = libapparmor.found()
855 conf.set10('HAVE_APPARMOR', have)
857 smack_run_label = get_option('smack-run-label')
858 if smack_run_label != ''
859 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
862 want_polkit = get_option('polkit')
863 install_polkit = false
864 install_polkit_pkla = false
865 if want_polkit != 'false' and not skip_deps
866 install_polkit = true
868 libpolkit = dependency('polkit-gobject-1',
870 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
871 message('Old polkit detected, will install pkla files')
872 install_polkit_pkla = true
875 conf.set10('ENABLE_POLKIT', install_polkit)
877 want_acl = get_option('acl')
878 if want_acl != 'false' and not skip_deps
879 libacl = cc.find_library('acl', required : want_acl == 'true')
880 have = libacl.found()
885 conf.set10('HAVE_ACL', have)
887 want_audit = get_option('audit')
888 if want_audit != 'false' and not skip_deps
889 libaudit = dependency('audit', required : want_audit == 'true')
890 have = libaudit.found()
895 conf.set10('HAVE_AUDIT', have)
897 want_blkid = get_option('blkid')
898 if want_blkid != 'false' and not skip_deps
899 libblkid = dependency('blkid', required : want_blkid == 'true')
900 have = libblkid.found()
905 conf.set10('HAVE_BLKID', have)
907 want_kmod = get_option('kmod')
908 if want_kmod != 'false' and not skip_deps
909 libkmod = dependency('libkmod',
911 required : want_kmod == 'true')
912 have = libkmod.found()
917 conf.set10('HAVE_KMOD', have)
919 want_pam = get_option('pam')
920 if want_pam != 'false' and not skip_deps
921 libpam = cc.find_library('pam', required : want_pam == 'true')
922 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
923 have = libpam.found() and libpam_misc.found()
929 conf.set10('HAVE_PAM', have)
931 want_microhttpd = get_option('microhttpd')
932 if want_microhttpd != 'false' and not skip_deps
933 libmicrohttpd = dependency('libmicrohttpd',
934 version : '>= 0.9.33',
935 required : want_microhttpd == 'true')
936 have = libmicrohttpd.found()
941 conf.set10('HAVE_MICROHTTPD', have)
943 want_libcryptsetup = get_option('libcryptsetup')
944 if want_libcryptsetup != 'false' and not skip_deps
945 libcryptsetup = dependency('libcryptsetup',
946 version : '>= 1.6.0',
947 required : want_libcryptsetup == 'true')
948 have = libcryptsetup.found()
949 have_sector = cc.has_member(
950 'struct crypt_params_plain',
952 prefix : '#include <libcryptsetup.h>')
958 conf.set10('HAVE_LIBCRYPTSETUP', have)
959 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
961 want_libcurl = get_option('libcurl')
962 if want_libcurl != 'false' and not skip_deps
963 libcurl = dependency('libcurl',
964 version : '>= 7.32.0',
965 required : want_libcurl == 'true')
966 have = libcurl.found()
971 conf.set10('HAVE_LIBCURL', have)
973 want_libidn = get_option('libidn')
974 want_libidn2 = get_option('libidn2')
975 if want_libidn == 'true' and want_libidn2 == 'true'
976 error('libidn and libidn2 cannot be requested simultaneously')
979 if want_libidn != 'false' and want_libidn2 != 'true' and not skip_deps
980 libidn = dependency('libidn',
981 required : want_libidn == 'true')
982 have = libidn.found()
987 conf.set10('HAVE_LIBIDN', have)
988 if not have and want_libidn2 != 'false' and not skip_deps
989 # libidn is used for both libidn and libidn2 objects
990 libidn = dependency('libidn2',
991 required : want_libidn2 == 'true')
992 have = libidn.found()
996 conf.set10('HAVE_LIBIDN2', have)
998 want_libiptc = get_option('libiptc')
999 if want_libiptc != 'false' and not skip_deps
1000 libiptc = dependency('libiptc',
1001 required : want_libiptc == 'true')
1002 have = libiptc.found()
1007 conf.set10('HAVE_LIBIPTC', have)
1009 want_qrencode = get_option('qrencode')
1010 if want_qrencode != 'false' and not skip_deps
1011 libqrencode = dependency('libqrencode',
1012 required : want_qrencode == 'true')
1013 have = libqrencode.found()
1018 conf.set10('HAVE_QRENCODE', have)
1020 want_gcrypt = get_option('gcrypt')
1021 if want_gcrypt != 'false' and not skip_deps
1022 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1023 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1024 have = libgcrypt.found() and libgpg_error.found()
1029 # link to neither of the libs if one is not found
1033 conf.set10('HAVE_GCRYPT', have)
1035 want_gnutls = get_option('gnutls')
1036 if want_gnutls != 'false' and not skip_deps
1037 libgnutls = dependency('gnutls',
1038 version : '>= 3.1.4',
1039 required : want_gnutls == 'true')
1040 have = libgnutls.found()
1045 conf.set10('HAVE_GNUTLS', have)
1047 want_openssl = get_option('openssl')
1048 if want_openssl != 'false' and not skip_deps
1049 libopenssl = dependency('openssl',
1050 version : '>= 1.1.0',
1051 required : want_openssl == 'true')
1052 have = libopenssl.found()
1057 conf.set10('HAVE_OPENSSL', have)
1059 want_elfutils = get_option('elfutils')
1060 if want_elfutils != 'false' and not skip_deps
1061 libdw = dependency('libdw',
1062 required : want_elfutils == 'true')
1063 have = libdw.found()
1068 conf.set10('HAVE_ELFUTILS', have)
1070 want_zlib = get_option('zlib')
1071 if want_zlib != 'false' and not skip_deps
1072 libz = dependency('zlib',
1073 required : want_zlib == 'true')
1079 conf.set10('HAVE_ZLIB', have)
1081 want_bzip2 = get_option('bzip2')
1082 if want_bzip2 != 'false' and not skip_deps
1083 libbzip2 = cc.find_library('bz2',
1084 required : want_bzip2 == 'true')
1085 have = libbzip2.found()
1090 conf.set10('HAVE_BZIP2', have)
1092 want_xz = get_option('xz')
1093 if want_xz != 'false' and not skip_deps
1094 libxz = dependency('liblzma',
1095 required : want_xz == 'true')
1096 have = libxz.found()
1101 conf.set10('HAVE_XZ', have)
1103 want_lz4 = get_option('lz4')
1104 if want_lz4 != 'false' and not skip_deps
1105 liblz4 = dependency('liblz4',
1106 version : '>= 1.3.0',
1107 required : want_lz4 == 'true')
1108 have = liblz4.found()
1113 conf.set10('HAVE_LZ4', have)
1115 want_xkbcommon = get_option('xkbcommon')
1116 if want_xkbcommon != 'false' and not skip_deps
1117 libxkbcommon = dependency('xkbcommon',
1118 version : '>= 0.3.0',
1119 required : want_xkbcommon == 'true')
1120 have = libxkbcommon.found()
1125 conf.set10('HAVE_XKBCOMMON', have)
1127 want_pcre2 = get_option('pcre2')
1128 if want_pcre2 != 'false'
1129 libpcre2 = dependency('libpcre2-8',
1130 required : want_pcre2 == 'true')
1131 have = libpcre2.found()
1136 conf.set10('HAVE_PCRE2', have)
1138 want_glib = get_option('glib')
1139 if want_glib != 'false' and not skip_deps
1140 libglib = dependency('glib-2.0',
1141 version : '>= 2.22.0',
1142 required : want_glib == 'true')
1143 libgobject = dependency('gobject-2.0',
1144 version : '>= 2.22.0',
1145 required : want_glib == 'true')
1146 libgio = dependency('gio-2.0',
1147 required : want_glib == 'true')
1148 have = libglib.found() and libgobject.found() and libgio.found()
1155 conf.set10('HAVE_GLIB', have)
1157 want_dbus = get_option('dbus')
1158 if want_dbus != 'false' and not skip_deps
1159 libdbus = dependency('dbus-1',
1160 version : '>= 1.3.2',
1161 required : want_dbus == 'true')
1162 have = libdbus.found()
1167 conf.set10('HAVE_DBUS', have)
1169 default_dnssec = get_option('default-dnssec')
1171 default_dnssec = 'no'
1173 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1174 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1175 default_dnssec = 'no'
1177 conf.set('DEFAULT_DNSSEC_MODE',
1178 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1179 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1181 dns_over_tls = get_option('dns-over-tls')
1182 if dns_over_tls != 'false'
1183 if dns_over_tls == 'openssl'
1186 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1187 if dns_over_tls == 'gnutls' and not have_gnutls
1188 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1191 if dns_over_tls == 'gnutls' or have_gnutls
1192 have_openssl = false
1194 have_openssl = conf.get('HAVE_OPENSSL') == 1
1195 if dns_over_tls != 'auto' and not have_openssl
1196 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1197 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1200 have = have_gnutls or have_openssl
1204 have_openssl = false
1206 conf.set10('ENABLE_DNS_OVER_TLS', have)
1207 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1208 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1210 default_dns_over_tls = get_option('default-dns-over-tls')
1212 default_dns_over_tls = 'no'
1214 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1215 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1216 default_dns_over_tls = 'no'
1218 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1219 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1220 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1222 want_importd = get_option('importd')
1223 if want_importd != 'false'
1224 have = (conf.get('HAVE_LIBCURL') == 1 and
1225 conf.get('HAVE_ZLIB') == 1 and
1226 conf.get('HAVE_XZ') == 1 and
1227 conf.get('HAVE_GCRYPT') == 1)
1228 if want_importd == 'true' and not have
1229 error('importd support was requested, but dependencies are not available')
1234 conf.set10('ENABLE_IMPORTD', have)
1236 want_remote = get_option('remote')
1237 if want_remote != 'false'
1238 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1239 conf.get('HAVE_LIBCURL') == 1]
1240 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1241 # it's possible to build one without the other. Complain only if
1242 # support was explicitly requested. The auxiliary files like sysusers
1243 # config should be installed when any of the programs are built.
1244 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1245 error('remote support was requested, but dependencies are not available')
1247 have = have_deps[0] or have_deps[1]
1251 conf.set10('ENABLE_REMOTE', have)
1253 foreach term : ['utmp',
1285 have = get_option(term)
1286 name = 'ENABLE_' + term.underscorify().to_upper()
1287 conf.set10(name, have)
1290 foreach tuple : [['nss-mymachines', 'machined'],
1291 ['nss-resolve', 'resolve']]
1292 want = get_option(tuple[0])
1294 have = get_option(tuple[1])
1295 if want == 'true' and not have
1296 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1301 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1302 conf.set10(name, have)
1306 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1307 'ENABLE_NSS_MYMACHINES',
1308 'ENABLE_NSS_RESOLVE',
1309 'ENABLE_NSS_SYSTEMD']
1310 if conf.get(term) == 1
1314 conf.set10('ENABLE_NSS', enable_nss)
1316 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1321 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1323 #####################################################################
1325 if get_option('efi')
1326 efi_arch = host_machine.cpu_family()
1328 if efi_arch == 'x86'
1329 EFI_MACHINE_TYPE_NAME = 'ia32'
1330 gnu_efi_arch = 'ia32'
1331 elif efi_arch == 'x86_64'
1332 EFI_MACHINE_TYPE_NAME = 'x64'
1333 gnu_efi_arch = 'x86_64'
1334 elif efi_arch == 'arm'
1335 EFI_MACHINE_TYPE_NAME = 'arm'
1336 gnu_efi_arch = 'arm'
1337 elif efi_arch == 'aarch64'
1338 EFI_MACHINE_TYPE_NAME = 'aa64'
1339 gnu_efi_arch = 'aarch64'
1341 EFI_MACHINE_TYPE_NAME = ''
1346 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1348 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1352 conf.set10('ENABLE_EFI', have)
1354 #####################################################################
1356 config_h = configure_file(
1357 output : 'config.h',
1358 configuration : conf)
1360 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1362 includes = include_directories('src/basic',
1366 'src/journal-remote',
1370 'src/time-wait-sync',
1376 'src/libsystemd/sd-bus',
1377 'src/libsystemd/sd-device',
1378 'src/libsystemd/sd-event',
1379 'src/libsystemd/sd-hwdb',
1380 'src/libsystemd/sd-id128',
1381 'src/libsystemd/sd-netlink',
1382 'src/libsystemd/sd-network',
1383 'src/libsystemd/sd-resolve',
1384 'src/libsystemd-network',
1387 add_project_arguments('-include', 'config.h', language : 'c')
1389 generate_gperfs = find_program('tools/generate-gperfs.py')
1393 subdir('src/systemd')
1395 subdir('src/libsystemd')
1396 subdir('src/libsystemd-network')
1397 subdir('src/journal')
1400 libjournal_core = static_library(
1402 libjournal_core_sources,
1404 include_directories : includes,
1407 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1408 libsystemd = shared_library(
1411 version : libsystemd_version,
1412 include_directories : includes,
1413 link_args : ['-shared',
1414 '-Wl,--version-script=' + libsystemd_sym_path],
1415 link_with : [libbasic,
1417 link_whole : [libsystemd_static,
1419 dependencies : [threads,
1423 link_depends : libsystemd_sym,
1425 install_dir : rootlibdir)
1427 static_libsystemd = get_option('static-libsystemd')
1428 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1430 install_libsystemd_static = static_library(
1433 journal_client_sources,
1435 basic_gcrypt_sources,
1437 include_directories : includes,
1438 build_by_default : static_libsystemd != 'false',
1439 install : static_libsystemd != 'false',
1440 install_dir : rootlibdir,
1441 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1442 dependencies : [threads,
1451 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1453 ############################################################
1455 # binaries that have --help and are intended for use by humans,
1456 # usually, but not always, installed in /bin.
1457 public_programs = []
1459 subdir('src/libudev')
1460 subdir('src/shared')
1462 subdir('src/shutdown')
1464 subdir('src/network')
1466 subdir('src/analyze')
1467 subdir('src/journal-remote')
1468 subdir('src/coredump')
1469 subdir('src/hostname')
1470 subdir('src/import')
1471 subdir('src/kernel-install')
1472 subdir('src/locale')
1473 subdir('src/machine')
1474 subdir('src/portable')
1475 subdir('src/nspawn')
1476 subdir('src/resolve')
1477 subdir('src/timedate')
1478 subdir('src/timesync')
1479 subdir('src/vconsole')
1480 subdir('src/boot/efi')
1487 ############################################################
1489 # only static linking apart from libdl, to make sure that the
1490 # module is linked to all libraries that it uses.
1491 test_dlopen = executable(
1495 include_directories : includes,
1496 link_with : [libbasic],
1497 dependencies : [libdl],
1498 build_by_default : want_tests != 'false')
1500 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1501 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1502 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1503 ['resolve', 'ENABLE_NSS_RESOLVE']]
1505 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1509 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1510 version_script_arg = join_paths(project_source_root, sym)
1512 nss = shared_library(
1514 'src/nss-@0@/nss-@0@.c'.format(module),
1517 include_directories : includes,
1518 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1519 link_args : ['-Wl,-z,nodelete',
1521 '-Wl,--version-script=' + version_script_arg],
1522 link_with : [libsystemd_static,
1524 dependencies : [threads,
1528 install_dir : rootlibdir)
1530 # We cannot use shared_module because it does not support version suffix.
1531 # Unfortunately shared_library insists on creating the symlink…
1532 meson.add_install_script('sh', '-c',
1533 'rm $DESTDIR@0@/libnss_@1@.so'
1534 .format(rootlibdir, module))
1536 if want_tests != 'false'
1537 test('dlopen-nss_' + module,
1539 # path to dlopen must include a slash
1540 args : nss.full_path())
1545 ############################################################
1547 executable('systemd',
1549 include_directories : includes,
1550 link_with : [libcore,
1552 dependencies : [versiondep,
1559 install_rpath : rootlibexecdir,
1561 install_dir : rootlibexecdir)
1563 meson.add_install_script(meson_make_symlink,
1564 join_paths(rootlibexecdir, 'systemd'),
1565 join_paths(rootsbindir, 'init'))
1567 exe = executable('systemd-analyze',
1568 systemd_analyze_sources,
1569 include_directories : includes,
1570 link_with : [libcore,
1572 dependencies : [versiondep,
1579 install_rpath : rootlibexecdir,
1581 public_programs += exe
1583 executable('systemd-journald',
1584 systemd_journald_sources,
1585 include_directories : includes,
1586 link_with : [libjournal_core,
1588 dependencies : [threads,
1592 install_rpath : rootlibexecdir,
1594 install_dir : rootlibexecdir)
1596 exe = executable('systemd-cat',
1597 systemd_cat_sources,
1598 include_directories : includes,
1599 link_with : [libjournal_core,
1601 dependencies : [threads],
1602 install_rpath : rootlibexecdir,
1604 public_programs += exe
1606 exe = executable('journalctl',
1608 include_directories : includes,
1609 link_with : [libshared],
1610 dependencies : [threads,
1615 install_rpath : rootlibexecdir,
1617 install_dir : rootbindir)
1618 public_programs += exe
1620 executable('systemd-getty-generator',
1621 'src/getty-generator/getty-generator.c',
1622 include_directories : includes,
1623 link_with : [libshared],
1624 install_rpath : rootlibexecdir,
1626 install_dir : systemgeneratordir)
1628 executable('systemd-debug-generator',
1629 'src/debug-generator/debug-generator.c',
1630 include_directories : includes,
1631 link_with : [libshared],
1632 install_rpath : rootlibexecdir,
1634 install_dir : systemgeneratordir)
1636 executable('systemd-run-generator',
1637 'src/run-generator/run-generator.c',
1638 include_directories : includes,
1639 link_with : [libshared],
1640 install_rpath : rootlibexecdir,
1642 install_dir : systemgeneratordir)
1644 executable('systemd-fstab-generator',
1645 'src/fstab-generator/fstab-generator.c',
1646 include_directories : includes,
1647 link_with : [libcore_shared,
1649 install_rpath : rootlibexecdir,
1651 install_dir : systemgeneratordir)
1653 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1654 executable('30-systemd-environment-d-generator',
1655 'src/environment-d-generator/environment-d-generator.c',
1656 include_directories : includes,
1657 link_with : [libshared],
1658 install_rpath : rootlibexecdir,
1660 install_dir : userenvgeneratordir)
1662 meson.add_install_script(meson_make_symlink,
1663 join_paths(sysconfdir, 'environment'),
1664 join_paths(environmentdir, '99-environment.conf'))
1667 if conf.get('ENABLE_HIBERNATE') == 1
1668 executable('systemd-hibernate-resume-generator',
1669 'src/hibernate-resume/hibernate-resume-generator.c',
1670 include_directories : includes,
1671 link_with : [libshared],
1672 install_rpath : rootlibexecdir,
1674 install_dir : systemgeneratordir)
1676 executable('systemd-hibernate-resume',
1677 'src/hibernate-resume/hibernate-resume.c',
1678 include_directories : includes,
1679 link_with : [libshared],
1680 install_rpath : rootlibexecdir,
1682 install_dir : rootlibexecdir)
1685 if conf.get('HAVE_BLKID') == 1
1686 executable('systemd-gpt-auto-generator',
1687 'src/gpt-auto-generator/gpt-auto-generator.c',
1688 'src/shared/blkid-util.h',
1689 include_directories : includes,
1690 link_with : [libshared],
1691 dependencies : libblkid,
1692 install_rpath : rootlibexecdir,
1694 install_dir : systemgeneratordir)
1696 exe = executable('systemd-dissect',
1697 'src/dissect/dissect.c',
1698 include_directories : includes,
1699 link_with : [libshared],
1700 install_rpath : rootlibexecdir,
1702 install_dir : rootlibexecdir)
1703 public_programs += exe
1706 if conf.get('ENABLE_RESOLVE') == 1
1707 executable('systemd-resolved',
1708 systemd_resolved_sources,
1709 include_directories : includes,
1710 link_with : [libshared,
1712 libsystemd_resolve_core],
1713 dependencies : systemd_resolved_dependencies,
1714 install_rpath : rootlibexecdir,
1716 install_dir : rootlibexecdir)
1718 exe = executable('resolvectl',
1720 include_directories : includes,
1721 link_with : [libshared,
1723 libsystemd_resolve_core],
1724 dependencies : [threads,
1728 install_rpath : rootlibexecdir,
1730 public_programs += exe
1732 meson.add_install_script(meson_make_symlink,
1733 join_paths(bindir, 'resolvectl'),
1734 join_paths(rootsbindir, 'resolvconf'))
1736 meson.add_install_script(meson_make_symlink,
1737 join_paths(bindir, 'resolvectl'),
1738 join_paths(bindir, 'systemd-resolve'))
1741 if conf.get('ENABLE_LOGIND') == 1
1742 executable('systemd-logind',
1743 systemd_logind_sources,
1744 include_directories : includes,
1745 link_with : [liblogind_core,
1747 dependencies : [threads,
1749 install_rpath : rootlibexecdir,
1751 install_dir : rootlibexecdir)
1753 exe = executable('loginctl',
1755 include_directories : includes,
1756 link_with : [libshared],
1757 dependencies : [threads,
1760 install_rpath : rootlibexecdir,
1762 install_dir : rootbindir)
1763 public_programs += exe
1765 exe = executable('systemd-inhibit',
1766 'src/login/inhibit.c',
1767 include_directories : includes,
1768 link_with : [libshared],
1769 install_rpath : rootlibexecdir,
1771 install_dir : rootbindir)
1772 public_programs += exe
1774 if conf.get('HAVE_PAM') == 1
1775 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1776 pam_systemd = shared_library(
1780 include_directories : includes,
1781 link_args : ['-shared',
1782 '-Wl,--version-script=' + version_script_arg],
1783 link_with : [libsystemd_static,
1785 dependencies : [threads,
1788 link_depends : pam_systemd_sym,
1790 install_dir : pamlibdir)
1792 if want_tests != 'false'
1793 test('dlopen-pam_systemd',
1795 # path to dlopen must include a slash
1796 args : pam_systemd.full_path())
1800 executable('systemd-user-runtime-dir',
1801 user_runtime_dir_sources,
1802 include_directories : includes,
1803 link_with : [libshared],
1804 install_rpath : rootlibexecdir,
1806 install_dir : rootlibexecdir)
1809 if conf.get('HAVE_PAM') == 1
1810 executable('systemd-user-sessions',
1811 'src/user-sessions/user-sessions.c',
1812 include_directories : includes,
1813 link_with : [libshared],
1814 install_rpath : rootlibexecdir,
1816 install_dir : rootlibexecdir)
1819 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1820 exe = executable('bootctl',
1821 'src/boot/bootctl.c',
1822 include_directories : includes,
1823 link_with : [libshared],
1824 dependencies : [libblkid],
1825 install_rpath : rootlibexecdir,
1827 public_programs += exe
1829 executable('systemd-bless-boot',
1830 'src/boot/bless-boot.c',
1831 include_directories : includes,
1832 link_with : [libshared],
1833 dependencies : [libblkid],
1834 install_rpath : rootlibexecdir,
1836 install_dir : rootlibexecdir)
1838 executable('systemd-bless-boot-generator',
1839 'src/boot/bless-boot-generator.c',
1840 include_directories : includes,
1841 link_with : [libshared],
1842 install_rpath : rootlibexecdir,
1844 install_dir : systemgeneratordir)
1847 executable('systemd-boot-check-no-failures',
1848 'src/boot/boot-check-no-failures.c',
1849 include_directories : includes,
1850 link_with : [libshared],
1851 dependencies : [libblkid],
1852 install_rpath : rootlibexecdir,
1854 install_dir : rootlibexecdir)
1856 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1857 include_directories : includes,
1858 link_with : [libshared],
1859 dependencies : [threads],
1860 install_rpath : rootlibexecdir,
1862 public_programs += exe
1865 if get_option('link-systemctl-shared')
1866 systemctl_link_with = [libshared]
1868 systemctl_link_with = [libsystemd_static,
1874 exe = executable('systemctl',
1875 'src/systemctl/systemctl.c',
1876 'src/systemctl/sysv-compat.h',
1877 'src/systemctl/sysv-compat.c',
1878 include_directories : includes,
1879 link_with : systemctl_link_with,
1880 dependencies : [threads,
1885 install_rpath : rootlibexecdir,
1887 install_dir : rootbindir)
1888 public_programs += exe
1890 if conf.get('ENABLE_PORTABLED') == 1
1891 executable('systemd-portabled',
1892 systemd_portabled_sources,
1893 include_directories : includes,
1894 link_with : [libshared],
1895 dependencies : [threads],
1896 install_rpath : rootlibexecdir,
1898 install_dir : rootlibexecdir)
1900 exe = executable('portablectl', 'src/portable/portablectl.c',
1901 include_directories : includes,
1902 link_with : [libshared],
1903 dependencies : [threads],
1904 install_rpath : rootlibexecdir,
1906 install_dir : rootbindir)
1907 public_programs += exe
1910 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1911 meson.add_install_script(meson_make_symlink,
1912 join_paths(rootbindir, 'systemctl'),
1913 join_paths(rootsbindir, alias))
1916 if conf.get('ENABLE_BACKLIGHT') == 1
1917 executable('systemd-backlight',
1918 'src/backlight/backlight.c',
1919 include_directories : includes,
1920 link_with : [libshared],
1921 install_rpath : rootlibexecdir,
1923 install_dir : rootlibexecdir)
1926 if conf.get('ENABLE_RFKILL') == 1
1927 executable('systemd-rfkill',
1928 'src/rfkill/rfkill.c',
1929 include_directories : includes,
1930 link_with : [libshared],
1931 install_rpath : rootlibexecdir,
1933 install_dir : rootlibexecdir)
1936 executable('systemd-system-update-generator',
1937 'src/system-update-generator/system-update-generator.c',
1938 include_directories : includes,
1939 link_with : [libshared],
1940 install_rpath : rootlibexecdir,
1942 install_dir : systemgeneratordir)
1944 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1945 executable('systemd-cryptsetup',
1946 'src/cryptsetup/cryptsetup.c',
1947 include_directories : includes,
1948 link_with : [libshared],
1949 dependencies : [libcryptsetup],
1950 install_rpath : rootlibexecdir,
1952 install_dir : rootlibexecdir)
1954 executable('systemd-cryptsetup-generator',
1955 'src/cryptsetup/cryptsetup-generator.c',
1956 include_directories : includes,
1957 link_with : [libshared],
1958 dependencies : [libcryptsetup],
1959 install_rpath : rootlibexecdir,
1961 install_dir : systemgeneratordir)
1963 executable('systemd-veritysetup',
1964 'src/veritysetup/veritysetup.c',
1965 include_directories : includes,
1966 link_with : [libshared],
1967 dependencies : [libcryptsetup],
1968 install_rpath : rootlibexecdir,
1970 install_dir : rootlibexecdir)
1972 executable('systemd-veritysetup-generator',
1973 'src/veritysetup/veritysetup-generator.c',
1974 include_directories : includes,
1975 link_with : [libshared],
1976 dependencies : [libcryptsetup],
1977 install_rpath : rootlibexecdir,
1979 install_dir : systemgeneratordir)
1982 if conf.get('HAVE_SYSV_COMPAT') == 1
1983 executable('systemd-sysv-generator',
1984 'src/sysv-generator/sysv-generator.c',
1985 include_directories : includes,
1986 link_with : [libshared],
1987 install_rpath : rootlibexecdir,
1989 install_dir : systemgeneratordir)
1991 executable('systemd-rc-local-generator',
1992 'src/rc-local-generator/rc-local-generator.c',
1993 include_directories : includes,
1994 link_with : [libshared],
1995 install_rpath : rootlibexecdir,
1997 install_dir : systemgeneratordir)
2000 if conf.get('ENABLE_HOSTNAMED') == 1
2001 executable('systemd-hostnamed',
2002 'src/hostname/hostnamed.c',
2003 include_directories : includes,
2004 link_with : [libshared],
2005 install_rpath : rootlibexecdir,
2007 install_dir : rootlibexecdir)
2009 exe = executable('hostnamectl',
2010 'src/hostname/hostnamectl.c',
2011 include_directories : includes,
2012 link_with : [libshared],
2013 install_rpath : rootlibexecdir,
2015 public_programs += exe
2018 if conf.get('ENABLE_LOCALED') == 1
2019 if conf.get('HAVE_XKBCOMMON') == 1
2020 # logind will load libxkbcommon.so dynamically on its own
2026 executable('systemd-localed',
2027 systemd_localed_sources,
2028 include_directories : includes,
2029 link_with : [libshared],
2030 dependencies : deps,
2031 install_rpath : rootlibexecdir,
2033 install_dir : rootlibexecdir)
2035 exe = executable('localectl',
2037 include_directories : includes,
2038 link_with : [libshared],
2039 install_rpath : rootlibexecdir,
2041 public_programs += exe
2044 if conf.get('ENABLE_TIMEDATED') == 1
2045 executable('systemd-timedated',
2046 'src/timedate/timedated.c',
2047 include_directories : includes,
2048 link_with : [libshared],
2049 install_rpath : rootlibexecdir,
2051 install_dir : rootlibexecdir)
2054 if conf.get('ENABLE_TIMEDATECTL') == 1
2055 exe = executable('timedatectl',
2056 'src/timedate/timedatectl.c',
2057 include_directories : includes,
2058 install_rpath : rootlibexecdir,
2059 link_with : [libshared],
2060 dependencies : [libm],
2062 public_programs += exe
2065 if conf.get('ENABLE_TIMESYNCD') == 1
2066 executable('systemd-timesyncd',
2067 systemd_timesyncd_sources,
2068 include_directories : includes,
2069 link_with : [libshared],
2070 dependencies : [threads,
2072 install_rpath : rootlibexecdir,
2074 install_dir : rootlibexecdir)
2076 executable('systemd-time-wait-sync',
2077 'src/time-wait-sync/time-wait-sync.c',
2078 include_directories : includes,
2079 link_with : [libshared],
2080 install_rpath : rootlibexecdir,
2082 install_dir : rootlibexecdir)
2085 if conf.get('ENABLE_MACHINED') == 1
2086 executable('systemd-machined',
2087 systemd_machined_sources,
2088 include_directories : includes,
2089 link_with : [libmachine_core,
2091 install_rpath : rootlibexecdir,
2093 install_dir : rootlibexecdir)
2095 exe = executable('machinectl',
2096 'src/machine/machinectl.c',
2097 include_directories : includes,
2098 link_with : [libshared],
2099 dependencies : [threads,
2102 install_rpath : rootlibexecdir,
2104 install_dir : rootbindir)
2105 public_programs += exe
2108 if conf.get('ENABLE_IMPORTD') == 1
2109 executable('systemd-importd',
2110 systemd_importd_sources,
2111 include_directories : includes,
2112 link_with : [libshared],
2113 dependencies : [threads],
2114 install_rpath : rootlibexecdir,
2116 install_dir : rootlibexecdir)
2118 systemd_pull = executable('systemd-pull',
2119 systemd_pull_sources,
2120 include_directories : includes,
2121 link_with : [libshared],
2122 dependencies : [versiondep,
2128 install_rpath : rootlibexecdir,
2130 install_dir : rootlibexecdir)
2132 systemd_import = executable('systemd-import',
2133 systemd_import_sources,
2134 include_directories : includes,
2135 link_with : [libshared],
2136 dependencies : [libcurl,
2140 install_rpath : rootlibexecdir,
2142 install_dir : rootlibexecdir)
2144 systemd_import_fs = executable('systemd-import-fs',
2145 systemd_import_fs_sources,
2146 include_directories : includes,
2147 link_with : [libshared],
2148 install_rpath : rootlibexecdir,
2150 install_dir : rootlibexecdir)
2152 systemd_export = executable('systemd-export',
2153 systemd_export_sources,
2154 include_directories : includes,
2155 link_with : [libshared],
2156 dependencies : [libcurl,
2160 install_rpath : rootlibexecdir,
2162 install_dir : rootlibexecdir)
2164 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2167 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2168 exe = executable('systemd-journal-upload',
2169 systemd_journal_upload_sources,
2170 include_directories : includes,
2171 link_with : [libshared],
2172 dependencies : [versiondep,
2178 install_rpath : rootlibexecdir,
2180 install_dir : rootlibexecdir)
2181 public_programs += exe
2184 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2185 s_j_remote = executable('systemd-journal-remote',
2186 systemd_journal_remote_sources,
2187 include_directories : includes,
2188 link_with : [libshared,
2189 libsystemd_journal_remote],
2190 dependencies : [threads,
2195 install_rpath : rootlibexecdir,
2197 install_dir : rootlibexecdir)
2199 s_j_gatewayd = executable('systemd-journal-gatewayd',
2200 systemd_journal_gatewayd_sources,
2201 include_directories : includes,
2202 link_with : [libshared],
2203 dependencies : [threads,
2208 install_rpath : rootlibexecdir,
2210 install_dir : rootlibexecdir)
2211 public_programs += [s_j_remote, s_j_gatewayd]
2214 if conf.get('ENABLE_COREDUMP') == 1
2215 executable('systemd-coredump',
2216 systemd_coredump_sources,
2217 include_directories : includes,
2218 link_with : [libshared],
2219 dependencies : [threads,
2224 install_rpath : rootlibexecdir,
2226 install_dir : rootlibexecdir)
2228 exe = executable('coredumpctl',
2229 coredumpctl_sources,
2230 include_directories : includes,
2231 link_with : [libshared],
2232 dependencies : [threads,
2235 install_rpath : rootlibexecdir,
2237 public_programs += exe
2240 if conf.get('ENABLE_BINFMT') == 1
2241 exe = executable('systemd-binfmt',
2242 'src/binfmt/binfmt.c',
2243 include_directories : includes,
2244 link_with : [libshared],
2245 install_rpath : rootlibexecdir,
2247 install_dir : rootlibexecdir)
2248 public_programs += exe
2250 meson.add_install_script('sh', '-c',
2251 mkdir_p.format(binfmtdir))
2252 meson.add_install_script('sh', '-c',
2253 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2256 if conf.get('ENABLE_VCONSOLE') == 1
2257 executable('systemd-vconsole-setup',
2258 'src/vconsole/vconsole-setup.c',
2259 include_directories : includes,
2260 link_with : [libshared],
2261 install_rpath : rootlibexecdir,
2263 install_dir : rootlibexecdir)
2266 if conf.get('ENABLE_RANDOMSEED') == 1
2267 executable('systemd-random-seed',
2268 'src/random-seed/random-seed.c',
2269 include_directories : includes,
2270 link_with : [libshared],
2271 install_rpath : rootlibexecdir,
2273 install_dir : rootlibexecdir)
2276 if conf.get('ENABLE_FIRSTBOOT') == 1
2277 executable('systemd-firstboot',
2278 'src/firstboot/firstboot.c',
2279 include_directories : includes,
2280 link_with : [libshared],
2281 dependencies : [libcrypt],
2282 install_rpath : rootlibexecdir,
2284 install_dir : rootbindir)
2287 executable('systemd-remount-fs',
2288 'src/remount-fs/remount-fs.c',
2289 include_directories : includes,
2290 link_with : [libcore_shared,
2292 install_rpath : rootlibexecdir,
2294 install_dir : rootlibexecdir)
2296 executable('systemd-machine-id-setup',
2297 'src/machine-id-setup/machine-id-setup-main.c',
2298 include_directories : includes,
2299 link_with : [libcore_shared,
2301 install_rpath : rootlibexecdir,
2303 install_dir : rootbindir)
2305 executable('systemd-fsck',
2307 include_directories : includes,
2308 link_with : [libshared],
2309 install_rpath : rootlibexecdir,
2311 install_dir : rootlibexecdir)
2313 executable('systemd-growfs',
2314 'src/partition/growfs.c',
2315 include_directories : includes,
2316 link_with : [libshared],
2317 dependencies : [libcryptsetup],
2318 install_rpath : rootlibexecdir,
2320 install_dir : rootlibexecdir)
2322 executable('systemd-makefs',
2323 'src/partition/makefs.c',
2324 include_directories : includes,
2325 link_with : [libshared],
2326 install_rpath : rootlibexecdir,
2328 install_dir : rootlibexecdir)
2330 executable('systemd-sleep',
2331 'src/sleep/sleep.c',
2332 include_directories : includes,
2333 link_with : [libshared],
2334 install_rpath : rootlibexecdir,
2336 install_dir : rootlibexecdir)
2338 install_data('src/sleep/sleep.conf',
2339 install_dir : pkgsysconfdir)
2341 exe = executable('systemd-sysctl',
2342 'src/sysctl/sysctl.c',
2343 include_directories : includes,
2344 link_with : [libshared],
2345 install_rpath : rootlibexecdir,
2347 install_dir : rootlibexecdir)
2348 public_programs += exe
2350 executable('systemd-ac-power',
2351 'src/ac-power/ac-power.c',
2352 include_directories : includes,
2353 link_with : [libshared],
2354 install_rpath : rootlibexecdir,
2356 install_dir : rootlibexecdir)
2358 exe = executable('systemd-detect-virt',
2359 'src/detect-virt/detect-virt.c',
2360 include_directories : includes,
2361 link_with : [libshared],
2362 install_rpath : rootlibexecdir,
2364 public_programs += exe
2366 exe = executable('systemd-delta',
2367 'src/delta/delta.c',
2368 include_directories : includes,
2369 link_with : [libshared],
2370 install_rpath : rootlibexecdir,
2372 public_programs += exe
2374 exe = executable('systemd-escape',
2375 'src/escape/escape.c',
2376 include_directories : includes,
2377 link_with : [libshared],
2378 install_rpath : rootlibexecdir,
2380 install_dir : rootbindir)
2381 public_programs += exe
2383 exe = executable('systemd-notify',
2384 'src/notify/notify.c',
2385 include_directories : includes,
2386 link_with : [libshared],
2387 install_rpath : rootlibexecdir,
2389 install_dir : rootbindir)
2390 public_programs += exe
2392 executable('systemd-volatile-root',
2393 'src/volatile-root/volatile-root.c',
2394 include_directories : includes,
2395 link_with : [libshared],
2396 install_rpath : rootlibexecdir,
2398 install_dir : rootlibexecdir)
2400 executable('systemd-cgroups-agent',
2401 'src/cgroups-agent/cgroups-agent.c',
2402 include_directories : includes,
2403 link_with : [libshared],
2404 install_rpath : rootlibexecdir,
2406 install_dir : rootlibexecdir)
2408 exe = executable('systemd-id128',
2409 'src/id128/id128.c',
2410 include_directories : includes,
2411 link_with : [libshared],
2412 install_rpath : rootlibexecdir,
2414 public_programs += exe
2416 exe = executable('systemd-path',
2418 include_directories : includes,
2419 link_with : [libshared],
2420 install_rpath : rootlibexecdir,
2422 public_programs += exe
2424 exe = executable('systemd-ask-password',
2425 'src/ask-password/ask-password.c',
2426 include_directories : includes,
2427 link_with : [libshared],
2428 install_rpath : rootlibexecdir,
2430 install_dir : rootbindir)
2431 public_programs += exe
2433 executable('systemd-reply-password',
2434 'src/reply-password/reply-password.c',
2435 include_directories : includes,
2436 link_with : [libshared],
2437 install_rpath : rootlibexecdir,
2439 install_dir : rootlibexecdir)
2441 exe = executable('systemd-tty-ask-password-agent',
2442 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2443 include_directories : includes,
2444 link_with : [libshared],
2445 install_rpath : rootlibexecdir,
2447 install_dir : rootbindir)
2448 public_programs += exe
2450 exe = executable('systemd-cgls',
2452 include_directories : includes,
2453 link_with : [libshared],
2454 install_rpath : rootlibexecdir,
2456 public_programs += exe
2458 exe = executable('systemd-cgtop',
2459 'src/cgtop/cgtop.c',
2460 include_directories : includes,
2461 link_with : [libshared],
2462 install_rpath : rootlibexecdir,
2464 public_programs += exe
2466 executable('systemd-initctl',
2467 'src/initctl/initctl.c',
2468 include_directories : includes,
2469 link_with : [libshared],
2470 install_rpath : rootlibexecdir,
2472 install_dir : rootlibexecdir)
2474 exe = executable('systemd-mount',
2475 'src/mount/mount-tool.c',
2476 include_directories : includes,
2477 link_with : [libshared],
2478 dependencies: [libmount],
2479 install_rpath : rootlibexecdir,
2481 public_programs += exe
2483 meson.add_install_script(meson_make_symlink,
2484 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2486 exe = executable('systemd-run',
2488 include_directories : includes,
2489 link_with : [libshared],
2490 install_rpath : rootlibexecdir,
2492 public_programs += exe
2494 exe = executable('systemd-stdio-bridge',
2495 'src/stdio-bridge/stdio-bridge.c',
2496 include_directories : includes,
2497 link_with : [libshared],
2498 dependencies : [versiondep],
2499 install_rpath : rootlibexecdir,
2501 public_programs += exe
2503 exe = executable('busctl',
2504 'src/busctl/busctl.c',
2505 'src/busctl/busctl-introspect.c',
2506 'src/busctl/busctl-introspect.h',
2507 include_directories : includes,
2508 link_with : [libshared],
2509 install_rpath : rootlibexecdir,
2511 public_programs += exe
2513 if conf.get('ENABLE_SYSUSERS') == 1
2514 exe = executable('systemd-sysusers',
2515 'src/sysusers/sysusers.c',
2516 include_directories : includes,
2517 link_with : [libshared],
2518 install_rpath : rootlibexecdir,
2520 install_dir : rootbindir)
2521 public_programs += exe
2524 if conf.get('ENABLE_TMPFILES') == 1
2525 exe = executable('systemd-tmpfiles',
2526 'src/tmpfiles/tmpfiles.c',
2527 include_directories : includes,
2528 link_with : [libshared],
2529 dependencies : [libacl],
2530 install_rpath : rootlibexecdir,
2532 install_dir : rootbindir)
2533 public_programs += exe
2535 if want_tests != 'false'
2536 test('test-systemd-tmpfiles',
2537 test_systemd_tmpfiles_py,
2538 # https://github.com/mesonbuild/meson/issues/2681
2539 args : exe.full_path())
2543 if conf.get('ENABLE_HWDB') == 1
2544 exe = executable('systemd-hwdb',
2546 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2547 include_directories : includes,
2548 link_with : [libudev_static],
2549 install_rpath : udev_rpath,
2551 install_dir : rootbindir)
2552 public_programs += exe
2555 if conf.get('ENABLE_QUOTACHECK') == 1
2556 executable('systemd-quotacheck',
2557 'src/quotacheck/quotacheck.c',
2558 include_directories : includes,
2559 link_with : [libshared],
2560 install_rpath : rootlibexecdir,
2562 install_dir : rootlibexecdir)
2565 exe = executable('systemd-socket-proxyd',
2566 'src/socket-proxy/socket-proxyd.c',
2567 include_directories : includes,
2568 link_with : [libshared],
2569 dependencies : [threads],
2570 install_rpath : rootlibexecdir,
2572 install_dir : rootlibexecdir)
2573 public_programs += exe
2575 exe = executable('systemd-udevd',
2576 systemd_udevd_sources,
2577 include_directories : includes,
2578 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2579 link_with : [libudev_core,
2582 dependencies : [versiondep,
2588 install_rpath : udev_rpath,
2590 install_dir : rootlibexecdir)
2591 public_programs += exe
2593 exe = executable('udevadm',
2595 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2596 include_directories : includes,
2597 link_with : [libudev_core,
2600 dependencies : [versiondep,
2606 install_rpath : udev_rpath,
2608 install_dir : rootbindir)
2609 public_programs += exe
2611 executable('systemd-shutdown',
2612 systemd_shutdown_sources,
2613 include_directories : includes,
2614 link_with : [libcore_shared,
2616 dependencies : [libmount],
2617 install_rpath : rootlibexecdir,
2619 install_dir : rootlibexecdir)
2621 executable('systemd-update-done',
2622 'src/update-done/update-done.c',
2623 include_directories : includes,
2624 link_with : [libshared],
2625 install_rpath : rootlibexecdir,
2627 install_dir : rootlibexecdir)
2629 executable('systemd-update-utmp',
2630 'src/update-utmp/update-utmp.c',
2631 include_directories : includes,
2632 link_with : [libshared],
2633 dependencies : [libaudit],
2634 install_rpath : rootlibexecdir,
2636 install_dir : rootlibexecdir)
2638 if conf.get('HAVE_KMOD') == 1
2639 executable('systemd-modules-load',
2640 'src/modules-load/modules-load.c',
2641 include_directories : includes,
2642 link_with : [libshared],
2643 dependencies : [libkmod],
2644 install_rpath : rootlibexecdir,
2646 install_dir : rootlibexecdir)
2648 meson.add_install_script('sh', '-c',
2649 mkdir_p.format(modulesloaddir))
2650 meson.add_install_script('sh', '-c',
2651 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2654 exe = executable('systemd-nspawn',
2655 systemd_nspawn_sources,
2656 include_directories : includes,
2657 link_with : [libcore_shared,
2660 dependencies : [libblkid,
2662 install_rpath : rootlibexecdir,
2664 public_programs += exe
2666 if conf.get('ENABLE_NETWORKD') == 1
2667 executable('systemd-networkd',
2668 systemd_networkd_sources,
2669 include_directories : includes,
2670 link_with : [libnetworkd_core,
2674 dependencies : [threads],
2675 install_rpath : rootlibexecdir,
2677 install_dir : rootlibexecdir)
2679 executable('systemd-networkd-wait-online',
2680 systemd_networkd_wait_online_sources,
2681 include_directories : includes,
2682 link_with : [libnetworkd_core,
2684 install_rpath : rootlibexecdir,
2686 install_dir : rootlibexecdir)
2688 exe = executable('networkctl',
2690 include_directories : includes,
2691 link_with : [libsystemd_network,
2693 install_rpath : rootlibexecdir,
2695 install_dir : rootbindir)
2696 public_programs += exe
2699 executable('systemd-sulogin-shell',
2700 ['src/sulogin-shell/sulogin-shell.c'],
2701 include_directories : includes,
2702 link_with : [libshared],
2703 install_rpath : rootlibexecdir,
2705 install_dir : rootlibexecdir)
2707 ############################################################
2710 'systemd-runtest.env',
2711 output : 'systemd-runtest.env',
2712 command : ['sh', '-c', '{ ' +
2713 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2714 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2716 build_by_default : true)
2718 foreach tuple : tests
2720 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2721 dependencies = tuple[2]
2722 condition = tuple.length() >= 4 ? tuple[3] : ''
2723 type = tuple.length() >= 5 ? tuple[4] : ''
2724 defs = tuple.length() >= 6 ? tuple[5] : []
2725 incs = tuple.length() >= 7 ? tuple[6] : includes
2728 name = sources[0].split('/')[-1].split('.')[0]
2729 if type.startswith('timeout=')
2730 timeout = type.split('=')[1].to_int()
2734 if condition == '' or conf.get(condition) == 1
2738 include_directories : incs,
2739 link_with : link_with,
2740 dependencies : [versiondep,
2743 build_by_default : want_tests != 'false',
2744 install_rpath : rootlibexecdir,
2745 install : install_tests,
2746 install_dir : join_paths(testsdir, type))
2749 message('@0@ is a manual test'.format(name))
2750 elif type == 'unsafe' and want_tests != 'unsafe'
2751 message('@0@ is an unsafe test'.format(name))
2752 elif want_tests != 'false'
2758 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2763 'test-libsystemd-sym',
2764 test_libsystemd_sym_c,
2765 include_directories : includes,
2766 link_with : [libsystemd],
2767 build_by_default : want_tests != 'false',
2768 install : install_tests,
2769 install_dir : testsdir)
2770 if want_tests != 'false'
2771 test('test-libsystemd-sym', exe)
2775 'test-libsystemd-static-sym',
2776 test_libsystemd_sym_c,
2777 include_directories : includes,
2778 link_with : [install_libsystemd_static],
2779 dependencies : [threads], # threads is already included in dependencies on the library,
2780 # but does not seem to get propagated. Add here as a work-around.
2781 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2782 install : install_tests and static_libsystemd_pic,
2783 install_dir : testsdir)
2784 if want_tests != 'false' and static_libsystemd_pic
2785 test('test-libsystemd-static-sym', exe)
2791 include_directories : includes,
2792 c_args : '-Wno-deprecated-declarations',
2793 link_with : [libudev],
2794 build_by_default : want_tests != 'false',
2795 install : install_tests,
2796 install_dir : testsdir)
2797 if want_tests != 'false'
2798 test('test-libudev-sym', exe)
2802 'test-libudev-static-sym',
2804 include_directories : includes,
2805 c_args : '-Wno-deprecated-declarations',
2806 link_with : [install_libudev_static],
2807 build_by_default : want_tests != 'false' and static_libudev_pic,
2808 install : install_tests and static_libudev_pic,
2809 install_dir : testsdir)
2810 if want_tests != 'false' and static_libudev_pic
2811 test('test-libudev-static-sym', exe)
2814 ############################################################
2818 if get_option('tests') != 'false'
2819 foreach tuple : fuzzers
2821 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2822 dependencies = tuple[2]
2823 defs = tuple.length() >= 4 ? tuple[3] : []
2824 incs = tuple.length() >= 5 ? tuple[4] : includes
2827 dependencies += fuzzing_engine
2829 sources += 'src/fuzz/fuzz-main.c'
2833 sources += 'src/fuzz/fuzzer-entry-point.c'
2836 name = sources[0].split('/')[-1].split('.')[0]
2838 fuzzer_exes += executable(
2841 include_directories : [incs, include_directories('src/fuzz')],
2842 link_with : link_with,
2843 dependencies : dependencies,
2849 run_target('fuzzers',
2850 depends : fuzzer_exes,
2853 ############################################################
2855 make_directive_index_py = find_program('tools/make-directive-index.py')
2856 make_man_index_py = find_program('tools/make-man-index.py')
2857 xml_helper_py = find_program('tools/xml_helper.py')
2858 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2862 subdir('sysusers.d')
2863 subdir('tmpfiles.d')
2868 subdir('shell-completion/bash')
2869 subdir('shell-completion/zsh')
2870 subdir('docs/sysvinit')
2871 subdir('docs/var-log')
2873 install_subdir('factory/etc',
2874 install_dir : factorydir)
2876 install_data('xorg/50-systemd-user.sh',
2877 install_dir : xinitrcdir)
2878 install_data('modprobe.d/systemd.conf',
2879 install_dir : modprobedir)
2880 install_data('LICENSE.GPL2',
2884 'docs/CODING_STYLE.md',
2885 'docs/DISTRO_PORTING.md',
2886 'docs/ENVIRONMENT.md',
2888 'docs/TRANSIENT-SETTINGS.md',
2889 'docs/TRANSLATORS.md',
2890 'docs/UIDS-GIDS.md',
2891 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2892 install_dir : docdir)
2894 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2895 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2897 ############################################################
2899 meson_check_help = find_program('tools/meson-check-help.sh')
2901 foreach exec : public_programs
2902 name = exec.full_path().split('/')[-1]
2903 if want_tests != 'false'
2904 test('check-help-' + name,
2906 args : exec.full_path())
2910 ############################################################
2912 # Enable tests for all supported sanitizers
2913 foreach tuple : sanitizers
2914 sanitizer = tuple[0]
2917 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2919 foreach p : fuzz_regression_tests
2920 b = p.split('/')[-2]
2921 c = p.split('/')[-1]
2923 name = '@0@:@1@'.format(b, sanitizer)
2926 if want_tests == 'false'
2927 message('Not compiling @0@ because tests is set to false'.format(name))
2929 exe = custom_target(
2933 command : [env, 'ln', '-fs',
2934 join_paths(build.full_path(), b),
2936 build_by_default : true)
2938 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2943 if want_tests != 'false' and slow_tests
2944 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2946 args : [exe.full_path(),
2947 join_paths(project_source_root, p)])
2954 ############################################################
2957 all_files = run_command(
2959 ['--git-dir=@0@/.git'.format(project_source_root),
2962 all_files = files(all_files.stdout().split())
2967 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
2970 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
2974 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2977 command : [meson_git_contrib_sh])
2981 git_head = run_command(
2983 ['--git-dir=@0@/.git'.format(project_source_root),
2984 'rev-parse', 'HEAD']).stdout().strip()
2985 git_head_short = run_command(
2987 ['--git-dir=@0@/.git'.format(project_source_root),
2988 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2992 command : ['git', 'archive',
2993 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
2995 '--prefix', 'systemd-@0@/'.format(git_head),
2999 ############################################################
3001 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3004 depends : [man, libsystemd, libudev],
3005 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3007 ############################################################
3010 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3012 'split /usr: @0@'.format(split_usr),
3013 'split bin-sbin: @0@'.format(split_bin),
3014 'prefix directory: @0@'.format(prefixdir),
3015 'rootprefix directory: @0@'.format(rootprefixdir),
3016 'sysconf directory: @0@'.format(sysconfdir),
3017 'include directory: @0@'.format(includedir),
3018 'lib directory: @0@'.format(libdir),
3019 'rootlib directory: @0@'.format(rootlibdir),
3020 'SysV init scripts: @0@'.format(sysvinit_path),
3021 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3022 'PAM modules directory: @0@'.format(pamlibdir),
3023 'PAM configuration directory: @0@'.format(pamconfdir),
3024 'RPM macros directory: @0@'.format(rpmmacrosdir),
3025 'modprobe.d directory: @0@'.format(modprobedir),
3026 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3027 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3028 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3029 'bash completions directory: @0@'.format(bashcompletiondir),
3030 'zsh completions directory: @0@'.format(zshcompletiondir),
3031 'extra start script: @0@'.format(get_option('rc-local')),
3032 'extra stop script: @0@'.format(get_option('halt-local')),
3033 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3034 get_option('debug-tty')),
3035 'TTY GID: @0@'.format(tty_gid),
3036 'users GID: @0@'.format(substs.get('USERS_GID')),
3037 'maximum system UID: @0@'.format(system_uid_max),
3038 'maximum system GID: @0@'.format(system_gid_max),
3039 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3040 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3041 'minimum container UID base: @0@'.format(container_uid_base_min),
3042 'maximum container UID base: @0@'.format(container_uid_base_max),
3043 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3044 'render group access mode: @0@'.format(get_option('group-render-mode')),
3045 'certificate root directory: @0@'.format(get_option('certificate-root')),
3046 'support URL: @0@'.format(support_url),
3047 'nobody user name: @0@'.format(nobody_user),
3048 'nobody group name: @0@'.format(nobody_group),
3049 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3050 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3052 'default DNSSEC mode: @0@'.format(default_dnssec),
3053 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3054 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3055 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3056 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3057 'default locale: @0@'.format(default_locale)]
3059 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3060 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3062 'default DNS servers: @0@'.format(alt_dns_servers),
3063 'default NTP servers: @0@'.format(alt_ntp_servers)]
3065 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3066 '@@0@'.format(time_epoch)).stdout().strip()
3068 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3071 'static libsystemd: @0@'.format(static_libsystemd),
3072 'static libudev: @0@'.format(static_libudev)]
3075 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3076 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3077 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3079 if conf.get('ENABLE_EFI') == 1
3080 status += 'efi arch: @0@'.format(efi_arch)
3084 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3085 'EFI CC @0@'.format(' '.join(efi_cc)),
3086 'EFI lib directory: @0@'.format(efi_libdir),
3087 'EFI lds directory: @0@'.format(efi_ldsdir),
3088 'EFI include directory: @0@'.format(efi_incdir)]
3140 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3141 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3144 ['legacy pkla', install_polkit_pkla],
3146 ['gnu-efi', have_gnu_efi],
3159 ['man pages', want_man],
3160 ['html pages', want_html],
3161 ['man page indices', want_man and have_lxml],
3166 ['adm group', get_option('adm-group')],
3167 ['wheel group', get_option('wheel-group')],
3170 ['debug mmap cache'],
3173 ['valgrind', conf.get('VALGRIND') == 1],
3174 ['trace logging', conf.get('LOG_TRACE') == 1],
3175 ['link-udev-shared', get_option('link-udev-shared')],
3176 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3179 if tuple.length() >= 2
3182 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3183 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3184 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3195 'enabled features: @0@'.format(', '.join(found)),
3197 'disabled features: @0@'.format(', '.join(missing)),
3199 message('\n '.join(status))
3201 if rootprefixdir != rootprefix_default
3203 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3204 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3205 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))