1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
12 meson_version : '>= 0.46',
15 libsystemd_version = '0.26.0'
16 libudev_version = '1.6.14'
18 # We need the same data in two different formats, ugh!
19 # Also, for hysterical reasons, we use different variable
20 # names, sometimes. Not all variables are included in every
22 conf = configuration_data()
23 conf.set('PROJECT_VERSION', meson.project_version())
25 substs = configuration_data()
26 substs.set('PROJECT_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
27 substs.set('PROJECT_VERSION', meson.project_version())
29 # This is to be used instead of meson.source_root(), as the latter will return
30 # the wrong result when systemd is being built as a meson subproject
31 project_source_root = meson.current_source_dir()
32 relative_source_path = run_command('realpath',
33 '--relative-to=@0@'.format(meson.current_build_dir()),
34 project_source_root).stdout().strip()
35 conf.set_quoted('RELATIVE_SOURCE_PATH', relative_source_path)
37 want_ossfuzz = get_option('oss-fuzz')
38 want_libfuzzer = get_option('llvm-fuzz')
39 want_fuzzbuzz = get_option('fuzzbuzz')
40 if want_ossfuzz + want_libfuzzer + want_fuzzbuzz > 1
41 error('only one of oss-fuzz, llvm-fuzz or fuzzbuzz can be specified')
44 skip_deps = want_ossfuzz or want_libfuzzer
45 fuzzer_build = want_ossfuzz or want_libfuzzer or want_fuzzbuzz
47 #####################################################################
49 # Try to install the git pre-commit hook
50 git_hook = run_command(join_paths(project_source_root, 'tools/add-git-hook.sh'))
51 if git_hook.returncode() == 0
52 message(git_hook.stdout().strip())
55 #####################################################################
57 if get_option('split-usr') == 'auto'
58 split_usr = run_command('test', '-L', '/bin').returncode() != 0
60 split_usr = get_option('split-usr') == 'true'
62 conf.set10('HAVE_SPLIT_USR', split_usr,
63 description : '/usr/bin and /bin directories are separate')
65 if get_option('split-bin') == 'auto'
66 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
68 split_bin = get_option('split-bin') == 'true'
70 conf.set10('HAVE_SPLIT_BIN', split_bin,
71 description : 'bin and sbin directories are separate')
73 rootprefixdir = get_option('rootprefix')
74 # Unusual rootprefixdir values are used by some distros
75 # (see https://github.com/systemd/systemd/pull/7461).
76 rootprefix_default = split_usr ? '/' : '/usr'
77 if rootprefixdir == ''
78 rootprefixdir = rootprefix_default
80 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
82 sysvinit_path = get_option('sysvinit-path')
83 sysvrcnd_path = get_option('sysvrcnd-path')
84 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
85 description : 'SysV init scripts and rcN.d links are supported')
87 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
88 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
89 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
91 # join_paths ignores the preceding arguments if an absolute component is
92 # encountered, so this should canonicalize various paths when they are
93 # absolute or relative.
94 prefixdir = get_option('prefix')
95 if not prefixdir.startswith('/')
96 error('Prefix is not absolute: "@0@"'.format(prefixdir))
98 bindir = join_paths(prefixdir, get_option('bindir'))
99 libdir = join_paths(prefixdir, get_option('libdir'))
100 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
101 includedir = join_paths(prefixdir, get_option('includedir'))
102 datadir = join_paths(prefixdir, get_option('datadir'))
103 localstatedir = join_paths('/', get_option('localstatedir'))
105 rootbindir = join_paths(rootprefixdir, 'bin')
106 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
107 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
109 rootlibdir = get_option('rootlibdir')
111 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
114 # Dirs of external packages
115 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
116 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
117 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
118 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
119 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
120 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
121 rpmmacrosdir = get_option('rpmmacrosdir')
122 if rpmmacrosdir != 'no'
123 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
125 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
128 pkgdatadir = join_paths(datadir, 'systemd')
129 environmentdir = join_paths(prefixdir, 'lib/environment.d')
130 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
131 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
132 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
133 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
134 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
135 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
136 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
137 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
138 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
139 pkgincludedir = join_paths(includedir, 'systemd')
140 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
141 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
142 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
143 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
144 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
145 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
146 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
147 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
148 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
149 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
150 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
151 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
152 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
153 factorydir = join_paths(datadir, 'factory')
154 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
155 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
156 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
157 catalogstatedir = join_paths(systemdstatedir, 'catalog')
158 randomseeddir = join_paths(localstatedir, 'lib/systemd')
159 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
161 docdir = get_option('docdir')
163 docdir = join_paths(datadir, 'doc/systemd')
166 dbuspolicydir = get_option('dbuspolicydir')
167 if dbuspolicydir == ''
168 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
171 dbussessionservicedir = get_option('dbussessionservicedir')
172 if dbussessionservicedir == ''
173 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
176 dbussystemservicedir = get_option('dbussystemservicedir')
177 if dbussystemservicedir == ''
178 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
181 pamlibdir = get_option('pamlibdir')
183 pamlibdir = join_paths(rootlibdir, 'security')
186 pamconfdir = get_option('pamconfdir')
188 pamconfdir = join_paths(sysconfdir, 'pam.d')
191 memory_accounting_default = get_option('memory-accounting-default')
192 status_unit_format_default = get_option('status-unit-format-default')
194 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
195 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
196 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
197 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
198 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
199 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
201 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
203 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
204 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
205 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
206 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
207 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
208 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
209 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
210 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
211 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
212 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
213 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
214 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
215 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
216 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
217 conf.set_quoted('ROOTPREFIX', rootprefixdir)
218 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
219 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
220 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
221 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
222 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
223 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
224 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
225 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
226 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
227 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
228 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
229 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
230 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
231 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
232 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
233 conf.set_quoted('LIBDIR', libdir)
234 conf.set_quoted('ROOTLIBDIR', rootlibdir)
235 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
236 conf.set_quoted('BOOTLIBDIR', bootlibdir)
237 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
238 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
239 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
240 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
241 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
242 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
243 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
244 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
245 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
246 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
248 substs.set('prefix', prefixdir)
249 substs.set('rootprefix', rootprefixdir)
250 substs.set('rootprefix_noslash', rootprefixdir_noslash)
251 substs.set('exec_prefix', prefixdir)
252 substs.set('libdir', libdir)
253 substs.set('rootlibdir', rootlibdir)
254 substs.set('includedir', includedir)
255 substs.set('sysconfdir', sysconfdir)
256 substs.set('bindir', bindir)
257 substs.set('rootbindir', rootbindir)
258 substs.set('rootlibexecdir', rootlibexecdir)
259 substs.set('systemunitdir', systemunitdir)
260 substs.set('userunitdir', userunitdir)
261 substs.set('systempresetdir', systempresetdir)
262 substs.set('userpresetdir', userpresetdir)
263 substs.set('udevhwdbdir', udevhwdbdir)
264 substs.set('udevrulesdir', udevrulesdir)
265 substs.set('udevlibexecdir', udevlibexecdir)
266 substs.set('environmentdir', environmentdir)
267 substs.set('catalogdir', catalogdir)
268 substs.set('tmpfilesdir', tmpfilesdir)
269 substs.set('sysusersdir', sysusersdir)
270 substs.set('sysctldir', sysctldir)
271 substs.set('binfmtdir', binfmtdir)
272 substs.set('modulesloaddir', modulesloaddir)
273 substs.set('modprobedir', modprobedir)
274 substs.set('systemgeneratordir', systemgeneratordir)
275 substs.set('usergeneratordir', usergeneratordir)
276 substs.set('systemenvgeneratordir', systemenvgeneratordir)
277 substs.set('userenvgeneratordir', userenvgeneratordir)
278 substs.set('systemshutdowndir', systemshutdowndir)
279 substs.set('systemsleepdir', systemsleepdir)
280 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
281 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
282 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
283 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
284 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
285 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
286 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
287 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
288 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
289 substs.set('BUILD_ROOT', meson.current_build_dir())
291 #####################################################################
293 cc = meson.get_compiler('c')
294 pkgconfig = import('pkgconfig')
295 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
296 meson_build_sh = find_program('tools/meson-build.sh')
298 want_tests = get_option('tests')
299 slow_tests = want_tests != 'false' and get_option('slow-tests')
300 install_tests = get_option('install-tests')
302 if add_languages('cpp', required : fuzzer_build)
303 # Used only for tests
304 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
310 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
311 if fuzzing_engine.found()
312 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
313 elif cc.has_argument('-fsanitize=fuzzer-no-link')
314 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
316 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
319 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
321 fuzzing_engine = meson.get_compiler('cpp').find_library(get_option('fuzzbuzz-engine'), dirs: get_option('fuzzbuzz-engine-dir'))
324 possible_cc_flags = [
328 '-Wmissing-include-dirs',
329 '-Wold-style-definition',
333 '-Wsuggest-attribute=noreturn',
334 '-Werror=missing-prototypes',
335 '-Werror=implicit-function-declaration',
336 '-Werror=missing-declarations',
337 '-Werror=return-type',
338 '-Werror=incompatible-pointer-types',
340 '-Wstrict-prototypes',
342 '-Wmissing-noreturn',
343 '-Wimplicit-fallthrough=5',
346 '-Wstrict-aliasing=2',
349 '-Werror=shift-count-overflow',
350 '-Werror=shift-overflow=2',
354 # negative arguments are correctly detected starting with meson 0.46.
355 '-Wno-unused-parameter',
356 '-Wno-missing-field-initializers',
357 '-Wno-unused-result',
358 '-Wno-format-signedness',
359 '-Wno-error=#warnings', # clang
360 '-Wno-string-plus-int', # clang
362 # work-around for gcc 7.1 turning this on on its own.
363 '-Wno-error=nonnull',
365 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
366 # optimizations enabled, producing essentially false positives.
367 '-Wno-maybe-uninitialized',
371 '-fdiagnostics-show-option',
372 '-fno-strict-aliasing',
373 '-fvisibility=hidden',
375 '-fstack-protector-strong',
376 '--param=ssp-buffer-size=4',
379 # --as-needed and --no-undefined are provided by meson by default,
380 # run mesonconf to see what is enabled
381 possible_link_flags = [
386 if cc.get_id() == 'clang'
387 possible_cc_flags += [
388 '-Wno-typedef-redefinition',
389 '-Wno-gnu-variable-sized-type-not-at-end',
393 if get_option('buildtype') != 'debug'
394 possible_cc_flags += [
395 '-ffunction-sections',
399 possible_link_flags += '-Wl,--gc-sections'
402 if get_option('b_ndebug') == 'true'
403 # With asserts disabled with get a bunch of warnings about variables which
404 # are used only in the asserts. This is not useful at all, so let's just silence
406 possible_cc_flags += [
407 '-Wno-unused-variable',
408 '-Wno-unused-but-set-variable',
412 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
413 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
417 #include <inttypes.h>
418 typedef uint64_t usec_t;
419 usec_t now(clockid_t clock);
424 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
425 add_project_arguments('-Werror=shadow', language : 'c')
428 cpp = ' '.join(cc.cmd_array()) + ' -E'
430 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
432 #####################################################################
433 # compilation result tests
435 conf.set('_GNU_SOURCE', true)
436 conf.set('__SANE_USERSPACE_TYPES__', true)
437 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
439 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
440 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
441 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
442 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
443 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
444 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
445 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
449 #include <sys/stat.h>
452 foreach decl : ['char16_t',
457 # We get -1 if the size cannot be determined
458 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
460 if decl == 'struct statx'
462 want_linux_stat_h = false
464 have = cc.sizeof(decl,
465 prefix : decl_headers + '#include <linux/stat.h>',
466 args : '-D_GNU_SOURCE') > 0
467 want_linux_stat_h = have
471 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
474 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
476 foreach ident : ['secure_getenv', '__secure_getenv']
477 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
481 ['memfd_create', '''#include <sys/mman.h>'''],
482 ['gettid', '''#include <sys/types.h>
483 #include <unistd.h>'''],
484 ['pivot_root', '''#include <stdlib.h>
485 #include <unistd.h>'''], # no known header declares pivot_root
486 ['name_to_handle_at', '''#include <sys/types.h>
487 #include <sys/stat.h>
488 #include <fcntl.h>'''],
489 ['setns', '''#include <sched.h>'''],
490 ['renameat2', '''#include <stdio.h>
491 #include <fcntl.h>'''],
492 ['kcmp', '''#include <linux/kcmp.h>'''],
493 ['keyctl', '''#include <sys/types.h>
494 #include <keyutils.h>'''],
495 ['copy_file_range', '''#include <sys/syscall.h>
496 #include <unistd.h>'''],
497 ['bpf', '''#include <sys/syscall.h>
498 #include <unistd.h>'''],
499 ['statx', '''#include <sys/types.h>
500 #include <sys/stat.h>
501 #include <unistd.h>'''],
502 ['explicit_bzero' , '''#include <string.h>'''],
503 ['reallocarray', '''#include <malloc.h>'''],
504 ['set_mempolicy', '''#include <stdlib.h>
505 #include <unistd.h>'''],
506 ['get_mempolicy', '''#include <stdlib.h>
507 #include <unistd.h>'''],
510 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
511 conf.set10('HAVE_' + ident[0].to_upper(), have)
514 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
515 conf.set10('USE_SYS_RANDOM_H', true)
516 conf.set10('HAVE_GETRANDOM', true)
518 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
519 conf.set10('USE_SYS_RANDOM_H', false)
520 conf.set10('HAVE_GETRANDOM', have)
523 #####################################################################
525 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
527 get_option('version-tag'),
528 meson.project_version()]
531 input : 'src/version/version.h.in',
532 output : 'version.h',
535 versiondep = declare_dependency(sources: version_h)
537 sed = find_program('sed')
538 awk = find_program('awk')
539 m4 = find_program('m4')
540 stat = find_program('stat')
541 git = find_program('git', required : false)
542 env = find_program('env')
543 perl = find_program('perl', required : false)
545 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
546 mkdir_p = 'mkdir -p $DESTDIR/@0@'
547 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
548 splash_bmp = files('test/splash.bmp')
550 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
551 # /usr/sbin, /sbin, and fall back to the default from middle column.
552 progs = [['quotaon', '/usr/sbin/quotaon' ],
553 ['quotacheck', '/usr/sbin/quotacheck' ],
554 ['kmod', '/usr/bin/kmod' ],
555 ['kexec', '/usr/sbin/kexec' ],
556 ['sulogin', '/usr/sbin/sulogin' ],
557 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
558 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
559 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
560 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
561 ['nologin', '/usr/sbin/nologin', ],
564 path = get_option(prog[0] + '-path')
566 message('Using @1@ for @0@'.format(prog[0], path))
568 exe = find_program(prog[0],
569 '/usr/sbin/' + prog[0],
572 path = exe.found() ? exe.path() : prog[1]
574 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
575 conf.set_quoted(name, path)
576 substs.set(name, path)
579 conf.set_quoted('TELINIT', get_option('telinit-path'))
581 if run_command('ln', '--relative', '--help').returncode() != 0
582 error('ln does not support --relative (added in coreutils 8.16)')
585 ############################################################
587 gperf = find_program('gperf')
589 gperf_test_format = '''
591 const char * in_word_set(const char *, @0@);
594 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
595 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
596 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
597 if cc.compiles(gperf_test)
598 gperf_len_type = 'size_t'
600 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
601 if cc.compiles(gperf_test)
602 gperf_len_type = 'unsigned'
604 error('unable to determine gperf len type')
607 message('gperf len type is @0@'.format(gperf_len_type))
608 conf.set('GPERF_LEN_TYPE', gperf_len_type,
609 description : 'The type of gperf "len" parameter')
611 ############################################################
613 if not cc.has_header('sys/capability.h')
614 error('POSIX caps headers not found')
616 foreach header : ['crypt.h',
618 'linux/vm_sockets.h',
620 'valgrind/memcheck.h',
621 'valgrind/valgrind.h',
624 conf.set10('HAVE_' + header.underscorify().to_upper(),
625 cc.has_header(header))
628 ############################################################
630 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
631 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
632 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
634 default_hierarchy = get_option('default-hierarchy')
635 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
636 description : 'default cgroup hierarchy as string')
637 if default_hierarchy == 'legacy'
638 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
639 elif default_hierarchy == 'hybrid'
640 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
642 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
645 default_net_naming_scheme = get_option('default-net-naming-scheme')
646 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
648 time_epoch = get_option('time-epoch')
651 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
653 conf.set('TIME_EPOCH', time_epoch)
655 system_uid_max = get_option('system-uid-max')
656 if system_uid_max == -1
657 system_uid_max = run_command(
659 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
660 '/etc/login.defs').stdout().strip()
661 if system_uid_max == ''
664 system_uid_max = system_uid_max.to_int()
667 conf.set('SYSTEM_UID_MAX', system_uid_max)
668 substs.set('systemuidmax', system_uid_max)
670 system_gid_max = get_option('system-gid-max')
671 if system_gid_max == -1
672 system_gid_max = run_command(
674 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
675 '/etc/login.defs').stdout().strip()
676 if system_gid_max == ''
679 system_gid_max = system_gid_max.to_int()
682 conf.set('SYSTEM_GID_MAX', system_gid_max)
683 substs.set('systemgidmax', system_gid_max)
685 dynamic_uid_min = get_option('dynamic-uid-min')
686 dynamic_uid_max = get_option('dynamic-uid-max')
687 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
688 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
689 substs.set('dynamicuidmin', dynamic_uid_min)
690 substs.set('dynamicuidmax', dynamic_uid_max)
692 container_uid_base_min = get_option('container-uid-base-min')
693 container_uid_base_max = get_option('container-uid-base-max')
694 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
695 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
696 substs.set('containeruidbasemin', container_uid_base_min)
697 substs.set('containeruidbasemax', container_uid_base_max)
699 nobody_user = get_option('nobody-user')
700 nobody_group = get_option('nobody-group')
702 if not meson.is_cross_build()
703 getent_result = run_command('getent', 'passwd', '65534')
704 if getent_result.returncode() == 0
705 name = getent_result.stdout().split(':')[0]
706 if name != nobody_user
708 '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) +
709 'Your build will result in an user table setup that is incompatible with the local system.')
712 id_result = run_command('id', '-u', nobody_user)
713 if id_result.returncode() == 0
714 id = id_result.stdout().to_int()
717 '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) +
718 'Your build will result in an user table setup that is incompatible with the local system.')
722 getent_result = run_command('getent', 'group', '65534')
723 if getent_result.returncode() == 0
724 name = getent_result.stdout().split(':')[0]
725 if name != nobody_group
727 '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) +
728 'Your build will result in an group table setup that is incompatible with the local system.')
731 id_result = run_command('id', '-g', nobody_group)
732 if id_result.returncode() == 0
733 id = id_result.stdout().to_int()
736 '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) +
737 'Your build will result in an group table setup that is incompatible with the local system.')
741 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
743 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
744 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
747 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
748 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
749 substs.set('NOBODY_USER_NAME', nobody_user)
750 substs.set('NOBODY_GROUP_NAME', nobody_group)
752 tty_gid = get_option('tty-gid')
753 conf.set('TTY_GID', tty_gid)
754 substs.set('TTY_GID', tty_gid)
756 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
757 users_gid = get_option('users-gid')
758 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
760 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
761 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
763 dev_kvm_mode = get_option('dev-kvm-mode')
764 substs.set('DEV_KVM_MODE', dev_kvm_mode)
765 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
766 group_render_mode = get_option('group-render-mode')
767 substs.set('GROUP_RENDER_MODE', group_render_mode)
768 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
770 kill_user_processes = get_option('default-kill-user-processes')
771 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
772 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
773 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
775 dns_servers = get_option('dns-servers')
776 conf.set_quoted('DNS_SERVERS', dns_servers)
777 substs.set('DNS_SERVERS', dns_servers)
779 ntp_servers = get_option('ntp-servers')
780 conf.set_quoted('NTP_SERVERS', ntp_servers)
781 substs.set('NTP_SERVERS', ntp_servers)
783 default_locale = get_option('default-locale')
784 if default_locale == ''
785 if not meson.is_cross_build()
786 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
787 default_locale = run_command(choose_default_locale_sh).stdout().strip()
789 default_locale = 'C.UTF-8'
792 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
794 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
796 substs.set('SUSHELL', get_option('debug-shell'))
797 substs.set('DEBUGTTY', get_option('debug-tty'))
798 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
800 enable_debug_hashmap = false
801 enable_debug_mmap_cache = false
802 enable_debug_siphash = false
803 foreach name : get_option('debug-extra')
805 enable_debug_hashmap = true
806 elif name == 'mmap-cache'
807 enable_debug_mmap_cache = true
808 elif name == 'siphash'
809 enable_debug_siphash = true
811 message('unknown debug option "@0@", ignoring'.format(name))
814 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
815 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
816 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
818 conf.set10('VALGRIND', get_option('valgrind'))
819 conf.set10('LOG_TRACE', get_option('log-trace'))
821 #####################################################################
823 threads = dependency('threads')
824 librt = cc.find_library('rt')
825 libm = cc.find_library('m')
826 libdl = cc.find_library('dl')
827 libcrypt = cc.find_library('crypt')
829 libcap = dependency('libcap', required : false)
830 if not libcap.found()
831 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
832 libcap = cc.find_library('cap')
835 libmount = dependency('mount',
836 version : fuzzer_build ? '>= 0' : '>= 2.30')
838 want_seccomp = get_option('seccomp')
839 if want_seccomp != 'false' and not skip_deps
840 libseccomp = dependency('libseccomp',
841 version : '>= 2.3.1',
842 required : want_seccomp == 'true')
843 have = libseccomp.found()
848 conf.set10('HAVE_SECCOMP', have)
850 want_selinux = get_option('selinux')
851 if want_selinux != 'false' and not skip_deps
852 libselinux = dependency('libselinux',
853 version : '>= 2.1.9',
854 required : want_selinux == 'true')
855 have = libselinux.found()
860 conf.set10('HAVE_SELINUX', have)
862 want_apparmor = get_option('apparmor')
863 if want_apparmor != 'false' and not skip_deps
864 libapparmor = dependency('libapparmor',
865 required : want_apparmor == 'true')
866 have = libapparmor.found()
871 conf.set10('HAVE_APPARMOR', have)
873 smack_run_label = get_option('smack-run-label')
874 if smack_run_label != ''
875 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
878 want_polkit = get_option('polkit')
879 install_polkit = false
880 install_polkit_pkla = false
881 if want_polkit != 'false' and not skip_deps
882 install_polkit = true
884 libpolkit = dependency('polkit-gobject-1',
886 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
887 message('Old polkit detected, will install pkla files')
888 install_polkit_pkla = true
891 conf.set10('ENABLE_POLKIT', install_polkit)
893 want_acl = get_option('acl')
894 if want_acl != 'false' and not skip_deps
895 libacl = cc.find_library('acl', required : want_acl == 'true')
896 have = libacl.found()
901 conf.set10('HAVE_ACL', have)
903 want_audit = get_option('audit')
904 if want_audit != 'false' and not skip_deps
905 libaudit = dependency('audit', required : want_audit == 'true')
906 have = libaudit.found()
911 conf.set10('HAVE_AUDIT', have)
913 want_blkid = get_option('blkid')
914 if want_blkid != 'false' and not skip_deps
915 libblkid = dependency('blkid', required : want_blkid == 'true')
916 have = libblkid.found()
921 conf.set10('HAVE_BLKID', have)
923 want_kmod = get_option('kmod')
924 if want_kmod != 'false' and not skip_deps
925 libkmod = dependency('libkmod',
927 required : want_kmod == 'true')
928 have = libkmod.found()
933 conf.set10('HAVE_KMOD', have)
935 want_pam = get_option('pam')
936 if want_pam != 'false' and not skip_deps
937 libpam = cc.find_library('pam', required : want_pam == 'true')
938 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
939 have = libpam.found() and libpam_misc.found()
945 conf.set10('HAVE_PAM', have)
947 want_microhttpd = get_option('microhttpd')
948 if want_microhttpd != 'false' and not skip_deps
949 libmicrohttpd = dependency('libmicrohttpd',
950 version : '>= 0.9.33',
951 required : want_microhttpd == 'true')
952 have = libmicrohttpd.found()
957 conf.set10('HAVE_MICROHTTPD', have)
959 want_libcryptsetup = get_option('libcryptsetup')
960 if want_libcryptsetup != 'false' and not skip_deps
961 libcryptsetup = dependency('libcryptsetup',
962 version : '>= 1.6.0',
963 required : want_libcryptsetup == 'true')
964 have = libcryptsetup.found()
965 have_sector = cc.has_member(
966 'struct crypt_params_plain',
968 prefix : '#include <libcryptsetup.h>')
974 conf.set10('HAVE_LIBCRYPTSETUP', have)
975 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
977 want_libcurl = get_option('libcurl')
978 if want_libcurl != 'false' and not skip_deps
979 libcurl = dependency('libcurl',
980 version : '>= 7.32.0',
981 required : want_libcurl == 'true')
982 have = libcurl.found()
987 conf.set10('HAVE_LIBCURL', have)
989 want_libidn = get_option('libidn')
990 want_libidn2 = get_option('libidn2')
991 if want_libidn == 'true' and want_libidn2 == 'true'
992 error('libidn and libidn2 cannot be requested simultaneously')
995 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
996 libidn = dependency('libidn2',
997 required : want_libidn2 == 'true')
998 have = libidn.found()
1003 conf.set10('HAVE_LIBIDN2', have)
1004 if not have and want_libidn != 'false' and not skip_deps
1005 # libidn is used for both libidn and libidn2 objects
1006 libidn = dependency('libidn',
1007 required : want_libidn == 'true')
1008 have = libidn.found()
1012 conf.set10('HAVE_LIBIDN', have)
1014 want_libiptc = get_option('libiptc')
1015 if want_libiptc != 'false' and not skip_deps
1016 libiptc = dependency('libiptc',
1017 required : want_libiptc == 'true')
1018 have = libiptc.found()
1023 conf.set10('HAVE_LIBIPTC', have)
1025 want_qrencode = get_option('qrencode')
1026 if want_qrencode != 'false' and not skip_deps
1027 libqrencode = dependency('libqrencode',
1028 required : want_qrencode == 'true')
1029 have = libqrencode.found()
1034 conf.set10('HAVE_QRENCODE', have)
1036 want_gcrypt = get_option('gcrypt')
1037 if want_gcrypt != 'false' and not skip_deps
1038 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1039 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1040 have = libgcrypt.found() and libgpg_error.found()
1045 # link to neither of the libs if one is not found
1049 conf.set10('HAVE_GCRYPT', have)
1051 want_gnutls = get_option('gnutls')
1052 if want_gnutls != 'false' and not skip_deps
1053 libgnutls = dependency('gnutls',
1054 version : '>= 3.1.4',
1055 required : want_gnutls == 'true')
1056 have = libgnutls.found()
1061 conf.set10('HAVE_GNUTLS', have)
1063 want_openssl = get_option('openssl')
1064 if want_openssl != 'false' and not skip_deps
1065 libopenssl = dependency('openssl',
1066 version : '>= 1.1.0',
1067 required : want_openssl == 'true')
1068 have = libopenssl.found()
1073 conf.set10('HAVE_OPENSSL', have)
1075 want_elfutils = get_option('elfutils')
1076 if want_elfutils != 'false' and not skip_deps
1077 libdw = dependency('libdw',
1078 required : want_elfutils == 'true')
1079 have = libdw.found()
1084 conf.set10('HAVE_ELFUTILS', have)
1086 want_zlib = get_option('zlib')
1087 if want_zlib != 'false' and not skip_deps
1088 libz = dependency('zlib',
1089 required : want_zlib == 'true')
1095 conf.set10('HAVE_ZLIB', have)
1097 want_bzip2 = get_option('bzip2')
1098 if want_bzip2 != 'false' and not skip_deps
1099 libbzip2 = cc.find_library('bz2',
1100 required : want_bzip2 == 'true')
1101 have = libbzip2.found()
1106 conf.set10('HAVE_BZIP2', have)
1108 want_xz = get_option('xz')
1109 if want_xz != 'false' and not skip_deps
1110 libxz = dependency('liblzma',
1111 required : want_xz == 'true')
1112 have = libxz.found()
1117 conf.set10('HAVE_XZ', have)
1119 want_lz4 = get_option('lz4')
1120 if want_lz4 != 'false' and not skip_deps
1121 liblz4 = dependency('liblz4',
1122 version : '>= 1.3.0',
1123 required : want_lz4 == 'true')
1124 have = liblz4.found()
1129 conf.set10('HAVE_LZ4', have)
1131 want_xkbcommon = get_option('xkbcommon')
1132 if want_xkbcommon != 'false' and not skip_deps
1133 libxkbcommon = dependency('xkbcommon',
1134 version : '>= 0.3.0',
1135 required : want_xkbcommon == 'true')
1136 have = libxkbcommon.found()
1141 conf.set10('HAVE_XKBCOMMON', have)
1143 want_pcre2 = get_option('pcre2')
1144 if want_pcre2 != 'false'
1145 libpcre2 = dependency('libpcre2-8',
1146 required : want_pcre2 == 'true')
1147 have = libpcre2.found()
1152 conf.set10('HAVE_PCRE2', have)
1154 want_glib = get_option('glib')
1155 if want_glib != 'false' and not skip_deps
1156 libglib = dependency('glib-2.0',
1157 version : '>= 2.22.0',
1158 required : want_glib == 'true')
1159 libgobject = dependency('gobject-2.0',
1160 version : '>= 2.22.0',
1161 required : want_glib == 'true')
1162 libgio = dependency('gio-2.0',
1163 required : want_glib == 'true')
1164 have = libglib.found() and libgobject.found() and libgio.found()
1171 conf.set10('HAVE_GLIB', have)
1173 want_dbus = get_option('dbus')
1174 if want_dbus != 'false' and not skip_deps
1175 libdbus = dependency('dbus-1',
1176 version : '>= 1.3.2',
1177 required : want_dbus == 'true')
1178 have = libdbus.found()
1183 conf.set10('HAVE_DBUS', have)
1185 default_dnssec = get_option('default-dnssec')
1187 default_dnssec = 'no'
1189 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1190 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1191 default_dnssec = 'no'
1193 conf.set('DEFAULT_DNSSEC_MODE',
1194 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1195 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1197 dns_over_tls = get_option('dns-over-tls')
1198 if dns_over_tls != 'false'
1199 if dns_over_tls == 'openssl'
1202 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1203 if dns_over_tls == 'gnutls' and not have_gnutls
1204 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1207 if dns_over_tls == 'gnutls' or have_gnutls
1208 have_openssl = false
1210 have_openssl = conf.get('HAVE_OPENSSL') == 1
1211 if dns_over_tls != 'auto' and not have_openssl
1212 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1213 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1216 have = have_gnutls or have_openssl
1220 have_openssl = false
1222 conf.set10('ENABLE_DNS_OVER_TLS', have)
1223 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1224 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1226 default_dns_over_tls = get_option('default-dns-over-tls')
1228 default_dns_over_tls = 'no'
1230 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1231 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.')
1232 default_dns_over_tls = 'no'
1234 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1235 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1236 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1238 want_importd = get_option('importd')
1239 if want_importd != 'false'
1240 have = (conf.get('HAVE_LIBCURL') == 1 and
1241 conf.get('HAVE_ZLIB') == 1 and
1242 conf.get('HAVE_XZ') == 1 and
1243 conf.get('HAVE_GCRYPT') == 1)
1244 if want_importd == 'true' and not have
1245 error('importd support was requested, but dependencies are not available')
1250 conf.set10('ENABLE_IMPORTD', have)
1252 want_remote = get_option('remote')
1253 if want_remote != 'false'
1254 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1255 conf.get('HAVE_LIBCURL') == 1]
1256 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1257 # it's possible to build one without the other. Complain only if
1258 # support was explicitly requested. The auxiliary files like sysusers
1259 # config should be installed when any of the programs are built.
1260 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1261 error('remote support was requested, but dependencies are not available')
1263 have = have_deps[0] or have_deps[1]
1267 conf.set10('ENABLE_REMOTE', have)
1269 foreach term : ['utmp',
1301 have = get_option(term)
1302 name = 'ENABLE_' + term.underscorify().to_upper()
1303 conf.set10(name, have)
1306 foreach tuple : [['nss-mymachines', 'machined'],
1307 ['nss-resolve', 'resolve']]
1308 want = get_option(tuple[0])
1310 have = get_option(tuple[1])
1311 if want == 'true' and not have
1312 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1317 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1318 conf.set10(name, have)
1322 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1323 'ENABLE_NSS_MYMACHINES',
1324 'ENABLE_NSS_RESOLVE',
1325 'ENABLE_NSS_SYSTEMD']
1326 if conf.get(term) == 1
1330 conf.set10('ENABLE_NSS', enable_nss)
1332 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1337 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1339 #####################################################################
1341 if get_option('efi')
1342 efi_arch = host_machine.cpu_family()
1344 if efi_arch == 'x86'
1345 EFI_MACHINE_TYPE_NAME = 'ia32'
1346 gnu_efi_arch = 'ia32'
1347 elif efi_arch == 'x86_64'
1348 EFI_MACHINE_TYPE_NAME = 'x64'
1349 gnu_efi_arch = 'x86_64'
1350 elif efi_arch == 'arm'
1351 EFI_MACHINE_TYPE_NAME = 'arm'
1352 gnu_efi_arch = 'arm'
1353 elif efi_arch == 'aarch64'
1354 EFI_MACHINE_TYPE_NAME = 'aa64'
1355 gnu_efi_arch = 'aarch64'
1357 EFI_MACHINE_TYPE_NAME = ''
1362 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1364 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1368 conf.set10('ENABLE_EFI', have)
1370 #####################################################################
1372 config_h = configure_file(
1373 output : 'config.h',
1374 configuration : conf)
1376 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1378 includes = include_directories('src/basic',
1383 'src/journal-remote',
1387 'src/time-wait-sync',
1393 'src/libsystemd/sd-bus',
1394 'src/libsystemd/sd-device',
1395 'src/libsystemd/sd-event',
1396 'src/libsystemd/sd-hwdb',
1397 'src/libsystemd/sd-id128',
1398 'src/libsystemd/sd-netlink',
1399 'src/libsystemd/sd-network',
1400 'src/libsystemd/sd-resolve',
1401 'src/libsystemd-network',
1404 add_project_arguments('-include', 'config.h', language : 'c')
1406 generate_gperfs = find_program('tools/generate-gperfs.py')
1410 subdir('src/systemd')
1412 subdir('src/libsystemd')
1413 subdir('src/libsystemd-network')
1414 subdir('src/journal')
1417 libjournal_core = static_library(
1419 libjournal_core_sources,
1421 include_directories : includes,
1424 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1425 libsystemd = shared_library(
1428 version : libsystemd_version,
1429 include_directories : includes,
1430 link_args : ['-shared',
1431 '-Wl,--version-script=' + libsystemd_sym_path],
1432 link_with : [libbasic,
1434 link_whole : [libsystemd_static,
1436 dependencies : [threads,
1440 link_depends : libsystemd_sym,
1442 install_dir : rootlibdir)
1444 static_libsystemd = get_option('static-libsystemd')
1445 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1447 install_libsystemd_static = static_library(
1450 journal_client_sources,
1452 basic_gcrypt_sources,
1454 include_directories : includes,
1455 build_by_default : static_libsystemd != 'false',
1456 install : static_libsystemd != 'false',
1457 install_dir : rootlibdir,
1458 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1459 dependencies : [threads,
1468 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1470 ############################################################
1472 # binaries that have --help and are intended for use by humans,
1473 # usually, but not always, installed in /bin.
1474 public_programs = []
1476 subdir('src/libudev')
1477 subdir('src/shared')
1479 subdir('src/shutdown')
1481 subdir('src/network')
1483 subdir('src/analyze')
1484 subdir('src/journal-remote')
1485 subdir('src/coredump')
1486 subdir('src/hostname')
1487 subdir('src/import')
1488 subdir('src/kernel-install')
1489 subdir('src/locale')
1490 subdir('src/machine')
1491 subdir('src/portable')
1492 subdir('src/nspawn')
1493 subdir('src/resolve')
1494 subdir('src/timedate')
1495 subdir('src/timesync')
1496 subdir('src/vconsole')
1497 subdir('src/boot/efi')
1504 ############################################################
1506 # only static linking apart from libdl, to make sure that the
1507 # module is linked to all libraries that it uses.
1508 test_dlopen = executable(
1512 include_directories : includes,
1513 link_with : [libbasic],
1514 dependencies : [libdl],
1515 build_by_default : want_tests != 'false')
1517 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1518 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1519 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1520 ['resolve', 'ENABLE_NSS_RESOLVE']]
1522 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1526 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1527 version_script_arg = join_paths(project_source_root, sym)
1529 nss = shared_library(
1531 'src/nss-@0@/nss-@0@.c'.format(module),
1534 include_directories : includes,
1535 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1536 link_args : ['-Wl,-z,nodelete',
1538 '-Wl,--version-script=' + version_script_arg],
1539 link_with : [libsystemd_static,
1541 dependencies : [threads,
1545 install_dir : rootlibdir)
1547 # We cannot use shared_module because it does not support version suffix.
1548 # Unfortunately shared_library insists on creating the symlink…
1549 meson.add_install_script('sh', '-c',
1550 'rm $DESTDIR@0@/libnss_@1@.so'
1551 .format(rootlibdir, module))
1553 if want_tests != 'false'
1554 test('dlopen-nss_' + module,
1556 # path to dlopen must include a slash
1557 args : nss.full_path())
1562 ############################################################
1564 executable('systemd',
1566 include_directories : includes,
1567 link_with : [libcore,
1569 dependencies : [versiondep,
1576 install_rpath : rootlibexecdir,
1578 install_dir : rootlibexecdir)
1580 meson.add_install_script(meson_make_symlink,
1581 join_paths(rootlibexecdir, 'systemd'),
1582 join_paths(rootsbindir, 'init'))
1584 exe = executable('systemd-analyze',
1585 systemd_analyze_sources,
1586 include_directories : includes,
1587 link_with : [libcore,
1589 dependencies : [versiondep,
1596 install_rpath : rootlibexecdir,
1598 public_programs += exe
1600 executable('systemd-journald',
1601 systemd_journald_sources,
1602 include_directories : includes,
1603 link_with : [libjournal_core,
1605 dependencies : [threads,
1609 install_rpath : rootlibexecdir,
1611 install_dir : rootlibexecdir)
1613 exe = executable('systemd-cat',
1614 systemd_cat_sources,
1615 include_directories : includes,
1616 link_with : [libjournal_core,
1618 dependencies : [threads],
1619 install_rpath : rootlibexecdir,
1621 public_programs += exe
1623 exe = executable('journalctl',
1625 include_directories : includes,
1626 link_with : [libshared],
1627 dependencies : [threads,
1632 install_rpath : rootlibexecdir,
1634 install_dir : rootbindir)
1635 public_programs += exe
1637 executable('systemd-getty-generator',
1638 'src/getty-generator/getty-generator.c',
1639 include_directories : includes,
1640 link_with : [libshared],
1641 install_rpath : rootlibexecdir,
1643 install_dir : systemgeneratordir)
1645 executable('systemd-debug-generator',
1646 'src/debug-generator/debug-generator.c',
1647 include_directories : includes,
1648 link_with : [libshared],
1649 install_rpath : rootlibexecdir,
1651 install_dir : systemgeneratordir)
1653 executable('systemd-run-generator',
1654 'src/run-generator/run-generator.c',
1655 include_directories : includes,
1656 link_with : [libshared],
1657 install_rpath : rootlibexecdir,
1659 install_dir : systemgeneratordir)
1661 executable('systemd-fstab-generator',
1662 'src/fstab-generator/fstab-generator.c',
1663 include_directories : includes,
1664 link_with : [libcore_shared,
1666 install_rpath : rootlibexecdir,
1668 install_dir : systemgeneratordir)
1670 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1671 executable('30-systemd-environment-d-generator',
1672 'src/environment-d-generator/environment-d-generator.c',
1673 include_directories : includes,
1674 link_with : [libshared],
1675 install_rpath : rootlibexecdir,
1677 install_dir : userenvgeneratordir)
1679 meson.add_install_script(meson_make_symlink,
1680 join_paths(sysconfdir, 'environment'),
1681 join_paths(environmentdir, '99-environment.conf'))
1684 if conf.get('ENABLE_HIBERNATE') == 1
1685 executable('systemd-hibernate-resume-generator',
1686 'src/hibernate-resume/hibernate-resume-generator.c',
1687 include_directories : includes,
1688 link_with : [libshared],
1689 install_rpath : rootlibexecdir,
1691 install_dir : systemgeneratordir)
1693 executable('systemd-hibernate-resume',
1694 'src/hibernate-resume/hibernate-resume.c',
1695 include_directories : includes,
1696 link_with : [libshared],
1697 install_rpath : rootlibexecdir,
1699 install_dir : rootlibexecdir)
1702 if conf.get('HAVE_BLKID') == 1
1703 executable('systemd-gpt-auto-generator',
1704 'src/gpt-auto-generator/gpt-auto-generator.c',
1705 'src/shared/blkid-util.h',
1706 include_directories : includes,
1707 link_with : [libshared],
1708 dependencies : libblkid,
1709 install_rpath : rootlibexecdir,
1711 install_dir : systemgeneratordir)
1713 exe = executable('systemd-dissect',
1714 'src/dissect/dissect.c',
1715 include_directories : includes,
1716 link_with : [libshared],
1717 install_rpath : rootlibexecdir,
1719 install_dir : rootlibexecdir)
1720 public_programs += exe
1723 if conf.get('ENABLE_RESOLVE') == 1
1724 executable('systemd-resolved',
1725 systemd_resolved_sources,
1726 include_directories : includes,
1727 link_with : [libshared,
1729 libsystemd_resolve_core],
1730 dependencies : systemd_resolved_dependencies,
1731 install_rpath : rootlibexecdir,
1733 install_dir : rootlibexecdir)
1735 exe = executable('resolvectl',
1737 include_directories : includes,
1738 link_with : [libshared,
1740 libsystemd_resolve_core],
1741 dependencies : [threads,
1745 install_rpath : rootlibexecdir,
1747 public_programs += exe
1749 meson.add_install_script(meson_make_symlink,
1750 join_paths(bindir, 'resolvectl'),
1751 join_paths(rootsbindir, 'resolvconf'))
1753 meson.add_install_script(meson_make_symlink,
1754 join_paths(bindir, 'resolvectl'),
1755 join_paths(bindir, 'systemd-resolve'))
1758 if conf.get('ENABLE_LOGIND') == 1
1759 executable('systemd-logind',
1760 systemd_logind_sources,
1761 include_directories : includes,
1762 link_with : [liblogind_core,
1764 dependencies : [threads,
1766 install_rpath : rootlibexecdir,
1768 install_dir : rootlibexecdir)
1770 exe = executable('loginctl',
1772 include_directories : includes,
1773 link_with : [libshared],
1774 dependencies : [threads,
1777 install_rpath : rootlibexecdir,
1779 install_dir : rootbindir)
1780 public_programs += exe
1782 exe = executable('systemd-inhibit',
1783 'src/login/inhibit.c',
1784 include_directories : includes,
1785 link_with : [libshared],
1786 install_rpath : rootlibexecdir,
1788 install_dir : rootbindir)
1789 public_programs += exe
1791 if conf.get('HAVE_PAM') == 1
1792 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1793 pam_systemd = shared_library(
1797 include_directories : includes,
1798 link_args : ['-shared',
1799 '-Wl,--version-script=' + version_script_arg],
1800 link_with : [libsystemd_static,
1802 dependencies : [threads,
1805 link_depends : pam_systemd_sym,
1807 install_dir : pamlibdir)
1809 if want_tests != 'false'
1810 test('dlopen-pam_systemd',
1812 # path to dlopen must include a slash
1813 args : pam_systemd.full_path())
1817 executable('systemd-user-runtime-dir',
1818 user_runtime_dir_sources,
1819 include_directories : includes,
1820 link_with : [libshared],
1821 install_rpath : rootlibexecdir,
1823 install_dir : rootlibexecdir)
1826 if conf.get('HAVE_PAM') == 1
1827 executable('systemd-user-sessions',
1828 'src/user-sessions/user-sessions.c',
1829 include_directories : includes,
1830 link_with : [libshared],
1831 install_rpath : rootlibexecdir,
1833 install_dir : rootlibexecdir)
1836 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1837 exe = executable('bootctl',
1838 'src/boot/bootctl.c',
1839 include_directories : includes,
1840 link_with : [libshared],
1841 dependencies : [libblkid],
1842 install_rpath : rootlibexecdir,
1844 public_programs += exe
1846 executable('systemd-bless-boot',
1847 'src/boot/bless-boot.c',
1848 include_directories : includes,
1849 link_with : [libshared],
1850 dependencies : [libblkid],
1851 install_rpath : rootlibexecdir,
1853 install_dir : rootlibexecdir)
1855 executable('systemd-bless-boot-generator',
1856 'src/boot/bless-boot-generator.c',
1857 include_directories : includes,
1858 link_with : [libshared],
1859 install_rpath : rootlibexecdir,
1861 install_dir : systemgeneratordir)
1864 executable('systemd-boot-check-no-failures',
1865 'src/boot/boot-check-no-failures.c',
1866 include_directories : includes,
1867 link_with : [libshared],
1868 dependencies : [libblkid],
1869 install_rpath : rootlibexecdir,
1871 install_dir : rootlibexecdir)
1873 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1874 include_directories : includes,
1875 link_with : [libshared],
1876 dependencies : [threads],
1877 install_rpath : rootlibexecdir,
1879 public_programs += exe
1882 if get_option('link-systemctl-shared')
1883 systemctl_link_with = [libshared]
1885 systemctl_link_with = [libsystemd_static,
1891 exe = executable('systemctl',
1892 'src/systemctl/systemctl.c',
1893 'src/systemctl/sysv-compat.h',
1894 'src/systemctl/sysv-compat.c',
1895 include_directories : includes,
1896 link_with : systemctl_link_with,
1897 dependencies : [threads,
1902 install_rpath : rootlibexecdir,
1904 install_dir : rootbindir)
1905 public_programs += exe
1907 if conf.get('ENABLE_PORTABLED') == 1
1908 executable('systemd-portabled',
1909 systemd_portabled_sources,
1910 include_directories : includes,
1911 link_with : [libshared],
1912 dependencies : [threads],
1913 install_rpath : rootlibexecdir,
1915 install_dir : rootlibexecdir)
1917 exe = executable('portablectl', 'src/portable/portablectl.c',
1918 include_directories : includes,
1919 link_with : [libshared],
1920 dependencies : [threads],
1921 install_rpath : rootlibexecdir,
1923 install_dir : rootbindir)
1924 public_programs += exe
1927 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1928 meson.add_install_script(meson_make_symlink,
1929 join_paths(rootbindir, 'systemctl'),
1930 join_paths(rootsbindir, alias))
1933 if conf.get('ENABLE_BACKLIGHT') == 1
1934 executable('systemd-backlight',
1935 'src/backlight/backlight.c',
1936 include_directories : includes,
1937 link_with : [libshared],
1938 install_rpath : rootlibexecdir,
1940 install_dir : rootlibexecdir)
1943 if conf.get('ENABLE_RFKILL') == 1
1944 executable('systemd-rfkill',
1945 'src/rfkill/rfkill.c',
1946 include_directories : includes,
1947 link_with : [libshared],
1948 install_rpath : rootlibexecdir,
1950 install_dir : rootlibexecdir)
1953 executable('systemd-system-update-generator',
1954 'src/system-update-generator/system-update-generator.c',
1955 include_directories : includes,
1956 link_with : [libshared],
1957 install_rpath : rootlibexecdir,
1959 install_dir : systemgeneratordir)
1961 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1962 executable('systemd-cryptsetup',
1963 'src/cryptsetup/cryptsetup.c',
1964 include_directories : includes,
1965 link_with : [libshared],
1966 dependencies : [libcryptsetup],
1967 install_rpath : rootlibexecdir,
1969 install_dir : rootlibexecdir)
1971 executable('systemd-cryptsetup-generator',
1972 'src/cryptsetup/cryptsetup-generator.c',
1973 include_directories : includes,
1974 link_with : [libshared],
1975 dependencies : [libcryptsetup],
1976 install_rpath : rootlibexecdir,
1978 install_dir : systemgeneratordir)
1980 executable('systemd-veritysetup',
1981 'src/veritysetup/veritysetup.c',
1982 include_directories : includes,
1983 link_with : [libshared],
1984 dependencies : [libcryptsetup],
1985 install_rpath : rootlibexecdir,
1987 install_dir : rootlibexecdir)
1989 executable('systemd-veritysetup-generator',
1990 'src/veritysetup/veritysetup-generator.c',
1991 include_directories : includes,
1992 link_with : [libshared],
1993 dependencies : [libcryptsetup],
1994 install_rpath : rootlibexecdir,
1996 install_dir : systemgeneratordir)
1999 if conf.get('HAVE_SYSV_COMPAT') == 1
2000 executable('systemd-sysv-generator',
2001 'src/sysv-generator/sysv-generator.c',
2002 include_directories : includes,
2003 link_with : [libshared],
2004 install_rpath : rootlibexecdir,
2006 install_dir : systemgeneratordir)
2008 executable('systemd-rc-local-generator',
2009 'src/rc-local-generator/rc-local-generator.c',
2010 include_directories : includes,
2011 link_with : [libshared],
2012 install_rpath : rootlibexecdir,
2014 install_dir : systemgeneratordir)
2017 if conf.get('ENABLE_HOSTNAMED') == 1
2018 executable('systemd-hostnamed',
2019 'src/hostname/hostnamed.c',
2020 include_directories : includes,
2021 link_with : [libshared],
2022 install_rpath : rootlibexecdir,
2024 install_dir : rootlibexecdir)
2026 exe = executable('hostnamectl',
2027 'src/hostname/hostnamectl.c',
2028 include_directories : includes,
2029 link_with : [libshared],
2030 install_rpath : rootlibexecdir,
2032 public_programs += exe
2035 if conf.get('ENABLE_LOCALED') == 1
2036 if conf.get('HAVE_XKBCOMMON') == 1
2037 # logind will load libxkbcommon.so dynamically on its own
2043 executable('systemd-localed',
2044 systemd_localed_sources,
2045 include_directories : includes,
2046 link_with : [libshared],
2047 dependencies : deps,
2048 install_rpath : rootlibexecdir,
2050 install_dir : rootlibexecdir)
2052 exe = executable('localectl',
2054 include_directories : includes,
2055 link_with : [libshared],
2056 install_rpath : rootlibexecdir,
2058 public_programs += exe
2061 if conf.get('ENABLE_TIMEDATED') == 1
2062 executable('systemd-timedated',
2063 'src/timedate/timedated.c',
2064 include_directories : includes,
2065 link_with : [libshared],
2066 install_rpath : rootlibexecdir,
2068 install_dir : rootlibexecdir)
2071 if conf.get('ENABLE_TIMEDATECTL') == 1
2072 exe = executable('timedatectl',
2073 'src/timedate/timedatectl.c',
2074 include_directories : includes,
2075 install_rpath : rootlibexecdir,
2076 link_with : [libshared],
2077 dependencies : [libm],
2079 public_programs += exe
2082 if conf.get('ENABLE_TIMESYNCD') == 1
2083 executable('systemd-timesyncd',
2084 systemd_timesyncd_sources,
2085 include_directories : includes,
2086 link_with : [libshared],
2087 dependencies : [threads,
2089 install_rpath : rootlibexecdir,
2091 install_dir : rootlibexecdir)
2093 executable('systemd-time-wait-sync',
2094 'src/time-wait-sync/time-wait-sync.c',
2095 include_directories : includes,
2096 link_with : [libshared],
2097 install_rpath : rootlibexecdir,
2099 install_dir : rootlibexecdir)
2102 if conf.get('ENABLE_MACHINED') == 1
2103 executable('systemd-machined',
2104 systemd_machined_sources,
2105 include_directories : includes,
2106 link_with : [libmachine_core,
2108 install_rpath : rootlibexecdir,
2110 install_dir : rootlibexecdir)
2112 exe = executable('machinectl',
2113 'src/machine/machinectl.c',
2114 include_directories : includes,
2115 link_with : [libshared],
2116 dependencies : [threads,
2119 install_rpath : rootlibexecdir,
2121 install_dir : rootbindir)
2122 public_programs += exe
2125 if conf.get('ENABLE_IMPORTD') == 1
2126 executable('systemd-importd',
2127 systemd_importd_sources,
2128 include_directories : includes,
2129 link_with : [libshared],
2130 dependencies : [threads],
2131 install_rpath : rootlibexecdir,
2133 install_dir : rootlibexecdir)
2135 systemd_pull = executable('systemd-pull',
2136 systemd_pull_sources,
2137 include_directories : includes,
2138 link_with : [libshared],
2139 dependencies : [versiondep,
2145 install_rpath : rootlibexecdir,
2147 install_dir : rootlibexecdir)
2149 systemd_import = executable('systemd-import',
2150 systemd_import_sources,
2151 include_directories : includes,
2152 link_with : [libshared],
2153 dependencies : [libcurl,
2157 install_rpath : rootlibexecdir,
2159 install_dir : rootlibexecdir)
2161 systemd_import_fs = executable('systemd-import-fs',
2162 systemd_import_fs_sources,
2163 include_directories : includes,
2164 link_with : [libshared],
2165 install_rpath : rootlibexecdir,
2167 install_dir : rootlibexecdir)
2169 systemd_export = executable('systemd-export',
2170 systemd_export_sources,
2171 include_directories : includes,
2172 link_with : [libshared],
2173 dependencies : [libcurl,
2177 install_rpath : rootlibexecdir,
2179 install_dir : rootlibexecdir)
2181 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2184 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2185 exe = executable('systemd-journal-upload',
2186 systemd_journal_upload_sources,
2187 include_directories : includes,
2188 link_with : [libshared],
2189 dependencies : [versiondep,
2195 install_rpath : rootlibexecdir,
2197 install_dir : rootlibexecdir)
2198 public_programs += exe
2201 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2202 s_j_remote = executable('systemd-journal-remote',
2203 systemd_journal_remote_sources,
2204 include_directories : includes,
2205 link_with : [libshared,
2206 libsystemd_journal_remote],
2207 dependencies : [threads,
2212 install_rpath : rootlibexecdir,
2214 install_dir : rootlibexecdir)
2216 s_j_gatewayd = executable('systemd-journal-gatewayd',
2217 systemd_journal_gatewayd_sources,
2218 include_directories : includes,
2219 link_with : [libshared],
2220 dependencies : [threads,
2225 install_rpath : rootlibexecdir,
2227 install_dir : rootlibexecdir)
2228 public_programs += [s_j_remote, s_j_gatewayd]
2231 if conf.get('ENABLE_COREDUMP') == 1
2232 executable('systemd-coredump',
2233 systemd_coredump_sources,
2234 include_directories : includes,
2235 link_with : [libshared],
2236 dependencies : [threads,
2241 install_rpath : rootlibexecdir,
2243 install_dir : rootlibexecdir)
2245 exe = executable('coredumpctl',
2246 coredumpctl_sources,
2247 include_directories : includes,
2248 link_with : [libshared],
2249 dependencies : [threads,
2252 install_rpath : rootlibexecdir,
2254 public_programs += exe
2257 if conf.get('ENABLE_BINFMT') == 1
2258 exe = executable('systemd-binfmt',
2259 'src/binfmt/binfmt.c',
2260 include_directories : includes,
2261 link_with : [libshared],
2262 install_rpath : rootlibexecdir,
2264 install_dir : rootlibexecdir)
2265 public_programs += exe
2267 meson.add_install_script('sh', '-c',
2268 mkdir_p.format(binfmtdir))
2269 meson.add_install_script('sh', '-c',
2270 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2273 if conf.get('ENABLE_VCONSOLE') == 1
2274 executable('systemd-vconsole-setup',
2275 'src/vconsole/vconsole-setup.c',
2276 include_directories : includes,
2277 link_with : [libshared],
2278 install_rpath : rootlibexecdir,
2280 install_dir : rootlibexecdir)
2283 if conf.get('ENABLE_RANDOMSEED') == 1
2284 executable('systemd-random-seed',
2285 'src/random-seed/random-seed.c',
2286 include_directories : includes,
2287 link_with : [libshared],
2288 install_rpath : rootlibexecdir,
2290 install_dir : rootlibexecdir)
2293 if conf.get('ENABLE_FIRSTBOOT') == 1
2294 executable('systemd-firstboot',
2295 'src/firstboot/firstboot.c',
2296 include_directories : includes,
2297 link_with : [libshared],
2298 dependencies : [libcrypt],
2299 install_rpath : rootlibexecdir,
2301 install_dir : rootbindir)
2304 executable('systemd-remount-fs',
2305 'src/remount-fs/remount-fs.c',
2306 include_directories : includes,
2307 link_with : [libcore_shared,
2309 install_rpath : rootlibexecdir,
2311 install_dir : rootlibexecdir)
2313 executable('systemd-machine-id-setup',
2314 'src/machine-id-setup/machine-id-setup-main.c',
2315 include_directories : includes,
2316 link_with : [libcore_shared,
2318 install_rpath : rootlibexecdir,
2320 install_dir : rootbindir)
2322 executable('systemd-fsck',
2324 include_directories : includes,
2325 link_with : [libshared],
2326 install_rpath : rootlibexecdir,
2328 install_dir : rootlibexecdir)
2330 executable('systemd-growfs',
2331 'src/partition/growfs.c',
2332 include_directories : includes,
2333 link_with : [libshared],
2334 dependencies : [libcryptsetup],
2335 install_rpath : rootlibexecdir,
2337 install_dir : rootlibexecdir)
2339 executable('systemd-makefs',
2340 'src/partition/makefs.c',
2341 include_directories : includes,
2342 link_with : [libshared],
2343 install_rpath : rootlibexecdir,
2345 install_dir : rootlibexecdir)
2347 executable('systemd-sleep',
2348 'src/sleep/sleep.c',
2349 include_directories : includes,
2350 link_with : [libshared],
2351 install_rpath : rootlibexecdir,
2353 install_dir : rootlibexecdir)
2355 install_data('src/sleep/sleep.conf',
2356 install_dir : pkgsysconfdir)
2358 exe = executable('systemd-sysctl',
2359 'src/sysctl/sysctl.c',
2360 include_directories : includes,
2361 link_with : [libshared],
2362 install_rpath : rootlibexecdir,
2364 install_dir : rootlibexecdir)
2365 public_programs += exe
2367 executable('systemd-ac-power',
2368 'src/ac-power/ac-power.c',
2369 include_directories : includes,
2370 link_with : [libshared],
2371 install_rpath : rootlibexecdir,
2373 install_dir : rootlibexecdir)
2375 exe = executable('systemd-detect-virt',
2376 'src/detect-virt/detect-virt.c',
2377 include_directories : includes,
2378 link_with : [libshared],
2379 install_rpath : rootlibexecdir,
2381 public_programs += exe
2383 exe = executable('systemd-delta',
2384 'src/delta/delta.c',
2385 include_directories : includes,
2386 link_with : [libshared],
2387 install_rpath : rootlibexecdir,
2389 public_programs += exe
2391 exe = executable('systemd-escape',
2392 'src/escape/escape.c',
2393 include_directories : includes,
2394 link_with : [libshared],
2395 install_rpath : rootlibexecdir,
2397 install_dir : rootbindir)
2398 public_programs += exe
2400 exe = executable('systemd-notify',
2401 'src/notify/notify.c',
2402 include_directories : includes,
2403 link_with : [libshared],
2404 install_rpath : rootlibexecdir,
2406 install_dir : rootbindir)
2407 public_programs += exe
2409 executable('systemd-volatile-root',
2410 'src/volatile-root/volatile-root.c',
2411 include_directories : includes,
2412 link_with : [libshared],
2413 install_rpath : rootlibexecdir,
2415 install_dir : rootlibexecdir)
2417 executable('systemd-cgroups-agent',
2418 'src/cgroups-agent/cgroups-agent.c',
2419 include_directories : includes,
2420 link_with : [libshared],
2421 install_rpath : rootlibexecdir,
2423 install_dir : rootlibexecdir)
2425 exe = executable('systemd-id128',
2426 'src/id128/id128.c',
2427 include_directories : includes,
2428 link_with : [libshared],
2429 install_rpath : rootlibexecdir,
2431 public_programs += exe
2433 exe = executable('systemd-path',
2435 include_directories : includes,
2436 link_with : [libshared],
2437 install_rpath : rootlibexecdir,
2439 public_programs += exe
2441 exe = executable('systemd-ask-password',
2442 'src/ask-password/ask-password.c',
2443 include_directories : includes,
2444 link_with : [libshared],
2445 install_rpath : rootlibexecdir,
2447 install_dir : rootbindir)
2448 public_programs += exe
2450 executable('systemd-reply-password',
2451 'src/reply-password/reply-password.c',
2452 include_directories : includes,
2453 link_with : [libshared],
2454 install_rpath : rootlibexecdir,
2456 install_dir : rootlibexecdir)
2458 exe = executable('systemd-tty-ask-password-agent',
2459 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2460 include_directories : includes,
2461 link_with : [libshared],
2462 install_rpath : rootlibexecdir,
2464 install_dir : rootbindir)
2465 public_programs += exe
2467 exe = executable('systemd-cgls',
2469 include_directories : includes,
2470 link_with : [libshared],
2471 install_rpath : rootlibexecdir,
2473 public_programs += exe
2475 exe = executable('systemd-cgtop',
2476 'src/cgtop/cgtop.c',
2477 include_directories : includes,
2478 link_with : [libshared],
2479 install_rpath : rootlibexecdir,
2481 public_programs += exe
2483 executable('systemd-initctl',
2484 'src/initctl/initctl.c',
2485 include_directories : includes,
2486 link_with : [libshared],
2487 install_rpath : rootlibexecdir,
2489 install_dir : rootlibexecdir)
2491 exe = executable('systemd-mount',
2492 'src/mount/mount-tool.c',
2493 include_directories : includes,
2494 link_with : [libshared],
2495 dependencies: [libmount],
2496 install_rpath : rootlibexecdir,
2498 public_programs += exe
2500 meson.add_install_script(meson_make_symlink,
2501 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2503 exe = executable('systemd-run',
2505 include_directories : includes,
2506 link_with : [libshared],
2507 install_rpath : rootlibexecdir,
2509 public_programs += exe
2511 exe = executable('systemd-stdio-bridge',
2512 'src/stdio-bridge/stdio-bridge.c',
2513 include_directories : includes,
2514 link_with : [libshared],
2515 dependencies : [versiondep],
2516 install_rpath : rootlibexecdir,
2518 public_programs += exe
2520 exe = executable('busctl',
2521 'src/busctl/busctl.c',
2522 'src/busctl/busctl-introspect.c',
2523 'src/busctl/busctl-introspect.h',
2524 include_directories : includes,
2525 link_with : [libshared],
2526 install_rpath : rootlibexecdir,
2528 public_programs += exe
2530 if conf.get('ENABLE_SYSUSERS') == 1
2531 exe = executable('systemd-sysusers',
2532 'src/sysusers/sysusers.c',
2533 include_directories : includes,
2534 link_with : [libshared],
2535 install_rpath : rootlibexecdir,
2537 install_dir : rootbindir)
2538 public_programs += exe
2541 if conf.get('ENABLE_TMPFILES') == 1
2542 exe = executable('systemd-tmpfiles',
2543 'src/tmpfiles/tmpfiles.c',
2544 include_directories : includes,
2545 link_with : [libshared],
2546 dependencies : [libacl],
2547 install_rpath : rootlibexecdir,
2549 install_dir : rootbindir)
2550 public_programs += exe
2552 if want_tests != 'false'
2553 test('test-systemd-tmpfiles',
2554 test_systemd_tmpfiles_py,
2555 # https://github.com/mesonbuild/meson/issues/2681
2556 args : exe.full_path())
2560 if conf.get('ENABLE_HWDB') == 1
2561 exe = executable('systemd-hwdb',
2563 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2564 include_directories : includes,
2565 link_with : [libudev_static],
2566 install_rpath : udev_rpath,
2568 install_dir : rootbindir)
2569 public_programs += exe
2572 if conf.get('ENABLE_QUOTACHECK') == 1
2573 executable('systemd-quotacheck',
2574 'src/quotacheck/quotacheck.c',
2575 include_directories : includes,
2576 link_with : [libshared],
2577 install_rpath : rootlibexecdir,
2579 install_dir : rootlibexecdir)
2582 exe = executable('systemd-socket-proxyd',
2583 'src/socket-proxy/socket-proxyd.c',
2584 include_directories : includes,
2585 link_with : [libshared],
2586 dependencies : [threads],
2587 install_rpath : rootlibexecdir,
2589 install_dir : rootlibexecdir)
2590 public_programs += exe
2592 exe = executable('systemd-udevd',
2593 systemd_udevd_sources,
2594 include_directories : includes,
2595 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2596 link_with : [libudev_core,
2599 dependencies : [versiondep,
2605 install_rpath : udev_rpath,
2607 install_dir : rootlibexecdir)
2608 public_programs += exe
2610 exe = executable('udevadm',
2612 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2613 include_directories : includes,
2614 link_with : [libudev_core,
2617 dependencies : [versiondep,
2623 install_rpath : udev_rpath,
2625 install_dir : rootbindir)
2626 public_programs += exe
2628 executable('systemd-shutdown',
2629 systemd_shutdown_sources,
2630 include_directories : includes,
2631 link_with : [libcore_shared,
2633 dependencies : [libmount],
2634 install_rpath : rootlibexecdir,
2636 install_dir : rootlibexecdir)
2638 executable('systemd-update-done',
2639 'src/update-done/update-done.c',
2640 include_directories : includes,
2641 link_with : [libshared],
2642 install_rpath : rootlibexecdir,
2644 install_dir : rootlibexecdir)
2646 executable('systemd-update-utmp',
2647 'src/update-utmp/update-utmp.c',
2648 include_directories : includes,
2649 link_with : [libshared],
2650 dependencies : [libaudit],
2651 install_rpath : rootlibexecdir,
2653 install_dir : rootlibexecdir)
2655 if conf.get('HAVE_KMOD') == 1
2656 executable('systemd-modules-load',
2657 'src/modules-load/modules-load.c',
2658 include_directories : includes,
2659 link_with : [libshared],
2660 dependencies : [libkmod],
2661 install_rpath : rootlibexecdir,
2663 install_dir : rootlibexecdir)
2665 meson.add_install_script('sh', '-c',
2666 mkdir_p.format(modulesloaddir))
2667 meson.add_install_script('sh', '-c',
2668 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2671 exe = executable('systemd-nspawn',
2672 systemd_nspawn_sources,
2673 include_directories : includes,
2674 link_with : [libcore_shared,
2677 dependencies : [libblkid,
2679 install_rpath : rootlibexecdir,
2681 public_programs += exe
2683 if conf.get('ENABLE_NETWORKD') == 1
2684 executable('systemd-networkd',
2685 systemd_networkd_sources,
2686 include_directories : includes,
2687 link_with : [libnetworkd_core,
2691 dependencies : [threads],
2692 install_rpath : rootlibexecdir,
2694 install_dir : rootlibexecdir)
2696 executable('systemd-networkd-wait-online',
2697 systemd_networkd_wait_online_sources,
2698 include_directories : includes,
2699 link_with : [libnetworkd_core,
2701 install_rpath : rootlibexecdir,
2703 install_dir : rootlibexecdir)
2705 exe = executable('networkctl',
2707 include_directories : includes,
2708 link_with : [libsystemd_network,
2710 install_rpath : rootlibexecdir,
2712 install_dir : rootbindir)
2713 public_programs += exe
2715 executable('systemd-network-generator',
2716 network_generator_sources,
2717 include_directories : includes,
2718 link_with : [libshared],
2719 install_rpath : rootlibexecdir,
2721 install_dir : rootlibexecdir)
2724 executable('systemd-sulogin-shell',
2725 ['src/sulogin-shell/sulogin-shell.c'],
2726 include_directories : includes,
2727 link_with : [libshared],
2728 install_rpath : rootlibexecdir,
2730 install_dir : rootlibexecdir)
2732 ############################################################
2735 'systemd-runtest.env',
2736 output : 'systemd-runtest.env',
2737 command : ['sh', '-c', '{ ' +
2738 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2739 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2741 build_by_default : true)
2743 foreach tuple : tests
2745 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2746 dependencies = tuple[2]
2747 condition = tuple.length() >= 4 ? tuple[3] : ''
2748 type = tuple.length() >= 5 ? tuple[4] : ''
2749 defs = tuple.length() >= 6 ? tuple[5] : []
2750 incs = tuple.length() >= 7 ? tuple[6] : includes
2753 name = sources[0].split('/')[-1].split('.')[0]
2754 if type.startswith('timeout=')
2755 timeout = type.split('=')[1].to_int()
2759 if condition == '' or conf.get(condition) == 1
2763 include_directories : incs,
2764 link_with : link_with,
2765 dependencies : [versiondep,
2768 build_by_default : want_tests != 'false',
2769 install_rpath : rootlibexecdir,
2770 install : install_tests,
2771 install_dir : join_paths(testsdir, type))
2774 message('@0@ is a manual test'.format(name))
2775 elif type == 'unsafe' and want_tests != 'unsafe'
2776 message('@0@ is an unsafe test'.format(name))
2777 elif want_tests != 'false'
2783 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2788 'test-libsystemd-sym',
2789 test_libsystemd_sym_c,
2790 include_directories : includes,
2791 link_with : [libsystemd],
2792 build_by_default : want_tests != 'false',
2793 install : install_tests,
2794 install_dir : testsdir)
2795 if want_tests != 'false'
2796 test('test-libsystemd-sym', exe)
2800 'test-libsystemd-static-sym',
2801 test_libsystemd_sym_c,
2802 include_directories : includes,
2803 link_with : [install_libsystemd_static],
2804 dependencies : [threads], # threads is already included in dependencies on the library,
2805 # but does not seem to get propagated. Add here as a work-around.
2806 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2807 install : install_tests and static_libsystemd_pic,
2808 install_dir : testsdir)
2809 if want_tests != 'false' and static_libsystemd_pic
2810 test('test-libsystemd-static-sym', exe)
2816 include_directories : includes,
2817 c_args : '-Wno-deprecated-declarations',
2818 link_with : [libudev],
2819 build_by_default : want_tests != 'false',
2820 install : install_tests,
2821 install_dir : testsdir)
2822 if want_tests != 'false'
2823 test('test-libudev-sym', exe)
2827 'test-libudev-static-sym',
2829 include_directories : includes,
2830 c_args : '-Wno-deprecated-declarations',
2831 link_with : [install_libudev_static],
2832 build_by_default : want_tests != 'false' and static_libudev_pic,
2833 install : install_tests and static_libudev_pic,
2834 install_dir : testsdir)
2835 if want_tests != 'false' and static_libudev_pic
2836 test('test-libudev-static-sym', exe)
2839 ############################################################
2843 if get_option('tests') != 'false'
2844 foreach tuple : fuzzers
2846 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2847 dependencies = tuple[2]
2848 defs = tuple.length() >= 4 ? tuple[3] : []
2849 incs = tuple.length() >= 5 ? tuple[4] : includes
2852 if want_ossfuzz or want_fuzzbuzz
2853 dependencies += fuzzing_engine
2855 if fuzzing_engine.found()
2856 dependencies += fuzzing_engine
2858 link_args += ['-fsanitize=fuzzer']
2861 sources += 'src/fuzz/fuzz-main.c'
2865 sources += 'src/fuzz/fuzzer-entry-point.c'
2868 name = sources[0].split('/')[-1].split('.')[0]
2870 fuzzer_exes += executable(
2873 include_directories : [incs, include_directories('src/fuzz')],
2874 link_with : link_with,
2875 dependencies : dependencies,
2877 link_args: link_args,
2882 run_target('fuzzers',
2883 depends : fuzzer_exes,
2886 ############################################################
2888 make_directive_index_py = find_program('tools/make-directive-index.py')
2889 make_man_index_py = find_program('tools/make-man-index.py')
2890 xml_helper_py = find_program('tools/xml_helper.py')
2891 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2895 subdir('sysusers.d')
2896 subdir('tmpfiles.d')
2901 subdir('shell-completion/bash')
2902 subdir('shell-completion/zsh')
2903 subdir('docs/sysvinit')
2904 subdir('docs/var-log')
2906 install_subdir('factory/etc',
2907 install_dir : factorydir)
2909 install_data('xorg/50-systemd-user.sh',
2910 install_dir : xinitrcdir)
2911 install_data('modprobe.d/systemd.conf',
2912 install_dir : modprobedir)
2913 install_data('LICENSE.GPL2',
2917 'docs/CODING_STYLE.md',
2918 'docs/DISTRO_PORTING.md',
2919 'docs/ENVIRONMENT.md',
2921 'docs/TRANSIENT-SETTINGS.md',
2922 'docs/TRANSLATORS.md',
2923 'docs/UIDS-GIDS.md',
2924 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2925 install_dir : docdir)
2927 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2928 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2930 ############################################################
2932 meson_check_help = find_program('tools/meson-check-help.sh')
2934 foreach exec : public_programs
2935 name = exec.full_path().split('/')[-1]
2936 if want_tests != 'false'
2937 test('check-help-' + name,
2939 args : exec.full_path())
2943 ############################################################
2945 check_directives_sh = find_program('tools/check-directives.sh')
2947 if want_tests != 'false'
2948 test('check-directives',
2949 check_directives_sh,
2950 args : project_source_root)
2953 ############################################################
2955 # Enable tests for all supported sanitizers
2956 foreach tuple : sanitizers
2957 sanitizer = tuple[0]
2960 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2962 foreach p : fuzz_regression_tests
2963 b = p.split('/')[-2]
2964 c = p.split('/')[-1]
2966 name = '@0@:@1@'.format(b, sanitizer)
2969 if want_tests == 'false'
2970 message('Not compiling @0@ because tests is set to false'.format(name))
2972 exe = custom_target(
2976 command : [env, 'ln', '-fs',
2977 join_paths(build.full_path(), b),
2979 build_by_default : true)
2981 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2986 if want_tests != 'false' and slow_tests
2987 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2989 args : [exe.full_path(),
2990 join_paths(project_source_root, p)])
2997 ############################################################
3000 all_files = run_command(
3002 ['--git-dir=@0@/.git'.format(project_source_root),
3005 all_files = files(all_files.stdout().split())
3010 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3013 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3017 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3020 command : [meson_git_contrib_sh])
3024 git_head = run_command(
3026 ['--git-dir=@0@/.git'.format(project_source_root),
3027 'rev-parse', 'HEAD']).stdout().strip()
3028 git_head_short = run_command(
3030 ['--git-dir=@0@/.git'.format(project_source_root),
3031 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3035 command : ['git', 'archive',
3036 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3038 '--prefix', 'systemd-@0@/'.format(git_head),
3042 ############################################################
3044 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3047 depends : [man, libsystemd, libudev],
3048 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3050 ############################################################
3053 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3055 'split /usr: @0@'.format(split_usr),
3056 'split bin-sbin: @0@'.format(split_bin),
3057 'prefix directory: @0@'.format(prefixdir),
3058 'rootprefix directory: @0@'.format(rootprefixdir),
3059 'sysconf directory: @0@'.format(sysconfdir),
3060 'include directory: @0@'.format(includedir),
3061 'lib directory: @0@'.format(libdir),
3062 'rootlib directory: @0@'.format(rootlibdir),
3063 'SysV init scripts: @0@'.format(sysvinit_path),
3064 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3065 'PAM modules directory: @0@'.format(pamlibdir),
3066 'PAM configuration directory: @0@'.format(pamconfdir),
3067 'RPM macros directory: @0@'.format(rpmmacrosdir),
3068 'modprobe.d directory: @0@'.format(modprobedir),
3069 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3070 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3071 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3072 'bash completions directory: @0@'.format(bashcompletiondir),
3073 'zsh completions directory: @0@'.format(zshcompletiondir),
3074 'extra start script: @0@'.format(get_option('rc-local')),
3075 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3076 get_option('debug-tty')),
3077 'TTY GID: @0@'.format(tty_gid),
3078 'users GID: @0@'.format(substs.get('USERS_GID')),
3079 'maximum system UID: @0@'.format(system_uid_max),
3080 'maximum system GID: @0@'.format(system_gid_max),
3081 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3082 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3083 'minimum container UID base: @0@'.format(container_uid_base_min),
3084 'maximum container UID base: @0@'.format(container_uid_base_max),
3085 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3086 'render group access mode: @0@'.format(get_option('group-render-mode')),
3087 'certificate root directory: @0@'.format(get_option('certificate-root')),
3088 'support URL: @0@'.format(support_url),
3089 'nobody user name: @0@'.format(nobody_user),
3090 'nobody group name: @0@'.format(nobody_group),
3091 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3092 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3094 'default DNSSEC mode: @0@'.format(default_dnssec),
3095 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3096 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3097 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3098 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3099 'default locale: @0@'.format(default_locale)]
3101 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3102 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3104 'default DNS servers: @0@'.format(alt_dns_servers),
3105 'default NTP servers: @0@'.format(alt_ntp_servers)]
3107 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3108 '@@0@'.format(time_epoch)).stdout().strip()
3110 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3113 'static libsystemd: @0@'.format(static_libsystemd),
3114 'static libudev: @0@'.format(static_libudev)]
3117 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3118 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3119 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3121 if conf.get('ENABLE_EFI') == 1
3122 status += 'efi arch: @0@'.format(efi_arch)
3126 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3127 'EFI CC @0@'.format(' '.join(efi_cc)),
3128 'EFI lib directory: @0@'.format(efi_libdir),
3129 'EFI lds directory: @0@'.format(efi_ldsdir),
3130 'EFI include directory: @0@'.format(efi_incdir)]
3182 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3183 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3186 ['legacy pkla', install_polkit_pkla],
3188 ['gnu-efi', have_gnu_efi],
3201 ['man pages', want_man],
3202 ['html pages', want_html],
3203 ['man page indices', want_man and have_lxml],
3208 ['adm group', get_option('adm-group')],
3209 ['wheel group', get_option('wheel-group')],
3212 ['debug mmap cache'],
3214 ['valgrind', conf.get('VALGRIND') == 1],
3215 ['trace logging', conf.get('LOG_TRACE') == 1],
3216 ['link-udev-shared', get_option('link-udev-shared')],
3217 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3220 if tuple.length() >= 2
3223 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3224 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3225 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3236 'enabled features: @0@'.format(', '.join(found)),
3238 'disabled features: @0@'.format(', '.join(missing)),
3240 message('\n '.join(status))
3242 if rootprefixdir != rootprefix_default
3244 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3245 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3246 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))