1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
13 meson_version : '>= 0.46',
16 libsystemd_version = '0.27.0'
17 libudev_version = '1.6.15'
19 # We need the same data in two different formats, ugh!
20 # Also, for hysterical reasons, we use different variable
21 # names, sometimes. Not all variables are included in every
23 conf = configuration_data()
24 conf.set('PROJECT_VERSION', meson.project_version())
26 substs = configuration_data()
27 substs.set('PROJECT_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
28 substs.set('PROJECT_VERSION', meson.project_version())
30 # This is to be used instead of meson.source_root(), as the latter will return
31 # the wrong result when systemd is being built as a meson subproject
32 project_source_root = meson.current_source_dir()
33 relative_source_path = run_command('realpath',
34 '--relative-to=@0@'.format(meson.current_build_dir()),
35 project_source_root).stdout().strip()
36 conf.set_quoted('RELATIVE_SOURCE_PATH', relative_source_path)
38 want_ossfuzz = get_option('oss-fuzz')
39 want_libfuzzer = get_option('llvm-fuzz')
40 want_fuzzbuzz = get_option('fuzzbuzz')
41 if want_ossfuzz + want_libfuzzer + want_fuzzbuzz > 1
42 error('only one of oss-fuzz, llvm-fuzz or fuzzbuzz can be specified')
45 skip_deps = want_ossfuzz or want_libfuzzer
46 fuzzer_build = want_ossfuzz or want_libfuzzer or want_fuzzbuzz
48 #####################################################################
50 # Try to install the git pre-commit hook
51 git_hook = run_command(join_paths(project_source_root, 'tools/add-git-hook.sh'))
52 if git_hook.returncode() == 0
53 message(git_hook.stdout().strip())
56 #####################################################################
58 if get_option('split-usr') == 'auto'
59 split_usr = run_command('test', '-L', '/bin').returncode() != 0
61 split_usr = get_option('split-usr') == 'true'
63 conf.set10('HAVE_SPLIT_USR', split_usr,
64 description : '/usr/bin and /bin directories are separate')
66 if get_option('split-bin') == 'auto'
67 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
69 split_bin = get_option('split-bin') == 'true'
71 conf.set10('HAVE_SPLIT_BIN', split_bin,
72 description : 'bin and sbin directories are separate')
74 rootprefixdir = get_option('rootprefix')
75 # Unusual rootprefixdir values are used by some distros
76 # (see https://github.com/systemd/systemd/pull/7461).
77 rootprefix_default = split_usr ? '/' : '/usr'
78 if rootprefixdir == ''
79 rootprefixdir = rootprefix_default
81 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
83 sysvinit_path = get_option('sysvinit-path')
84 sysvrcnd_path = get_option('sysvrcnd-path')
85 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
86 description : 'SysV init scripts and rcN.d links are supported')
88 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
89 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
90 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
92 # join_paths ignores the preceding arguments if an absolute component is
93 # encountered, so this should canonicalize various paths when they are
94 # absolute or relative.
95 prefixdir = get_option('prefix')
96 if not prefixdir.startswith('/')
97 error('Prefix is not absolute: "@0@"'.format(prefixdir))
99 bindir = join_paths(prefixdir, get_option('bindir'))
100 libdir = join_paths(prefixdir, get_option('libdir'))
101 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
102 includedir = join_paths(prefixdir, get_option('includedir'))
103 datadir = join_paths(prefixdir, get_option('datadir'))
104 localstatedir = join_paths('/', get_option('localstatedir'))
106 rootbindir = join_paths(rootprefixdir, 'bin')
107 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
108 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
110 rootlibdir = get_option('rootlibdir')
112 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
115 # Dirs of external packages
116 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
117 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
118 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
119 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
120 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
121 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
122 rpmmacrosdir = get_option('rpmmacrosdir')
123 if rpmmacrosdir != 'no'
124 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
126 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
129 pkgdatadir = join_paths(datadir, 'systemd')
130 environmentdir = join_paths(prefixdir, 'lib/environment.d')
131 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
132 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
133 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
134 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
135 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
136 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
137 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
138 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
139 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
140 pkgincludedir = join_paths(includedir, 'systemd')
141 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
142 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
143 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
144 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
145 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
146 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
147 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
148 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
149 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
150 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
151 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
152 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
153 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
154 factorydir = join_paths(datadir, 'factory')
155 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
156 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
157 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
158 catalogstatedir = join_paths(systemdstatedir, 'catalog')
159 randomseeddir = join_paths(localstatedir, 'lib/systemd')
160 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
161 ntpservicelistdir = join_paths(rootprefixdir, 'lib/systemd/ntp-units.d')
163 docdir = get_option('docdir')
165 docdir = join_paths(datadir, 'doc/systemd')
168 dbuspolicydir = get_option('dbuspolicydir')
169 if dbuspolicydir == ''
170 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
173 dbussessionservicedir = get_option('dbussessionservicedir')
174 if dbussessionservicedir == ''
175 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
178 dbussystemservicedir = get_option('dbussystemservicedir')
179 if dbussystemservicedir == ''
180 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
183 pamlibdir = get_option('pamlibdir')
185 pamlibdir = join_paths(rootlibdir, 'security')
188 pamconfdir = get_option('pamconfdir')
190 pamconfdir = join_paths(sysconfdir, 'pam.d')
193 memory_accounting_default = get_option('memory-accounting-default')
194 status_unit_format_default = get_option('status-unit-format-default')
196 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
197 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
198 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
199 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
200 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
201 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
203 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
205 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
206 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
207 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
208 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
209 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
210 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
211 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
212 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
213 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
214 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
215 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
216 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
217 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
218 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
219 conf.set_quoted('ROOTPREFIX', rootprefixdir)
220 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
221 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
222 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
223 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
224 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
225 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
226 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
227 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
228 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
229 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
230 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
231 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
232 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
233 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
234 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
235 conf.set_quoted('LIBDIR', libdir)
236 conf.set_quoted('ROOTLIBDIR', rootlibdir)
237 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
238 conf.set_quoted('BOOTLIBDIR', bootlibdir)
239 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
240 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
241 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
242 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
243 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
244 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
245 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
246 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
247 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
248 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
250 substs.set('prefix', prefixdir)
251 substs.set('rootprefix', rootprefixdir)
252 substs.set('rootprefix_noslash', rootprefixdir_noslash)
253 substs.set('exec_prefix', prefixdir)
254 substs.set('libdir', libdir)
255 substs.set('rootlibdir', rootlibdir)
256 substs.set('includedir', includedir)
257 substs.set('sysconfdir', sysconfdir)
258 substs.set('bindir', bindir)
259 substs.set('rootbindir', rootbindir)
260 substs.set('rootlibexecdir', rootlibexecdir)
261 substs.set('systemunitdir', systemunitdir)
262 substs.set('userunitdir', userunitdir)
263 substs.set('systempresetdir', systempresetdir)
264 substs.set('userpresetdir', userpresetdir)
265 substs.set('udevhwdbdir', udevhwdbdir)
266 substs.set('udevrulesdir', udevrulesdir)
267 substs.set('udevlibexecdir', udevlibexecdir)
268 substs.set('environmentdir', environmentdir)
269 substs.set('catalogdir', catalogdir)
270 substs.set('tmpfilesdir', tmpfilesdir)
271 substs.set('sysusersdir', sysusersdir)
272 substs.set('sysctldir', sysctldir)
273 substs.set('binfmtdir', binfmtdir)
274 substs.set('modulesloaddir', modulesloaddir)
275 substs.set('modprobedir', modprobedir)
276 substs.set('systemgeneratordir', systemgeneratordir)
277 substs.set('usergeneratordir', usergeneratordir)
278 substs.set('systemenvgeneratordir', systemenvgeneratordir)
279 substs.set('userenvgeneratordir', userenvgeneratordir)
280 substs.set('systemshutdowndir', systemshutdowndir)
281 substs.set('systemsleepdir', systemsleepdir)
282 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
283 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
284 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
285 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
286 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
287 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
288 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
289 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
290 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
291 substs.set('BUILD_ROOT', meson.current_build_dir())
293 #####################################################################
295 cc = meson.get_compiler('c')
296 pkgconfig = import('pkgconfig')
297 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
298 meson_build_sh = find_program('tools/meson-build.sh')
300 want_tests = get_option('tests')
301 slow_tests = want_tests != 'false' and get_option('slow-tests')
302 install_tests = get_option('install-tests')
304 if add_languages('cpp', required : fuzzer_build)
305 # Used only for tests
306 cxx = meson.get_compiler('cpp')
307 cxx_cmd = ' '.join(cxx.cmd_array())
313 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
314 if fuzzing_engine.found()
315 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
316 elif cc.has_argument('-fsanitize=fuzzer-no-link')
317 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
319 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
322 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
324 fuzzing_engine = meson.get_compiler('cpp').find_library(get_option('fuzzbuzz-engine'), dirs: get_option('fuzzbuzz-engine-dir'))
327 # Those generate many false positives, and we do not want to change the code to
329 basic_disabled_warnings = [
330 '-Wno-unused-parameter',
331 '-Wno-missing-field-initializers',
332 '-Wno-unused-result',
333 '-Wno-format-signedness',
335 if get_option('b_ndebug') == 'true'
336 # With asserts disabled with get a bunch of warnings about variables which
337 # are used only in the asserts. This is not useful at all, so let's just silence
339 basic_disabled_warnings += [
340 '-Wno-unused-variable',
341 '-Wno-unused-but-set-variable',
345 possible_cc_flags = [
348 '-Wmissing-include-dirs',
349 '-Wold-style-definition',
353 '-Wsuggest-attribute=noreturn',
354 '-Werror=missing-prototypes',
355 '-Werror=implicit-function-declaration',
356 '-Werror=missing-declarations',
357 '-Werror=return-type',
358 '-Werror=incompatible-pointer-types',
360 '-Wstrict-prototypes',
362 '-Wmissing-noreturn',
363 '-Wimplicit-fallthrough=5',
366 '-Wstrict-aliasing=2',
369 '-Werror=shift-count-overflow',
370 '-Werror=shift-overflow=2',
374 # negative arguments are correctly detected starting with meson 0.46.
375 '-Wno-error=#warnings', # clang
376 '-Wno-string-plus-int', # clang
378 # work-around for gcc 7.1 turning this on on its own.
379 '-Wno-error=nonnull',
381 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
382 # optimizations enabled, producing essentially false positives.
383 '-Wno-maybe-uninitialized',
387 '-fdiagnostics-show-option',
388 '-fno-strict-aliasing',
389 '-fvisibility=hidden',
391 '-fstack-protector-strong',
392 '--param=ssp-buffer-size=4',
395 # --as-needed and --no-undefined are provided by meson by default,
396 # run mesonconf to see what is enabled
397 possible_link_flags = [
403 if cc.get_id() == 'clang'
404 possible_cc_flags += [
405 '-Wno-typedef-redefinition',
406 '-Wno-gnu-variable-sized-type-not-at-end',
410 if get_option('buildtype') != 'debug'
411 possible_cc_flags += [
412 '-ffunction-sections',
416 possible_link_flags += '-Wl,--gc-sections'
419 add_project_arguments(cc.get_supported_arguments(basic_disabled_warnings), language : 'c')
420 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
421 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
425 #include <inttypes.h>
426 typedef uint64_t usec_t;
427 usec_t now(clockid_t clock);
432 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
433 add_project_arguments('-Werror=shadow', language : 'c')
437 add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp')
440 cpp = ' '.join(cc.cmd_array()) + ' -E'
442 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
444 #####################################################################
445 # compilation result tests
447 conf.set('_GNU_SOURCE', true)
448 conf.set('__SANE_USERSPACE_TYPES__', true)
449 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
451 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
452 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
453 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
454 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
455 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
456 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
457 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
461 #include <sys/stat.h>
464 foreach decl : ['char16_t',
469 # We get -1 if the size cannot be determined
470 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
472 if decl == 'struct statx'
474 want_linux_stat_h = false
476 have = cc.sizeof(decl,
477 prefix : decl_headers + '#include <linux/stat.h>',
478 args : '-D_GNU_SOURCE') > 0
479 want_linux_stat_h = have
483 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
486 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
488 foreach ident : ['secure_getenv', '__secure_getenv']
489 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
493 ['memfd_create', '''#include <sys/mman.h>'''],
494 ['gettid', '''#include <sys/types.h>
495 #include <unistd.h>'''],
496 ['pivot_root', '''#include <stdlib.h>
497 #include <unistd.h>'''], # no known header declares pivot_root
498 ['name_to_handle_at', '''#include <sys/types.h>
499 #include <sys/stat.h>
500 #include <fcntl.h>'''],
501 ['setns', '''#include <sched.h>'''],
502 ['renameat2', '''#include <stdio.h>
503 #include <fcntl.h>'''],
504 ['kcmp', '''#include <linux/kcmp.h>'''],
505 ['keyctl', '''#include <sys/types.h>
506 #include <keyutils.h>'''],
507 ['copy_file_range', '''#include <sys/syscall.h>
508 #include <unistd.h>'''],
509 ['bpf', '''#include <sys/syscall.h>
510 #include <unistd.h>'''],
511 ['statx', '''#include <sys/types.h>
512 #include <sys/stat.h>
513 #include <unistd.h>'''],
514 ['explicit_bzero' , '''#include <string.h>'''],
515 ['reallocarray', '''#include <malloc.h>'''],
516 ['set_mempolicy', '''#include <stdlib.h>
517 #include <unistd.h>'''],
518 ['get_mempolicy', '''#include <stdlib.h>
519 #include <unistd.h>'''],
522 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
523 conf.set10('HAVE_' + ident[0].to_upper(), have)
526 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
527 conf.set10('USE_SYS_RANDOM_H', true)
528 conf.set10('HAVE_GETRANDOM', true)
530 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
531 conf.set10('USE_SYS_RANDOM_H', false)
532 conf.set10('HAVE_GETRANDOM', have)
535 #####################################################################
537 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
539 get_option('version-tag'),
540 meson.project_version()]
543 input : 'src/version/version.h.in',
544 output : 'version.h',
547 versiondep = declare_dependency(sources: version_h)
549 sed = find_program('sed')
550 awk = find_program('awk')
551 m4 = find_program('m4')
552 stat = find_program('stat')
553 git = find_program('git', required : false)
554 env = find_program('env')
555 perl = find_program('perl', required : false)
557 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
558 mkdir_p = 'mkdir -p $DESTDIR/@0@'
559 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
560 splash_bmp = files('test/splash.bmp')
562 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
563 # /usr/sbin, /sbin, and fall back to the default from middle column.
564 progs = [['quotaon', '/usr/sbin/quotaon' ],
565 ['quotacheck', '/usr/sbin/quotacheck' ],
566 ['kmod', '/usr/bin/kmod' ],
567 ['kexec', '/usr/sbin/kexec' ],
568 ['sulogin', '/usr/sbin/sulogin' ],
569 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
570 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
571 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
572 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
573 ['nologin', '/usr/sbin/nologin', ],
576 path = get_option(prog[0] + '-path')
578 message('Using @1@ for @0@'.format(prog[0], path))
580 exe = find_program(prog[0],
581 '/usr/sbin/' + prog[0],
584 path = exe.found() ? exe.path() : prog[1]
586 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
587 conf.set_quoted(name, path)
588 substs.set(name, path)
591 conf.set_quoted('TELINIT', get_option('telinit-path'))
593 if run_command('ln', '--relative', '--help').returncode() != 0
594 error('ln does not support --relative (added in coreutils 8.16)')
597 ############################################################
599 gperf = find_program('gperf')
601 gperf_test_format = '''
603 const char * in_word_set(const char *, @0@);
606 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
607 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
608 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
609 if cc.compiles(gperf_test)
610 gperf_len_type = 'size_t'
612 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
613 if cc.compiles(gperf_test)
614 gperf_len_type = 'unsigned'
616 error('unable to determine gperf len type')
619 message('gperf len type is @0@'.format(gperf_len_type))
620 conf.set('GPERF_LEN_TYPE', gperf_len_type,
621 description : 'The type of gperf "len" parameter')
623 ############################################################
625 if not cc.has_header('sys/capability.h')
626 error('POSIX caps headers not found')
628 foreach header : ['crypt.h',
630 'linux/vm_sockets.h',
632 'valgrind/memcheck.h',
633 'valgrind/valgrind.h',
636 conf.set10('HAVE_' + header.underscorify().to_upper(),
637 cc.has_header(header))
640 ############################################################
642 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
643 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
644 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
646 default_hierarchy = get_option('default-hierarchy')
647 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
648 description : 'default cgroup hierarchy as string')
649 if default_hierarchy == 'legacy'
650 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
651 elif default_hierarchy == 'hybrid'
652 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
654 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
657 default_net_naming_scheme = get_option('default-net-naming-scheme')
658 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
660 time_epoch = get_option('time-epoch')
663 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
665 conf.set('TIME_EPOCH', time_epoch)
667 system_uid_max = get_option('system-uid-max')
668 if system_uid_max == -1
669 system_uid_max = run_command(
671 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
672 '/etc/login.defs').stdout().strip()
673 if system_uid_max == ''
676 system_uid_max = system_uid_max.to_int()
679 conf.set('SYSTEM_UID_MAX', system_uid_max)
680 substs.set('systemuidmax', system_uid_max)
682 system_gid_max = get_option('system-gid-max')
683 if system_gid_max == -1
684 system_gid_max = run_command(
686 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
687 '/etc/login.defs').stdout().strip()
688 if system_gid_max == ''
691 system_gid_max = system_gid_max.to_int()
694 conf.set('SYSTEM_GID_MAX', system_gid_max)
695 substs.set('systemgidmax', system_gid_max)
697 dynamic_uid_min = get_option('dynamic-uid-min')
698 dynamic_uid_max = get_option('dynamic-uid-max')
699 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
700 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
701 substs.set('dynamicuidmin', dynamic_uid_min)
702 substs.set('dynamicuidmax', dynamic_uid_max)
704 container_uid_base_min = get_option('container-uid-base-min')
705 container_uid_base_max = get_option('container-uid-base-max')
706 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
707 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
708 substs.set('containeruidbasemin', container_uid_base_min)
709 substs.set('containeruidbasemax', container_uid_base_max)
711 nobody_user = get_option('nobody-user')
712 nobody_group = get_option('nobody-group')
714 if not meson.is_cross_build()
715 getent_result = run_command('getent', 'passwd', '65534')
716 if getent_result.returncode() == 0
717 name = getent_result.stdout().split(':')[0]
718 if name != nobody_user
720 '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) +
721 'Your build will result in an user table setup that is incompatible with the local system.')
724 id_result = run_command('id', '-u', nobody_user)
725 if id_result.returncode() == 0
726 id = id_result.stdout().to_int()
729 '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) +
730 'Your build will result in an user table setup that is incompatible with the local system.')
734 getent_result = run_command('getent', 'group', '65534')
735 if getent_result.returncode() == 0
736 name = getent_result.stdout().split(':')[0]
737 if name != nobody_group
739 '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) +
740 'Your build will result in an group table setup that is incompatible with the local system.')
743 id_result = run_command('id', '-g', nobody_group)
744 if id_result.returncode() == 0
745 id = id_result.stdout().to_int()
748 '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) +
749 'Your build will result in an group table setup that is incompatible with the local system.')
753 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
755 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
756 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
759 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
760 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
761 substs.set('NOBODY_USER_NAME', nobody_user)
762 substs.set('NOBODY_GROUP_NAME', nobody_group)
764 tty_gid = get_option('tty-gid')
765 conf.set('TTY_GID', tty_gid)
766 substs.set('TTY_GID', tty_gid)
768 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
769 users_gid = get_option('users-gid')
770 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
772 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
773 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
775 dev_kvm_mode = get_option('dev-kvm-mode')
776 substs.set('DEV_KVM_MODE', dev_kvm_mode)
777 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
778 group_render_mode = get_option('group-render-mode')
779 substs.set('GROUP_RENDER_MODE', group_render_mode)
780 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
782 kill_user_processes = get_option('default-kill-user-processes')
783 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
784 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
785 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
787 dns_servers = get_option('dns-servers')
788 conf.set_quoted('DNS_SERVERS', dns_servers)
789 substs.set('DNS_SERVERS', dns_servers)
791 ntp_servers = get_option('ntp-servers')
792 conf.set_quoted('NTP_SERVERS', ntp_servers)
793 substs.set('NTP_SERVERS', ntp_servers)
795 default_locale = get_option('default-locale')
796 if default_locale == ''
797 if not meson.is_cross_build()
798 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
799 default_locale = run_command(choose_default_locale_sh).stdout().strip()
801 default_locale = 'C.UTF-8'
804 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
806 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
808 service_watchdog = get_option('service-watchdog')
809 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
810 substs.set('SERVICE_WATCHDOG', watchdog_value)
812 substs.set('SUSHELL', get_option('debug-shell'))
813 substs.set('DEBUGTTY', get_option('debug-tty'))
814 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
816 enable_debug_hashmap = false
817 enable_debug_mmap_cache = false
818 enable_debug_siphash = false
819 foreach name : get_option('debug-extra')
821 enable_debug_hashmap = true
822 elif name == 'mmap-cache'
823 enable_debug_mmap_cache = true
824 elif name == 'siphash'
825 enable_debug_siphash = true
827 message('unknown debug option "@0@", ignoring'.format(name))
830 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
831 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
832 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
834 conf.set10('VALGRIND', get_option('valgrind'))
835 conf.set10('LOG_TRACE', get_option('log-trace'))
837 #####################################################################
839 threads = dependency('threads')
840 librt = cc.find_library('rt')
841 libm = cc.find_library('m')
842 libdl = cc.find_library('dl')
843 libcrypt = cc.find_library('crypt')
845 libcap = dependency('libcap', required : false)
846 if not libcap.found()
847 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
848 libcap = cc.find_library('cap')
851 libmount = dependency('mount',
852 version : fuzzer_build ? '>= 0' : '>= 2.30')
854 want_seccomp = get_option('seccomp')
855 if want_seccomp != 'false' and not skip_deps
856 libseccomp = dependency('libseccomp',
857 version : '>= 2.3.1',
858 required : want_seccomp == 'true')
859 have = libseccomp.found()
864 conf.set10('HAVE_SECCOMP', have)
866 want_selinux = get_option('selinux')
867 if want_selinux != 'false' and not skip_deps
868 libselinux = dependency('libselinux',
869 version : '>= 2.1.9',
870 required : want_selinux == 'true')
871 have = libselinux.found()
876 conf.set10('HAVE_SELINUX', have)
878 want_apparmor = get_option('apparmor')
879 if want_apparmor != 'false' and not skip_deps
880 libapparmor = dependency('libapparmor',
881 required : want_apparmor == 'true')
882 have = libapparmor.found()
887 conf.set10('HAVE_APPARMOR', have)
889 smack_run_label = get_option('smack-run-label')
890 if smack_run_label != ''
891 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
894 want_polkit = get_option('polkit')
895 install_polkit = false
896 install_polkit_pkla = false
897 if want_polkit != 'false' and not skip_deps
898 install_polkit = true
900 libpolkit = dependency('polkit-gobject-1',
902 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
903 message('Old polkit detected, will install pkla files')
904 install_polkit_pkla = true
907 conf.set10('ENABLE_POLKIT', install_polkit)
909 want_acl = get_option('acl')
910 if want_acl != 'false' and not skip_deps
911 libacl = cc.find_library('acl', required : want_acl == 'true')
912 have = libacl.found()
917 conf.set10('HAVE_ACL', have)
919 want_audit = get_option('audit')
920 if want_audit != 'false' and not skip_deps
921 libaudit = dependency('audit', required : want_audit == 'true')
922 have = libaudit.found()
927 conf.set10('HAVE_AUDIT', have)
929 want_blkid = get_option('blkid')
930 if want_blkid != 'false' and not skip_deps
931 libblkid = dependency('blkid', required : want_blkid == 'true')
932 have = libblkid.found()
937 conf.set10('HAVE_BLKID', have)
939 want_kmod = get_option('kmod')
940 if want_kmod != 'false' and not skip_deps
941 libkmod = dependency('libkmod',
943 required : want_kmod == 'true')
944 have = libkmod.found()
949 conf.set10('HAVE_KMOD', have)
951 want_pam = get_option('pam')
952 if want_pam != 'false' and not skip_deps
953 libpam = cc.find_library('pam', required : want_pam == 'true')
954 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
955 have = libpam.found() and libpam_misc.found()
961 conf.set10('HAVE_PAM', have)
963 want_microhttpd = get_option('microhttpd')
964 if want_microhttpd != 'false' and not skip_deps
965 libmicrohttpd = dependency('libmicrohttpd',
966 version : '>= 0.9.33',
967 required : want_microhttpd == 'true')
968 have = libmicrohttpd.found()
973 conf.set10('HAVE_MICROHTTPD', have)
975 want_libcryptsetup = get_option('libcryptsetup')
976 if want_libcryptsetup != 'false' and not skip_deps
977 libcryptsetup = dependency('libcryptsetup',
978 version : '>= 2.0.1',
979 required : want_libcryptsetup == 'true')
980 have = libcryptsetup.found()
985 conf.set10('HAVE_LIBCRYPTSETUP', have)
987 want_libcurl = get_option('libcurl')
988 if want_libcurl != 'false' and not skip_deps
989 libcurl = dependency('libcurl',
990 version : '>= 7.32.0',
991 required : want_libcurl == 'true')
992 have = libcurl.found()
997 conf.set10('HAVE_LIBCURL', have)
999 want_libidn = get_option('libidn')
1000 want_libidn2 = get_option('libidn2')
1001 if want_libidn == 'true' and want_libidn2 == 'true'
1002 error('libidn and libidn2 cannot be requested simultaneously')
1005 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1006 libidn = dependency('libidn2',
1007 required : want_libidn2 == 'true')
1008 have = libidn.found()
1013 conf.set10('HAVE_LIBIDN2', have)
1014 if not have and want_libidn != 'false' and not skip_deps
1015 # libidn is used for both libidn and libidn2 objects
1016 libidn = dependency('libidn',
1017 required : want_libidn == 'true')
1018 have = libidn.found()
1022 conf.set10('HAVE_LIBIDN', have)
1024 want_libiptc = get_option('libiptc')
1025 if want_libiptc != 'false' and not skip_deps
1026 libiptc = dependency('libiptc',
1027 required : want_libiptc == 'true')
1028 have = libiptc.found()
1033 conf.set10('HAVE_LIBIPTC', have)
1035 want_qrencode = get_option('qrencode')
1036 if want_qrencode != 'false' and not skip_deps
1037 libqrencode = dependency('libqrencode',
1038 required : want_qrencode == 'true')
1039 have = libqrencode.found()
1044 conf.set10('HAVE_QRENCODE', have)
1046 want_gcrypt = get_option('gcrypt')
1047 if want_gcrypt != 'false' and not skip_deps
1048 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1049 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1050 have = libgcrypt.found() and libgpg_error.found()
1055 # link to neither of the libs if one is not found
1059 conf.set10('HAVE_GCRYPT', have)
1061 want_gnutls = get_option('gnutls')
1062 if want_gnutls != 'false' and not skip_deps
1063 libgnutls = dependency('gnutls',
1064 version : '>= 3.1.4',
1065 required : want_gnutls == 'true')
1066 have = libgnutls.found()
1071 conf.set10('HAVE_GNUTLS', have)
1073 want_openssl = get_option('openssl')
1074 if want_openssl != 'false' and not skip_deps
1075 libopenssl = dependency('openssl',
1076 version : '>= 1.1.0',
1077 required : want_openssl == 'true')
1078 have = libopenssl.found()
1083 conf.set10('HAVE_OPENSSL', have)
1085 want_elfutils = get_option('elfutils')
1086 if want_elfutils != 'false' and not skip_deps
1087 libdw = dependency('libdw',
1088 required : want_elfutils == 'true')
1089 have = libdw.found()
1094 conf.set10('HAVE_ELFUTILS', have)
1096 want_zlib = get_option('zlib')
1097 if want_zlib != 'false' and not skip_deps
1098 libz = dependency('zlib',
1099 required : want_zlib == 'true')
1105 conf.set10('HAVE_ZLIB', have)
1107 want_bzip2 = get_option('bzip2')
1108 if want_bzip2 != 'false' and not skip_deps
1109 libbzip2 = cc.find_library('bz2',
1110 required : want_bzip2 == 'true')
1111 have = libbzip2.found()
1116 conf.set10('HAVE_BZIP2', have)
1118 want_xz = get_option('xz')
1119 if want_xz != 'false' and not skip_deps
1120 libxz = dependency('liblzma',
1121 required : want_xz == 'true')
1122 have = libxz.found()
1127 conf.set10('HAVE_XZ', have)
1129 want_lz4 = get_option('lz4')
1130 if want_lz4 != 'false' and not skip_deps
1131 liblz4 = dependency('liblz4',
1132 version : '>= 1.3.0',
1133 required : want_lz4 == 'true')
1134 have = liblz4.found()
1139 conf.set10('HAVE_LZ4', have)
1141 want_xkbcommon = get_option('xkbcommon')
1142 if want_xkbcommon != 'false' and not skip_deps
1143 libxkbcommon = dependency('xkbcommon',
1144 version : '>= 0.3.0',
1145 required : want_xkbcommon == 'true')
1146 have = libxkbcommon.found()
1151 conf.set10('HAVE_XKBCOMMON', have)
1153 want_pcre2 = get_option('pcre2')
1154 if want_pcre2 != 'false'
1155 libpcre2 = dependency('libpcre2-8',
1156 required : want_pcre2 == 'true')
1157 have = libpcre2.found()
1162 conf.set10('HAVE_PCRE2', have)
1164 want_glib = get_option('glib')
1165 if want_glib != 'false' and not skip_deps
1166 libglib = dependency('glib-2.0',
1167 version : '>= 2.22.0',
1168 required : want_glib == 'true')
1169 libgobject = dependency('gobject-2.0',
1170 version : '>= 2.22.0',
1171 required : want_glib == 'true')
1172 libgio = dependency('gio-2.0',
1173 required : want_glib == 'true')
1174 have = libglib.found() and libgobject.found() and libgio.found()
1181 conf.set10('HAVE_GLIB', have)
1183 want_dbus = get_option('dbus')
1184 if want_dbus != 'false' and not skip_deps
1185 libdbus = dependency('dbus-1',
1186 version : '>= 1.3.2',
1187 required : want_dbus == 'true')
1188 have = libdbus.found()
1193 conf.set10('HAVE_DBUS', have)
1195 default_dnssec = get_option('default-dnssec')
1197 default_dnssec = 'no'
1199 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1200 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1201 default_dnssec = 'no'
1203 conf.set('DEFAULT_DNSSEC_MODE',
1204 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1205 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1207 dns_over_tls = get_option('dns-over-tls')
1208 if dns_over_tls != 'false'
1209 if dns_over_tls == 'openssl'
1212 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1213 if dns_over_tls == 'gnutls' and not have_gnutls
1214 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1217 if dns_over_tls == 'gnutls' or have_gnutls
1218 have_openssl = false
1220 have_openssl = conf.get('HAVE_OPENSSL') == 1
1221 if dns_over_tls != 'auto' and not have_openssl
1222 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1223 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1226 have = have_gnutls or have_openssl
1230 have_openssl = false
1232 conf.set10('ENABLE_DNS_OVER_TLS', have)
1233 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1234 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1236 default_dns_over_tls = get_option('default-dns-over-tls')
1238 default_dns_over_tls = 'no'
1240 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1241 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.')
1242 default_dns_over_tls = 'no'
1244 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1245 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1246 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1248 want_importd = get_option('importd')
1249 if want_importd != 'false'
1250 have = (conf.get('HAVE_LIBCURL') == 1 and
1251 conf.get('HAVE_ZLIB') == 1 and
1252 conf.get('HAVE_XZ') == 1 and
1253 conf.get('HAVE_GCRYPT') == 1)
1254 if want_importd == 'true' and not have
1255 error('importd support was requested, but dependencies are not available')
1260 conf.set10('ENABLE_IMPORTD', have)
1262 want_remote = get_option('remote')
1263 if want_remote != 'false'
1264 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1265 conf.get('HAVE_LIBCURL') == 1]
1266 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1267 # it's possible to build one without the other. Complain only if
1268 # support was explicitly requested. The auxiliary files like sysusers
1269 # config should be installed when any of the programs are built.
1270 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1271 error('remote support was requested, but dependencies are not available')
1273 have = have_deps[0] or have_deps[1]
1277 conf.set10('ENABLE_REMOTE', have)
1279 foreach term : ['utmp',
1312 have = get_option(term)
1313 name = 'ENABLE_' + term.underscorify().to_upper()
1314 conf.set10(name, have)
1317 foreach tuple : [['nss-mymachines', 'machined'],
1318 ['nss-resolve', 'resolve']]
1319 want = get_option(tuple[0])
1321 have = get_option(tuple[1])
1322 if want == 'true' and not have
1323 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1328 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1329 conf.set10(name, have)
1333 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1334 'ENABLE_NSS_MYMACHINES',
1335 'ENABLE_NSS_RESOLVE',
1336 'ENABLE_NSS_SYSTEMD']
1337 if conf.get(term) == 1
1341 conf.set10('ENABLE_NSS', enable_nss)
1343 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1348 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1350 #####################################################################
1352 if get_option('efi')
1353 efi_arch = host_machine.cpu_family()
1355 if efi_arch == 'x86'
1356 EFI_MACHINE_TYPE_NAME = 'ia32'
1357 gnu_efi_arch = 'ia32'
1358 elif efi_arch == 'x86_64'
1359 EFI_MACHINE_TYPE_NAME = 'x64'
1360 gnu_efi_arch = 'x86_64'
1361 elif efi_arch == 'arm'
1362 EFI_MACHINE_TYPE_NAME = 'arm'
1363 gnu_efi_arch = 'arm'
1364 elif efi_arch == 'aarch64'
1365 EFI_MACHINE_TYPE_NAME = 'aa64'
1366 gnu_efi_arch = 'aarch64'
1368 EFI_MACHINE_TYPE_NAME = ''
1373 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1375 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1379 conf.set10('ENABLE_EFI', have)
1381 #####################################################################
1383 config_h = configure_file(
1384 output : 'config.h',
1385 configuration : conf)
1387 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1389 includes = include_directories('src/basic',
1394 'src/journal-remote',
1398 'src/time-wait-sync',
1404 'src/libsystemd/sd-bus',
1405 'src/libsystemd/sd-device',
1406 'src/libsystemd/sd-event',
1407 'src/libsystemd/sd-hwdb',
1408 'src/libsystemd/sd-id128',
1409 'src/libsystemd/sd-netlink',
1410 'src/libsystemd/sd-network',
1411 'src/libsystemd/sd-resolve',
1412 'src/libsystemd-network',
1415 add_project_arguments('-include', 'config.h', language : 'c')
1417 generate_gperfs = find_program('tools/generate-gperfs.py')
1421 subdir('src/systemd')
1423 subdir('src/libsystemd')
1424 subdir('src/libsystemd-network')
1425 subdir('src/journal')
1428 libjournal_core = static_library(
1430 libjournal_core_sources,
1432 include_directories : includes,
1435 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1436 libsystemd = shared_library(
1439 version : libsystemd_version,
1440 include_directories : includes,
1441 link_args : ['-shared',
1442 '-Wl,--version-script=' + libsystemd_sym_path],
1443 link_with : [libbasic,
1445 link_whole : [libsystemd_static,
1447 dependencies : [threads,
1451 link_depends : libsystemd_sym,
1453 install_dir : rootlibdir)
1455 static_libsystemd = get_option('static-libsystemd')
1456 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1458 install_libsystemd_static = static_library(
1461 journal_client_sources,
1463 basic_gcrypt_sources,
1465 include_directories : includes,
1466 build_by_default : static_libsystemd != 'false',
1467 install : static_libsystemd != 'false',
1468 install_dir : rootlibdir,
1469 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1470 dependencies : [threads,
1479 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1481 #Generate autosuspend rules
1482 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1484 ############################################################
1486 # binaries that have --help and are intended for use by humans,
1487 # usually, but not always, installed in /bin.
1488 public_programs = []
1490 subdir('src/libudev')
1491 subdir('src/shared')
1493 subdir('src/shutdown')
1495 subdir('src/network')
1497 subdir('src/analyze')
1498 subdir('src/journal-remote')
1499 subdir('src/coredump')
1500 subdir('src/pstore')
1501 subdir('src/hostname')
1502 subdir('src/import')
1503 subdir('src/kernel-install')
1504 subdir('src/locale')
1505 subdir('src/machine')
1506 subdir('src/portable')
1507 subdir('src/nspawn')
1508 subdir('src/resolve')
1509 subdir('src/timedate')
1510 subdir('src/timesync')
1511 subdir('src/vconsole')
1512 subdir('src/boot/efi')
1519 ############################################################
1521 # only static linking apart from libdl, to make sure that the
1522 # module is linked to all libraries that it uses.
1523 test_dlopen = executable(
1527 include_directories : includes,
1528 link_with : [libbasic],
1529 dependencies : [libdl],
1530 build_by_default : want_tests != 'false')
1532 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1533 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1534 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1535 ['resolve', 'ENABLE_NSS_RESOLVE']]
1537 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1541 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1542 version_script_arg = join_paths(project_source_root, sym)
1544 nss = shared_library(
1546 'src/nss-@0@/nss-@0@.c'.format(module),
1549 include_directories : includes,
1550 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1551 link_args : ['-Wl,-z,nodelete',
1553 '-Wl,--version-script=' + version_script_arg],
1554 link_with : [libsystemd_static,
1557 dependencies : [threads,
1561 install_dir : rootlibdir)
1563 # We cannot use shared_module because it does not support version suffix.
1564 # Unfortunately shared_library insists on creating the symlink…
1565 meson.add_install_script('sh', '-c',
1566 'rm $DESTDIR@0@/libnss_@1@.so'
1567 .format(rootlibdir, module))
1569 if want_tests != 'false'
1570 test('dlopen-nss_' + module,
1572 # path to dlopen must include a slash
1573 args : nss.full_path())
1578 ############################################################
1580 executable('systemd',
1582 include_directories : includes,
1583 link_with : [libcore,
1585 dependencies : [versiondep,
1592 install_rpath : rootlibexecdir,
1594 install_dir : rootlibexecdir)
1596 meson.add_install_script(meson_make_symlink,
1597 join_paths(rootlibexecdir, 'systemd'),
1598 join_paths(rootsbindir, 'init'))
1600 exe = executable('systemd-analyze',
1601 systemd_analyze_sources,
1602 include_directories : includes,
1603 link_with : [libcore,
1605 dependencies : [versiondep,
1612 install_rpath : rootlibexecdir,
1614 public_programs += exe
1616 executable('systemd-journald',
1617 systemd_journald_sources,
1618 include_directories : includes,
1619 link_with : [libjournal_core,
1621 dependencies : [threads,
1625 install_rpath : rootlibexecdir,
1627 install_dir : rootlibexecdir)
1629 exe = executable('systemd-cat',
1630 systemd_cat_sources,
1631 include_directories : includes,
1632 link_with : [libjournal_core,
1634 dependencies : [threads],
1635 install_rpath : rootlibexecdir,
1637 public_programs += exe
1639 exe = executable('journalctl',
1641 include_directories : includes,
1642 link_with : [libshared],
1643 dependencies : [threads,
1648 install_rpath : rootlibexecdir,
1650 install_dir : rootbindir)
1651 public_programs += exe
1653 executable('systemd-getty-generator',
1654 'src/getty-generator/getty-generator.c',
1655 include_directories : includes,
1656 link_with : [libshared],
1657 install_rpath : rootlibexecdir,
1659 install_dir : systemgeneratordir)
1661 executable('systemd-debug-generator',
1662 'src/debug-generator/debug-generator.c',
1663 include_directories : includes,
1664 link_with : [libshared],
1665 install_rpath : rootlibexecdir,
1667 install_dir : systemgeneratordir)
1669 executable('systemd-run-generator',
1670 'src/run-generator/run-generator.c',
1671 include_directories : includes,
1672 link_with : [libshared],
1673 install_rpath : rootlibexecdir,
1675 install_dir : systemgeneratordir)
1677 executable('systemd-fstab-generator',
1678 'src/fstab-generator/fstab-generator.c',
1679 include_directories : includes,
1680 link_with : [libcore_shared,
1682 install_rpath : rootlibexecdir,
1684 install_dir : systemgeneratordir)
1686 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1687 executable('30-systemd-environment-d-generator',
1688 'src/environment-d-generator/environment-d-generator.c',
1689 include_directories : includes,
1690 link_with : [libshared],
1691 install_rpath : rootlibexecdir,
1693 install_dir : userenvgeneratordir)
1695 meson.add_install_script(meson_make_symlink,
1696 join_paths(sysconfdir, 'environment'),
1697 join_paths(environmentdir, '99-environment.conf'))
1700 if conf.get('ENABLE_HIBERNATE') == 1
1701 executable('systemd-hibernate-resume-generator',
1702 'src/hibernate-resume/hibernate-resume-generator.c',
1703 include_directories : includes,
1704 link_with : [libshared],
1705 install_rpath : rootlibexecdir,
1707 install_dir : systemgeneratordir)
1709 executable('systemd-hibernate-resume',
1710 'src/hibernate-resume/hibernate-resume.c',
1711 include_directories : includes,
1712 link_with : [libshared],
1713 install_rpath : rootlibexecdir,
1715 install_dir : rootlibexecdir)
1718 if conf.get('HAVE_BLKID') == 1
1719 executable('systemd-gpt-auto-generator',
1720 'src/gpt-auto-generator/gpt-auto-generator.c',
1721 'src/shared/blkid-util.h',
1722 include_directories : includes,
1723 link_with : [libshared],
1724 dependencies : libblkid,
1725 install_rpath : rootlibexecdir,
1727 install_dir : systemgeneratordir)
1729 exe = executable('systemd-dissect',
1730 'src/dissect/dissect.c',
1731 include_directories : includes,
1732 link_with : [libshared],
1733 install_rpath : rootlibexecdir,
1735 install_dir : rootlibexecdir)
1736 public_programs += exe
1739 if conf.get('ENABLE_RESOLVE') == 1
1740 executable('systemd-resolved',
1741 systemd_resolved_sources,
1742 include_directories : includes,
1743 link_with : [libshared,
1745 libsystemd_resolve_core],
1746 dependencies : systemd_resolved_dependencies,
1747 install_rpath : rootlibexecdir,
1749 install_dir : rootlibexecdir)
1751 exe = executable('resolvectl',
1753 include_directories : includes,
1754 link_with : [libshared,
1756 libsystemd_resolve_core],
1757 dependencies : [threads,
1761 install_rpath : rootlibexecdir,
1763 public_programs += exe
1765 meson.add_install_script(meson_make_symlink,
1766 join_paths(bindir, 'resolvectl'),
1767 join_paths(rootsbindir, 'resolvconf'))
1769 meson.add_install_script(meson_make_symlink,
1770 join_paths(bindir, 'resolvectl'),
1771 join_paths(bindir, 'systemd-resolve'))
1774 if conf.get('ENABLE_LOGIND') == 1
1775 executable('systemd-logind',
1776 systemd_logind_sources,
1777 include_directories : includes,
1778 link_with : [liblogind_core,
1780 dependencies : [threads,
1782 install_rpath : rootlibexecdir,
1784 install_dir : rootlibexecdir)
1786 exe = executable('loginctl',
1788 include_directories : includes,
1789 link_with : [libshared],
1790 dependencies : [threads,
1793 install_rpath : rootlibexecdir,
1795 install_dir : rootbindir)
1796 public_programs += exe
1798 exe = executable('systemd-inhibit',
1799 'src/login/inhibit.c',
1800 include_directories : includes,
1801 link_with : [libshared],
1802 install_rpath : rootlibexecdir,
1804 install_dir : rootbindir)
1805 public_programs += exe
1807 if conf.get('HAVE_PAM') == 1
1808 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1809 pam_systemd = shared_library(
1813 include_directories : includes,
1814 link_args : ['-shared',
1815 '-Wl,--version-script=' + version_script_arg],
1816 link_with : [libsystemd_static,
1818 dependencies : [threads,
1821 link_depends : pam_systemd_sym,
1823 install_dir : pamlibdir)
1825 if want_tests != 'false'
1826 test('dlopen-pam_systemd',
1828 # path to dlopen must include a slash
1829 args : pam_systemd.full_path())
1833 executable('systemd-user-runtime-dir',
1834 user_runtime_dir_sources,
1835 include_directories : includes,
1836 link_with : [libshared],
1837 install_rpath : rootlibexecdir,
1839 install_dir : rootlibexecdir)
1842 if conf.get('HAVE_PAM') == 1
1843 executable('systemd-user-sessions',
1844 'src/user-sessions/user-sessions.c',
1845 include_directories : includes,
1846 link_with : [libshared],
1847 install_rpath : rootlibexecdir,
1849 install_dir : rootlibexecdir)
1852 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1853 exe = executable('bootctl',
1854 'src/boot/bootctl.c',
1855 include_directories : includes,
1856 link_with : [libshared],
1857 dependencies : [libblkid],
1858 install_rpath : rootlibexecdir,
1860 public_programs += exe
1862 executable('systemd-bless-boot',
1863 'src/boot/bless-boot.c',
1864 include_directories : includes,
1865 link_with : [libshared],
1866 dependencies : [libblkid],
1867 install_rpath : rootlibexecdir,
1869 install_dir : rootlibexecdir)
1871 executable('systemd-bless-boot-generator',
1872 'src/boot/bless-boot-generator.c',
1873 include_directories : includes,
1874 link_with : [libshared],
1875 install_rpath : rootlibexecdir,
1877 install_dir : systemgeneratordir)
1880 executable('systemd-boot-check-no-failures',
1881 'src/boot/boot-check-no-failures.c',
1882 include_directories : includes,
1883 link_with : [libshared],
1884 dependencies : [libblkid],
1885 install_rpath : rootlibexecdir,
1887 install_dir : rootlibexecdir)
1889 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1890 include_directories : includes,
1891 link_with : [libshared],
1892 dependencies : [threads],
1893 install_rpath : rootlibexecdir,
1895 public_programs += exe
1898 if get_option('link-systemctl-shared')
1899 systemctl_link_with = [libshared]
1901 systemctl_link_with = [libsystemd_static,
1907 exe = executable('systemctl',
1908 'src/systemctl/systemctl.c',
1909 'src/systemctl/sysv-compat.h',
1910 'src/systemctl/sysv-compat.c',
1911 include_directories : includes,
1912 link_with : systemctl_link_with,
1913 dependencies : [threads,
1918 install_rpath : rootlibexecdir,
1920 install_dir : rootbindir)
1921 public_programs += exe
1923 if conf.get('ENABLE_PORTABLED') == 1
1924 executable('systemd-portabled',
1925 systemd_portabled_sources,
1926 include_directories : includes,
1927 link_with : [libshared],
1928 dependencies : [threads],
1929 install_rpath : rootlibexecdir,
1931 install_dir : rootlibexecdir)
1933 exe = executable('portablectl', 'src/portable/portablectl.c',
1934 include_directories : includes,
1935 link_with : [libshared],
1936 dependencies : [threads],
1937 install_rpath : rootlibexecdir,
1939 install_dir : rootbindir)
1940 public_programs += exe
1943 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1944 meson.add_install_script(meson_make_symlink,
1945 join_paths(rootbindir, 'systemctl'),
1946 join_paths(rootsbindir, alias))
1949 if conf.get('ENABLE_BACKLIGHT') == 1
1950 executable('systemd-backlight',
1951 'src/backlight/backlight.c',
1952 include_directories : includes,
1953 link_with : [libshared],
1954 install_rpath : rootlibexecdir,
1956 install_dir : rootlibexecdir)
1959 if conf.get('ENABLE_RFKILL') == 1
1960 executable('systemd-rfkill',
1961 'src/rfkill/rfkill.c',
1962 include_directories : includes,
1963 link_with : [libshared],
1964 install_rpath : rootlibexecdir,
1966 install_dir : rootlibexecdir)
1969 executable('systemd-system-update-generator',
1970 'src/system-update-generator/system-update-generator.c',
1971 include_directories : includes,
1972 link_with : [libshared],
1973 install_rpath : rootlibexecdir,
1975 install_dir : systemgeneratordir)
1977 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1978 executable('systemd-cryptsetup',
1979 'src/cryptsetup/cryptsetup.c',
1980 include_directories : includes,
1981 link_with : [libshared],
1982 dependencies : [libcryptsetup],
1983 install_rpath : rootlibexecdir,
1985 install_dir : rootlibexecdir)
1987 executable('systemd-cryptsetup-generator',
1988 'src/cryptsetup/cryptsetup-generator.c',
1989 include_directories : includes,
1990 link_with : [libshared],
1991 dependencies : [libcryptsetup],
1992 install_rpath : rootlibexecdir,
1994 install_dir : systemgeneratordir)
1996 executable('systemd-veritysetup',
1997 'src/veritysetup/veritysetup.c',
1998 include_directories : includes,
1999 link_with : [libshared],
2000 dependencies : [libcryptsetup],
2001 install_rpath : rootlibexecdir,
2003 install_dir : rootlibexecdir)
2005 executable('systemd-veritysetup-generator',
2006 'src/veritysetup/veritysetup-generator.c',
2007 include_directories : includes,
2008 link_with : [libshared],
2009 dependencies : [libcryptsetup],
2010 install_rpath : rootlibexecdir,
2012 install_dir : systemgeneratordir)
2015 if conf.get('HAVE_SYSV_COMPAT') == 1
2016 executable('systemd-sysv-generator',
2017 'src/sysv-generator/sysv-generator.c',
2018 include_directories : includes,
2019 link_with : [libshared],
2020 install_rpath : rootlibexecdir,
2022 install_dir : systemgeneratordir)
2024 executable('systemd-rc-local-generator',
2025 'src/rc-local-generator/rc-local-generator.c',
2026 include_directories : includes,
2027 link_with : [libshared],
2028 install_rpath : rootlibexecdir,
2030 install_dir : systemgeneratordir)
2033 if conf.get('ENABLE_HOSTNAMED') == 1
2034 executable('systemd-hostnamed',
2035 'src/hostname/hostnamed.c',
2036 include_directories : includes,
2037 link_with : [libshared],
2038 install_rpath : rootlibexecdir,
2040 install_dir : rootlibexecdir)
2042 exe = executable('hostnamectl',
2043 'src/hostname/hostnamectl.c',
2044 include_directories : includes,
2045 link_with : [libshared],
2046 install_rpath : rootlibexecdir,
2048 public_programs += exe
2051 if conf.get('ENABLE_LOCALED') == 1
2052 if conf.get('HAVE_XKBCOMMON') == 1
2053 # logind will load libxkbcommon.so dynamically on its own
2059 executable('systemd-localed',
2060 systemd_localed_sources,
2061 include_directories : includes,
2062 link_with : [libshared],
2063 dependencies : deps,
2064 install_rpath : rootlibexecdir,
2066 install_dir : rootlibexecdir)
2068 exe = executable('localectl',
2070 include_directories : includes,
2071 link_with : [libshared],
2072 install_rpath : rootlibexecdir,
2074 public_programs += exe
2077 if conf.get('ENABLE_TIMEDATED') == 1
2078 executable('systemd-timedated',
2079 'src/timedate/timedated.c',
2080 include_directories : includes,
2081 link_with : [libshared],
2082 install_rpath : rootlibexecdir,
2084 install_dir : rootlibexecdir)
2087 if conf.get('ENABLE_TIMEDATECTL') == 1
2088 exe = executable('timedatectl',
2089 'src/timedate/timedatectl.c',
2090 include_directories : includes,
2091 install_rpath : rootlibexecdir,
2092 link_with : [libshared],
2093 dependencies : [libm],
2095 public_programs += exe
2098 if conf.get('ENABLE_TIMESYNCD') == 1
2099 executable('systemd-timesyncd',
2100 systemd_timesyncd_sources,
2101 include_directories : includes,
2102 link_with : [libshared],
2103 dependencies : [threads,
2105 install_rpath : rootlibexecdir,
2107 install_dir : rootlibexecdir)
2109 executable('systemd-time-wait-sync',
2110 'src/time-wait-sync/time-wait-sync.c',
2111 include_directories : includes,
2112 link_with : [libshared],
2113 install_rpath : rootlibexecdir,
2115 install_dir : rootlibexecdir)
2118 if conf.get('ENABLE_MACHINED') == 1
2119 executable('systemd-machined',
2120 systemd_machined_sources,
2121 include_directories : includes,
2122 link_with : [libmachine_core,
2124 install_rpath : rootlibexecdir,
2126 install_dir : rootlibexecdir)
2128 exe = executable('machinectl',
2129 'src/machine/machinectl.c',
2130 include_directories : includes,
2131 link_with : [libshared],
2132 dependencies : [threads,
2135 install_rpath : rootlibexecdir,
2137 install_dir : rootbindir)
2138 public_programs += exe
2141 if conf.get('ENABLE_IMPORTD') == 1
2142 executable('systemd-importd',
2143 systemd_importd_sources,
2144 include_directories : includes,
2145 link_with : [libshared],
2146 dependencies : [threads],
2147 install_rpath : rootlibexecdir,
2149 install_dir : rootlibexecdir)
2151 systemd_pull = executable('systemd-pull',
2152 systemd_pull_sources,
2153 include_directories : includes,
2154 link_with : [libshared],
2155 dependencies : [versiondep,
2161 install_rpath : rootlibexecdir,
2163 install_dir : rootlibexecdir)
2165 systemd_import = executable('systemd-import',
2166 systemd_import_sources,
2167 include_directories : includes,
2168 link_with : [libshared],
2169 dependencies : [libcurl,
2173 install_rpath : rootlibexecdir,
2175 install_dir : rootlibexecdir)
2177 systemd_import_fs = executable('systemd-import-fs',
2178 systemd_import_fs_sources,
2179 include_directories : includes,
2180 link_with : [libshared],
2181 install_rpath : rootlibexecdir,
2183 install_dir : rootlibexecdir)
2185 systemd_export = executable('systemd-export',
2186 systemd_export_sources,
2187 include_directories : includes,
2188 link_with : [libshared],
2189 dependencies : [libcurl,
2193 install_rpath : rootlibexecdir,
2195 install_dir : rootlibexecdir)
2197 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2200 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2201 exe = executable('systemd-journal-upload',
2202 systemd_journal_upload_sources,
2203 include_directories : includes,
2204 link_with : [libshared],
2205 dependencies : [versiondep,
2211 install_rpath : rootlibexecdir,
2213 install_dir : rootlibexecdir)
2214 public_programs += exe
2217 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2218 s_j_remote = executable('systemd-journal-remote',
2219 systemd_journal_remote_sources,
2220 include_directories : includes,
2221 link_with : [libshared,
2222 libsystemd_journal_remote],
2223 dependencies : [threads,
2228 install_rpath : rootlibexecdir,
2230 install_dir : rootlibexecdir)
2232 s_j_gatewayd = executable('systemd-journal-gatewayd',
2233 systemd_journal_gatewayd_sources,
2234 include_directories : includes,
2235 link_with : [libshared],
2236 dependencies : [threads,
2241 install_rpath : rootlibexecdir,
2243 install_dir : rootlibexecdir)
2244 public_programs += [s_j_remote, s_j_gatewayd]
2247 if conf.get('ENABLE_COREDUMP') == 1
2248 executable('systemd-coredump',
2249 systemd_coredump_sources,
2250 include_directories : includes,
2251 link_with : [libshared],
2252 dependencies : [threads,
2257 install_rpath : rootlibexecdir,
2259 install_dir : rootlibexecdir)
2261 exe = executable('coredumpctl',
2262 coredumpctl_sources,
2263 include_directories : includes,
2264 link_with : [libshared],
2265 dependencies : [threads,
2268 install_rpath : rootlibexecdir,
2270 public_programs += exe
2273 if conf.get('ENABLE_PSTORE') == 1
2274 executable('systemd-pstore',
2275 systemd_pstore_sources,
2276 include_directories : includes,
2277 link_with : [libshared],
2278 dependencies : [threads,
2283 install_rpath : rootlibexecdir,
2285 install_dir : rootlibexecdir)
2288 if conf.get('ENABLE_BINFMT') == 1
2289 exe = executable('systemd-binfmt',
2290 'src/binfmt/binfmt.c',
2291 include_directories : includes,
2292 link_with : [libshared],
2293 install_rpath : rootlibexecdir,
2295 install_dir : rootlibexecdir)
2296 public_programs += exe
2298 meson.add_install_script('sh', '-c',
2299 mkdir_p.format(binfmtdir))
2300 meson.add_install_script('sh', '-c',
2301 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2304 if conf.get('ENABLE_VCONSOLE') == 1
2305 executable('systemd-vconsole-setup',
2306 'src/vconsole/vconsole-setup.c',
2307 include_directories : includes,
2308 link_with : [libshared],
2309 install_rpath : rootlibexecdir,
2311 install_dir : rootlibexecdir)
2314 if conf.get('ENABLE_RANDOMSEED') == 1
2315 executable('systemd-random-seed',
2316 'src/random-seed/random-seed.c',
2317 include_directories : includes,
2318 link_with : [libshared],
2319 install_rpath : rootlibexecdir,
2321 install_dir : rootlibexecdir)
2324 if conf.get('ENABLE_FIRSTBOOT') == 1
2325 executable('systemd-firstboot',
2326 'src/firstboot/firstboot.c',
2327 include_directories : includes,
2328 link_with : [libshared],
2329 dependencies : [libcrypt],
2330 install_rpath : rootlibexecdir,
2332 install_dir : rootbindir)
2335 executable('systemd-remount-fs',
2336 'src/remount-fs/remount-fs.c',
2337 include_directories : includes,
2338 link_with : [libcore_shared,
2340 install_rpath : rootlibexecdir,
2342 install_dir : rootlibexecdir)
2344 executable('systemd-machine-id-setup',
2345 'src/machine-id-setup/machine-id-setup-main.c',
2346 include_directories : includes,
2347 link_with : [libcore_shared,
2349 install_rpath : rootlibexecdir,
2351 install_dir : rootbindir)
2353 executable('systemd-fsck',
2355 include_directories : includes,
2356 link_with : [libshared],
2357 install_rpath : rootlibexecdir,
2359 install_dir : rootlibexecdir)
2361 executable('systemd-growfs',
2362 'src/partition/growfs.c',
2363 include_directories : includes,
2364 link_with : [libshared],
2365 dependencies : [libcryptsetup],
2366 install_rpath : rootlibexecdir,
2368 install_dir : rootlibexecdir)
2370 executable('systemd-makefs',
2371 'src/partition/makefs.c',
2372 include_directories : includes,
2373 link_with : [libshared],
2374 install_rpath : rootlibexecdir,
2376 install_dir : rootlibexecdir)
2378 executable('systemd-sleep',
2379 'src/sleep/sleep.c',
2380 include_directories : includes,
2381 link_with : [libshared],
2382 install_rpath : rootlibexecdir,
2384 install_dir : rootlibexecdir)
2386 install_data('src/sleep/sleep.conf',
2387 install_dir : pkgsysconfdir)
2389 exe = executable('systemd-sysctl',
2390 'src/sysctl/sysctl.c',
2391 include_directories : includes,
2392 link_with : [libshared],
2393 install_rpath : rootlibexecdir,
2395 install_dir : rootlibexecdir)
2396 public_programs += exe
2398 executable('systemd-ac-power',
2399 'src/ac-power/ac-power.c',
2400 include_directories : includes,
2401 link_with : [libshared],
2402 install_rpath : rootlibexecdir,
2404 install_dir : rootlibexecdir)
2406 exe = executable('systemd-detect-virt',
2407 'src/detect-virt/detect-virt.c',
2408 include_directories : includes,
2409 link_with : [libshared],
2410 install_rpath : rootlibexecdir,
2412 public_programs += exe
2414 exe = executable('systemd-delta',
2415 'src/delta/delta.c',
2416 include_directories : includes,
2417 link_with : [libshared],
2418 install_rpath : rootlibexecdir,
2420 public_programs += exe
2422 exe = executable('systemd-escape',
2423 'src/escape/escape.c',
2424 include_directories : includes,
2425 link_with : [libshared],
2426 install_rpath : rootlibexecdir,
2428 install_dir : rootbindir)
2429 public_programs += exe
2431 exe = executable('systemd-notify',
2432 'src/notify/notify.c',
2433 include_directories : includes,
2434 link_with : [libshared],
2435 install_rpath : rootlibexecdir,
2437 install_dir : rootbindir)
2438 public_programs += exe
2440 executable('systemd-volatile-root',
2441 'src/volatile-root/volatile-root.c',
2442 include_directories : includes,
2443 link_with : [libshared],
2444 install_rpath : rootlibexecdir,
2446 install_dir : rootlibexecdir)
2448 executable('systemd-cgroups-agent',
2449 'src/cgroups-agent/cgroups-agent.c',
2450 include_directories : includes,
2451 link_with : [libshared],
2452 install_rpath : rootlibexecdir,
2454 install_dir : rootlibexecdir)
2456 exe = executable('systemd-id128',
2457 'src/id128/id128.c',
2458 include_directories : includes,
2459 link_with : [libshared],
2460 install_rpath : rootlibexecdir,
2462 public_programs += exe
2464 exe = executable('systemd-path',
2466 include_directories : includes,
2467 link_with : [libshared],
2468 install_rpath : rootlibexecdir,
2470 public_programs += exe
2472 exe = executable('systemd-ask-password',
2473 'src/ask-password/ask-password.c',
2474 include_directories : includes,
2475 link_with : [libshared],
2476 install_rpath : rootlibexecdir,
2478 install_dir : rootbindir)
2479 public_programs += exe
2481 executable('systemd-reply-password',
2482 'src/reply-password/reply-password.c',
2483 include_directories : includes,
2484 link_with : [libshared],
2485 install_rpath : rootlibexecdir,
2487 install_dir : rootlibexecdir)
2489 exe = executable('systemd-tty-ask-password-agent',
2490 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2491 include_directories : includes,
2492 link_with : [libshared],
2493 install_rpath : rootlibexecdir,
2495 install_dir : rootbindir)
2496 public_programs += exe
2498 exe = executable('systemd-cgls',
2500 include_directories : includes,
2501 link_with : [libshared],
2502 install_rpath : rootlibexecdir,
2504 public_programs += exe
2506 exe = executable('systemd-cgtop',
2507 'src/cgtop/cgtop.c',
2508 include_directories : includes,
2509 link_with : [libshared],
2510 install_rpath : rootlibexecdir,
2512 public_programs += exe
2514 executable('systemd-initctl',
2515 'src/initctl/initctl.c',
2516 include_directories : includes,
2517 link_with : [libshared],
2518 install_rpath : rootlibexecdir,
2520 install_dir : rootlibexecdir)
2522 exe = executable('systemd-mount',
2523 'src/mount/mount-tool.c',
2524 include_directories : includes,
2525 link_with : [libshared],
2526 dependencies: [libmount],
2527 install_rpath : rootlibexecdir,
2529 public_programs += exe
2531 meson.add_install_script(meson_make_symlink,
2532 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2534 exe = executable('systemd-run',
2536 include_directories : includes,
2537 link_with : [libshared],
2538 install_rpath : rootlibexecdir,
2540 public_programs += exe
2542 exe = executable('systemd-stdio-bridge',
2543 'src/stdio-bridge/stdio-bridge.c',
2544 include_directories : includes,
2545 link_with : [libshared],
2546 dependencies : [versiondep],
2547 install_rpath : rootlibexecdir,
2549 public_programs += exe
2551 exe = executable('busctl',
2552 'src/busctl/busctl.c',
2553 'src/busctl/busctl-introspect.c',
2554 'src/busctl/busctl-introspect.h',
2555 include_directories : includes,
2556 link_with : [libshared],
2557 install_rpath : rootlibexecdir,
2559 public_programs += exe
2561 if conf.get('ENABLE_SYSUSERS') == 1
2562 exe = executable('systemd-sysusers',
2563 'src/sysusers/sysusers.c',
2564 include_directories : includes,
2565 link_with : [libshared],
2566 install_rpath : rootlibexecdir,
2568 install_dir : rootbindir)
2569 public_programs += exe
2572 if conf.get('ENABLE_TMPFILES') == 1
2573 exe = executable('systemd-tmpfiles',
2574 'src/tmpfiles/tmpfiles.c',
2575 include_directories : includes,
2576 link_with : [libshared],
2577 dependencies : [libacl],
2578 install_rpath : rootlibexecdir,
2580 install_dir : rootbindir)
2581 public_programs += exe
2583 if want_tests != 'false'
2584 test('test-systemd-tmpfiles',
2585 test_systemd_tmpfiles_py,
2586 # https://github.com/mesonbuild/meson/issues/2681
2587 args : exe.full_path())
2591 if conf.get('ENABLE_HWDB') == 1
2592 exe = executable('systemd-hwdb',
2594 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2595 include_directories : includes,
2596 link_with : [libudev_static],
2597 install_rpath : udev_rpath,
2599 install_dir : rootbindir)
2600 public_programs += exe
2603 if conf.get('ENABLE_QUOTACHECK') == 1
2604 executable('systemd-quotacheck',
2605 'src/quotacheck/quotacheck.c',
2606 include_directories : includes,
2607 link_with : [libshared],
2608 install_rpath : rootlibexecdir,
2610 install_dir : rootlibexecdir)
2613 exe = executable('systemd-socket-proxyd',
2614 'src/socket-proxy/socket-proxyd.c',
2615 include_directories : includes,
2616 link_with : [libshared],
2617 dependencies : [threads],
2618 install_rpath : rootlibexecdir,
2620 install_dir : rootlibexecdir)
2621 public_programs += exe
2623 exe = executable('systemd-udevd',
2624 systemd_udevd_sources,
2625 include_directories : includes,
2626 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2627 link_with : [libudev_core,
2630 dependencies : [versiondep,
2636 install_rpath : udev_rpath,
2638 install_dir : rootlibexecdir)
2639 public_programs += exe
2641 exe = executable('udevadm',
2643 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2644 include_directories : includes,
2645 link_with : [libudev_core,
2648 dependencies : [versiondep,
2654 install_rpath : udev_rpath,
2656 install_dir : rootbindir)
2657 public_programs += exe
2659 executable('systemd-shutdown',
2660 systemd_shutdown_sources,
2661 include_directories : includes,
2662 link_with : [libcore_shared,
2664 dependencies : [libmount],
2665 install_rpath : rootlibexecdir,
2667 install_dir : rootlibexecdir)
2669 executable('systemd-update-done',
2670 'src/update-done/update-done.c',
2671 include_directories : includes,
2672 link_with : [libshared],
2673 install_rpath : rootlibexecdir,
2675 install_dir : rootlibexecdir)
2677 executable('systemd-update-utmp',
2678 'src/update-utmp/update-utmp.c',
2679 include_directories : includes,
2680 link_with : [libshared],
2681 dependencies : [libaudit],
2682 install_rpath : rootlibexecdir,
2684 install_dir : rootlibexecdir)
2686 if conf.get('HAVE_KMOD') == 1
2687 executable('systemd-modules-load',
2688 'src/modules-load/modules-load.c',
2689 include_directories : includes,
2690 link_with : [libshared],
2691 dependencies : [libkmod],
2692 install_rpath : rootlibexecdir,
2694 install_dir : rootlibexecdir)
2696 meson.add_install_script('sh', '-c',
2697 mkdir_p.format(modulesloaddir))
2698 meson.add_install_script('sh', '-c',
2699 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2702 exe = executable('systemd-nspawn',
2703 systemd_nspawn_sources,
2704 include_directories : includes,
2705 link_with : [libcore_shared,
2708 dependencies : [libblkid,
2710 install_rpath : rootlibexecdir,
2712 public_programs += exe
2714 if conf.get('ENABLE_NETWORKD') == 1
2715 executable('systemd-networkd',
2716 systemd_networkd_sources,
2717 include_directories : network_include_dir,
2718 link_with : [libnetworkd_core,
2722 dependencies : [threads],
2723 install_rpath : rootlibexecdir,
2725 install_dir : rootlibexecdir)
2727 executable('systemd-networkd-wait-online',
2728 systemd_networkd_wait_online_sources,
2729 include_directories : includes,
2730 link_with : [libnetworkd_core,
2732 install_rpath : rootlibexecdir,
2734 install_dir : rootlibexecdir)
2736 exe = executable('networkctl',
2738 include_directories : includes,
2739 link_with : [libsystemd_network,
2741 install_rpath : rootlibexecdir,
2743 install_dir : rootbindir)
2744 public_programs += exe
2746 executable('systemd-network-generator',
2747 network_generator_sources,
2748 include_directories : includes,
2749 link_with : [libshared],
2750 install_rpath : rootlibexecdir,
2752 install_dir : rootlibexecdir)
2755 executable('systemd-sulogin-shell',
2756 ['src/sulogin-shell/sulogin-shell.c'],
2757 include_directories : includes,
2758 link_with : [libshared],
2759 install_rpath : rootlibexecdir,
2761 install_dir : rootlibexecdir)
2763 ############################################################
2766 'systemd-runtest.env',
2767 output : 'systemd-runtest.env',
2768 command : ['sh', '-c', '{ ' +
2769 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2770 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2772 build_by_default : true)
2774 foreach tuple : tests
2776 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2777 dependencies = tuple[2]
2778 condition = tuple.length() >= 4 ? tuple[3] : ''
2779 type = tuple.length() >= 5 ? tuple[4] : ''
2780 defs = tuple.length() >= 6 ? tuple[5] : []
2781 incs = tuple.length() >= 7 ? tuple[6] : includes
2784 name = sources[0].split('/')[-1].split('.')[0]
2785 if type.startswith('timeout=')
2786 timeout = type.split('=')[1].to_int()
2790 if condition == '' or conf.get(condition) == 1
2794 include_directories : incs,
2795 link_with : link_with,
2796 dependencies : [versiondep,
2799 build_by_default : want_tests != 'false',
2800 install_rpath : rootlibexecdir,
2801 install : install_tests,
2802 install_dir : join_paths(testsdir, type))
2805 message('@0@ is a manual test'.format(name))
2806 elif type == 'unsafe' and want_tests != 'unsafe'
2807 message('@0@ is an unsafe test'.format(name))
2808 elif want_tests != 'false'
2814 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2819 'test-libsystemd-sym',
2820 test_libsystemd_sym_c,
2821 include_directories : includes,
2822 link_with : [libsystemd],
2823 build_by_default : want_tests != 'false',
2824 install : install_tests,
2825 install_dir : testsdir)
2826 if want_tests != 'false'
2827 test('test-libsystemd-sym', exe)
2831 'test-libsystemd-static-sym',
2832 test_libsystemd_sym_c,
2833 include_directories : includes,
2834 link_with : [install_libsystemd_static],
2835 dependencies : [threads], # threads is already included in dependencies on the library,
2836 # but does not seem to get propagated. Add here as a work-around.
2837 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2838 install : install_tests and static_libsystemd_pic,
2839 install_dir : testsdir)
2840 if want_tests != 'false' and static_libsystemd_pic
2841 test('test-libsystemd-static-sym', exe)
2847 include_directories : includes,
2848 c_args : '-Wno-deprecated-declarations',
2849 link_with : [libudev],
2850 build_by_default : want_tests != 'false',
2851 install : install_tests,
2852 install_dir : testsdir)
2853 if want_tests != 'false'
2854 test('test-libudev-sym', exe)
2858 'test-libudev-static-sym',
2860 include_directories : includes,
2861 c_args : '-Wno-deprecated-declarations',
2862 link_with : [install_libudev_static],
2863 build_by_default : want_tests != 'false' and static_libudev_pic,
2864 install : install_tests and static_libudev_pic,
2865 install_dir : testsdir)
2866 if want_tests != 'false' and static_libudev_pic
2867 test('test-libudev-static-sym', exe)
2870 ############################################################
2874 if get_option('tests') != 'false'
2875 foreach tuple : fuzzers
2877 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2878 dependencies = tuple[2]
2879 defs = tuple.length() >= 4 ? tuple[3] : []
2880 incs = tuple.length() >= 5 ? tuple[4] : includes
2883 if want_ossfuzz or want_fuzzbuzz
2884 dependencies += fuzzing_engine
2886 if fuzzing_engine.found()
2887 dependencies += fuzzing_engine
2889 link_args += ['-fsanitize=fuzzer']
2892 sources += 'src/fuzz/fuzz-main.c'
2896 sources += 'src/fuzz/fuzzer-entry-point.c'
2899 name = sources[0].split('/')[-1].split('.')[0]
2901 fuzzer_exes += executable(
2904 include_directories : [incs, include_directories('src/fuzz')],
2905 link_with : link_with,
2906 dependencies : dependencies,
2908 link_args: link_args,
2913 run_target('fuzzers',
2914 depends : fuzzer_exes,
2917 ############################################################
2919 make_directive_index_py = find_program('tools/make-directive-index.py')
2920 make_man_index_py = find_program('tools/make-man-index.py')
2921 xml_helper_py = find_program('tools/xml_helper.py')
2922 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2925 subdir('sysusers.d')
2926 subdir('tmpfiles.d')
2932 subdir('shell-completion/bash')
2933 subdir('shell-completion/zsh')
2934 subdir('docs/sysvinit')
2935 subdir('docs/var-log')
2937 install_subdir('factory/etc',
2938 install_dir : factorydir)
2940 install_data('xorg/50-systemd-user.sh',
2941 install_dir : xinitrcdir)
2942 install_data('modprobe.d/systemd.conf',
2943 install_dir : modprobedir)
2944 install_data('LICENSE.GPL2',
2948 'docs/CODING_STYLE.md',
2949 'docs/DISTRO_PORTING.md',
2950 'docs/ENVIRONMENT.md',
2952 'docs/TRANSIENT-SETTINGS.md',
2953 'docs/TRANSLATORS.md',
2954 'docs/UIDS-GIDS.md',
2955 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2956 install_dir : docdir)
2958 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2959 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2961 ############################################################
2963 meson_check_help = find_program('tools/meson-check-help.sh')
2965 foreach exec : public_programs
2966 name = exec.full_path().split('/')[-1]
2967 if want_tests != 'false'
2968 test('check-help-' + name,
2970 args : exec.full_path())
2974 ############################################################
2976 check_directives_sh = find_program('tools/check-directives.sh')
2978 if want_tests != 'false'
2979 test('check-directives',
2980 check_directives_sh,
2981 args : project_source_root)
2984 ############################################################
2986 # Enable tests for all supported sanitizers
2987 foreach tuple : sanitizers
2988 sanitizer = tuple[0]
2991 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2993 foreach p : fuzz_regression_tests
2994 b = p.split('/')[-2]
2995 c = p.split('/')[-1]
2997 name = '@0@:@1@'.format(b, sanitizer)
3000 if want_tests == 'false'
3001 message('Not compiling @0@ because tests is set to false'.format(name))
3003 exe = custom_target(
3007 command : [env, 'ln', '-fs',
3008 join_paths(build.full_path(), b),
3010 build_by_default : true)
3012 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3017 if want_tests != 'false' and slow_tests
3018 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3020 args : [exe.full_path(),
3021 join_paths(project_source_root, p)])
3028 ############################################################
3031 all_files = run_command(
3033 ['--git-dir=@0@/.git'.format(project_source_root),
3036 all_files = files(all_files.stdout().split())
3041 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3044 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3048 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3051 command : [meson_git_contrib_sh])
3055 git_head = run_command(
3057 ['--git-dir=@0@/.git'.format(project_source_root),
3058 'rev-parse', 'HEAD']).stdout().strip()
3059 git_head_short = run_command(
3061 ['--git-dir=@0@/.git'.format(project_source_root),
3062 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3066 command : ['git', 'archive',
3067 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3069 '--prefix', 'systemd-@0@/'.format(git_head),
3073 ############################################################
3075 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3078 depends : [man, libsystemd, libudev],
3079 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3081 ############################################################
3082 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3085 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3087 'split /usr: @0@'.format(split_usr),
3088 'split bin-sbin: @0@'.format(split_bin),
3089 'prefix directory: @0@'.format(prefixdir),
3090 'rootprefix directory: @0@'.format(rootprefixdir),
3091 'sysconf directory: @0@'.format(sysconfdir),
3092 'include directory: @0@'.format(includedir),
3093 'lib directory: @0@'.format(libdir),
3094 'rootlib directory: @0@'.format(rootlibdir),
3095 'SysV init scripts: @0@'.format(sysvinit_path),
3096 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3097 'PAM modules directory: @0@'.format(pamlibdir),
3098 'PAM configuration directory: @0@'.format(pamconfdir),
3099 'RPM macros directory: @0@'.format(rpmmacrosdir),
3100 'modprobe.d directory: @0@'.format(modprobedir),
3101 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3102 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3103 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3104 'bash completions directory: @0@'.format(bashcompletiondir),
3105 'zsh completions directory: @0@'.format(zshcompletiondir),
3106 'extra start script: @0@'.format(get_option('rc-local')),
3107 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3108 get_option('debug-tty')),
3109 'TTY GID: @0@'.format(tty_gid),
3110 'users GID: @0@'.format(substs.get('USERS_GID')),
3111 'maximum system UID: @0@'.format(system_uid_max),
3112 'maximum system GID: @0@'.format(system_gid_max),
3113 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3114 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3115 'minimum container UID base: @0@'.format(container_uid_base_min),
3116 'maximum container UID base: @0@'.format(container_uid_base_max),
3117 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3118 'render group access mode: @0@'.format(get_option('group-render-mode')),
3119 'certificate root directory: @0@'.format(get_option('certificate-root')),
3120 'support URL: @0@'.format(support_url),
3121 'nobody user name: @0@'.format(nobody_user),
3122 'nobody group name: @0@'.format(nobody_group),
3123 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3124 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3126 'default DNSSEC mode: @0@'.format(default_dnssec),
3127 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3128 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3129 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3130 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3131 'default locale: @0@'.format(default_locale),
3132 'systemd service watchdog: @0@'.format(watchdog_opt)]
3134 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3135 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3137 'default DNS servers: @0@'.format(alt_dns_servers),
3138 'default NTP servers: @0@'.format(alt_ntp_servers)]
3140 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3141 '@@0@'.format(time_epoch)).stdout().strip()
3143 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3146 'static libsystemd: @0@'.format(static_libsystemd),
3147 'static libudev: @0@'.format(static_libudev)]
3150 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3151 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3152 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3154 if conf.get('ENABLE_EFI') == 1
3155 status += 'efi arch: @0@'.format(efi_arch)
3159 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3160 'EFI CC @0@'.format(' '.join(efi_cc)),
3161 'EFI lib directory: @0@'.format(efi_libdir),
3162 'EFI lds directory: @0@'.format(efi_ldsdir),
3163 'EFI include directory: @0@'.format(efi_incdir)]
3215 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3216 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3220 ['legacy pkla', install_polkit_pkla],
3222 ['gnu-efi', have_gnu_efi],
3235 ['man pages', want_man],
3236 ['html pages', want_html],
3237 ['man page indices', want_man and have_lxml],
3242 ['adm group', get_option('adm-group')],
3243 ['wheel group', get_option('wheel-group')],
3246 ['debug mmap cache'],
3248 ['valgrind', conf.get('VALGRIND') == 1],
3249 ['trace logging', conf.get('LOG_TRACE') == 1],
3250 ['link-udev-shared', get_option('link-udev-shared')],
3251 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3254 if tuple.length() >= 2
3257 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3258 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3259 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3270 'enabled features: @0@'.format(', '.join(found)),
3272 'disabled features: @0@'.format(', '.join(missing)),
3274 message('\n '.join(status))
3276 if rootprefixdir != rootprefix_default
3278 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3279 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3280 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))