1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
13 meson_version : '>= 0.46',
16 libsystemd_version = '0.27.1'
17 libudev_version = '1.6.16'
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 default_user_path = get_option('user-path')
838 if default_user_path != ''
839 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
840 default_user_path_display = default_user_path
842 # meson 0.49 fails when ?: is used in .format()
843 default_user_path_display = '(same as system services)'
847 #####################################################################
849 threads = dependency('threads')
850 librt = cc.find_library('rt')
851 libm = cc.find_library('m')
852 libdl = cc.find_library('dl')
853 libcrypt = cc.find_library('crypt')
855 libcap = dependency('libcap', required : false)
856 if not libcap.found()
857 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
858 libcap = cc.find_library('cap')
861 libmount = dependency('mount',
862 version : fuzzer_build ? '>= 0' : '>= 2.30')
864 want_seccomp = get_option('seccomp')
865 if want_seccomp != 'false' and not skip_deps
866 libseccomp = dependency('libseccomp',
867 version : '>= 2.3.1',
868 required : want_seccomp == 'true')
869 have = libseccomp.found()
874 conf.set10('HAVE_SECCOMP', have)
876 want_selinux = get_option('selinux')
877 if want_selinux != 'false' and not skip_deps
878 libselinux = dependency('libselinux',
879 version : '>= 2.1.9',
880 required : want_selinux == 'true')
881 have = libselinux.found()
886 conf.set10('HAVE_SELINUX', have)
888 want_apparmor = get_option('apparmor')
889 if want_apparmor != 'false' and not skip_deps
890 libapparmor = dependency('libapparmor',
891 required : want_apparmor == 'true')
892 have = libapparmor.found()
897 conf.set10('HAVE_APPARMOR', have)
899 smack_run_label = get_option('smack-run-label')
900 if smack_run_label != ''
901 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
904 want_polkit = get_option('polkit')
905 install_polkit = false
906 install_polkit_pkla = false
907 if want_polkit != 'false' and not skip_deps
908 install_polkit = true
910 libpolkit = dependency('polkit-gobject-1',
912 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
913 message('Old polkit detected, will install pkla files')
914 install_polkit_pkla = true
917 conf.set10('ENABLE_POLKIT', install_polkit)
919 want_acl = get_option('acl')
920 if want_acl != 'false' and not skip_deps
921 libacl = cc.find_library('acl', required : want_acl == 'true')
922 have = libacl.found()
927 conf.set10('HAVE_ACL', have)
929 want_audit = get_option('audit')
930 if want_audit != 'false' and not skip_deps
931 libaudit = dependency('audit', required : want_audit == 'true')
932 have = libaudit.found()
937 conf.set10('HAVE_AUDIT', have)
939 want_blkid = get_option('blkid')
940 if want_blkid != 'false' and not skip_deps
941 libblkid = dependency('blkid', required : want_blkid == 'true')
942 have = libblkid.found()
947 conf.set10('HAVE_BLKID', have)
949 want_kmod = get_option('kmod')
950 if want_kmod != 'false' and not skip_deps
951 libkmod = dependency('libkmod',
953 required : want_kmod == 'true')
954 have = libkmod.found()
959 conf.set10('HAVE_KMOD', have)
961 want_pam = get_option('pam')
962 if want_pam != 'false' and not skip_deps
963 libpam = cc.find_library('pam', required : want_pam == 'true')
964 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
965 have = libpam.found() and libpam_misc.found()
971 conf.set10('HAVE_PAM', have)
973 want_microhttpd = get_option('microhttpd')
974 if want_microhttpd != 'false' and not skip_deps
975 libmicrohttpd = dependency('libmicrohttpd',
976 version : '>= 0.9.33',
977 required : want_microhttpd == 'true')
978 have = libmicrohttpd.found()
983 conf.set10('HAVE_MICROHTTPD', have)
985 want_libcryptsetup = get_option('libcryptsetup')
986 if want_libcryptsetup != 'false' and not skip_deps
987 libcryptsetup = dependency('libcryptsetup',
988 version : '>= 2.0.1',
989 required : want_libcryptsetup == 'true')
990 have = libcryptsetup.found()
995 conf.set10('HAVE_LIBCRYPTSETUP', have)
997 want_libcurl = get_option('libcurl')
998 if want_libcurl != 'false' and not skip_deps
999 libcurl = dependency('libcurl',
1000 version : '>= 7.32.0',
1001 required : want_libcurl == 'true')
1002 have = libcurl.found()
1007 conf.set10('HAVE_LIBCURL', have)
1009 want_libidn = get_option('libidn')
1010 want_libidn2 = get_option('libidn2')
1011 if want_libidn == 'true' and want_libidn2 == 'true'
1012 error('libidn and libidn2 cannot be requested simultaneously')
1015 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1016 libidn = dependency('libidn2',
1017 required : want_libidn2 == 'true')
1018 have = libidn.found()
1023 conf.set10('HAVE_LIBIDN2', have)
1024 if not have and want_libidn != 'false' and not skip_deps
1025 # libidn is used for both libidn and libidn2 objects
1026 libidn = dependency('libidn',
1027 required : want_libidn == 'true')
1028 have = libidn.found()
1032 conf.set10('HAVE_LIBIDN', have)
1034 want_libiptc = get_option('libiptc')
1035 if want_libiptc != 'false' and not skip_deps
1036 libiptc = dependency('libiptc',
1037 required : want_libiptc == 'true')
1038 have = libiptc.found()
1043 conf.set10('HAVE_LIBIPTC', have)
1045 want_qrencode = get_option('qrencode')
1046 if want_qrencode != 'false' and not skip_deps
1047 libqrencode = dependency('libqrencode',
1048 required : want_qrencode == 'true')
1049 have = libqrencode.found()
1054 conf.set10('HAVE_QRENCODE', have)
1056 want_gcrypt = get_option('gcrypt')
1057 if want_gcrypt != 'false' and not skip_deps
1058 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1059 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1060 have = libgcrypt.found() and libgpg_error.found()
1065 # link to neither of the libs if one is not found
1069 conf.set10('HAVE_GCRYPT', have)
1071 want_gnutls = get_option('gnutls')
1072 if want_gnutls != 'false' and not skip_deps
1073 libgnutls = dependency('gnutls',
1074 version : '>= 3.1.4',
1075 required : want_gnutls == 'true')
1076 have = libgnutls.found()
1081 conf.set10('HAVE_GNUTLS', have)
1083 want_openssl = get_option('openssl')
1084 if want_openssl != 'false' and not skip_deps
1085 libopenssl = dependency('openssl',
1086 version : '>= 1.1.0',
1087 required : want_openssl == 'true')
1088 have = libopenssl.found()
1093 conf.set10('HAVE_OPENSSL', have)
1095 want_elfutils = get_option('elfutils')
1096 if want_elfutils != 'false' and not skip_deps
1097 libdw = dependency('libdw',
1098 required : want_elfutils == 'true')
1099 have = libdw.found()
1104 conf.set10('HAVE_ELFUTILS', have)
1106 want_zlib = get_option('zlib')
1107 if want_zlib != 'false' and not skip_deps
1108 libz = dependency('zlib',
1109 required : want_zlib == 'true')
1115 conf.set10('HAVE_ZLIB', have)
1117 want_bzip2 = get_option('bzip2')
1118 if want_bzip2 != 'false' and not skip_deps
1119 libbzip2 = cc.find_library('bz2',
1120 required : want_bzip2 == 'true')
1121 have = libbzip2.found()
1126 conf.set10('HAVE_BZIP2', have)
1128 want_xz = get_option('xz')
1129 if want_xz != 'false' and not skip_deps
1130 libxz = dependency('liblzma',
1131 required : want_xz == 'true')
1132 have = libxz.found()
1137 conf.set10('HAVE_XZ', have)
1139 want_lz4 = get_option('lz4')
1140 if want_lz4 != 'false' and not skip_deps
1141 liblz4 = dependency('liblz4',
1142 version : '>= 1.3.0',
1143 required : want_lz4 == 'true')
1144 have = liblz4.found()
1149 conf.set10('HAVE_LZ4', have)
1151 want_xkbcommon = get_option('xkbcommon')
1152 if want_xkbcommon != 'false' and not skip_deps
1153 libxkbcommon = dependency('xkbcommon',
1154 version : '>= 0.3.0',
1155 required : want_xkbcommon == 'true')
1156 have = libxkbcommon.found()
1161 conf.set10('HAVE_XKBCOMMON', have)
1163 want_pcre2 = get_option('pcre2')
1164 if want_pcre2 != 'false'
1165 libpcre2 = dependency('libpcre2-8',
1166 required : want_pcre2 == 'true')
1167 have = libpcre2.found()
1172 conf.set10('HAVE_PCRE2', have)
1174 want_glib = get_option('glib')
1175 if want_glib != 'false' and not skip_deps
1176 libglib = dependency('glib-2.0',
1177 version : '>= 2.22.0',
1178 required : want_glib == 'true')
1179 libgobject = dependency('gobject-2.0',
1180 version : '>= 2.22.0',
1181 required : want_glib == 'true')
1182 libgio = dependency('gio-2.0',
1183 required : want_glib == 'true')
1184 have = libglib.found() and libgobject.found() and libgio.found()
1191 conf.set10('HAVE_GLIB', have)
1193 want_dbus = get_option('dbus')
1194 if want_dbus != 'false' and not skip_deps
1195 libdbus = dependency('dbus-1',
1196 version : '>= 1.3.2',
1197 required : want_dbus == 'true')
1198 have = libdbus.found()
1203 conf.set10('HAVE_DBUS', have)
1205 default_dnssec = get_option('default-dnssec')
1207 default_dnssec = 'no'
1209 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1210 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1211 default_dnssec = 'no'
1213 conf.set('DEFAULT_DNSSEC_MODE',
1214 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1215 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1217 dns_over_tls = get_option('dns-over-tls')
1218 if dns_over_tls != 'false'
1219 if dns_over_tls == 'openssl'
1222 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1223 if dns_over_tls == 'gnutls' and not have_gnutls
1224 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1227 if dns_over_tls == 'gnutls' or have_gnutls
1228 have_openssl = false
1230 have_openssl = conf.get('HAVE_OPENSSL') == 1
1231 if dns_over_tls != 'auto' and not have_openssl
1232 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1233 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1236 have = have_gnutls or have_openssl
1240 have_openssl = false
1242 conf.set10('ENABLE_DNS_OVER_TLS', have)
1243 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1244 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1246 default_dns_over_tls = get_option('default-dns-over-tls')
1248 default_dns_over_tls = 'no'
1250 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1251 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.')
1252 default_dns_over_tls = 'no'
1254 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1255 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1256 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1258 want_importd = get_option('importd')
1259 if want_importd != 'false'
1260 have = (conf.get('HAVE_LIBCURL') == 1 and
1261 conf.get('HAVE_ZLIB') == 1 and
1262 conf.get('HAVE_XZ') == 1 and
1263 conf.get('HAVE_GCRYPT') == 1)
1264 if want_importd == 'true' and not have
1265 error('importd support was requested, but dependencies are not available')
1270 conf.set10('ENABLE_IMPORTD', have)
1272 want_remote = get_option('remote')
1273 if want_remote != 'false'
1274 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1275 conf.get('HAVE_LIBCURL') == 1]
1276 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1277 # it's possible to build one without the other. Complain only if
1278 # support was explicitly requested. The auxiliary files like sysusers
1279 # config should be installed when any of the programs are built.
1280 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1281 error('remote support was requested, but dependencies are not available')
1283 have = have_deps[0] or have_deps[1]
1287 conf.set10('ENABLE_REMOTE', have)
1289 foreach term : ['utmp',
1322 have = get_option(term)
1323 name = 'ENABLE_' + term.underscorify().to_upper()
1324 conf.set10(name, have)
1327 foreach tuple : [['nss-mymachines', 'machined'],
1328 ['nss-resolve', 'resolve']]
1329 want = get_option(tuple[0])
1331 have = get_option(tuple[1])
1332 if want == 'true' and not have
1333 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1338 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1339 conf.set10(name, have)
1343 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1344 'ENABLE_NSS_MYMACHINES',
1345 'ENABLE_NSS_RESOLVE',
1346 'ENABLE_NSS_SYSTEMD']
1347 if conf.get(term) == 1
1351 conf.set10('ENABLE_NSS', enable_nss)
1353 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1358 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1360 #####################################################################
1362 if get_option('efi')
1363 efi_arch = host_machine.cpu_family()
1365 if efi_arch == 'x86'
1366 EFI_MACHINE_TYPE_NAME = 'ia32'
1367 gnu_efi_arch = 'ia32'
1368 elif efi_arch == 'x86_64'
1369 EFI_MACHINE_TYPE_NAME = 'x64'
1370 gnu_efi_arch = 'x86_64'
1371 elif efi_arch == 'arm'
1372 EFI_MACHINE_TYPE_NAME = 'arm'
1373 gnu_efi_arch = 'arm'
1374 elif efi_arch == 'aarch64'
1375 EFI_MACHINE_TYPE_NAME = 'aa64'
1376 gnu_efi_arch = 'aarch64'
1378 EFI_MACHINE_TYPE_NAME = ''
1383 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1385 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1389 conf.set10('ENABLE_EFI', have)
1391 #####################################################################
1393 config_h = configure_file(
1394 output : 'config.h',
1395 configuration : conf)
1397 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1399 includes = include_directories('src/basic',
1404 'src/journal-remote',
1408 'src/time-wait-sync',
1414 'src/libsystemd/sd-bus',
1415 'src/libsystemd/sd-device',
1416 'src/libsystemd/sd-event',
1417 'src/libsystemd/sd-hwdb',
1418 'src/libsystemd/sd-id128',
1419 'src/libsystemd/sd-netlink',
1420 'src/libsystemd/sd-network',
1421 'src/libsystemd/sd-resolve',
1422 'src/libsystemd-network',
1425 add_project_arguments('-include', 'config.h', language : 'c')
1427 generate_gperfs = find_program('tools/generate-gperfs.py')
1431 subdir('src/systemd')
1433 subdir('src/libsystemd')
1434 subdir('src/libsystemd-network')
1435 subdir('src/journal')
1438 libjournal_core = static_library(
1440 libjournal_core_sources,
1442 include_directories : includes,
1445 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1446 libsystemd = shared_library(
1449 version : libsystemd_version,
1450 include_directories : includes,
1451 link_args : ['-shared',
1452 '-Wl,--version-script=' + libsystemd_sym_path],
1453 link_with : [libbasic,
1455 link_whole : [libsystemd_static,
1457 dependencies : [threads,
1461 link_depends : libsystemd_sym,
1463 install_dir : rootlibdir)
1465 static_libsystemd = get_option('static-libsystemd')
1466 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1468 install_libsystemd_static = static_library(
1471 journal_client_sources,
1473 basic_gcrypt_sources,
1475 include_directories : includes,
1476 build_by_default : static_libsystemd != 'false',
1477 install : static_libsystemd != 'false',
1478 install_dir : rootlibdir,
1479 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1480 dependencies : [threads,
1489 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1491 #Generate autosuspend rules
1492 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1494 ############################################################
1496 # binaries that have --help and are intended for use by humans,
1497 # usually, but not always, installed in /bin.
1498 public_programs = []
1500 subdir('src/libudev')
1501 subdir('src/shared')
1503 subdir('src/shutdown')
1505 subdir('src/network')
1507 subdir('src/analyze')
1508 subdir('src/journal-remote')
1509 subdir('src/coredump')
1510 subdir('src/pstore')
1511 subdir('src/hostname')
1512 subdir('src/import')
1513 subdir('src/kernel-install')
1514 subdir('src/locale')
1515 subdir('src/machine')
1516 subdir('src/portable')
1517 subdir('src/nspawn')
1518 subdir('src/resolve')
1519 subdir('src/timedate')
1520 subdir('src/timesync')
1521 subdir('src/vconsole')
1522 subdir('src/boot/efi')
1529 ############################################################
1531 # only static linking apart from libdl, to make sure that the
1532 # module is linked to all libraries that it uses.
1533 test_dlopen = executable(
1537 include_directories : includes,
1538 link_with : [libbasic],
1539 dependencies : [libdl],
1540 build_by_default : want_tests != 'false')
1542 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1543 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1544 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1545 ['resolve', 'ENABLE_NSS_RESOLVE']]
1547 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1551 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1552 version_script_arg = join_paths(project_source_root, sym)
1554 nss = shared_library(
1556 'src/nss-@0@/nss-@0@.c'.format(module),
1559 include_directories : includes,
1560 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1561 link_args : ['-Wl,-z,nodelete',
1563 '-Wl,--version-script=' + version_script_arg],
1564 link_with : [libsystemd_static,
1567 dependencies : [threads,
1571 install_dir : rootlibdir)
1573 # We cannot use shared_module because it does not support version suffix.
1574 # Unfortunately shared_library insists on creating the symlink…
1575 meson.add_install_script('sh', '-c',
1576 'rm $DESTDIR@0@/libnss_@1@.so'
1577 .format(rootlibdir, module))
1579 if want_tests != 'false'
1580 test('dlopen-nss_' + module,
1582 # path to dlopen must include a slash
1583 args : nss.full_path())
1588 ############################################################
1590 executable('systemd',
1592 include_directories : includes,
1593 link_with : [libcore,
1595 dependencies : [versiondep,
1602 install_rpath : rootlibexecdir,
1604 install_dir : rootlibexecdir)
1606 meson.add_install_script(meson_make_symlink,
1607 join_paths(rootlibexecdir, 'systemd'),
1608 join_paths(rootsbindir, 'init'))
1610 exe = executable('systemd-analyze',
1611 systemd_analyze_sources,
1612 include_directories : includes,
1613 link_with : [libcore,
1615 dependencies : [versiondep,
1622 install_rpath : rootlibexecdir,
1624 public_programs += exe
1626 executable('systemd-journald',
1627 systemd_journald_sources,
1628 include_directories : includes,
1629 link_with : [libjournal_core,
1631 dependencies : [threads,
1635 install_rpath : rootlibexecdir,
1637 install_dir : rootlibexecdir)
1639 exe = executable('systemd-cat',
1640 systemd_cat_sources,
1641 include_directories : includes,
1642 link_with : [libjournal_core,
1644 dependencies : [threads],
1645 install_rpath : rootlibexecdir,
1647 public_programs += exe
1649 exe = executable('journalctl',
1651 include_directories : includes,
1652 link_with : [libshared],
1653 dependencies : [threads,
1658 install_rpath : rootlibexecdir,
1660 install_dir : rootbindir)
1661 public_programs += exe
1663 executable('systemd-getty-generator',
1664 'src/getty-generator/getty-generator.c',
1665 include_directories : includes,
1666 link_with : [libshared],
1667 install_rpath : rootlibexecdir,
1669 install_dir : systemgeneratordir)
1671 executable('systemd-debug-generator',
1672 'src/debug-generator/debug-generator.c',
1673 include_directories : includes,
1674 link_with : [libshared],
1675 install_rpath : rootlibexecdir,
1677 install_dir : systemgeneratordir)
1679 executable('systemd-run-generator',
1680 'src/run-generator/run-generator.c',
1681 include_directories : includes,
1682 link_with : [libshared],
1683 install_rpath : rootlibexecdir,
1685 install_dir : systemgeneratordir)
1687 executable('systemd-fstab-generator',
1688 'src/fstab-generator/fstab-generator.c',
1689 include_directories : includes,
1690 link_with : [libcore_shared,
1692 install_rpath : rootlibexecdir,
1694 install_dir : systemgeneratordir)
1696 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1697 executable('30-systemd-environment-d-generator',
1698 'src/environment-d-generator/environment-d-generator.c',
1699 include_directories : includes,
1700 link_with : [libshared],
1701 install_rpath : rootlibexecdir,
1703 install_dir : userenvgeneratordir)
1705 meson.add_install_script(meson_make_symlink,
1706 join_paths(sysconfdir, 'environment'),
1707 join_paths(environmentdir, '99-environment.conf'))
1710 if conf.get('ENABLE_HIBERNATE') == 1
1711 executable('systemd-hibernate-resume-generator',
1712 'src/hibernate-resume/hibernate-resume-generator.c',
1713 include_directories : includes,
1714 link_with : [libshared],
1715 install_rpath : rootlibexecdir,
1717 install_dir : systemgeneratordir)
1719 executable('systemd-hibernate-resume',
1720 'src/hibernate-resume/hibernate-resume.c',
1721 include_directories : includes,
1722 link_with : [libshared],
1723 install_rpath : rootlibexecdir,
1725 install_dir : rootlibexecdir)
1728 if conf.get('HAVE_BLKID') == 1
1729 executable('systemd-gpt-auto-generator',
1730 'src/gpt-auto-generator/gpt-auto-generator.c',
1731 'src/shared/blkid-util.h',
1732 include_directories : includes,
1733 link_with : [libshared],
1734 dependencies : libblkid,
1735 install_rpath : rootlibexecdir,
1737 install_dir : systemgeneratordir)
1739 exe = executable('systemd-dissect',
1740 'src/dissect/dissect.c',
1741 include_directories : includes,
1742 link_with : [libshared],
1743 install_rpath : rootlibexecdir,
1745 install_dir : rootlibexecdir)
1746 public_programs += exe
1749 if conf.get('ENABLE_RESOLVE') == 1
1750 executable('systemd-resolved',
1751 systemd_resolved_sources,
1752 include_directories : includes,
1753 link_with : [libshared,
1755 libsystemd_resolve_core],
1756 dependencies : systemd_resolved_dependencies,
1757 install_rpath : rootlibexecdir,
1759 install_dir : rootlibexecdir)
1761 exe = executable('resolvectl',
1763 include_directories : includes,
1764 link_with : [libshared,
1766 libsystemd_resolve_core],
1767 dependencies : [threads,
1771 install_rpath : rootlibexecdir,
1773 public_programs += exe
1775 meson.add_install_script(meson_make_symlink,
1776 join_paths(bindir, 'resolvectl'),
1777 join_paths(rootsbindir, 'resolvconf'))
1779 meson.add_install_script(meson_make_symlink,
1780 join_paths(bindir, 'resolvectl'),
1781 join_paths(bindir, 'systemd-resolve'))
1784 if conf.get('ENABLE_LOGIND') == 1
1785 executable('systemd-logind',
1786 systemd_logind_sources,
1787 include_directories : includes,
1788 link_with : [liblogind_core,
1790 dependencies : [threads,
1792 install_rpath : rootlibexecdir,
1794 install_dir : rootlibexecdir)
1796 exe = executable('loginctl',
1798 include_directories : includes,
1799 link_with : [libshared],
1800 dependencies : [threads,
1803 install_rpath : rootlibexecdir,
1805 install_dir : rootbindir)
1806 public_programs += exe
1808 exe = executable('systemd-inhibit',
1809 'src/login/inhibit.c',
1810 include_directories : includes,
1811 link_with : [libshared],
1812 install_rpath : rootlibexecdir,
1814 install_dir : rootbindir)
1815 public_programs += exe
1817 if conf.get('HAVE_PAM') == 1
1818 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1819 pam_systemd = shared_library(
1823 include_directories : includes,
1824 link_args : ['-shared',
1825 '-Wl,--version-script=' + version_script_arg],
1826 link_with : [libsystemd_static,
1828 dependencies : [threads,
1831 link_depends : pam_systemd_sym,
1833 install_dir : pamlibdir)
1835 if want_tests != 'false'
1836 test('dlopen-pam_systemd',
1838 # path to dlopen must include a slash
1839 args : pam_systemd.full_path())
1843 executable('systemd-user-runtime-dir',
1844 user_runtime_dir_sources,
1845 include_directories : includes,
1846 link_with : [libshared],
1847 install_rpath : rootlibexecdir,
1849 install_dir : rootlibexecdir)
1852 if conf.get('HAVE_PAM') == 1
1853 executable('systemd-user-sessions',
1854 'src/user-sessions/user-sessions.c',
1855 include_directories : includes,
1856 link_with : [libshared],
1857 install_rpath : rootlibexecdir,
1859 install_dir : rootlibexecdir)
1862 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1863 exe = executable('bootctl',
1864 'src/boot/bootctl.c',
1865 include_directories : includes,
1866 link_with : [libshared],
1867 dependencies : [libblkid],
1868 install_rpath : rootlibexecdir,
1870 public_programs += exe
1872 executable('systemd-bless-boot',
1873 'src/boot/bless-boot.c',
1874 include_directories : includes,
1875 link_with : [libshared],
1876 dependencies : [libblkid],
1877 install_rpath : rootlibexecdir,
1879 install_dir : rootlibexecdir)
1881 executable('systemd-bless-boot-generator',
1882 'src/boot/bless-boot-generator.c',
1883 include_directories : includes,
1884 link_with : [libshared],
1885 install_rpath : rootlibexecdir,
1887 install_dir : systemgeneratordir)
1890 executable('systemd-boot-check-no-failures',
1891 'src/boot/boot-check-no-failures.c',
1892 include_directories : includes,
1893 link_with : [libshared],
1894 dependencies : [libblkid],
1895 install_rpath : rootlibexecdir,
1897 install_dir : rootlibexecdir)
1899 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1900 include_directories : includes,
1901 link_with : [libshared],
1902 dependencies : [threads],
1903 install_rpath : rootlibexecdir,
1905 public_programs += exe
1908 if get_option('link-systemctl-shared')
1909 systemctl_link_with = [libshared]
1911 systemctl_link_with = [libsystemd_static,
1917 exe = executable('systemctl',
1918 'src/systemctl/systemctl.c',
1919 'src/systemctl/sysv-compat.h',
1920 'src/systemctl/sysv-compat.c',
1921 include_directories : includes,
1922 link_with : systemctl_link_with,
1923 dependencies : [threads,
1928 install_rpath : rootlibexecdir,
1930 install_dir : rootbindir)
1931 public_programs += exe
1933 if conf.get('ENABLE_PORTABLED') == 1
1934 executable('systemd-portabled',
1935 systemd_portabled_sources,
1936 include_directories : includes,
1937 link_with : [libshared],
1938 dependencies : [threads],
1939 install_rpath : rootlibexecdir,
1941 install_dir : rootlibexecdir)
1943 exe = executable('portablectl', 'src/portable/portablectl.c',
1944 include_directories : includes,
1945 link_with : [libshared],
1946 dependencies : [threads],
1947 install_rpath : rootlibexecdir,
1949 install_dir : rootbindir)
1950 public_programs += exe
1953 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1954 meson.add_install_script(meson_make_symlink,
1955 join_paths(rootbindir, 'systemctl'),
1956 join_paths(rootsbindir, alias))
1959 if conf.get('ENABLE_BACKLIGHT') == 1
1960 executable('systemd-backlight',
1961 'src/backlight/backlight.c',
1962 include_directories : includes,
1963 link_with : [libshared],
1964 install_rpath : rootlibexecdir,
1966 install_dir : rootlibexecdir)
1969 if conf.get('ENABLE_RFKILL') == 1
1970 executable('systemd-rfkill',
1971 'src/rfkill/rfkill.c',
1972 include_directories : includes,
1973 link_with : [libshared],
1974 install_rpath : rootlibexecdir,
1976 install_dir : rootlibexecdir)
1979 executable('systemd-system-update-generator',
1980 'src/system-update-generator/system-update-generator.c',
1981 include_directories : includes,
1982 link_with : [libshared],
1983 install_rpath : rootlibexecdir,
1985 install_dir : systemgeneratordir)
1987 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1988 executable('systemd-cryptsetup',
1989 'src/cryptsetup/cryptsetup.c',
1990 include_directories : includes,
1991 link_with : [libshared],
1992 dependencies : [libcryptsetup],
1993 install_rpath : rootlibexecdir,
1995 install_dir : rootlibexecdir)
1997 executable('systemd-cryptsetup-generator',
1998 'src/cryptsetup/cryptsetup-generator.c',
1999 include_directories : includes,
2000 link_with : [libshared],
2001 dependencies : [libcryptsetup],
2002 install_rpath : rootlibexecdir,
2004 install_dir : systemgeneratordir)
2006 executable('systemd-veritysetup',
2007 'src/veritysetup/veritysetup.c',
2008 include_directories : includes,
2009 link_with : [libshared],
2010 dependencies : [libcryptsetup],
2011 install_rpath : rootlibexecdir,
2013 install_dir : rootlibexecdir)
2015 executable('systemd-veritysetup-generator',
2016 'src/veritysetup/veritysetup-generator.c',
2017 include_directories : includes,
2018 link_with : [libshared],
2019 dependencies : [libcryptsetup],
2020 install_rpath : rootlibexecdir,
2022 install_dir : systemgeneratordir)
2025 if conf.get('HAVE_SYSV_COMPAT') == 1
2026 executable('systemd-sysv-generator',
2027 'src/sysv-generator/sysv-generator.c',
2028 include_directories : includes,
2029 link_with : [libshared],
2030 install_rpath : rootlibexecdir,
2032 install_dir : systemgeneratordir)
2034 executable('systemd-rc-local-generator',
2035 'src/rc-local-generator/rc-local-generator.c',
2036 include_directories : includes,
2037 link_with : [libshared],
2038 install_rpath : rootlibexecdir,
2040 install_dir : systemgeneratordir)
2043 if conf.get('ENABLE_HOSTNAMED') == 1
2044 executable('systemd-hostnamed',
2045 'src/hostname/hostnamed.c',
2046 include_directories : includes,
2047 link_with : [libshared],
2048 install_rpath : rootlibexecdir,
2050 install_dir : rootlibexecdir)
2052 exe = executable('hostnamectl',
2053 'src/hostname/hostnamectl.c',
2054 include_directories : includes,
2055 link_with : [libshared],
2056 install_rpath : rootlibexecdir,
2058 public_programs += exe
2061 if conf.get('ENABLE_LOCALED') == 1
2062 if conf.get('HAVE_XKBCOMMON') == 1
2063 # logind will load libxkbcommon.so dynamically on its own
2069 executable('systemd-localed',
2070 systemd_localed_sources,
2071 include_directories : includes,
2072 link_with : [libshared],
2073 dependencies : deps,
2074 install_rpath : rootlibexecdir,
2076 install_dir : rootlibexecdir)
2078 exe = executable('localectl',
2080 include_directories : includes,
2081 link_with : [libshared],
2082 install_rpath : rootlibexecdir,
2084 public_programs += exe
2087 if conf.get('ENABLE_TIMEDATED') == 1
2088 executable('systemd-timedated',
2089 'src/timedate/timedated.c',
2090 include_directories : includes,
2091 link_with : [libshared],
2092 install_rpath : rootlibexecdir,
2094 install_dir : rootlibexecdir)
2097 if conf.get('ENABLE_TIMEDATECTL') == 1
2098 exe = executable('timedatectl',
2099 'src/timedate/timedatectl.c',
2100 include_directories : includes,
2101 install_rpath : rootlibexecdir,
2102 link_with : [libshared],
2103 dependencies : [libm],
2105 public_programs += exe
2108 if conf.get('ENABLE_TIMESYNCD') == 1
2109 executable('systemd-timesyncd',
2110 systemd_timesyncd_sources,
2111 include_directories : includes,
2112 link_with : [libshared],
2113 dependencies : [threads,
2115 install_rpath : rootlibexecdir,
2117 install_dir : rootlibexecdir)
2119 executable('systemd-time-wait-sync',
2120 'src/time-wait-sync/time-wait-sync.c',
2121 include_directories : includes,
2122 link_with : [libshared],
2123 install_rpath : rootlibexecdir,
2125 install_dir : rootlibexecdir)
2128 if conf.get('ENABLE_MACHINED') == 1
2129 executable('systemd-machined',
2130 systemd_machined_sources,
2131 include_directories : includes,
2132 link_with : [libmachine_core,
2134 install_rpath : rootlibexecdir,
2136 install_dir : rootlibexecdir)
2138 exe = executable('machinectl',
2139 'src/machine/machinectl.c',
2140 include_directories : includes,
2141 link_with : [libshared],
2142 dependencies : [threads,
2145 install_rpath : rootlibexecdir,
2147 install_dir : rootbindir)
2148 public_programs += exe
2151 if conf.get('ENABLE_IMPORTD') == 1
2152 executable('systemd-importd',
2153 systemd_importd_sources,
2154 include_directories : includes,
2155 link_with : [libshared],
2156 dependencies : [threads],
2157 install_rpath : rootlibexecdir,
2159 install_dir : rootlibexecdir)
2161 systemd_pull = executable('systemd-pull',
2162 systemd_pull_sources,
2163 include_directories : includes,
2164 link_with : [libshared],
2165 dependencies : [versiondep,
2171 install_rpath : rootlibexecdir,
2173 install_dir : rootlibexecdir)
2175 systemd_import = executable('systemd-import',
2176 systemd_import_sources,
2177 include_directories : includes,
2178 link_with : [libshared],
2179 dependencies : [libcurl,
2183 install_rpath : rootlibexecdir,
2185 install_dir : rootlibexecdir)
2187 systemd_import_fs = executable('systemd-import-fs',
2188 systemd_import_fs_sources,
2189 include_directories : includes,
2190 link_with : [libshared],
2191 install_rpath : rootlibexecdir,
2193 install_dir : rootlibexecdir)
2195 systemd_export = executable('systemd-export',
2196 systemd_export_sources,
2197 include_directories : includes,
2198 link_with : [libshared],
2199 dependencies : [libcurl,
2203 install_rpath : rootlibexecdir,
2205 install_dir : rootlibexecdir)
2207 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2210 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2211 exe = executable('systemd-journal-upload',
2212 systemd_journal_upload_sources,
2213 include_directories : includes,
2214 link_with : [libshared],
2215 dependencies : [versiondep,
2221 install_rpath : rootlibexecdir,
2223 install_dir : rootlibexecdir)
2224 public_programs += exe
2227 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2228 s_j_remote = executable('systemd-journal-remote',
2229 systemd_journal_remote_sources,
2230 include_directories : includes,
2231 link_with : [libshared,
2232 libsystemd_journal_remote],
2233 dependencies : [threads,
2238 install_rpath : rootlibexecdir,
2240 install_dir : rootlibexecdir)
2242 s_j_gatewayd = executable('systemd-journal-gatewayd',
2243 systemd_journal_gatewayd_sources,
2244 include_directories : includes,
2245 link_with : [libshared],
2246 dependencies : [threads,
2251 install_rpath : rootlibexecdir,
2253 install_dir : rootlibexecdir)
2254 public_programs += [s_j_remote, s_j_gatewayd]
2257 if conf.get('ENABLE_COREDUMP') == 1
2258 executable('systemd-coredump',
2259 systemd_coredump_sources,
2260 include_directories : includes,
2261 link_with : [libshared],
2262 dependencies : [threads,
2267 install_rpath : rootlibexecdir,
2269 install_dir : rootlibexecdir)
2271 exe = executable('coredumpctl',
2272 coredumpctl_sources,
2273 include_directories : includes,
2274 link_with : [libshared],
2275 dependencies : [threads,
2278 install_rpath : rootlibexecdir,
2280 public_programs += exe
2283 if conf.get('ENABLE_PSTORE') == 1
2284 executable('systemd-pstore',
2285 systemd_pstore_sources,
2286 include_directories : includes,
2287 link_with : [libshared],
2288 dependencies : [threads,
2293 install_rpath : rootlibexecdir,
2295 install_dir : rootlibexecdir)
2298 if conf.get('ENABLE_BINFMT') == 1
2299 exe = executable('systemd-binfmt',
2300 'src/binfmt/binfmt.c',
2301 include_directories : includes,
2302 link_with : [libshared],
2303 install_rpath : rootlibexecdir,
2305 install_dir : rootlibexecdir)
2306 public_programs += exe
2308 meson.add_install_script('sh', '-c',
2309 mkdir_p.format(binfmtdir))
2310 meson.add_install_script('sh', '-c',
2311 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2314 if conf.get('ENABLE_VCONSOLE') == 1
2315 executable('systemd-vconsole-setup',
2316 'src/vconsole/vconsole-setup.c',
2317 include_directories : includes,
2318 link_with : [libshared],
2319 install_rpath : rootlibexecdir,
2321 install_dir : rootlibexecdir)
2324 if conf.get('ENABLE_RANDOMSEED') == 1
2325 executable('systemd-random-seed',
2326 'src/random-seed/random-seed.c',
2327 include_directories : includes,
2328 link_with : [libshared],
2329 install_rpath : rootlibexecdir,
2331 install_dir : rootlibexecdir)
2334 if conf.get('ENABLE_FIRSTBOOT') == 1
2335 executable('systemd-firstboot',
2336 'src/firstboot/firstboot.c',
2337 include_directories : includes,
2338 link_with : [libshared],
2339 dependencies : [libcrypt],
2340 install_rpath : rootlibexecdir,
2342 install_dir : rootbindir)
2345 executable('systemd-remount-fs',
2346 'src/remount-fs/remount-fs.c',
2347 include_directories : includes,
2348 link_with : [libcore_shared,
2350 install_rpath : rootlibexecdir,
2352 install_dir : rootlibexecdir)
2354 executable('systemd-machine-id-setup',
2355 'src/machine-id-setup/machine-id-setup-main.c',
2356 include_directories : includes,
2357 link_with : [libcore_shared,
2359 install_rpath : rootlibexecdir,
2361 install_dir : rootbindir)
2363 executable('systemd-fsck',
2365 include_directories : includes,
2366 link_with : [libshared],
2367 install_rpath : rootlibexecdir,
2369 install_dir : rootlibexecdir)
2371 executable('systemd-growfs',
2372 'src/partition/growfs.c',
2373 include_directories : includes,
2374 link_with : [libshared],
2375 dependencies : [libcryptsetup],
2376 install_rpath : rootlibexecdir,
2378 install_dir : rootlibexecdir)
2380 executable('systemd-makefs',
2381 'src/partition/makefs.c',
2382 include_directories : includes,
2383 link_with : [libshared],
2384 install_rpath : rootlibexecdir,
2386 install_dir : rootlibexecdir)
2388 executable('systemd-sleep',
2389 'src/sleep/sleep.c',
2390 include_directories : includes,
2391 link_with : [libshared],
2392 install_rpath : rootlibexecdir,
2394 install_dir : rootlibexecdir)
2396 install_data('src/sleep/sleep.conf',
2397 install_dir : pkgsysconfdir)
2399 exe = executable('systemd-sysctl',
2400 'src/sysctl/sysctl.c',
2401 include_directories : includes,
2402 link_with : [libshared],
2403 install_rpath : rootlibexecdir,
2405 install_dir : rootlibexecdir)
2406 public_programs += exe
2408 executable('systemd-ac-power',
2409 'src/ac-power/ac-power.c',
2410 include_directories : includes,
2411 link_with : [libshared],
2412 install_rpath : rootlibexecdir,
2414 install_dir : rootlibexecdir)
2416 exe = executable('systemd-detect-virt',
2417 'src/detect-virt/detect-virt.c',
2418 include_directories : includes,
2419 link_with : [libshared],
2420 install_rpath : rootlibexecdir,
2422 public_programs += exe
2424 exe = executable('systemd-delta',
2425 'src/delta/delta.c',
2426 include_directories : includes,
2427 link_with : [libshared],
2428 install_rpath : rootlibexecdir,
2430 public_programs += exe
2432 exe = executable('systemd-escape',
2433 'src/escape/escape.c',
2434 include_directories : includes,
2435 link_with : [libshared],
2436 install_rpath : rootlibexecdir,
2438 install_dir : rootbindir)
2439 public_programs += exe
2441 exe = executable('systemd-notify',
2442 'src/notify/notify.c',
2443 include_directories : includes,
2444 link_with : [libshared],
2445 install_rpath : rootlibexecdir,
2447 install_dir : rootbindir)
2448 public_programs += exe
2450 executable('systemd-volatile-root',
2451 'src/volatile-root/volatile-root.c',
2452 include_directories : includes,
2453 link_with : [libshared],
2454 install_rpath : rootlibexecdir,
2456 install_dir : rootlibexecdir)
2458 executable('systemd-cgroups-agent',
2459 'src/cgroups-agent/cgroups-agent.c',
2460 include_directories : includes,
2461 link_with : [libshared],
2462 install_rpath : rootlibexecdir,
2464 install_dir : rootlibexecdir)
2466 exe = executable('systemd-id128',
2467 'src/id128/id128.c',
2468 include_directories : includes,
2469 link_with : [libshared],
2470 install_rpath : rootlibexecdir,
2472 public_programs += exe
2474 exe = executable('systemd-path',
2476 include_directories : includes,
2477 link_with : [libshared],
2478 install_rpath : rootlibexecdir,
2480 public_programs += exe
2482 exe = executable('systemd-ask-password',
2483 'src/ask-password/ask-password.c',
2484 include_directories : includes,
2485 link_with : [libshared],
2486 install_rpath : rootlibexecdir,
2488 install_dir : rootbindir)
2489 public_programs += exe
2491 executable('systemd-reply-password',
2492 'src/reply-password/reply-password.c',
2493 include_directories : includes,
2494 link_with : [libshared],
2495 install_rpath : rootlibexecdir,
2497 install_dir : rootlibexecdir)
2499 exe = executable('systemd-tty-ask-password-agent',
2500 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2501 include_directories : includes,
2502 link_with : [libshared],
2503 install_rpath : rootlibexecdir,
2505 install_dir : rootbindir)
2506 public_programs += exe
2508 exe = executable('systemd-cgls',
2510 include_directories : includes,
2511 link_with : [libshared],
2512 install_rpath : rootlibexecdir,
2514 public_programs += exe
2516 exe = executable('systemd-cgtop',
2517 'src/cgtop/cgtop.c',
2518 include_directories : includes,
2519 link_with : [libshared],
2520 install_rpath : rootlibexecdir,
2522 public_programs += exe
2524 executable('systemd-initctl',
2525 'src/initctl/initctl.c',
2526 include_directories : includes,
2527 link_with : [libshared],
2528 install_rpath : rootlibexecdir,
2530 install_dir : rootlibexecdir)
2532 exe = executable('systemd-mount',
2533 'src/mount/mount-tool.c',
2534 include_directories : includes,
2535 link_with : [libshared],
2536 dependencies: [libmount],
2537 install_rpath : rootlibexecdir,
2539 public_programs += exe
2541 meson.add_install_script(meson_make_symlink,
2542 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2544 exe = executable('systemd-run',
2546 include_directories : includes,
2547 link_with : [libshared],
2548 install_rpath : rootlibexecdir,
2550 public_programs += exe
2552 exe = executable('systemd-stdio-bridge',
2553 'src/stdio-bridge/stdio-bridge.c',
2554 include_directories : includes,
2555 link_with : [libshared],
2556 dependencies : [versiondep],
2557 install_rpath : rootlibexecdir,
2559 public_programs += exe
2561 exe = executable('busctl',
2562 'src/busctl/busctl.c',
2563 'src/busctl/busctl-introspect.c',
2564 'src/busctl/busctl-introspect.h',
2565 include_directories : includes,
2566 link_with : [libshared],
2567 install_rpath : rootlibexecdir,
2569 public_programs += exe
2571 if conf.get('ENABLE_SYSUSERS') == 1
2572 exe = executable('systemd-sysusers',
2573 'src/sysusers/sysusers.c',
2574 include_directories : includes,
2575 link_with : [libshared],
2576 install_rpath : rootlibexecdir,
2578 install_dir : rootbindir)
2579 public_programs += exe
2582 if conf.get('ENABLE_TMPFILES') == 1
2583 exe = executable('systemd-tmpfiles',
2584 'src/tmpfiles/tmpfiles.c',
2585 include_directories : includes,
2586 link_with : [libshared],
2587 dependencies : [libacl],
2588 install_rpath : rootlibexecdir,
2590 install_dir : rootbindir)
2591 public_programs += exe
2593 if want_tests != 'false'
2594 test('test-systemd-tmpfiles',
2595 test_systemd_tmpfiles_py,
2596 # https://github.com/mesonbuild/meson/issues/2681
2597 args : exe.full_path())
2601 if conf.get('ENABLE_HWDB') == 1
2602 exe = executable('systemd-hwdb',
2604 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2605 include_directories : includes,
2606 link_with : [libudev_static],
2607 install_rpath : udev_rpath,
2609 install_dir : rootbindir)
2610 public_programs += exe
2613 if conf.get('ENABLE_QUOTACHECK') == 1
2614 executable('systemd-quotacheck',
2615 'src/quotacheck/quotacheck.c',
2616 include_directories : includes,
2617 link_with : [libshared],
2618 install_rpath : rootlibexecdir,
2620 install_dir : rootlibexecdir)
2623 exe = executable('systemd-socket-proxyd',
2624 'src/socket-proxy/socket-proxyd.c',
2625 include_directories : includes,
2626 link_with : [libshared],
2627 dependencies : [threads],
2628 install_rpath : rootlibexecdir,
2630 install_dir : rootlibexecdir)
2631 public_programs += exe
2633 exe = executable('systemd-udevd',
2634 systemd_udevd_sources,
2635 include_directories : includes,
2636 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2637 link_with : [libudev_core,
2640 dependencies : [versiondep,
2646 install_rpath : udev_rpath,
2648 install_dir : rootlibexecdir)
2649 public_programs += exe
2651 exe = executable('udevadm',
2653 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2654 include_directories : includes,
2655 link_with : [libudev_core,
2658 dependencies : [versiondep,
2664 install_rpath : udev_rpath,
2666 install_dir : rootbindir)
2667 public_programs += exe
2669 executable('systemd-shutdown',
2670 systemd_shutdown_sources,
2671 include_directories : includes,
2672 link_with : [libcore_shared,
2674 dependencies : [libmount],
2675 install_rpath : rootlibexecdir,
2677 install_dir : rootlibexecdir)
2679 executable('systemd-update-done',
2680 'src/update-done/update-done.c',
2681 include_directories : includes,
2682 link_with : [libshared],
2683 install_rpath : rootlibexecdir,
2685 install_dir : rootlibexecdir)
2687 executable('systemd-update-utmp',
2688 'src/update-utmp/update-utmp.c',
2689 include_directories : includes,
2690 link_with : [libshared],
2691 dependencies : [libaudit],
2692 install_rpath : rootlibexecdir,
2694 install_dir : rootlibexecdir)
2696 if conf.get('HAVE_KMOD') == 1
2697 executable('systemd-modules-load',
2698 'src/modules-load/modules-load.c',
2699 include_directories : includes,
2700 link_with : [libshared],
2701 dependencies : [libkmod],
2702 install_rpath : rootlibexecdir,
2704 install_dir : rootlibexecdir)
2706 meson.add_install_script('sh', '-c',
2707 mkdir_p.format(modulesloaddir))
2708 meson.add_install_script('sh', '-c',
2709 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2712 exe = executable('systemd-nspawn',
2713 systemd_nspawn_sources,
2714 include_directories : includes,
2715 link_with : [libcore_shared,
2718 dependencies : [libblkid,
2720 install_rpath : rootlibexecdir,
2722 public_programs += exe
2724 if conf.get('ENABLE_NETWORKD') == 1
2725 executable('systemd-networkd',
2726 systemd_networkd_sources,
2727 include_directories : network_include_dir,
2728 link_with : [libnetworkd_core,
2732 dependencies : [threads],
2733 install_rpath : rootlibexecdir,
2735 install_dir : rootlibexecdir)
2737 executable('systemd-networkd-wait-online',
2738 systemd_networkd_wait_online_sources,
2739 include_directories : includes,
2740 link_with : [libnetworkd_core,
2742 install_rpath : rootlibexecdir,
2744 install_dir : rootlibexecdir)
2746 exe = executable('networkctl',
2748 include_directories : includes,
2749 link_with : [libsystemd_network,
2751 install_rpath : rootlibexecdir,
2753 install_dir : rootbindir)
2754 public_programs += exe
2756 executable('systemd-network-generator',
2757 network_generator_sources,
2758 include_directories : includes,
2759 link_with : [libshared],
2760 install_rpath : rootlibexecdir,
2762 install_dir : rootlibexecdir)
2765 executable('systemd-sulogin-shell',
2766 ['src/sulogin-shell/sulogin-shell.c'],
2767 include_directories : includes,
2768 link_with : [libshared],
2769 install_rpath : rootlibexecdir,
2771 install_dir : rootlibexecdir)
2773 ############################################################
2776 'systemd-runtest.env',
2777 output : 'systemd-runtest.env',
2778 command : ['sh', '-c', '{ ' +
2779 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2780 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2782 build_by_default : true)
2784 foreach tuple : tests
2786 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2787 dependencies = tuple[2]
2788 condition = tuple.length() >= 4 ? tuple[3] : ''
2789 type = tuple.length() >= 5 ? tuple[4] : ''
2790 defs = tuple.length() >= 6 ? tuple[5] : []
2791 incs = tuple.length() >= 7 ? tuple[6] : includes
2794 name = sources[0].split('/')[-1].split('.')[0]
2795 if type.startswith('timeout=')
2796 timeout = type.split('=')[1].to_int()
2800 if condition == '' or conf.get(condition) == 1
2804 include_directories : incs,
2805 link_with : link_with,
2806 dependencies : [versiondep,
2809 build_by_default : want_tests != 'false',
2810 install_rpath : rootlibexecdir,
2811 install : install_tests,
2812 install_dir : join_paths(testsdir, type))
2815 message('@0@ is a manual test'.format(name))
2816 elif type == 'unsafe' and want_tests != 'unsafe'
2817 message('@0@ is an unsafe test'.format(name))
2818 elif want_tests != 'false'
2824 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2829 'test-libsystemd-sym',
2830 test_libsystemd_sym_c,
2831 include_directories : includes,
2832 link_with : [libsystemd],
2833 build_by_default : want_tests != 'false',
2834 install : install_tests,
2835 install_dir : testsdir)
2836 if want_tests != 'false'
2837 test('test-libsystemd-sym', exe)
2841 'test-libsystemd-static-sym',
2842 test_libsystemd_sym_c,
2843 include_directories : includes,
2844 link_with : [install_libsystemd_static],
2845 dependencies : [threads], # threads is already included in dependencies on the library,
2846 # but does not seem to get propagated. Add here as a work-around.
2847 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2848 install : install_tests and static_libsystemd_pic,
2849 install_dir : testsdir)
2850 if want_tests != 'false' and static_libsystemd_pic
2851 test('test-libsystemd-static-sym', exe)
2857 include_directories : includes,
2858 c_args : '-Wno-deprecated-declarations',
2859 link_with : [libudev],
2860 build_by_default : want_tests != 'false',
2861 install : install_tests,
2862 install_dir : testsdir)
2863 if want_tests != 'false'
2864 test('test-libudev-sym', exe)
2868 'test-libudev-static-sym',
2870 include_directories : includes,
2871 c_args : '-Wno-deprecated-declarations',
2872 link_with : [install_libudev_static],
2873 build_by_default : want_tests != 'false' and static_libudev_pic,
2874 install : install_tests and static_libudev_pic,
2875 install_dir : testsdir)
2876 if want_tests != 'false' and static_libudev_pic
2877 test('test-libudev-static-sym', exe)
2880 ############################################################
2884 if get_option('tests') != 'false'
2885 foreach tuple : fuzzers
2887 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2888 dependencies = tuple[2]
2889 defs = tuple.length() >= 4 ? tuple[3] : []
2890 incs = tuple.length() >= 5 ? tuple[4] : includes
2893 if want_ossfuzz or want_fuzzbuzz
2894 dependencies += fuzzing_engine
2896 if fuzzing_engine.found()
2897 dependencies += fuzzing_engine
2899 link_args += ['-fsanitize=fuzzer']
2902 sources += 'src/fuzz/fuzz-main.c'
2906 sources += 'src/fuzz/fuzzer-entry-point.c'
2909 name = sources[0].split('/')[-1].split('.')[0]
2911 fuzzer_exes += executable(
2914 include_directories : [incs, include_directories('src/fuzz')],
2915 link_with : link_with,
2916 dependencies : dependencies,
2918 link_args: link_args,
2923 run_target('fuzzers',
2924 depends : fuzzer_exes,
2927 ############################################################
2929 make_directive_index_py = find_program('tools/make-directive-index.py')
2930 make_man_index_py = find_program('tools/make-man-index.py')
2931 xml_helper_py = find_program('tools/xml_helper.py')
2932 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2933 autosuspend_update_sh = find_program('tools/meson-autosuspend-update.sh')
2936 subdir('sysusers.d')
2937 subdir('tmpfiles.d')
2943 subdir('shell-completion/bash')
2944 subdir('shell-completion/zsh')
2945 subdir('docs/sysvinit')
2946 subdir('docs/var-log')
2948 install_subdir('factory/etc',
2949 install_dir : factorydir)
2951 install_data('xorg/50-systemd-user.sh',
2952 install_dir : xinitrcdir)
2953 install_data('modprobe.d/systemd.conf',
2954 install_dir : modprobedir)
2955 install_data('LICENSE.GPL2',
2959 'docs/CODING_STYLE.md',
2960 'docs/DISTRO_PORTING.md',
2961 'docs/ENVIRONMENT.md',
2963 'docs/TRANSIENT-SETTINGS.md',
2964 'docs/TRANSLATORS.md',
2965 'docs/UIDS-GIDS.md',
2966 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2967 install_dir : docdir)
2969 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2970 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2972 ############################################################
2974 meson_check_help = find_program('tools/meson-check-help.sh')
2976 foreach exec : public_programs
2977 name = exec.full_path().split('/')[-1]
2978 if want_tests != 'false'
2979 test('check-help-' + name,
2981 args : exec.full_path())
2985 ############################################################
2987 check_directives_sh = find_program('tools/check-directives.sh')
2989 if want_tests != 'false'
2990 test('check-directives',
2991 check_directives_sh,
2992 args : project_source_root)
2995 ############################################################
2997 # Enable tests for all supported sanitizers
2998 foreach tuple : sanitizers
2999 sanitizer = tuple[0]
3002 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3004 foreach p : fuzz_regression_tests
3005 b = p.split('/')[-2]
3006 c = p.split('/')[-1]
3008 name = '@0@:@1@'.format(b, sanitizer)
3011 if want_tests == 'false'
3012 message('Not compiling @0@ because tests is set to false'.format(name))
3014 exe = custom_target(
3018 command : [env, 'ln', '-fs',
3019 join_paths(build.full_path(), b),
3021 build_by_default : true)
3023 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3028 if want_tests != 'false' and slow_tests
3029 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3031 args : [exe.full_path(),
3032 join_paths(project_source_root, p)])
3039 ############################################################
3042 all_files = run_command(
3044 ['--git-dir=@0@/.git'.format(project_source_root),
3047 all_files = files(all_files.stdout().split())
3052 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3055 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3059 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3062 command : [meson_git_contrib_sh])
3066 git_head = run_command(
3068 ['--git-dir=@0@/.git'.format(project_source_root),
3069 'rev-parse', 'HEAD']).stdout().strip()
3070 git_head_short = run_command(
3072 ['--git-dir=@0@/.git'.format(project_source_root),
3073 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3077 command : ['git', 'archive',
3078 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3080 '--prefix', 'systemd-@0@/'.format(git_head),
3084 ############################################################
3086 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3089 depends : [man, libsystemd, libudev],
3090 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3092 ############################################################
3093 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3096 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3098 'split /usr: @0@'.format(split_usr),
3099 'split bin-sbin: @0@'.format(split_bin),
3100 'prefix directory: @0@'.format(prefixdir),
3101 'rootprefix directory: @0@'.format(rootprefixdir),
3102 'sysconf directory: @0@'.format(sysconfdir),
3103 'include directory: @0@'.format(includedir),
3104 'lib directory: @0@'.format(libdir),
3105 'rootlib directory: @0@'.format(rootlibdir),
3106 'SysV init scripts: @0@'.format(sysvinit_path),
3107 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3108 'PAM modules directory: @0@'.format(pamlibdir),
3109 'PAM configuration directory: @0@'.format(pamconfdir),
3110 'RPM macros directory: @0@'.format(rpmmacrosdir),
3111 'modprobe.d directory: @0@'.format(modprobedir),
3112 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3113 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3114 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3115 'bash completions directory: @0@'.format(bashcompletiondir),
3116 'zsh completions directory: @0@'.format(zshcompletiondir),
3117 'extra start script: @0@'.format(get_option('rc-local')),
3118 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3119 get_option('debug-tty')),
3120 'TTY GID: @0@'.format(tty_gid),
3121 'users GID: @0@'.format(substs.get('USERS_GID')),
3122 'maximum system UID: @0@'.format(system_uid_max),
3123 'maximum system GID: @0@'.format(system_gid_max),
3124 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3125 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3126 'minimum container UID base: @0@'.format(container_uid_base_min),
3127 'maximum container UID base: @0@'.format(container_uid_base_max),
3128 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3129 'render group access mode: @0@'.format(get_option('group-render-mode')),
3130 'certificate root directory: @0@'.format(get_option('certificate-root')),
3131 'support URL: @0@'.format(support_url),
3132 'nobody user name: @0@'.format(nobody_user),
3133 'nobody group name: @0@'.format(nobody_group),
3134 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3135 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3137 'default DNSSEC mode: @0@'.format(default_dnssec),
3138 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3139 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3140 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3141 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3142 'default locale: @0@'.format(default_locale),
3143 'default user $PATH: @0@'.format(default_user_path_display),
3144 'systemd service watchdog: @0@'.format(watchdog_opt)]
3146 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3147 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3149 'default DNS servers: @0@'.format(alt_dns_servers),
3150 'default NTP servers: @0@'.format(alt_ntp_servers)]
3152 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3153 '@@0@'.format(time_epoch)).stdout().strip()
3155 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3158 'static libsystemd: @0@'.format(static_libsystemd),
3159 'static libudev: @0@'.format(static_libudev)]
3162 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3163 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3164 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3166 if conf.get('ENABLE_EFI') == 1
3167 status += 'efi arch: @0@'.format(efi_arch)
3171 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3172 'EFI CC @0@'.format(' '.join(efi_cc)),
3173 'EFI lib directory: @0@'.format(efi_libdir),
3174 'EFI lds directory: @0@'.format(efi_ldsdir),
3175 'EFI include directory: @0@'.format(efi_incdir)]
3227 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3228 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3232 ['legacy pkla', install_polkit_pkla],
3234 ['gnu-efi', have_gnu_efi],
3247 ['man pages', want_man],
3248 ['html pages', want_html],
3249 ['man page indices', want_man and have_lxml],
3254 ['adm group', get_option('adm-group')],
3255 ['wheel group', get_option('wheel-group')],
3258 ['debug mmap cache'],
3260 ['valgrind', conf.get('VALGRIND') == 1],
3261 ['trace logging', conf.get('LOG_TRACE') == 1],
3262 ['link-udev-shared', get_option('link-udev-shared')],
3263 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3266 if tuple.length() >= 2
3269 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3270 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3271 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3282 'enabled features: @0@'.format(', '.join(found)),
3284 'disabled features: @0@'.format(', '.join(missing)),
3286 message('\n '.join(status))
3288 if rootprefixdir != rootprefix_default
3290 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3291 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3292 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))