1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
12 meson_version : '>= 0.46',
15 libsystemd_version = '0.26.0'
16 libudev_version = '1.6.14'
18 # We need the same data in two different formats, ugh!
19 # Also, for hysterical reasons, we use different variable
20 # names, sometimes. Not all variables are included in every
22 conf = configuration_data()
23 conf.set('PROJECT_VERSION', meson.project_version())
25 substs = configuration_data()
26 substs.set('PROJECT_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
27 substs.set('PROJECT_VERSION', meson.project_version())
29 # This is to be used instead of meson.source_root(), as the latter will return
30 # the wrong result when systemd is being built as a meson subproject
31 project_source_root = meson.current_source_dir()
33 want_ossfuzz = get_option('oss-fuzz')
34 want_libfuzzer = get_option('llvm-fuzz')
35 want_fuzzbuzz = get_option('fuzzbuzz')
36 if want_ossfuzz + want_libfuzzer + want_fuzzbuzz > 1
37 error('only one of oss-fuzz, llvm-fuzz or fuzzbuzz can be specified')
40 skip_deps = want_ossfuzz or want_libfuzzer
41 fuzzer_build = want_ossfuzz or want_libfuzzer or want_fuzzbuzz
43 #####################################################################
45 # Try to install the git pre-commit hook
46 git_hook = run_command(join_paths(project_source_root, 'tools/add-git-hook.sh'))
47 if git_hook.returncode() == 0
48 message(git_hook.stdout().strip())
51 #####################################################################
53 if get_option('split-usr') == 'auto'
54 split_usr = run_command('test', '-L', '/bin').returncode() != 0
56 split_usr = get_option('split-usr') == 'true'
58 conf.set10('HAVE_SPLIT_USR', split_usr,
59 description : '/usr/bin and /bin directories are separate')
61 if get_option('split-bin') == 'auto'
62 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
64 split_bin = get_option('split-bin') == 'true'
66 conf.set10('HAVE_SPLIT_BIN', split_bin,
67 description : 'bin and sbin directories are separate')
69 rootprefixdir = get_option('rootprefix')
70 # Unusual rootprefixdir values are used by some distros
71 # (see https://github.com/systemd/systemd/pull/7461).
72 rootprefix_default = split_usr ? '/' : '/usr'
73 if rootprefixdir == ''
74 rootprefixdir = rootprefix_default
76 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
78 sysvinit_path = get_option('sysvinit-path')
79 sysvrcnd_path = get_option('sysvrcnd-path')
80 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
81 description : 'SysV init scripts and rcN.d links are supported')
83 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
84 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
85 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
87 # join_paths ignores the preceding arguments if an absolute component is
88 # encountered, so this should canonicalize various paths when they are
89 # absolute or relative.
90 prefixdir = get_option('prefix')
91 if not prefixdir.startswith('/')
92 error('Prefix is not absolute: "@0@"'.format(prefixdir))
94 bindir = join_paths(prefixdir, get_option('bindir'))
95 libdir = join_paths(prefixdir, get_option('libdir'))
96 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
97 includedir = join_paths(prefixdir, get_option('includedir'))
98 datadir = join_paths(prefixdir, get_option('datadir'))
99 localstatedir = join_paths('/', get_option('localstatedir'))
101 rootbindir = join_paths(rootprefixdir, 'bin')
102 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
103 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
105 rootlibdir = get_option('rootlibdir')
107 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
110 # Dirs of external packages
111 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
112 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
113 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
114 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
115 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
116 varlogdir = join_paths(localstatedir, 'log')
117 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
118 rpmmacrosdir = get_option('rpmmacrosdir')
119 if rpmmacrosdir != 'no'
120 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
122 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
125 pkgdatadir = join_paths(datadir, 'systemd')
126 environmentdir = join_paths(prefixdir, 'lib/environment.d')
127 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
128 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
129 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
130 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
131 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
132 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
133 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
134 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
135 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
136 pkgincludedir = join_paths(includedir, 'systemd')
137 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
138 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
139 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
140 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
141 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
142 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
143 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
144 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
145 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
146 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
147 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
148 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
149 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
150 factorydir = join_paths(datadir, 'factory')
151 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
152 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
153 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
154 catalogstatedir = join_paths(systemdstatedir, 'catalog')
155 randomseeddir = join_paths(localstatedir, 'lib/systemd')
156 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
158 docdir = get_option('docdir')
160 docdir = join_paths(datadir, 'doc/systemd')
163 dbuspolicydir = get_option('dbuspolicydir')
164 if dbuspolicydir == ''
165 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
168 dbussessionservicedir = get_option('dbussessionservicedir')
169 if dbussessionservicedir == ''
170 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
173 dbussystemservicedir = get_option('dbussystemservicedir')
174 if dbussystemservicedir == ''
175 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
178 pamlibdir = get_option('pamlibdir')
180 pamlibdir = join_paths(rootlibdir, 'security')
183 pamconfdir = get_option('pamconfdir')
185 pamconfdir = join_paths(sysconfdir, 'pam.d')
188 memory_accounting_default = get_option('memory-accounting-default')
190 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
191 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
192 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
193 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
194 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
195 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
196 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
198 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
200 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
201 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
202 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
203 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
204 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
205 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
206 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
207 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
208 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
209 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
210 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
211 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
212 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
213 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
214 conf.set_quoted('ROOTPREFIX', rootprefixdir)
215 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
216 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
217 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
218 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
219 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
220 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
221 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
222 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
223 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
224 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
225 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
226 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
227 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
228 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
229 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
230 conf.set_quoted('LIBDIR', libdir)
231 conf.set_quoted('ROOTLIBDIR', rootlibdir)
232 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
233 conf.set_quoted('BOOTLIBDIR', bootlibdir)
234 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
235 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
236 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
237 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
238 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
239 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
240 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
241 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
242 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
244 substs.set('prefix', prefixdir)
245 substs.set('rootprefix', rootprefixdir)
246 substs.set('rootprefix_noslash', rootprefixdir_noslash)
247 substs.set('exec_prefix', prefixdir)
248 substs.set('libdir', libdir)
249 substs.set('rootlibdir', rootlibdir)
250 substs.set('includedir', includedir)
251 substs.set('sysconfdir', sysconfdir)
252 substs.set('bindir', bindir)
253 substs.set('rootbindir', rootbindir)
254 substs.set('rootlibexecdir', rootlibexecdir)
255 substs.set('systemunitdir', systemunitdir)
256 substs.set('userunitdir', userunitdir)
257 substs.set('systempresetdir', systempresetdir)
258 substs.set('userpresetdir', userpresetdir)
259 substs.set('udevhwdbdir', udevhwdbdir)
260 substs.set('udevrulesdir', udevrulesdir)
261 substs.set('udevlibexecdir', udevlibexecdir)
262 substs.set('environmentdir', environmentdir)
263 substs.set('catalogdir', catalogdir)
264 substs.set('tmpfilesdir', tmpfilesdir)
265 substs.set('sysusersdir', sysusersdir)
266 substs.set('sysctldir', sysctldir)
267 substs.set('binfmtdir', binfmtdir)
268 substs.set('modulesloaddir', modulesloaddir)
269 substs.set('modprobedir', modprobedir)
270 substs.set('systemgeneratordir', systemgeneratordir)
271 substs.set('usergeneratordir', usergeneratordir)
272 substs.set('systemenvgeneratordir', systemenvgeneratordir)
273 substs.set('userenvgeneratordir', userenvgeneratordir)
274 substs.set('systemshutdowndir', systemshutdowndir)
275 substs.set('systemsleepdir', systemsleepdir)
276 substs.set('VARLOGDIR', varlogdir)
277 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
278 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
279 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
280 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
281 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
282 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
283 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
284 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
285 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
287 #####################################################################
289 cc = meson.get_compiler('c')
290 pkgconfig = import('pkgconfig')
291 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
292 meson_build_sh = find_program('tools/meson-build.sh')
294 want_tests = get_option('tests')
295 slow_tests = want_tests != 'false' and get_option('slow-tests')
296 install_tests = get_option('install-tests')
298 if add_languages('cpp', required : fuzzer_build)
299 # Used only for tests
300 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
306 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
308 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
310 fuzzing_engine = meson.get_compiler('cpp').find_library(get_option('fuzzbuzz-engine'), dirs: get_option('fuzzbuzz-engine-dir'))
313 possible_cc_flags = [
317 '-Wmissing-include-dirs',
318 '-Wold-style-definition',
322 '-Wsuggest-attribute=noreturn',
323 '-Werror=missing-prototypes',
324 '-Werror=implicit-function-declaration',
325 '-Werror=missing-declarations',
326 '-Werror=return-type',
327 '-Werror=incompatible-pointer-types',
329 '-Wstrict-prototypes',
331 '-Wmissing-noreturn',
332 '-Wimplicit-fallthrough=5',
335 '-Wstrict-aliasing=2',
338 '-Werror=shift-count-overflow',
339 '-Werror=shift-overflow=2',
343 # negative arguments are correctly detected starting with meson 0.46.
344 '-Wno-unused-parameter',
345 '-Wno-missing-field-initializers',
346 '-Wno-unused-result',
347 '-Wno-format-signedness',
348 '-Wno-error=#warnings', # clang
349 '-Wno-string-plus-int', # clang
351 # work-around for gcc 7.1 turning this on on its own.
352 '-Wno-error=nonnull',
354 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
355 # optimizations enabled, producing essentially false positives.
356 '-Wno-maybe-uninitialized',
360 '-fdiagnostics-show-option',
361 '-fno-strict-aliasing',
362 '-fvisibility=hidden',
364 '-fstack-protector-strong',
365 '--param=ssp-buffer-size=4',
368 # --as-needed and --no-undefined are provided by meson by default,
369 # run mesonconf to see what is enabled
370 possible_link_flags = [
375 if cc.get_id() == 'clang'
376 possible_cc_flags += [
377 '-Wno-typedef-redefinition',
378 '-Wno-gnu-variable-sized-type-not-at-end',
382 if get_option('buildtype') != 'debug'
383 possible_cc_flags += [
384 '-ffunction-sections',
388 possible_link_flags += '-Wl,--gc-sections'
391 if get_option('b_ndebug') == 'true'
392 # With asserts disabled with get a bunch of warnings about variables which
393 # are used only in the asserts. This is not useful at all, so let's just silence
395 possible_cc_flags += [
396 '-Wno-unused-variable',
397 '-Wno-unused-but-set-variable',
401 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
402 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
406 #include <inttypes.h>
407 typedef uint64_t usec_t;
408 usec_t now(clockid_t clock);
413 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
414 add_project_arguments('-Werror=shadow', language : 'c')
417 cpp = ' '.join(cc.cmd_array()) + ' -E'
419 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
421 #####################################################################
422 # compilation result tests
424 conf.set('_GNU_SOURCE', true)
425 conf.set('__SANE_USERSPACE_TYPES__', true)
426 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
428 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
429 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
430 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
431 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
432 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
433 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
434 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
438 #include <sys/stat.h>
441 foreach decl : ['char16_t',
446 # We get -1 if the size cannot be determined
447 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
449 if decl == 'struct statx'
451 want_linux_stat_h = false
453 have = cc.sizeof(decl,
454 prefix : decl_headers + '#include <linux/stat.h>',
455 args : '-D_GNU_SOURCE') > 0
456 want_linux_stat_h = have
460 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
463 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
465 foreach ident : ['secure_getenv', '__secure_getenv']
466 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
470 ['memfd_create', '''#include <sys/mman.h>'''],
471 ['gettid', '''#include <sys/types.h>
472 #include <unistd.h>'''],
473 ['pivot_root', '''#include <stdlib.h>
474 #include <unistd.h>'''], # no known header declares pivot_root
475 ['name_to_handle_at', '''#include <sys/types.h>
476 #include <sys/stat.h>
477 #include <fcntl.h>'''],
478 ['setns', '''#include <sched.h>'''],
479 ['renameat2', '''#include <stdio.h>
480 #include <fcntl.h>'''],
481 ['kcmp', '''#include <linux/kcmp.h>'''],
482 ['keyctl', '''#include <sys/types.h>
483 #include <keyutils.h>'''],
484 ['copy_file_range', '''#include <sys/syscall.h>
485 #include <unistd.h>'''],
486 ['bpf', '''#include <sys/syscall.h>
487 #include <unistd.h>'''],
488 ['statx', '''#include <sys/types.h>
489 #include <sys/stat.h>
490 #include <unistd.h>'''],
491 ['explicit_bzero' , '''#include <string.h>'''],
492 ['reallocarray', '''#include <malloc.h>'''],
495 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
496 conf.set10('HAVE_' + ident[0].to_upper(), have)
499 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
500 conf.set10('USE_SYS_RANDOM_H', true)
501 conf.set10('HAVE_GETRANDOM', true)
503 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
504 conf.set10('USE_SYS_RANDOM_H', false)
505 conf.set10('HAVE_GETRANDOM', have)
508 #####################################################################
510 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
512 get_option('version-tag'),
513 meson.project_version()]
516 input : 'src/version/version.h.in',
517 output : 'version.h',
520 versiondep = declare_dependency(sources: version_h)
522 sed = find_program('sed')
523 awk = find_program('awk')
524 m4 = find_program('m4')
525 stat = find_program('stat')
526 git = find_program('git', required : false)
527 env = find_program('env')
528 perl = find_program('perl', required : false)
530 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
531 mkdir_p = 'mkdir -p $DESTDIR/@0@'
532 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
533 splash_bmp = files('test/splash.bmp')
535 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
536 # /usr/sbin, /sbin, and fall back to the default from middle column.
537 progs = [['quotaon', '/usr/sbin/quotaon' ],
538 ['quotacheck', '/usr/sbin/quotacheck' ],
539 ['kmod', '/usr/bin/kmod' ],
540 ['kexec', '/usr/sbin/kexec' ],
541 ['sulogin', '/usr/sbin/sulogin' ],
542 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
543 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
544 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
545 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
548 path = get_option(prog[0] + '-path')
550 message('Using @1@ for @0@'.format(prog[0], path))
552 exe = find_program(prog[0],
553 '/usr/sbin/' + prog[0],
556 path = exe.found() ? exe.path() : prog[1]
558 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
559 conf.set_quoted(name, path)
560 substs.set(name, path)
563 conf.set_quoted('TELINIT', get_option('telinit-path'))
565 if run_command('ln', '--relative', '--help').returncode() != 0
566 error('ln does not support --relative (added in coreutils 8.16)')
569 ############################################################
571 gperf = find_program('gperf')
573 gperf_test_format = '''
575 const char * in_word_set(const char *, @0@);
578 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
579 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
580 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
581 if cc.compiles(gperf_test)
582 gperf_len_type = 'size_t'
584 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
585 if cc.compiles(gperf_test)
586 gperf_len_type = 'unsigned'
588 error('unable to determine gperf len type')
591 message('gperf len type is @0@'.format(gperf_len_type))
592 conf.set('GPERF_LEN_TYPE', gperf_len_type,
593 description : 'The type of gperf "len" parameter')
595 ############################################################
597 if not cc.has_header('sys/capability.h')
598 error('POSIX caps headers not found')
600 foreach header : ['crypt.h',
602 'linux/vm_sockets.h',
604 'valgrind/memcheck.h',
605 'valgrind/valgrind.h',
608 conf.set10('HAVE_' + header.underscorify().to_upper(),
609 cc.has_header(header))
612 ############################################################
614 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
615 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
616 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
618 default_hierarchy = get_option('default-hierarchy')
619 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
620 description : 'default cgroup hierarchy as string')
621 if default_hierarchy == 'legacy'
622 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
623 elif default_hierarchy == 'hybrid'
624 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
626 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
629 default_net_naming_scheme = get_option('default-net-naming-scheme')
630 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
632 time_epoch = get_option('time-epoch')
635 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
637 conf.set('TIME_EPOCH', time_epoch)
639 system_uid_max = get_option('system-uid-max')
640 if system_uid_max == -1
641 system_uid_max = run_command(
643 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
644 '/etc/login.defs').stdout().strip()
645 if system_uid_max == ''
648 system_uid_max = system_uid_max.to_int()
651 conf.set('SYSTEM_UID_MAX', system_uid_max)
652 substs.set('systemuidmax', system_uid_max)
654 system_gid_max = get_option('system-gid-max')
655 if system_gid_max == -1
656 system_gid_max = run_command(
658 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
659 '/etc/login.defs').stdout().strip()
660 if system_gid_max == ''
663 system_gid_max = system_gid_max.to_int()
666 conf.set('SYSTEM_GID_MAX', system_gid_max)
667 substs.set('systemgidmax', system_gid_max)
669 dynamic_uid_min = get_option('dynamic-uid-min')
670 dynamic_uid_max = get_option('dynamic-uid-max')
671 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
672 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
673 substs.set('dynamicuidmin', dynamic_uid_min)
674 substs.set('dynamicuidmax', dynamic_uid_max)
676 container_uid_base_min = get_option('container-uid-base-min')
677 container_uid_base_max = get_option('container-uid-base-max')
678 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
679 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
680 substs.set('containeruidbasemin', container_uid_base_min)
681 substs.set('containeruidbasemax', container_uid_base_max)
683 nobody_user = get_option('nobody-user')
684 nobody_group = get_option('nobody-group')
686 if not meson.is_cross_build()
687 getent_result = run_command('getent', 'passwd', '65534')
688 if getent_result.returncode() == 0
689 name = getent_result.stdout().split(':')[0]
690 if name != nobody_user
692 '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) +
693 'Your build will result in an user table setup that is incompatible with the local system.')
696 id_result = run_command('id', '-u', nobody_user)
697 if id_result.returncode() == 0
698 id = id_result.stdout().to_int()
701 '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) +
702 'Your build will result in an user table setup that is incompatible with the local system.')
706 getent_result = run_command('getent', 'group', '65534')
707 if getent_result.returncode() == 0
708 name = getent_result.stdout().split(':')[0]
709 if name != nobody_group
711 '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) +
712 'Your build will result in an group table setup that is incompatible with the local system.')
715 id_result = run_command('id', '-g', nobody_group)
716 if id_result.returncode() == 0
717 id = id_result.stdout().to_int()
720 '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) +
721 'Your build will result in an group table setup that is incompatible with the local system.')
725 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
727 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
728 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
731 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
732 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
733 substs.set('NOBODY_USER_NAME', nobody_user)
734 substs.set('NOBODY_GROUP_NAME', nobody_group)
736 tty_gid = get_option('tty-gid')
737 conf.set('TTY_GID', tty_gid)
738 substs.set('TTY_GID', tty_gid)
740 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
741 users_gid = get_option('users-gid')
742 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
744 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
745 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
747 dev_kvm_mode = get_option('dev-kvm-mode')
748 substs.set('DEV_KVM_MODE', dev_kvm_mode)
749 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
750 group_render_mode = get_option('group-render-mode')
751 substs.set('GROUP_RENDER_MODE', group_render_mode)
752 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
754 kill_user_processes = get_option('default-kill-user-processes')
755 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
756 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
757 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
759 dns_servers = get_option('dns-servers')
760 conf.set_quoted('DNS_SERVERS', dns_servers)
761 substs.set('DNS_SERVERS', dns_servers)
763 ntp_servers = get_option('ntp-servers')
764 conf.set_quoted('NTP_SERVERS', ntp_servers)
765 substs.set('NTP_SERVERS', ntp_servers)
767 default_locale = get_option('default-locale')
768 if default_locale == ''
769 if not meson.is_cross_build()
770 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
771 default_locale = run_command(choose_default_locale_sh).stdout().strip()
773 default_locale = 'C.UTF-8'
776 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
778 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
780 substs.set('SUSHELL', get_option('debug-shell'))
781 substs.set('DEBUGTTY', get_option('debug-tty'))
783 enable_debug_hashmap = false
784 enable_debug_mmap_cache = false
785 enable_debug_siphash = false
786 enable_debug_udev = false
787 foreach name : get_option('debug-extra')
789 enable_debug_hashmap = true
790 elif name == 'mmap-cache'
791 enable_debug_mmap_cache = true
792 elif name == 'siphash'
793 enable_debug_siphash = true
795 enable_debug_udev = true
797 message('unknown debug option "@0@", ignoring'.format(name))
800 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
801 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
802 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
803 conf.set10('ENABLE_DEBUG_UDEV', enable_debug_udev)
805 conf.set10('VALGRIND', get_option('valgrind'))
806 conf.set10('LOG_TRACE', get_option('log-trace'))
808 #####################################################################
810 threads = dependency('threads')
811 librt = cc.find_library('rt')
812 libm = cc.find_library('m')
813 libdl = cc.find_library('dl')
814 libcrypt = cc.find_library('crypt')
816 libcap = dependency('libcap', required : false)
817 if not libcap.found()
818 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
819 libcap = cc.find_library('cap')
822 libmount = dependency('mount',
823 version : fuzzer_build ? '>= 0' : '>= 2.30')
825 want_seccomp = get_option('seccomp')
826 if want_seccomp != 'false' and not skip_deps
827 libseccomp = dependency('libseccomp',
828 version : '>= 2.3.1',
829 required : want_seccomp == 'true')
830 have = libseccomp.found()
835 conf.set10('HAVE_SECCOMP', have)
837 want_selinux = get_option('selinux')
838 if want_selinux != 'false' and not skip_deps
839 libselinux = dependency('libselinux',
840 version : '>= 2.1.9',
841 required : want_selinux == 'true')
842 have = libselinux.found()
847 conf.set10('HAVE_SELINUX', have)
849 want_apparmor = get_option('apparmor')
850 if want_apparmor != 'false' and not skip_deps
851 libapparmor = dependency('libapparmor',
852 required : want_apparmor == 'true')
853 have = libapparmor.found()
858 conf.set10('HAVE_APPARMOR', have)
860 smack_run_label = get_option('smack-run-label')
861 if smack_run_label != ''
862 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
865 want_polkit = get_option('polkit')
866 install_polkit = false
867 install_polkit_pkla = false
868 if want_polkit != 'false' and not skip_deps
869 install_polkit = true
871 libpolkit = dependency('polkit-gobject-1',
873 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
874 message('Old polkit detected, will install pkla files')
875 install_polkit_pkla = true
878 conf.set10('ENABLE_POLKIT', install_polkit)
880 want_acl = get_option('acl')
881 if want_acl != 'false' and not skip_deps
882 libacl = cc.find_library('acl', required : want_acl == 'true')
883 have = libacl.found()
888 conf.set10('HAVE_ACL', have)
890 want_audit = get_option('audit')
891 if want_audit != 'false' and not skip_deps
892 libaudit = dependency('audit', required : want_audit == 'true')
893 have = libaudit.found()
898 conf.set10('HAVE_AUDIT', have)
900 want_blkid = get_option('blkid')
901 if want_blkid != 'false' and not skip_deps
902 libblkid = dependency('blkid', required : want_blkid == 'true')
903 have = libblkid.found()
908 conf.set10('HAVE_BLKID', have)
910 want_kmod = get_option('kmod')
911 if want_kmod != 'false' and not skip_deps
912 libkmod = dependency('libkmod',
914 required : want_kmod == 'true')
915 have = libkmod.found()
920 conf.set10('HAVE_KMOD', have)
922 want_pam = get_option('pam')
923 if want_pam != 'false' and not skip_deps
924 libpam = cc.find_library('pam', required : want_pam == 'true')
925 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
926 have = libpam.found() and libpam_misc.found()
932 conf.set10('HAVE_PAM', have)
934 want_microhttpd = get_option('microhttpd')
935 if want_microhttpd != 'false' and not skip_deps
936 libmicrohttpd = dependency('libmicrohttpd',
937 version : '>= 0.9.33',
938 required : want_microhttpd == 'true')
939 have = libmicrohttpd.found()
944 conf.set10('HAVE_MICROHTTPD', have)
946 want_libcryptsetup = get_option('libcryptsetup')
947 if want_libcryptsetup != 'false' and not skip_deps
948 libcryptsetup = dependency('libcryptsetup',
949 version : '>= 1.6.0',
950 required : want_libcryptsetup == 'true')
951 have = libcryptsetup.found()
952 have_sector = cc.has_member(
953 'struct crypt_params_plain',
955 prefix : '#include <libcryptsetup.h>')
961 conf.set10('HAVE_LIBCRYPTSETUP', have)
962 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
964 want_libcurl = get_option('libcurl')
965 if want_libcurl != 'false' and not skip_deps
966 libcurl = dependency('libcurl',
967 version : '>= 7.32.0',
968 required : want_libcurl == 'true')
969 have = libcurl.found()
974 conf.set10('HAVE_LIBCURL', have)
976 want_libidn = get_option('libidn')
977 want_libidn2 = get_option('libidn2')
978 if want_libidn == 'true' and want_libidn2 == 'true'
979 error('libidn and libidn2 cannot be requested simultaneously')
982 if want_libidn != 'false' and want_libidn2 != 'true' and not skip_deps
983 libidn = dependency('libidn',
984 required : want_libidn == 'true')
985 have = libidn.found()
990 conf.set10('HAVE_LIBIDN', have)
991 if not have and want_libidn2 != 'false' and not skip_deps
992 # libidn is used for both libidn and libidn2 objects
993 libidn = dependency('libidn2',
994 required : want_libidn2 == 'true')
995 have = libidn.found()
999 conf.set10('HAVE_LIBIDN2', have)
1001 want_libiptc = get_option('libiptc')
1002 if want_libiptc != 'false' and not skip_deps
1003 libiptc = dependency('libiptc',
1004 required : want_libiptc == 'true')
1005 have = libiptc.found()
1010 conf.set10('HAVE_LIBIPTC', have)
1012 want_qrencode = get_option('qrencode')
1013 if want_qrencode != 'false' and not skip_deps
1014 libqrencode = dependency('libqrencode',
1015 required : want_qrencode == 'true')
1016 have = libqrencode.found()
1021 conf.set10('HAVE_QRENCODE', have)
1023 want_gcrypt = get_option('gcrypt')
1024 if want_gcrypt != 'false' and not skip_deps
1025 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1026 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1027 have = libgcrypt.found() and libgpg_error.found()
1032 # link to neither of the libs if one is not found
1036 conf.set10('HAVE_GCRYPT', have)
1038 want_gnutls = get_option('gnutls')
1039 if want_gnutls != 'false' and not skip_deps
1040 libgnutls = dependency('gnutls',
1041 version : '>= 3.1.4',
1042 required : want_gnutls == 'true')
1043 have = libgnutls.found()
1048 conf.set10('HAVE_GNUTLS', have)
1050 want_openssl = get_option('openssl')
1051 if want_openssl != 'false' and not skip_deps
1052 libopenssl = dependency('openssl',
1053 version : '>= 1.1.0',
1054 required : want_openssl == 'true')
1055 have = libopenssl.found()
1060 conf.set10('HAVE_OPENSSL', have)
1062 want_elfutils = get_option('elfutils')
1063 if want_elfutils != 'false' and not skip_deps
1064 libdw = dependency('libdw',
1065 required : want_elfutils == 'true')
1066 have = libdw.found()
1071 conf.set10('HAVE_ELFUTILS', have)
1073 want_zlib = get_option('zlib')
1074 if want_zlib != 'false' and not skip_deps
1075 libz = dependency('zlib',
1076 required : want_zlib == 'true')
1082 conf.set10('HAVE_ZLIB', have)
1084 want_bzip2 = get_option('bzip2')
1085 if want_bzip2 != 'false' and not skip_deps
1086 libbzip2 = cc.find_library('bz2',
1087 required : want_bzip2 == 'true')
1088 have = libbzip2.found()
1093 conf.set10('HAVE_BZIP2', have)
1095 want_xz = get_option('xz')
1096 if want_xz != 'false' and not skip_deps
1097 libxz = dependency('liblzma',
1098 required : want_xz == 'true')
1099 have = libxz.found()
1104 conf.set10('HAVE_XZ', have)
1106 want_lz4 = get_option('lz4')
1107 if want_lz4 != 'false' and not skip_deps
1108 liblz4 = dependency('liblz4',
1109 version : '>= 1.3.0',
1110 required : want_lz4 == 'true')
1111 have = liblz4.found()
1116 conf.set10('HAVE_LZ4', have)
1118 want_xkbcommon = get_option('xkbcommon')
1119 if want_xkbcommon != 'false' and not skip_deps
1120 libxkbcommon = dependency('xkbcommon',
1121 version : '>= 0.3.0',
1122 required : want_xkbcommon == 'true')
1123 have = libxkbcommon.found()
1128 conf.set10('HAVE_XKBCOMMON', have)
1130 want_pcre2 = get_option('pcre2')
1131 if want_pcre2 != 'false'
1132 libpcre2 = dependency('libpcre2-8',
1133 required : want_pcre2 == 'true')
1134 have = libpcre2.found()
1139 conf.set10('HAVE_PCRE2', have)
1141 want_glib = get_option('glib')
1142 if want_glib != 'false' and not skip_deps
1143 libglib = dependency('glib-2.0',
1144 version : '>= 2.22.0',
1145 required : want_glib == 'true')
1146 libgobject = dependency('gobject-2.0',
1147 version : '>= 2.22.0',
1148 required : want_glib == 'true')
1149 libgio = dependency('gio-2.0',
1150 required : want_glib == 'true')
1151 have = libglib.found() and libgobject.found() and libgio.found()
1158 conf.set10('HAVE_GLIB', have)
1160 want_dbus = get_option('dbus')
1161 if want_dbus != 'false' and not skip_deps
1162 libdbus = dependency('dbus-1',
1163 version : '>= 1.3.2',
1164 required : want_dbus == 'true')
1165 have = libdbus.found()
1170 conf.set10('HAVE_DBUS', have)
1172 default_dnssec = get_option('default-dnssec')
1174 default_dnssec = 'no'
1176 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1177 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1178 default_dnssec = 'no'
1180 conf.set('DEFAULT_DNSSEC_MODE',
1181 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1182 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1184 dns_over_tls = get_option('dns-over-tls')
1185 if dns_over_tls != 'false'
1186 if dns_over_tls == 'openssl'
1189 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1190 if dns_over_tls == 'gnutls' and not have_gnutls
1191 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1194 if dns_over_tls == 'gnutls' or have_gnutls
1195 have_openssl = false
1197 have_openssl = conf.get('HAVE_OPENSSL') == 1
1198 if dns_over_tls != 'auto' and not have_openssl
1199 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1200 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1203 have = have_gnutls or have_openssl
1207 have_openssl = false
1209 conf.set10('ENABLE_DNS_OVER_TLS', have)
1210 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1211 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1213 default_dns_over_tls = get_option('default-dns-over-tls')
1215 default_dns_over_tls = 'no'
1217 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1218 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1219 default_dns_over_tls = 'no'
1221 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1222 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1223 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1225 want_importd = get_option('importd')
1226 if want_importd != 'false'
1227 have = (conf.get('HAVE_LIBCURL') == 1 and
1228 conf.get('HAVE_ZLIB') == 1 and
1229 conf.get('HAVE_XZ') == 1 and
1230 conf.get('HAVE_GCRYPT') == 1)
1231 if want_importd == 'true' and not have
1232 error('importd support was requested, but dependencies are not available')
1237 conf.set10('ENABLE_IMPORTD', have)
1239 want_remote = get_option('remote')
1240 if want_remote != 'false'
1241 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1242 conf.get('HAVE_LIBCURL') == 1]
1243 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1244 # it's possible to build one without the other. Complain only if
1245 # support was explicitly requested. The auxiliary files like sysusers
1246 # config should be installed when any of the programs are built.
1247 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1248 error('remote support was requested, but dependencies are not available')
1250 have = have_deps[0] or have_deps[1]
1254 conf.set10('ENABLE_REMOTE', have)
1256 foreach term : ['utmp',
1288 have = get_option(term)
1289 name = 'ENABLE_' + term.underscorify().to_upper()
1290 conf.set10(name, have)
1293 foreach tuple : [['nss-mymachines', 'machined'],
1294 ['nss-resolve', 'resolve']]
1295 want = get_option(tuple[0])
1297 have = get_option(tuple[1])
1298 if want == 'true' and not have
1299 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1304 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1305 conf.set10(name, have)
1309 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1310 'ENABLE_NSS_MYMACHINES',
1311 'ENABLE_NSS_RESOLVE',
1312 'ENABLE_NSS_SYSTEMD']
1313 if conf.get(term) == 1
1317 conf.set10('ENABLE_NSS', enable_nss)
1319 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1324 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1326 #####################################################################
1328 if get_option('efi')
1329 efi_arch = host_machine.cpu_family()
1331 if efi_arch == 'x86'
1332 EFI_MACHINE_TYPE_NAME = 'ia32'
1333 gnu_efi_arch = 'ia32'
1334 elif efi_arch == 'x86_64'
1335 EFI_MACHINE_TYPE_NAME = 'x64'
1336 gnu_efi_arch = 'x86_64'
1337 elif efi_arch == 'arm'
1338 EFI_MACHINE_TYPE_NAME = 'arm'
1339 gnu_efi_arch = 'arm'
1340 elif efi_arch == 'aarch64'
1341 EFI_MACHINE_TYPE_NAME = 'aa64'
1342 gnu_efi_arch = 'aarch64'
1344 EFI_MACHINE_TYPE_NAME = ''
1349 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1351 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1355 conf.set10('ENABLE_EFI', have)
1357 #####################################################################
1359 config_h = configure_file(
1360 output : 'config.h',
1361 configuration : conf)
1363 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1365 includes = include_directories('src/basic',
1369 'src/journal-remote',
1373 'src/time-wait-sync',
1379 'src/libsystemd/sd-bus',
1380 'src/libsystemd/sd-device',
1381 'src/libsystemd/sd-event',
1382 'src/libsystemd/sd-hwdb',
1383 'src/libsystemd/sd-id128',
1384 'src/libsystemd/sd-netlink',
1385 'src/libsystemd/sd-network',
1386 'src/libsystemd/sd-resolve',
1387 'src/libsystemd-network',
1390 add_project_arguments('-include', 'config.h', language : 'c')
1392 generate_gperfs = find_program('tools/generate-gperfs.py')
1396 subdir('src/systemd')
1398 subdir('src/libsystemd')
1399 subdir('src/libsystemd-network')
1400 subdir('src/journal')
1403 libjournal_core = static_library(
1405 libjournal_core_sources,
1407 include_directories : includes,
1410 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1411 libsystemd = shared_library(
1414 version : libsystemd_version,
1415 include_directories : includes,
1416 link_args : ['-shared',
1417 '-Wl,--version-script=' + libsystemd_sym_path],
1418 link_with : [libbasic,
1420 link_whole : [libsystemd_static,
1422 dependencies : [threads,
1426 link_depends : libsystemd_sym,
1428 install_dir : rootlibdir)
1430 static_libsystemd = get_option('static-libsystemd')
1431 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1433 install_libsystemd_static = static_library(
1436 journal_client_sources,
1438 basic_gcrypt_sources,
1440 include_directories : includes,
1441 build_by_default : static_libsystemd != 'false',
1442 install : static_libsystemd != 'false',
1443 install_dir : rootlibdir,
1444 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1445 dependencies : [threads,
1454 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1456 ############################################################
1458 # binaries that have --help and are intended for use by humans,
1459 # usually, but not always, installed in /bin.
1460 public_programs = []
1462 subdir('src/libudev')
1463 subdir('src/shared')
1465 subdir('src/shutdown')
1467 subdir('src/network')
1469 subdir('src/analyze')
1470 subdir('src/journal-remote')
1471 subdir('src/coredump')
1472 subdir('src/hostname')
1473 subdir('src/import')
1474 subdir('src/kernel-install')
1475 subdir('src/locale')
1476 subdir('src/machine')
1477 subdir('src/portable')
1478 subdir('src/nspawn')
1479 subdir('src/resolve')
1480 subdir('src/timedate')
1481 subdir('src/timesync')
1482 subdir('src/vconsole')
1483 subdir('src/boot/efi')
1490 ############################################################
1492 # only static linking apart from libdl, to make sure that the
1493 # module is linked to all libraries that it uses.
1494 test_dlopen = executable(
1498 include_directories : includes,
1499 link_with : [libbasic],
1500 dependencies : [libdl],
1501 build_by_default : want_tests != 'false')
1503 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1504 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1505 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1506 ['resolve', 'ENABLE_NSS_RESOLVE']]
1508 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1512 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1513 version_script_arg = join_paths(project_source_root, sym)
1515 nss = shared_library(
1517 'src/nss-@0@/nss-@0@.c'.format(module),
1520 include_directories : includes,
1521 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1522 link_args : ['-Wl,-z,nodelete',
1524 '-Wl,--version-script=' + version_script_arg],
1525 link_with : [libsystemd_static,
1527 dependencies : [threads,
1531 install_dir : rootlibdir)
1533 # We cannot use shared_module because it does not support version suffix.
1534 # Unfortunately shared_library insists on creating the symlink…
1535 meson.add_install_script('sh', '-c',
1536 'rm $DESTDIR@0@/libnss_@1@.so'
1537 .format(rootlibdir, module))
1539 if want_tests != 'false'
1540 test('dlopen-nss_' + module,
1542 # path to dlopen must include a slash
1543 args : nss.full_path())
1548 ############################################################
1550 executable('systemd',
1552 include_directories : includes,
1553 link_with : [libcore,
1555 dependencies : [versiondep,
1562 install_rpath : rootlibexecdir,
1564 install_dir : rootlibexecdir)
1566 meson.add_install_script(meson_make_symlink,
1567 join_paths(rootlibexecdir, 'systemd'),
1568 join_paths(rootsbindir, 'init'))
1570 exe = executable('systemd-analyze',
1571 systemd_analyze_sources,
1572 include_directories : includes,
1573 link_with : [libcore,
1575 dependencies : [versiondep,
1582 install_rpath : rootlibexecdir,
1584 public_programs += exe
1586 executable('systemd-journald',
1587 systemd_journald_sources,
1588 include_directories : includes,
1589 link_with : [libjournal_core,
1591 dependencies : [threads,
1595 install_rpath : rootlibexecdir,
1597 install_dir : rootlibexecdir)
1599 exe = executable('systemd-cat',
1600 systemd_cat_sources,
1601 include_directories : includes,
1602 link_with : [libjournal_core,
1604 dependencies : [threads],
1605 install_rpath : rootlibexecdir,
1607 public_programs += exe
1609 exe = executable('journalctl',
1611 include_directories : includes,
1612 link_with : [libshared],
1613 dependencies : [threads,
1618 install_rpath : rootlibexecdir,
1620 install_dir : rootbindir)
1621 public_programs += exe
1623 executable('systemd-getty-generator',
1624 'src/getty-generator/getty-generator.c',
1625 include_directories : includes,
1626 link_with : [libshared],
1627 install_rpath : rootlibexecdir,
1629 install_dir : systemgeneratordir)
1631 executable('systemd-debug-generator',
1632 'src/debug-generator/debug-generator.c',
1633 include_directories : includes,
1634 link_with : [libshared],
1635 install_rpath : rootlibexecdir,
1637 install_dir : systemgeneratordir)
1639 executable('systemd-run-generator',
1640 'src/run-generator/run-generator.c',
1641 include_directories : includes,
1642 link_with : [libshared],
1643 install_rpath : rootlibexecdir,
1645 install_dir : systemgeneratordir)
1647 executable('systemd-fstab-generator',
1648 'src/fstab-generator/fstab-generator.c',
1649 include_directories : includes,
1650 link_with : [libcore_shared,
1652 install_rpath : rootlibexecdir,
1654 install_dir : systemgeneratordir)
1656 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1657 executable('30-systemd-environment-d-generator',
1658 'src/environment-d-generator/environment-d-generator.c',
1659 include_directories : includes,
1660 link_with : [libshared],
1661 install_rpath : rootlibexecdir,
1663 install_dir : userenvgeneratordir)
1665 meson.add_install_script(meson_make_symlink,
1666 join_paths(sysconfdir, 'environment'),
1667 join_paths(environmentdir, '99-environment.conf'))
1670 if conf.get('ENABLE_HIBERNATE') == 1
1671 executable('systemd-hibernate-resume-generator',
1672 'src/hibernate-resume/hibernate-resume-generator.c',
1673 include_directories : includes,
1674 link_with : [libshared],
1675 install_rpath : rootlibexecdir,
1677 install_dir : systemgeneratordir)
1679 executable('systemd-hibernate-resume',
1680 'src/hibernate-resume/hibernate-resume.c',
1681 include_directories : includes,
1682 link_with : [libshared],
1683 install_rpath : rootlibexecdir,
1685 install_dir : rootlibexecdir)
1688 if conf.get('HAVE_BLKID') == 1
1689 executable('systemd-gpt-auto-generator',
1690 'src/gpt-auto-generator/gpt-auto-generator.c',
1691 'src/shared/blkid-util.h',
1692 include_directories : includes,
1693 link_with : [libshared],
1694 dependencies : libblkid,
1695 install_rpath : rootlibexecdir,
1697 install_dir : systemgeneratordir)
1699 exe = executable('systemd-dissect',
1700 'src/dissect/dissect.c',
1701 include_directories : includes,
1702 link_with : [libshared],
1703 install_rpath : rootlibexecdir,
1705 install_dir : rootlibexecdir)
1706 public_programs += exe
1709 if conf.get('ENABLE_RESOLVE') == 1
1710 executable('systemd-resolved',
1711 systemd_resolved_sources,
1712 include_directories : includes,
1713 link_with : [libshared,
1715 libsystemd_resolve_core],
1716 dependencies : systemd_resolved_dependencies,
1717 install_rpath : rootlibexecdir,
1719 install_dir : rootlibexecdir)
1721 exe = executable('resolvectl',
1723 include_directories : includes,
1724 link_with : [libshared,
1726 libsystemd_resolve_core],
1727 dependencies : [threads,
1731 install_rpath : rootlibexecdir,
1733 public_programs += exe
1735 meson.add_install_script(meson_make_symlink,
1736 join_paths(bindir, 'resolvectl'),
1737 join_paths(rootsbindir, 'resolvconf'))
1739 meson.add_install_script(meson_make_symlink,
1740 join_paths(bindir, 'resolvectl'),
1741 join_paths(bindir, 'systemd-resolve'))
1744 if conf.get('ENABLE_LOGIND') == 1
1745 executable('systemd-logind',
1746 systemd_logind_sources,
1747 include_directories : includes,
1748 link_with : [liblogind_core,
1750 dependencies : [threads,
1752 install_rpath : rootlibexecdir,
1754 install_dir : rootlibexecdir)
1756 exe = executable('loginctl',
1758 include_directories : includes,
1759 link_with : [libshared],
1760 dependencies : [threads,
1763 install_rpath : rootlibexecdir,
1765 install_dir : rootbindir)
1766 public_programs += exe
1768 exe = executable('systemd-inhibit',
1769 'src/login/inhibit.c',
1770 include_directories : includes,
1771 link_with : [libshared],
1772 install_rpath : rootlibexecdir,
1774 install_dir : rootbindir)
1775 public_programs += exe
1777 if conf.get('HAVE_PAM') == 1
1778 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1779 pam_systemd = shared_library(
1783 include_directories : includes,
1784 link_args : ['-shared',
1785 '-Wl,--version-script=' + version_script_arg],
1786 link_with : [libsystemd_static,
1788 dependencies : [threads,
1791 link_depends : pam_systemd_sym,
1793 install_dir : pamlibdir)
1795 if want_tests != 'false'
1796 test('dlopen-pam_systemd',
1798 # path to dlopen must include a slash
1799 args : pam_systemd.full_path())
1803 executable('systemd-user-runtime-dir',
1804 user_runtime_dir_sources,
1805 include_directories : includes,
1806 link_with : [libshared],
1807 install_rpath : rootlibexecdir,
1809 install_dir : rootlibexecdir)
1812 if conf.get('HAVE_PAM') == 1
1813 executable('systemd-user-sessions',
1814 'src/user-sessions/user-sessions.c',
1815 include_directories : includes,
1816 link_with : [libshared],
1817 install_rpath : rootlibexecdir,
1819 install_dir : rootlibexecdir)
1822 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1823 exe = executable('bootctl',
1824 'src/boot/bootctl.c',
1825 include_directories : includes,
1826 link_with : [libshared],
1827 dependencies : [libblkid],
1828 install_rpath : rootlibexecdir,
1830 public_programs += exe
1832 executable('systemd-bless-boot',
1833 'src/boot/bless-boot.c',
1834 include_directories : includes,
1835 link_with : [libshared],
1836 dependencies : [libblkid],
1837 install_rpath : rootlibexecdir,
1839 install_dir : rootlibexecdir)
1841 executable('systemd-bless-boot-generator',
1842 'src/boot/bless-boot-generator.c',
1843 include_directories : includes,
1844 link_with : [libshared],
1845 install_rpath : rootlibexecdir,
1847 install_dir : systemgeneratordir)
1850 executable('systemd-boot-check-no-failures',
1851 'src/boot/boot-check-no-failures.c',
1852 include_directories : includes,
1853 link_with : [libshared],
1854 dependencies : [libblkid],
1855 install_rpath : rootlibexecdir,
1857 install_dir : rootlibexecdir)
1859 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1860 include_directories : includes,
1861 link_with : [libshared],
1862 dependencies : [threads],
1863 install_rpath : rootlibexecdir,
1865 public_programs += exe
1868 if get_option('link-systemctl-shared')
1869 systemctl_link_with = [libshared]
1871 systemctl_link_with = [libsystemd_static,
1877 exe = executable('systemctl',
1878 'src/systemctl/systemctl.c',
1879 'src/systemctl/sysv-compat.h',
1880 'src/systemctl/sysv-compat.c',
1881 include_directories : includes,
1882 link_with : systemctl_link_with,
1883 dependencies : [threads,
1888 install_rpath : rootlibexecdir,
1890 install_dir : rootbindir)
1891 public_programs += exe
1893 if conf.get('ENABLE_PORTABLED') == 1
1894 executable('systemd-portabled',
1895 systemd_portabled_sources,
1896 include_directories : includes,
1897 link_with : [libshared],
1898 dependencies : [threads],
1899 install_rpath : rootlibexecdir,
1901 install_dir : rootlibexecdir)
1903 exe = executable('portablectl', 'src/portable/portablectl.c',
1904 include_directories : includes,
1905 link_with : [libshared],
1906 dependencies : [threads],
1907 install_rpath : rootlibexecdir,
1909 install_dir : rootbindir)
1910 public_programs += exe
1913 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1914 meson.add_install_script(meson_make_symlink,
1915 join_paths(rootbindir, 'systemctl'),
1916 join_paths(rootsbindir, alias))
1919 if conf.get('ENABLE_BACKLIGHT') == 1
1920 executable('systemd-backlight',
1921 'src/backlight/backlight.c',
1922 include_directories : includes,
1923 link_with : [libshared],
1924 install_rpath : rootlibexecdir,
1926 install_dir : rootlibexecdir)
1929 if conf.get('ENABLE_RFKILL') == 1
1930 executable('systemd-rfkill',
1931 'src/rfkill/rfkill.c',
1932 include_directories : includes,
1933 link_with : [libshared],
1934 install_rpath : rootlibexecdir,
1936 install_dir : rootlibexecdir)
1939 executable('systemd-system-update-generator',
1940 'src/system-update-generator/system-update-generator.c',
1941 include_directories : includes,
1942 link_with : [libshared],
1943 install_rpath : rootlibexecdir,
1945 install_dir : systemgeneratordir)
1947 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1948 executable('systemd-cryptsetup',
1949 'src/cryptsetup/cryptsetup.c',
1950 include_directories : includes,
1951 link_with : [libshared],
1952 dependencies : [libcryptsetup],
1953 install_rpath : rootlibexecdir,
1955 install_dir : rootlibexecdir)
1957 executable('systemd-cryptsetup-generator',
1958 'src/cryptsetup/cryptsetup-generator.c',
1959 include_directories : includes,
1960 link_with : [libshared],
1961 dependencies : [libcryptsetup],
1962 install_rpath : rootlibexecdir,
1964 install_dir : systemgeneratordir)
1966 executable('systemd-veritysetup',
1967 'src/veritysetup/veritysetup.c',
1968 include_directories : includes,
1969 link_with : [libshared],
1970 dependencies : [libcryptsetup],
1971 install_rpath : rootlibexecdir,
1973 install_dir : rootlibexecdir)
1975 executable('systemd-veritysetup-generator',
1976 'src/veritysetup/veritysetup-generator.c',
1977 include_directories : includes,
1978 link_with : [libshared],
1979 dependencies : [libcryptsetup],
1980 install_rpath : rootlibexecdir,
1982 install_dir : systemgeneratordir)
1985 if conf.get('HAVE_SYSV_COMPAT') == 1
1986 executable('systemd-sysv-generator',
1987 'src/sysv-generator/sysv-generator.c',
1988 include_directories : includes,
1989 link_with : [libshared],
1990 install_rpath : rootlibexecdir,
1992 install_dir : systemgeneratordir)
1994 executable('systemd-rc-local-generator',
1995 'src/rc-local-generator/rc-local-generator.c',
1996 include_directories : includes,
1997 link_with : [libshared],
1998 install_rpath : rootlibexecdir,
2000 install_dir : systemgeneratordir)
2003 if conf.get('ENABLE_HOSTNAMED') == 1
2004 executable('systemd-hostnamed',
2005 'src/hostname/hostnamed.c',
2006 include_directories : includes,
2007 link_with : [libshared],
2008 install_rpath : rootlibexecdir,
2010 install_dir : rootlibexecdir)
2012 exe = executable('hostnamectl',
2013 'src/hostname/hostnamectl.c',
2014 include_directories : includes,
2015 link_with : [libshared],
2016 install_rpath : rootlibexecdir,
2018 public_programs += exe
2021 if conf.get('ENABLE_LOCALED') == 1
2022 if conf.get('HAVE_XKBCOMMON') == 1
2023 # logind will load libxkbcommon.so dynamically on its own
2029 executable('systemd-localed',
2030 systemd_localed_sources,
2031 include_directories : includes,
2032 link_with : [libshared],
2033 dependencies : deps,
2034 install_rpath : rootlibexecdir,
2036 install_dir : rootlibexecdir)
2038 exe = executable('localectl',
2040 include_directories : includes,
2041 link_with : [libshared],
2042 install_rpath : rootlibexecdir,
2044 public_programs += exe
2047 if conf.get('ENABLE_TIMEDATED') == 1
2048 executable('systemd-timedated',
2049 'src/timedate/timedated.c',
2050 include_directories : includes,
2051 link_with : [libshared],
2052 install_rpath : rootlibexecdir,
2054 install_dir : rootlibexecdir)
2057 if conf.get('ENABLE_TIMEDATECTL') == 1
2058 exe = executable('timedatectl',
2059 'src/timedate/timedatectl.c',
2060 include_directories : includes,
2061 install_rpath : rootlibexecdir,
2062 link_with : [libshared],
2063 dependencies : [libm],
2065 public_programs += exe
2068 if conf.get('ENABLE_TIMESYNCD') == 1
2069 executable('systemd-timesyncd',
2070 systemd_timesyncd_sources,
2071 include_directories : includes,
2072 link_with : [libshared],
2073 dependencies : [threads,
2075 install_rpath : rootlibexecdir,
2077 install_dir : rootlibexecdir)
2079 executable('systemd-time-wait-sync',
2080 'src/time-wait-sync/time-wait-sync.c',
2081 include_directories : includes,
2082 link_with : [libshared],
2083 install_rpath : rootlibexecdir,
2085 install_dir : rootlibexecdir)
2088 if conf.get('ENABLE_MACHINED') == 1
2089 executable('systemd-machined',
2090 systemd_machined_sources,
2091 include_directories : includes,
2092 link_with : [libmachine_core,
2094 install_rpath : rootlibexecdir,
2096 install_dir : rootlibexecdir)
2098 exe = executable('machinectl',
2099 'src/machine/machinectl.c',
2100 include_directories : includes,
2101 link_with : [libshared],
2102 dependencies : [threads,
2105 install_rpath : rootlibexecdir,
2107 install_dir : rootbindir)
2108 public_programs += exe
2111 if conf.get('ENABLE_IMPORTD') == 1
2112 executable('systemd-importd',
2113 systemd_importd_sources,
2114 include_directories : includes,
2115 link_with : [libshared],
2116 dependencies : [threads],
2117 install_rpath : rootlibexecdir,
2119 install_dir : rootlibexecdir)
2121 systemd_pull = executable('systemd-pull',
2122 systemd_pull_sources,
2123 include_directories : includes,
2124 link_with : [libshared],
2125 dependencies : [versiondep,
2131 install_rpath : rootlibexecdir,
2133 install_dir : rootlibexecdir)
2135 systemd_import = executable('systemd-import',
2136 systemd_import_sources,
2137 include_directories : includes,
2138 link_with : [libshared],
2139 dependencies : [libcurl,
2143 install_rpath : rootlibexecdir,
2145 install_dir : rootlibexecdir)
2147 systemd_import_fs = executable('systemd-import-fs',
2148 systemd_import_fs_sources,
2149 include_directories : includes,
2150 link_with : [libshared],
2151 install_rpath : rootlibexecdir,
2153 install_dir : rootlibexecdir)
2155 systemd_export = executable('systemd-export',
2156 systemd_export_sources,
2157 include_directories : includes,
2158 link_with : [libshared],
2159 dependencies : [libcurl,
2163 install_rpath : rootlibexecdir,
2165 install_dir : rootlibexecdir)
2167 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2170 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2171 exe = executable('systemd-journal-upload',
2172 systemd_journal_upload_sources,
2173 include_directories : includes,
2174 link_with : [libshared],
2175 dependencies : [versiondep,
2181 install_rpath : rootlibexecdir,
2183 install_dir : rootlibexecdir)
2184 public_programs += exe
2187 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2188 s_j_remote = executable('systemd-journal-remote',
2189 systemd_journal_remote_sources,
2190 include_directories : includes,
2191 link_with : [libshared,
2192 libsystemd_journal_remote],
2193 dependencies : [threads,
2198 install_rpath : rootlibexecdir,
2200 install_dir : rootlibexecdir)
2202 s_j_gatewayd = executable('systemd-journal-gatewayd',
2203 systemd_journal_gatewayd_sources,
2204 include_directories : includes,
2205 link_with : [libshared],
2206 dependencies : [threads,
2211 install_rpath : rootlibexecdir,
2213 install_dir : rootlibexecdir)
2214 public_programs += [s_j_remote, s_j_gatewayd]
2217 if conf.get('ENABLE_COREDUMP') == 1
2218 executable('systemd-coredump',
2219 systemd_coredump_sources,
2220 include_directories : includes,
2221 link_with : [libshared],
2222 dependencies : [threads,
2227 install_rpath : rootlibexecdir,
2229 install_dir : rootlibexecdir)
2231 exe = executable('coredumpctl',
2232 coredumpctl_sources,
2233 include_directories : includes,
2234 link_with : [libshared],
2235 dependencies : [threads,
2238 install_rpath : rootlibexecdir,
2240 public_programs += exe
2243 if conf.get('ENABLE_BINFMT') == 1
2244 exe = executable('systemd-binfmt',
2245 'src/binfmt/binfmt.c',
2246 include_directories : includes,
2247 link_with : [libshared],
2248 install_rpath : rootlibexecdir,
2250 install_dir : rootlibexecdir)
2251 public_programs += exe
2253 meson.add_install_script('sh', '-c',
2254 mkdir_p.format(binfmtdir))
2255 meson.add_install_script('sh', '-c',
2256 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2259 if conf.get('ENABLE_VCONSOLE') == 1
2260 executable('systemd-vconsole-setup',
2261 'src/vconsole/vconsole-setup.c',
2262 include_directories : includes,
2263 link_with : [libshared],
2264 install_rpath : rootlibexecdir,
2266 install_dir : rootlibexecdir)
2269 if conf.get('ENABLE_RANDOMSEED') == 1
2270 executable('systemd-random-seed',
2271 'src/random-seed/random-seed.c',
2272 include_directories : includes,
2273 link_with : [libshared],
2274 install_rpath : rootlibexecdir,
2276 install_dir : rootlibexecdir)
2279 if conf.get('ENABLE_FIRSTBOOT') == 1
2280 executable('systemd-firstboot',
2281 'src/firstboot/firstboot.c',
2282 include_directories : includes,
2283 link_with : [libshared],
2284 dependencies : [libcrypt],
2285 install_rpath : rootlibexecdir,
2287 install_dir : rootbindir)
2290 executable('systemd-remount-fs',
2291 'src/remount-fs/remount-fs.c',
2292 include_directories : includes,
2293 link_with : [libcore_shared,
2295 install_rpath : rootlibexecdir,
2297 install_dir : rootlibexecdir)
2299 executable('systemd-machine-id-setup',
2300 'src/machine-id-setup/machine-id-setup-main.c',
2301 include_directories : includes,
2302 link_with : [libcore_shared,
2304 install_rpath : rootlibexecdir,
2306 install_dir : rootbindir)
2308 executable('systemd-fsck',
2310 include_directories : includes,
2311 link_with : [libshared],
2312 install_rpath : rootlibexecdir,
2314 install_dir : rootlibexecdir)
2316 executable('systemd-growfs',
2317 'src/partition/growfs.c',
2318 include_directories : includes,
2319 link_with : [libshared],
2320 dependencies : [libcryptsetup],
2321 install_rpath : rootlibexecdir,
2323 install_dir : rootlibexecdir)
2325 executable('systemd-makefs',
2326 'src/partition/makefs.c',
2327 include_directories : includes,
2328 link_with : [libshared],
2329 install_rpath : rootlibexecdir,
2331 install_dir : rootlibexecdir)
2333 executable('systemd-sleep',
2334 'src/sleep/sleep.c',
2335 include_directories : includes,
2336 link_with : [libshared],
2337 install_rpath : rootlibexecdir,
2339 install_dir : rootlibexecdir)
2341 install_data('src/sleep/sleep.conf',
2342 install_dir : pkgsysconfdir)
2344 exe = executable('systemd-sysctl',
2345 'src/sysctl/sysctl.c',
2346 include_directories : includes,
2347 link_with : [libshared],
2348 install_rpath : rootlibexecdir,
2350 install_dir : rootlibexecdir)
2351 public_programs += exe
2353 executable('systemd-ac-power',
2354 'src/ac-power/ac-power.c',
2355 include_directories : includes,
2356 link_with : [libshared],
2357 install_rpath : rootlibexecdir,
2359 install_dir : rootlibexecdir)
2361 exe = executable('systemd-detect-virt',
2362 'src/detect-virt/detect-virt.c',
2363 include_directories : includes,
2364 link_with : [libshared],
2365 install_rpath : rootlibexecdir,
2367 public_programs += exe
2369 exe = executable('systemd-delta',
2370 'src/delta/delta.c',
2371 include_directories : includes,
2372 link_with : [libshared],
2373 install_rpath : rootlibexecdir,
2375 public_programs += exe
2377 exe = executable('systemd-escape',
2378 'src/escape/escape.c',
2379 include_directories : includes,
2380 link_with : [libshared],
2381 install_rpath : rootlibexecdir,
2383 install_dir : rootbindir)
2384 public_programs += exe
2386 exe = executable('systemd-notify',
2387 'src/notify/notify.c',
2388 include_directories : includes,
2389 link_with : [libshared],
2390 install_rpath : rootlibexecdir,
2392 install_dir : rootbindir)
2393 public_programs += exe
2395 executable('systemd-volatile-root',
2396 'src/volatile-root/volatile-root.c',
2397 include_directories : includes,
2398 link_with : [libshared],
2399 install_rpath : rootlibexecdir,
2401 install_dir : rootlibexecdir)
2403 executable('systemd-cgroups-agent',
2404 'src/cgroups-agent/cgroups-agent.c',
2405 include_directories : includes,
2406 link_with : [libshared],
2407 install_rpath : rootlibexecdir,
2409 install_dir : rootlibexecdir)
2411 exe = executable('systemd-id128',
2412 'src/id128/id128.c',
2413 include_directories : includes,
2414 link_with : [libshared],
2415 install_rpath : rootlibexecdir,
2417 public_programs += exe
2419 exe = executable('systemd-path',
2421 include_directories : includes,
2422 link_with : [libshared],
2423 install_rpath : rootlibexecdir,
2425 public_programs += exe
2427 exe = executable('systemd-ask-password',
2428 'src/ask-password/ask-password.c',
2429 include_directories : includes,
2430 link_with : [libshared],
2431 install_rpath : rootlibexecdir,
2433 install_dir : rootbindir)
2434 public_programs += exe
2436 executable('systemd-reply-password',
2437 'src/reply-password/reply-password.c',
2438 include_directories : includes,
2439 link_with : [libshared],
2440 install_rpath : rootlibexecdir,
2442 install_dir : rootlibexecdir)
2444 exe = executable('systemd-tty-ask-password-agent',
2445 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2446 include_directories : includes,
2447 link_with : [libshared],
2448 install_rpath : rootlibexecdir,
2450 install_dir : rootbindir)
2451 public_programs += exe
2453 exe = executable('systemd-cgls',
2455 include_directories : includes,
2456 link_with : [libshared],
2457 install_rpath : rootlibexecdir,
2459 public_programs += exe
2461 exe = executable('systemd-cgtop',
2462 'src/cgtop/cgtop.c',
2463 include_directories : includes,
2464 link_with : [libshared],
2465 install_rpath : rootlibexecdir,
2467 public_programs += exe
2469 executable('systemd-initctl',
2470 'src/initctl/initctl.c',
2471 include_directories : includes,
2472 link_with : [libshared],
2473 install_rpath : rootlibexecdir,
2475 install_dir : rootlibexecdir)
2477 exe = executable('systemd-mount',
2478 'src/mount/mount-tool.c',
2479 include_directories : includes,
2480 link_with : [libshared],
2481 dependencies: [libmount],
2482 install_rpath : rootlibexecdir,
2484 public_programs += exe
2486 meson.add_install_script(meson_make_symlink,
2487 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2489 exe = executable('systemd-run',
2491 include_directories : includes,
2492 link_with : [libshared],
2493 install_rpath : rootlibexecdir,
2495 public_programs += exe
2497 exe = executable('systemd-stdio-bridge',
2498 'src/stdio-bridge/stdio-bridge.c',
2499 include_directories : includes,
2500 link_with : [libshared],
2501 dependencies : [versiondep],
2502 install_rpath : rootlibexecdir,
2504 public_programs += exe
2506 exe = executable('busctl',
2507 'src/busctl/busctl.c',
2508 'src/busctl/busctl-introspect.c',
2509 'src/busctl/busctl-introspect.h',
2510 include_directories : includes,
2511 link_with : [libshared],
2512 install_rpath : rootlibexecdir,
2514 public_programs += exe
2516 if conf.get('ENABLE_SYSUSERS') == 1
2517 exe = executable('systemd-sysusers',
2518 'src/sysusers/sysusers.c',
2519 include_directories : includes,
2520 link_with : [libshared],
2521 install_rpath : rootlibexecdir,
2523 install_dir : rootbindir)
2524 public_programs += exe
2527 if conf.get('ENABLE_TMPFILES') == 1
2528 exe = executable('systemd-tmpfiles',
2529 'src/tmpfiles/tmpfiles.c',
2530 include_directories : includes,
2531 link_with : [libshared],
2532 dependencies : [libacl],
2533 install_rpath : rootlibexecdir,
2535 install_dir : rootbindir)
2536 public_programs += exe
2538 if want_tests != 'false'
2539 test('test-systemd-tmpfiles',
2540 test_systemd_tmpfiles_py,
2541 # https://github.com/mesonbuild/meson/issues/2681
2542 args : exe.full_path())
2546 if conf.get('ENABLE_HWDB') == 1
2547 exe = executable('systemd-hwdb',
2549 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2550 include_directories : includes,
2551 link_with : [libudev_static],
2552 install_rpath : udev_rpath,
2554 install_dir : rootbindir)
2555 public_programs += exe
2558 if conf.get('ENABLE_QUOTACHECK') == 1
2559 executable('systemd-quotacheck',
2560 'src/quotacheck/quotacheck.c',
2561 include_directories : includes,
2562 link_with : [libshared],
2563 install_rpath : rootlibexecdir,
2565 install_dir : rootlibexecdir)
2568 exe = executable('systemd-socket-proxyd',
2569 'src/socket-proxy/socket-proxyd.c',
2570 include_directories : includes,
2571 link_with : [libshared],
2572 dependencies : [threads],
2573 install_rpath : rootlibexecdir,
2575 install_dir : rootlibexecdir)
2576 public_programs += exe
2578 exe = executable('systemd-udevd',
2579 systemd_udevd_sources,
2580 include_directories : includes,
2581 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2582 link_with : [libudev_core,
2585 dependencies : [versiondep,
2591 install_rpath : udev_rpath,
2593 install_dir : rootlibexecdir)
2594 public_programs += exe
2596 exe = executable('udevadm',
2598 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2599 include_directories : includes,
2600 link_with : [libudev_core,
2603 dependencies : [versiondep,
2609 install_rpath : udev_rpath,
2611 install_dir : rootbindir)
2612 public_programs += exe
2614 executable('systemd-shutdown',
2615 systemd_shutdown_sources,
2616 include_directories : includes,
2617 link_with : [libcore_shared,
2619 dependencies : [libmount],
2620 install_rpath : rootlibexecdir,
2622 install_dir : rootlibexecdir)
2624 executable('systemd-update-done',
2625 'src/update-done/update-done.c',
2626 include_directories : includes,
2627 link_with : [libshared],
2628 install_rpath : rootlibexecdir,
2630 install_dir : rootlibexecdir)
2632 executable('systemd-update-utmp',
2633 'src/update-utmp/update-utmp.c',
2634 include_directories : includes,
2635 link_with : [libshared],
2636 dependencies : [libaudit],
2637 install_rpath : rootlibexecdir,
2639 install_dir : rootlibexecdir)
2641 if conf.get('HAVE_KMOD') == 1
2642 executable('systemd-modules-load',
2643 'src/modules-load/modules-load.c',
2644 include_directories : includes,
2645 link_with : [libshared],
2646 dependencies : [libkmod],
2647 install_rpath : rootlibexecdir,
2649 install_dir : rootlibexecdir)
2651 meson.add_install_script('sh', '-c',
2652 mkdir_p.format(modulesloaddir))
2653 meson.add_install_script('sh', '-c',
2654 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2657 exe = executable('systemd-nspawn',
2658 systemd_nspawn_sources,
2659 include_directories : includes,
2660 link_with : [libcore_shared,
2663 dependencies : [libblkid,
2665 install_rpath : rootlibexecdir,
2667 public_programs += exe
2669 if conf.get('ENABLE_NETWORKD') == 1
2670 executable('systemd-networkd',
2671 systemd_networkd_sources,
2672 include_directories : includes,
2673 link_with : [libnetworkd_core,
2677 dependencies : [threads],
2678 install_rpath : rootlibexecdir,
2680 install_dir : rootlibexecdir)
2682 executable('systemd-networkd-wait-online',
2683 systemd_networkd_wait_online_sources,
2684 include_directories : includes,
2685 link_with : [libnetworkd_core,
2687 install_rpath : rootlibexecdir,
2689 install_dir : rootlibexecdir)
2691 exe = executable('networkctl',
2693 include_directories : includes,
2694 link_with : [libsystemd_network,
2696 install_rpath : rootlibexecdir,
2698 install_dir : rootbindir)
2699 public_programs += exe
2702 executable('systemd-sulogin-shell',
2703 ['src/sulogin-shell/sulogin-shell.c'],
2704 include_directories : includes,
2705 link_with : [libshared],
2706 install_rpath : rootlibexecdir,
2708 install_dir : rootlibexecdir)
2710 ############################################################
2713 'systemd-runtest.env',
2714 output : 'systemd-runtest.env',
2715 command : ['sh', '-c', '{ ' +
2716 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2717 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2719 build_by_default : true)
2721 foreach tuple : tests
2723 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2724 dependencies = tuple[2]
2725 condition = tuple.length() >= 4 ? tuple[3] : ''
2726 type = tuple.length() >= 5 ? tuple[4] : ''
2727 defs = tuple.length() >= 6 ? tuple[5] : []
2728 incs = tuple.length() >= 7 ? tuple[6] : includes
2731 name = sources[0].split('/')[-1].split('.')[0]
2732 if type.startswith('timeout=')
2733 timeout = type.split('=')[1].to_int()
2737 if condition == '' or conf.get(condition) == 1
2741 include_directories : incs,
2742 link_with : link_with,
2743 dependencies : [versiondep,
2746 build_by_default : want_tests != 'false',
2747 install_rpath : rootlibexecdir,
2748 install : install_tests,
2749 install_dir : join_paths(testsdir, type))
2752 message('@0@ is a manual test'.format(name))
2753 elif type == 'unsafe' and want_tests != 'unsafe'
2754 message('@0@ is an unsafe test'.format(name))
2755 elif want_tests != 'false'
2761 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2766 'test-libsystemd-sym',
2767 test_libsystemd_sym_c,
2768 include_directories : includes,
2769 link_with : [libsystemd],
2770 build_by_default : want_tests != 'false',
2771 install : install_tests,
2772 install_dir : testsdir)
2773 if want_tests != 'false'
2774 test('test-libsystemd-sym', exe)
2778 'test-libsystemd-static-sym',
2779 test_libsystemd_sym_c,
2780 include_directories : includes,
2781 link_with : [install_libsystemd_static],
2782 dependencies : [threads], # threads is already included in dependencies on the library,
2783 # but does not seem to get propagated. Add here as a work-around.
2784 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2785 install : install_tests and static_libsystemd_pic,
2786 install_dir : testsdir)
2787 if want_tests != 'false' and static_libsystemd_pic
2788 test('test-libsystemd-static-sym', exe)
2794 include_directories : includes,
2795 c_args : '-Wno-deprecated-declarations',
2796 link_with : [libudev],
2797 build_by_default : want_tests != 'false',
2798 install : install_tests,
2799 install_dir : testsdir)
2800 if want_tests != 'false'
2801 test('test-libudev-sym', exe)
2805 'test-libudev-static-sym',
2807 include_directories : includes,
2808 c_args : '-Wno-deprecated-declarations',
2809 link_with : [install_libudev_static],
2810 build_by_default : want_tests != 'false' and static_libudev_pic,
2811 install : install_tests and static_libudev_pic,
2812 install_dir : testsdir)
2813 if want_tests != 'false' and static_libudev_pic
2814 test('test-libudev-static-sym', exe)
2817 ############################################################
2821 if get_option('tests') != 'false'
2822 foreach tuple : fuzzers
2824 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2825 dependencies = tuple[2]
2826 defs = tuple.length() >= 4 ? tuple[3] : []
2827 incs = tuple.length() >= 5 ? tuple[4] : includes
2830 dependencies += fuzzing_engine
2832 sources += 'src/fuzz/fuzz-main.c'
2836 sources += 'src/fuzz/fuzzer-entry-point.c'
2839 name = sources[0].split('/')[-1].split('.')[0]
2841 fuzzer_exes += executable(
2844 include_directories : [incs, include_directories('src/fuzz')],
2845 link_with : link_with,
2846 dependencies : dependencies,
2852 run_target('fuzzers',
2853 depends : fuzzer_exes,
2856 ############################################################
2858 make_directive_index_py = find_program('tools/make-directive-index.py')
2859 make_man_index_py = find_program('tools/make-man-index.py')
2860 xml_helper_py = find_program('tools/xml_helper.py')
2861 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2865 subdir('sysusers.d')
2866 subdir('tmpfiles.d')
2871 subdir('shell-completion/bash')
2872 subdir('shell-completion/zsh')
2873 subdir('docs/sysvinit')
2874 subdir('docs/var-log')
2876 install_subdir('factory/etc',
2877 install_dir : factorydir)
2879 install_data('xorg/50-systemd-user.sh',
2880 install_dir : xinitrcdir)
2881 install_data('modprobe.d/systemd.conf',
2882 install_dir : modprobedir)
2883 install_data('LICENSE.GPL2',
2887 'docs/CODING_STYLE.md',
2888 'docs/DISTRO_PORTING.md',
2889 'docs/ENVIRONMENT.md',
2891 'docs/TRANSIENT-SETTINGS.md',
2892 'docs/TRANSLATORS.md',
2893 'docs/UIDS-GIDS.md',
2894 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2895 install_dir : docdir)
2897 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2898 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2900 ############################################################
2902 meson_check_help = find_program('tools/meson-check-help.sh')
2904 foreach exec : public_programs
2905 name = exec.full_path().split('/')[-1]
2906 if want_tests != 'false'
2907 test('check-help-' + name,
2909 args : exec.full_path())
2913 ############################################################
2915 # Enable tests for all supported sanitizers
2916 foreach tuple : sanitizers
2917 sanitizer = tuple[0]
2920 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2922 foreach p : fuzz_regression_tests
2923 b = p.split('/')[-2]
2924 c = p.split('/')[-1]
2926 name = '@0@:@1@'.format(b, sanitizer)
2929 if want_tests == 'false'
2930 message('Not compiling @0@ because tests is set to false'.format(name))
2932 exe = custom_target(
2936 command : [env, 'ln', '-fs',
2937 join_paths(build.full_path(), b),
2939 build_by_default : true)
2941 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2946 if want_tests != 'false' and slow_tests
2947 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2949 args : [exe.full_path(),
2950 join_paths(project_source_root, p)])
2957 ############################################################
2960 all_files = run_command(
2962 ['--git-dir=@0@/.git'.format(project_source_root),
2965 all_files = files(all_files.stdout().split())
2970 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
2973 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
2977 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2980 command : [meson_git_contrib_sh])
2984 git_head = run_command(
2986 ['--git-dir=@0@/.git'.format(project_source_root),
2987 'rev-parse', 'HEAD']).stdout().strip()
2988 git_head_short = run_command(
2990 ['--git-dir=@0@/.git'.format(project_source_root),
2991 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2995 command : ['git', 'archive',
2996 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
2998 '--prefix', 'systemd-@0@/'.format(git_head),
3002 ############################################################
3004 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3007 depends : [man, libsystemd, libudev],
3008 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3010 ############################################################
3013 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3015 'split /usr: @0@'.format(split_usr),
3016 'split bin-sbin: @0@'.format(split_bin),
3017 'prefix directory: @0@'.format(prefixdir),
3018 'rootprefix directory: @0@'.format(rootprefixdir),
3019 'sysconf directory: @0@'.format(sysconfdir),
3020 'include directory: @0@'.format(includedir),
3021 'lib directory: @0@'.format(libdir),
3022 'rootlib directory: @0@'.format(rootlibdir),
3023 'SysV init scripts: @0@'.format(sysvinit_path),
3024 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3025 'PAM modules directory: @0@'.format(pamlibdir),
3026 'PAM configuration directory: @0@'.format(pamconfdir),
3027 'RPM macros directory: @0@'.format(rpmmacrosdir),
3028 'modprobe.d directory: @0@'.format(modprobedir),
3029 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3030 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3031 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3032 'bash completions directory: @0@'.format(bashcompletiondir),
3033 'zsh completions directory: @0@'.format(zshcompletiondir),
3034 'extra start script: @0@'.format(get_option('rc-local')),
3035 'extra stop script: @0@'.format(get_option('halt-local')),
3036 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3037 get_option('debug-tty')),
3038 'TTY GID: @0@'.format(tty_gid),
3039 'users GID: @0@'.format(substs.get('USERS_GID')),
3040 'maximum system UID: @0@'.format(system_uid_max),
3041 'maximum system GID: @0@'.format(system_gid_max),
3042 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3043 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3044 'minimum container UID base: @0@'.format(container_uid_base_min),
3045 'maximum container UID base: @0@'.format(container_uid_base_max),
3046 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3047 'render group access mode: @0@'.format(get_option('group-render-mode')),
3048 'certificate root directory: @0@'.format(get_option('certificate-root')),
3049 'support URL: @0@'.format(support_url),
3050 'nobody user name: @0@'.format(nobody_user),
3051 'nobody group name: @0@'.format(nobody_group),
3052 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3053 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3055 'default DNSSEC mode: @0@'.format(default_dnssec),
3056 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3057 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3058 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3059 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3060 'default locale: @0@'.format(default_locale)]
3062 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3063 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3065 'default DNS servers: @0@'.format(alt_dns_servers),
3066 'default NTP servers: @0@'.format(alt_ntp_servers)]
3068 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3069 '@@0@'.format(time_epoch)).stdout().strip()
3071 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3074 'static libsystemd: @0@'.format(static_libsystemd),
3075 'static libudev: @0@'.format(static_libudev)]
3078 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3079 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3080 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3082 if conf.get('ENABLE_EFI') == 1
3083 status += 'efi arch: @0@'.format(efi_arch)
3087 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3088 'EFI CC @0@'.format(' '.join(efi_cc)),
3089 'EFI lib directory: @0@'.format(efi_libdir),
3090 'EFI lds directory: @0@'.format(efi_ldsdir),
3091 'EFI include directory: @0@'.format(efi_incdir)]
3143 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3144 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3147 ['legacy pkla', install_polkit_pkla],
3149 ['gnu-efi', have_gnu_efi],
3162 ['man pages', want_man],
3163 ['html pages', want_html],
3164 ['man page indices', want_man and have_lxml],
3169 ['adm group', get_option('adm-group')],
3170 ['wheel group', get_option('wheel-group')],
3173 ['debug mmap cache'],
3176 ['valgrind', conf.get('VALGRIND') == 1],
3177 ['trace logging', conf.get('LOG_TRACE') == 1],
3178 ['link-udev-shared', get_option('link-udev-shared')],
3179 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3182 if tuple.length() >= 2
3185 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3186 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3187 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3198 'enabled features: @0@'.format(', '.join(found)),
3200 'disabled features: @0@'.format(', '.join(missing)),
3202 message('\n '.join(status))
3204 if rootprefixdir != rootprefix_default
3206 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3207 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3208 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))