1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
12 meson_version : '>= 0.46',
15 libsystemd_version = '0.23.0'
16 libudev_version = '1.6.11'
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_quoted('PACKAGE_STRING', meson.project_name() + ' ' + meson.project_version())
24 conf.set_quoted('PACKAGE_VERSION', meson.project_version())
26 substs = configuration_data()
27 substs.set('PACKAGE_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
28 substs.set('PACKAGE_VERSION', meson.project_version())
30 want_ossfuzz = get_option('oss-fuzz')
31 want_libfuzzer = get_option('llvm-fuzz')
32 if want_ossfuzz and want_libfuzzer
33 error('only one of oss-fuzz and llvm-fuzz can be specified')
35 fuzzer_build = want_ossfuzz or want_libfuzzer
37 #####################################################################
39 # Try to install the git pre-commit hook
40 git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
41 if git_hook.returncode() == 0
42 message(git_hook.stdout().strip())
45 #####################################################################
47 if get_option('split-usr') == 'auto'
48 split_usr = run_command('test', '-L', '/bin').returncode() != 0
50 split_usr = get_option('split-usr') == 'true'
52 conf.set10('HAVE_SPLIT_USR', split_usr,
53 description : '/usr/bin and /bin directories are separate')
55 if get_option('split-bin') == 'auto'
56 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
58 split_bin = get_option('split-bin') == 'true'
60 conf.set10('HAVE_SPLIT_BIN', split_bin,
61 description : 'bin and sbin directories are separate')
63 rootprefixdir = get_option('rootprefix')
64 # Unusual rootprefixdir values are used by some distros
65 # (see https://github.com/systemd/systemd/pull/7461).
66 rootprefix_default = split_usr ? '/' : '/usr'
67 if rootprefixdir == ''
68 rootprefixdir = rootprefix_default
71 sysvinit_path = get_option('sysvinit-path')
72 sysvrcnd_path = get_option('sysvrcnd-path')
73 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
74 description : 'SysV init scripts and rcN.d links are supported')
76 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
77 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
78 conf.set('HIGH_RLIMIT_NOFILE', 256*1024)
80 # join_paths ignore the preceding arguments if an absolute component is
81 # encountered, so this should canonicalize various paths when they are
82 # absolute or relative.
83 prefixdir = get_option('prefix')
84 if not prefixdir.startswith('/')
85 error('Prefix is not absolute: "@0@"'.format(prefixdir))
87 bindir = join_paths(prefixdir, get_option('bindir'))
88 libdir = join_paths(prefixdir, get_option('libdir'))
89 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
90 includedir = join_paths(prefixdir, get_option('includedir'))
91 datadir = join_paths(prefixdir, get_option('datadir'))
92 localstatedir = join_paths('/', get_option('localstatedir'))
94 rootbindir = join_paths(rootprefixdir, 'bin')
95 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
96 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
98 rootlibdir = get_option('rootlibdir')
100 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
103 # Dirs of external packages
104 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
105 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
106 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
107 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
108 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
109 varlogdir = join_paths(localstatedir, 'log')
110 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
111 rpmmacrosdir = get_option('rpmmacrosdir')
112 if rpmmacrosdir != 'no'
113 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
115 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
118 pkgdatadir = join_paths(datadir, 'systemd')
119 environmentdir = join_paths(prefixdir, 'lib/environment.d')
120 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
121 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
122 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
123 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
124 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
125 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
126 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
127 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
128 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
129 pkgincludedir = join_paths(includedir, 'systemd')
130 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
131 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
132 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
133 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
134 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
135 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
136 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
137 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
138 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
139 udevhomedir = udevlibexecdir
140 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
141 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
142 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
143 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
144 factorydir = join_paths(datadir, 'factory')
145 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
146 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
147 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
148 catalogstatedir = join_paths(systemdstatedir, 'catalog')
149 randomseeddir = join_paths(localstatedir, 'lib/systemd')
150 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
152 docdir = get_option('docdir')
154 docdir = join_paths(datadir, 'doc/systemd')
157 dbuspolicydir = get_option('dbuspolicydir')
158 if dbuspolicydir == ''
159 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
162 dbussessionservicedir = get_option('dbussessionservicedir')
163 if dbussessionservicedir == ''
164 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
167 dbussystemservicedir = get_option('dbussystemservicedir')
168 if dbussystemservicedir == ''
169 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
172 pamlibdir = get_option('pamlibdir')
174 pamlibdir = join_paths(rootlibdir, 'security')
177 pamconfdir = get_option('pamconfdir')
179 pamconfdir = join_paths(sysconfdir, 'pam.d')
182 memory_accounting_default = get_option('memory-accounting-default')
184 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
185 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
186 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
187 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
188 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
189 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
190 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
192 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
194 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
195 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
196 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
197 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
198 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
199 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
200 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
201 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
202 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
203 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
204 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
205 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
206 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
207 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
208 conf.set_quoted('ROOTPREFIX', rootprefixdir)
209 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
210 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
211 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
212 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
213 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
214 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
215 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
216 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
217 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
218 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
219 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
220 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
221 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
222 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
223 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
224 conf.set_quoted('LIBDIR', libdir)
225 conf.set_quoted('ROOTLIBDIR', rootlibdir)
226 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
227 conf.set_quoted('BOOTLIBDIR', bootlibdir)
228 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
229 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
230 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
231 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
232 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
233 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
234 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
235 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
237 substs.set('prefix', prefixdir)
238 substs.set('exec_prefix', prefixdir)
239 substs.set('libdir', libdir)
240 substs.set('rootlibdir', rootlibdir)
241 substs.set('includedir', includedir)
242 substs.set('pkgsysconfdir', pkgsysconfdir)
243 substs.set('bindir', bindir)
244 substs.set('rootbindir', rootbindir)
245 substs.set('rootlibexecdir', rootlibexecdir)
246 substs.set('systemunitdir', systemunitdir)
247 substs.set('userunitdir', userunitdir)
248 substs.set('systempresetdir', systempresetdir)
249 substs.set('userpresetdir', userpresetdir)
250 substs.set('udevhwdbdir', udevhwdbdir)
251 substs.set('udevrulesdir', udevrulesdir)
252 substs.set('udevlibexecdir', udevlibexecdir)
253 substs.set('environmentdir', environmentdir)
254 substs.set('catalogdir', catalogdir)
255 substs.set('tmpfilesdir', tmpfilesdir)
256 substs.set('sysusersdir', sysusersdir)
257 substs.set('sysctldir', sysctldir)
258 substs.set('binfmtdir', binfmtdir)
259 substs.set('modulesloaddir', modulesloaddir)
260 substs.set('modprobedir', modprobedir)
261 substs.set('systemgeneratordir', systemgeneratordir)
262 substs.set('usergeneratordir', usergeneratordir)
263 substs.set('systemenvgeneratordir', systemenvgeneratordir)
264 substs.set('userenvgeneratordir', userenvgeneratordir)
265 substs.set('systemshutdowndir', systemshutdowndir)
266 substs.set('systemsleepdir', systemsleepdir)
267 substs.set('VARLOGDIR', varlogdir)
268 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
269 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
270 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
271 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
272 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
273 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
274 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
275 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
276 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
278 #####################################################################
280 cc = meson.get_compiler('c')
281 pkgconfig = import('pkgconfig')
282 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
283 meson_build_sh = find_program('tools/meson-build.sh')
285 want_tests = get_option('tests')
286 slow_tests = want_tests != 'false' and get_option('slow-tests')
287 install_tests = get_option('install-tests')
289 cxx = find_program('c++', required : fuzzer_build)
291 # Used only for tests
293 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
299 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
301 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
304 possible_cc_flags = [
308 '-Wmissing-include-dirs',
309 '-Wold-style-definition',
313 '-Wsuggest-attribute=noreturn',
314 '-Werror=missing-prototypes',
315 '-Werror=implicit-function-declaration',
316 '-Werror=missing-declarations',
317 '-Werror=return-type',
318 '-Werror=incompatible-pointer-types',
320 '-Wstrict-prototypes',
322 '-Wmissing-noreturn',
323 '-Wimplicit-fallthrough=5',
326 '-Wstrict-aliasing=2',
329 '-Werror=shift-count-overflow',
330 '-Werror=shift-overflow=2',
334 # negative arguments are correctly detected starting with meson 0.46.
335 '-Wno-unused-parameter',
336 '-Wno-missing-field-initializers',
337 '-Wno-unused-result',
338 '-Wno-format-signedness',
340 # work-around for gcc 7.1 turning this on on its own.
341 '-Wno-error=nonnull',
343 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
344 # optimizations enabled, producing essentially false positives.
345 '-Wno-maybe-uninitialized',
349 '-fdiagnostics-show-option',
350 '-fno-strict-aliasing',
351 '-fvisibility=hidden',
353 '-fstack-protector-strong',
354 '--param=ssp-buffer-size=4',
357 # --as-needed and --no-undefined are provided by meson by default,
358 # run mesonconf to see what is enabled
359 possible_link_flags = [
364 # the oss-fuzz fuzzers are not built with -fPIE, so don't
365 # enable it when we are linking against them
367 possible_cc_flags += '-fPIE'
368 possible_link_flags += '-pie'
371 if cc.get_id() == 'clang'
372 possible_cc_flags += [
373 '-Wno-typedef-redefinition',
374 '-Wno-gnu-variable-sized-type-not-at-end',
378 if get_option('buildtype') != 'debug'
379 possible_cc_flags += [
380 '-ffunction-sections',
384 possible_link_flags += '-Wl,--gc-sections'
387 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
388 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
392 #include <inttypes.h>
393 typedef uint64_t usec_t;
394 usec_t now(clockid_t clock);
399 ''', name : '-Werror=shadow with local shadowing')
400 add_project_arguments('-Werror=shadow', language : 'c')
403 cpp = ' '.join(cc.cmd_array()) + ' -E'
405 #####################################################################
406 # compilation result tests
408 conf.set('_GNU_SOURCE', true)
409 conf.set('__SANE_USERSPACE_TYPES__', true)
411 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
412 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
413 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
414 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
415 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
416 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
417 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
421 #include <linux/ethtool.h>
422 #include <linux/fib_rules.h>
423 #include <sys/stat.h>
426 foreach decl : ['char16_t',
428 'struct ethtool_link_settings',
429 'struct fib_rule_uid_range',
433 # We get -1 if the size cannot be determined
434 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
436 if decl == 'struct statx'
438 want_linux_stat_h = false
440 have = cc.sizeof(decl,
441 prefix : decl_headers + '#include <linux/stat.h>',
442 args : '-D_GNU_SOURCE') > 0
443 want_linux_stat_h = have
447 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
450 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
452 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
453 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
454 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
455 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
456 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
457 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
458 ['IFLA_BOND_AD_ACTOR_SYSTEM', 'linux/if_link.h'],
459 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
460 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
461 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
462 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
463 # if_tunnel.h is buggy and cannot be included on its own
464 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
465 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
466 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
467 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
468 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
469 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
470 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
471 ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
472 ['NDA_IFINDEX', 'linux/neighbour.h'],
473 ['IFA_FLAGS', 'linux/if_addr.h'],
474 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
475 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
476 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
477 ['FOU_ATTR_REMCSUM_NOPARTIAL', 'linux/fou.h'],
478 ['FOU_CMD_GET', 'linux/fou.h'],
480 prefix = decl.length() > 2 ? decl[2] : ''
481 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
482 conf.set10('HAVE_' + decl[0], have)
485 foreach ident : ['secure_getenv', '__secure_getenv']
486 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
490 ['memfd_create', '''#include <sys/mman.h>'''],
491 ['gettid', '''#include <sys/types.h>
492 #include <unistd.h>'''],
493 ['pivot_root', '''#include <stdlib.h>
494 #include <unistd.h>'''], # no known header declares pivot_root
495 ['name_to_handle_at', '''#include <sys/types.h>
496 #include <sys/stat.h>
497 #include <fcntl.h>'''],
498 ['setns', '''#include <sched.h>'''],
499 ['renameat2', '''#include <stdio.h>
500 #include <fcntl.h>'''],
501 ['kcmp', '''#include <linux/kcmp.h>'''],
502 ['keyctl', '''#include <sys/types.h>
503 #include <keyutils.h>'''],
504 ['copy_file_range', '''#include <sys/syscall.h>
505 #include <unistd.h>'''],
506 ['bpf', '''#include <sys/syscall.h>
507 #include <unistd.h>'''],
508 ['statx', '''#include <sys/types.h>
509 #include <sys/stat.h>
510 #include <unistd.h>'''],
511 ['explicit_bzero' , '''#include <string.h>'''],
512 ['reallocarray', '''#include <malloc.h>'''],
515 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
516 conf.set10('HAVE_' + ident[0].to_upper(), have)
519 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
520 conf.set10('USE_SYS_RANDOM_H', true)
521 conf.set10('HAVE_GETRANDOM', true)
523 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
524 conf.set10('USE_SYS_RANDOM_H', false)
525 conf.set10('HAVE_GETRANDOM', have)
528 #####################################################################
530 sed = find_program('sed')
531 awk = find_program('awk')
532 m4 = find_program('m4')
533 stat = find_program('stat')
534 git = find_program('git', required : false)
535 env = find_program('env')
536 perl = find_program('perl', required : false)
538 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
539 mkdir_p = 'mkdir -p $DESTDIR/@0@'
540 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
541 splash_bmp = files('test/splash.bmp')
543 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
544 # /usr/sbin, /sbin, and fall back to the default from middle column.
545 progs = [['quotaon', '/usr/sbin/quotaon' ],
546 ['quotacheck', '/usr/sbin/quotacheck' ],
547 ['kmod', '/usr/bin/kmod' ],
548 ['kexec', '/usr/sbin/kexec' ],
549 ['sulogin', '/usr/sbin/sulogin' ],
550 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
551 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
552 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
553 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
556 path = get_option(prog[0] + '-path')
558 message('Using @1@ for @0@'.format(prog[0], path))
560 exe = find_program(prog[0],
561 '/usr/sbin/' + prog[0],
564 path = exe.found() ? exe.path() : prog[1]
566 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
567 conf.set_quoted(name, path)
568 substs.set(name, path)
571 conf.set_quoted('TELINIT', get_option('telinit-path'))
573 if run_command('ln', '--relative', '--help').returncode() != 0
574 error('ln does not support --relative (added in coreutils 8.16)')
577 ############################################################
579 gperf = find_program('gperf')
581 gperf_test_format = '''
583 const char * in_word_set(const char *, @0@);
586 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
587 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
588 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
589 if cc.compiles(gperf_test)
590 gperf_len_type = 'size_t'
592 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
593 if cc.compiles(gperf_test)
594 gperf_len_type = 'unsigned'
596 error('unable to determine gperf len type')
599 message('gperf len type is @0@'.format(gperf_len_type))
600 conf.set('GPERF_LEN_TYPE', gperf_len_type,
601 description : 'The type of gperf "len" parameter')
603 ############################################################
605 if not cc.has_header('sys/capability.h')
606 error('POSIX caps headers not found')
608 foreach header : ['crypt.h',
612 'linux/vm_sockets.h',
614 'valgrind/memcheck.h',
615 'valgrind/valgrind.h',
618 conf.set10('HAVE_' + header.underscorify().to_upper(),
619 cc.has_header(header))
622 ############################################################
624 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
625 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
626 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
628 default_hierarchy = get_option('default-hierarchy')
629 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
630 description : 'default cgroup hierarchy as string')
631 if default_hierarchy == 'legacy'
632 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
633 elif default_hierarchy == 'hybrid'
634 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
636 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
639 time_epoch = get_option('time-epoch')
642 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
644 conf.set('TIME_EPOCH', time_epoch)
646 system_uid_max = get_option('system-uid-max')
647 if system_uid_max == -1
648 system_uid_max = run_command(
650 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
651 '/etc/login.defs').stdout().strip()
652 if system_uid_max == ''
655 system_uid_max = system_uid_max.to_int()
658 conf.set('SYSTEM_UID_MAX', system_uid_max)
659 substs.set('systemuidmax', system_uid_max)
661 system_gid_max = get_option('system-gid-max')
662 if system_gid_max == -1
663 system_gid_max = run_command(
665 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
666 '/etc/login.defs').stdout().strip()
667 if system_gid_max == ''
670 system_gid_max = system_gid_max.to_int()
673 conf.set('SYSTEM_GID_MAX', system_gid_max)
674 substs.set('systemgidmax', system_gid_max)
676 dynamic_uid_min = get_option('dynamic-uid-min')
677 dynamic_uid_max = get_option('dynamic-uid-max')
678 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
679 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
680 substs.set('dynamicuidmin', dynamic_uid_min)
681 substs.set('dynamicuidmax', dynamic_uid_max)
683 container_uid_base_min = get_option('container-uid-base-min')
684 container_uid_base_max = get_option('container-uid-base-max')
685 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
686 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
687 substs.set('containeruidbasemin', container_uid_base_min)
688 substs.set('containeruidbasemax', container_uid_base_max)
690 nobody_user = get_option('nobody-user')
691 nobody_group = get_option('nobody-group')
693 if not meson.is_cross_build()
694 getent_result = run_command('getent', 'passwd', '65534')
695 if getent_result.returncode() == 0
696 name = getent_result.stdout().split(':')[0]
697 if name != nobody_user
699 '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) +
700 'Your build will result in an user table setup that is incompatible with the local system.')
703 id_result = run_command('id', '-u', nobody_user)
704 if id_result.returncode() == 0
705 id = id_result.stdout().to_int()
708 '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) +
709 'Your build will result in an user table setup that is incompatible with the local system.')
713 getent_result = run_command('getent', 'group', '65534')
714 if getent_result.returncode() == 0
715 name = getent_result.stdout().split(':')[0]
716 if name != nobody_group
718 '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) +
719 'Your build will result in an group table setup that is incompatible with the local system.')
722 id_result = run_command('id', '-g', nobody_group)
723 if id_result.returncode() == 0
724 id = id_result.stdout().to_int()
727 '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) +
728 'Your build will result in an group table setup that is incompatible with the local system.')
732 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
734 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
735 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
738 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
739 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
740 substs.set('NOBODY_USER_NAME', nobody_user)
741 substs.set('NOBODY_GROUP_NAME', nobody_group)
743 tty_gid = get_option('tty-gid')
744 conf.set('TTY_GID', tty_gid)
745 substs.set('TTY_GID', tty_gid)
747 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
748 users_gid = get_option('users-gid')
749 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
751 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
752 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
754 dev_kvm_mode = get_option('dev-kvm-mode')
755 substs.set('DEV_KVM_MODE', dev_kvm_mode)
756 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
757 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
759 kill_user_processes = get_option('default-kill-user-processes')
760 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
761 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
762 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
764 dns_servers = get_option('dns-servers')
765 conf.set_quoted('DNS_SERVERS', dns_servers)
766 substs.set('DNS_SERVERS', dns_servers)
768 ntp_servers = get_option('ntp-servers')
769 conf.set_quoted('NTP_SERVERS', ntp_servers)
770 substs.set('NTP_SERVERS', ntp_servers)
772 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
774 substs.set('SUSHELL', get_option('debug-shell'))
775 substs.set('DEBUGTTY', get_option('debug-tty'))
777 enable_debug_hashmap = false
778 enable_debug_mmap_cache = false
779 foreach name : get_option('debug-extra')
781 enable_debug_hashmap = true
782 elif name == 'mmap-cache'
783 enable_debug_mmap_cache = true
785 message('unknown debug option "@0@", ignoring'.format(name))
788 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
789 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
791 conf.set10('VALGRIND', get_option('valgrind'))
792 conf.set10('LOG_TRACE', get_option('log-trace'))
794 #####################################################################
796 threads = dependency('threads')
797 librt = cc.find_library('rt')
798 libm = cc.find_library('m')
799 libdl = cc.find_library('dl')
800 libcrypt = cc.find_library('crypt')
802 libcap = dependency('libcap', required : false)
803 if not libcap.found()
804 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
805 libcap = cc.find_library('cap')
808 libmount = dependency('mount',
809 version : fuzzer_build ? '>= 0' : '>= 2.30')
811 want_seccomp = get_option('seccomp')
812 if want_seccomp != 'false' and not fuzzer_build
813 libseccomp = dependency('libseccomp',
814 version : '>= 2.3.1',
815 required : want_seccomp == 'true')
816 have = libseccomp.found()
821 conf.set10('HAVE_SECCOMP', have)
823 want_selinux = get_option('selinux')
824 if want_selinux != 'false' and not fuzzer_build
825 libselinux = dependency('libselinux',
826 version : '>= 2.1.9',
827 required : want_selinux == 'true')
828 have = libselinux.found()
833 conf.set10('HAVE_SELINUX', have)
835 want_apparmor = get_option('apparmor')
836 if want_apparmor != 'false' and not fuzzer_build
837 libapparmor = dependency('libapparmor',
838 required : want_apparmor == 'true')
839 have = libapparmor.found()
844 conf.set10('HAVE_APPARMOR', have)
846 smack_run_label = get_option('smack-run-label')
847 if smack_run_label != ''
848 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
851 want_polkit = get_option('polkit')
852 install_polkit = false
853 install_polkit_pkla = false
854 if want_polkit != 'false' and not fuzzer_build
855 install_polkit = true
857 libpolkit = dependency('polkit-gobject-1',
859 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
860 message('Old polkit detected, will install pkla files')
861 install_polkit_pkla = true
864 conf.set10('ENABLE_POLKIT', install_polkit)
866 want_acl = get_option('acl')
867 if want_acl != 'false' and not fuzzer_build
868 libacl = cc.find_library('acl', required : want_acl == 'true')
869 have = libacl.found()
874 conf.set10('HAVE_ACL', have)
876 want_audit = get_option('audit')
877 if want_audit != 'false' and not fuzzer_build
878 libaudit = dependency('audit', required : want_audit == 'true')
879 have = libaudit.found()
884 conf.set10('HAVE_AUDIT', have)
886 want_blkid = get_option('blkid')
887 if want_blkid != 'false' and not fuzzer_build
888 libblkid = dependency('blkid', required : want_blkid == 'true')
889 have = libblkid.found()
894 conf.set10('HAVE_BLKID', have)
896 want_kmod = get_option('kmod')
897 if want_kmod != 'false' and not fuzzer_build
898 libkmod = dependency('libkmod',
900 required : want_kmod == 'true')
901 have = libkmod.found()
906 conf.set10('HAVE_KMOD', have)
908 want_pam = get_option('pam')
909 if want_pam != 'false' and not fuzzer_build
910 libpam = cc.find_library('pam', required : want_pam == 'true')
911 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
912 have = libpam.found() and libpam_misc.found()
918 conf.set10('HAVE_PAM', have)
920 want_microhttpd = get_option('microhttpd')
921 if want_microhttpd != 'false' and not fuzzer_build
922 libmicrohttpd = dependency('libmicrohttpd',
923 version : '>= 0.9.33',
924 required : want_microhttpd == 'true')
925 have = libmicrohttpd.found()
930 conf.set10('HAVE_MICROHTTPD', have)
932 want_libcryptsetup = get_option('libcryptsetup')
933 if want_libcryptsetup != 'false' and not fuzzer_build
934 libcryptsetup = dependency('libcryptsetup',
935 version : '>= 1.6.0',
936 required : want_libcryptsetup == 'true')
937 have = libcryptsetup.found()
938 have_sector = cc.has_member(
939 'struct crypt_params_plain',
941 prefix : '#include <libcryptsetup.h>')
947 conf.set10('HAVE_LIBCRYPTSETUP', have)
948 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
950 want_libcurl = get_option('libcurl')
951 if want_libcurl != 'false' and not fuzzer_build
952 libcurl = dependency('libcurl',
953 version : '>= 7.32.0',
954 required : want_libcurl == 'true')
955 have = libcurl.found()
960 conf.set10('HAVE_LIBCURL', have)
962 want_libidn = get_option('libidn')
963 want_libidn2 = get_option('libidn2')
964 if want_libidn == 'true' and want_libidn2 == 'true'
965 error('libidn and libidn2 cannot be requested simultaneously')
968 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
969 libidn = dependency('libidn',
970 required : want_libidn == 'true')
971 have = libidn.found()
976 conf.set10('HAVE_LIBIDN', have)
977 if not have and want_libidn2 != 'false' and not fuzzer_build
978 # libidn is used for both libidn and libidn2 objects
979 libidn = dependency('libidn2',
980 required : want_libidn2 == 'true')
981 have = libidn.found()
985 conf.set10('HAVE_LIBIDN2', have)
987 want_libiptc = get_option('libiptc')
988 if want_libiptc != 'false' and not fuzzer_build
989 libiptc = dependency('libiptc',
990 required : want_libiptc == 'true')
991 have = libiptc.found()
996 conf.set10('HAVE_LIBIPTC', have)
998 want_qrencode = get_option('qrencode')
999 if want_qrencode != 'false' and not fuzzer_build
1000 libqrencode = dependency('libqrencode',
1001 required : want_qrencode == 'true')
1002 have = libqrencode.found()
1007 conf.set10('HAVE_QRENCODE', have)
1009 want_gcrypt = get_option('gcrypt')
1010 if want_gcrypt != 'false' and not fuzzer_build
1011 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1012 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1013 have = libgcrypt.found() and libgpg_error.found()
1018 # link to neither of the libs if one is not found
1022 conf.set10('HAVE_GCRYPT', have)
1024 want_gnutls = get_option('gnutls')
1025 if want_gnutls != 'false' and not fuzzer_build
1026 libgnutls = dependency('gnutls',
1027 version : '>= 3.1.4',
1028 required : want_gnutls == 'true')
1029 have = libgnutls.found()
1034 conf.set10('HAVE_GNUTLS', have)
1036 want_openssl = get_option('openssl')
1037 if want_openssl != 'false' and not fuzzer_build
1038 libopenssl = dependency('openssl',
1039 version : '>= 1.1.0',
1040 required : want_openssl == 'true')
1041 have = libopenssl.found()
1046 conf.set10('HAVE_OPENSSL', have)
1048 want_elfutils = get_option('elfutils')
1049 if want_elfutils != 'false' and not fuzzer_build
1050 libdw = dependency('libdw',
1051 required : want_elfutils == 'true')
1052 have = libdw.found()
1057 conf.set10('HAVE_ELFUTILS', have)
1059 want_zlib = get_option('zlib')
1060 if want_zlib != 'false' and not fuzzer_build
1061 libz = dependency('zlib',
1062 required : want_zlib == 'true')
1068 conf.set10('HAVE_ZLIB', have)
1070 want_bzip2 = get_option('bzip2')
1071 if want_bzip2 != 'false' and not fuzzer_build
1072 libbzip2 = cc.find_library('bz2',
1073 required : want_bzip2 == 'true')
1074 have = libbzip2.found()
1079 conf.set10('HAVE_BZIP2', have)
1081 want_xz = get_option('xz')
1082 if want_xz != 'false' and not fuzzer_build
1083 libxz = dependency('liblzma',
1084 required : want_xz == 'true')
1085 have = libxz.found()
1090 conf.set10('HAVE_XZ', have)
1092 want_lz4 = get_option('lz4')
1093 if want_lz4 != 'false' and not fuzzer_build
1094 liblz4 = dependency('liblz4',
1095 version : '>= 1.3.0',
1096 required : want_lz4 == 'true')
1097 have = liblz4.found()
1102 conf.set10('HAVE_LZ4', have)
1104 want_xkbcommon = get_option('xkbcommon')
1105 if want_xkbcommon != 'false' and not fuzzer_build
1106 libxkbcommon = dependency('xkbcommon',
1107 version : '>= 0.3.0',
1108 required : want_xkbcommon == 'true')
1109 have = libxkbcommon.found()
1114 conf.set10('HAVE_XKBCOMMON', have)
1116 want_pcre2 = get_option('pcre2')
1117 if want_pcre2 != 'false'
1118 libpcre2 = dependency('libpcre2-8',
1119 required : want_pcre2 == 'true')
1120 have = libpcre2.found()
1125 conf.set10('HAVE_PCRE2', have)
1127 want_glib = get_option('glib')
1128 if want_glib != 'false' and not fuzzer_build
1129 libglib = dependency('glib-2.0',
1130 version : '>= 2.22.0',
1131 required : want_glib == 'true')
1132 libgobject = dependency('gobject-2.0',
1133 version : '>= 2.22.0',
1134 required : want_glib == 'true')
1135 libgio = dependency('gio-2.0',
1136 required : want_glib == 'true')
1137 have = libglib.found() and libgobject.found() and libgio.found()
1144 conf.set10('HAVE_GLIB', have)
1146 want_dbus = get_option('dbus')
1147 if want_dbus != 'false' and not fuzzer_build
1148 libdbus = dependency('dbus-1',
1149 version : '>= 1.3.2',
1150 required : want_dbus == 'true')
1151 have = libdbus.found()
1156 conf.set10('HAVE_DBUS', have)
1158 default_dnssec = get_option('default-dnssec')
1160 default_dnssec = 'no'
1162 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1163 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1164 default_dnssec = 'no'
1166 conf.set('DEFAULT_DNSSEC_MODE',
1167 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1168 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1170 dns_over_tls = get_option('dns-over-tls')
1171 if dns_over_tls != 'false'
1172 if dns_over_tls == 'openssl'
1175 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1176 if dns_over_tls == 'gnutls' and not have_gnutls
1177 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1180 if dns_over_tls == 'gnutls' or have_gnutls
1181 have_openssl = false
1183 have_openssl = conf.get('HAVE_OPENSSL') == 1
1184 if dns_over_tls != 'auto' and not have_openssl
1185 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1186 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1189 have = have_gnutls or have_openssl
1191 have = have_gnutls = have_openssl = false
1193 conf.set10('ENABLE_DNS_OVER_TLS', have)
1194 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1195 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1197 default_dns_over_tls = get_option('default-dns-over-tls')
1199 default_dns_over_tls = 'no'
1201 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1202 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1203 default_dns_over_tls = 'no'
1205 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1206 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1207 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1209 want_importd = get_option('importd')
1210 if want_importd != 'false'
1211 have = (conf.get('HAVE_LIBCURL') == 1 and
1212 conf.get('HAVE_ZLIB') == 1 and
1213 conf.get('HAVE_XZ') == 1 and
1214 conf.get('HAVE_GCRYPT') == 1)
1215 if want_importd == 'true' and not have
1216 error('importd support was requested, but dependencies are not available')
1221 conf.set10('ENABLE_IMPORTD', have)
1223 want_remote = get_option('remote')
1224 if want_remote != 'false'
1225 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1226 conf.get('HAVE_LIBCURL') == 1]
1227 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1228 # it's possible to build one without the other. Complain only if
1229 # support was explictly requested. The auxiliary files like sysusers
1230 # config should be installed when any of the programs are built.
1231 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1232 error('remote support was requested, but dependencies are not available')
1234 have = have_deps[0] or have_deps[1]
1238 conf.set10('ENABLE_REMOTE', have)
1240 foreach term : ['utmp',
1272 have = get_option(term)
1273 name = 'ENABLE_' + term.underscorify().to_upper()
1274 conf.set10(name, have)
1277 foreach tuple : [['nss-mymachines', 'machined'],
1278 ['nss-resolve', 'resolve']]
1279 want = get_option(tuple[0])
1281 have = get_option(tuple[1])
1282 if want == 'true' and not have
1283 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1288 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1289 conf.set10(name, have)
1293 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1294 'ENABLE_NSS_MYMACHINES',
1295 'ENABLE_NSS_RESOLVE',
1296 'ENABLE_NSS_SYSTEMD']
1297 if conf.get(term) == 1
1301 conf.set10('ENABLE_NSS', enable_nss)
1303 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1308 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1310 #####################################################################
1312 if get_option('efi')
1313 efi_arch = host_machine.cpu_family()
1315 if efi_arch == 'x86'
1316 EFI_MACHINE_TYPE_NAME = 'ia32'
1317 gnu_efi_arch = 'ia32'
1318 elif efi_arch == 'x86_64'
1319 EFI_MACHINE_TYPE_NAME = 'x64'
1320 gnu_efi_arch = 'x86_64'
1321 elif efi_arch == 'arm'
1322 EFI_MACHINE_TYPE_NAME = 'arm'
1323 gnu_efi_arch = 'arm'
1324 elif efi_arch == 'aarch64'
1325 EFI_MACHINE_TYPE_NAME = 'aa64'
1326 gnu_efi_arch = 'aarch64'
1328 EFI_MACHINE_TYPE_NAME = ''
1333 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1335 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1339 conf.set10('ENABLE_EFI', have)
1341 #####################################################################
1343 config_h = configure_file(
1344 output : 'config.h',
1345 configuration : conf)
1347 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1349 includes = include_directories('src/basic',
1353 'src/journal-remote',
1357 'src/time-wait-sync',
1362 'src/libsystemd/sd-bus',
1363 'src/libsystemd/sd-device',
1364 'src/libsystemd/sd-hwdb',
1365 'src/libsystemd/sd-id128',
1366 'src/libsystemd/sd-netlink',
1367 'src/libsystemd/sd-network',
1368 'src/libsystemd-network',
1371 add_project_arguments('-include', 'config.h', language : 'c')
1375 subdir('src/systemd')
1377 subdir('src/libsystemd')
1378 subdir('src/libsystemd-network')
1379 subdir('src/journal')
1382 libjournal_core = static_library(
1384 libjournal_core_sources,
1386 include_directories : includes,
1389 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1390 libsystemd = shared_library(
1393 version : libsystemd_version,
1394 include_directories : includes,
1395 link_args : ['-shared',
1396 '-Wl,--version-script=' + libsystemd_sym_path],
1397 link_with : [libbasic,
1399 link_whole : [libsystemd_static,
1401 dependencies : [threads,
1405 link_depends : libsystemd_sym,
1407 install_dir : rootlibdir)
1409 static_libsystemd = get_option('static-libsystemd')
1410 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1412 install_libsystemd_static = static_library(
1415 journal_client_sources,
1417 basic_gcrypt_sources,
1419 include_directories : includes,
1420 build_by_default : static_libsystemd != 'false',
1421 install : static_libsystemd != 'false',
1422 install_dir : rootlibdir,
1423 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1424 dependencies : [threads,
1433 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1435 ############################################################
1437 # binaries that have --help and are intended for use by humans,
1438 # usually, but not always, installed in /bin.
1439 public_programs = []
1441 subdir('src/libudev')
1442 subdir('src/shared')
1445 subdir('src/network')
1447 subdir('src/analyze')
1448 subdir('src/journal-remote')
1449 subdir('src/coredump')
1450 subdir('src/hostname')
1451 subdir('src/import')
1452 subdir('src/kernel-install')
1453 subdir('src/locale')
1454 subdir('src/machine')
1455 subdir('src/portable')
1456 subdir('src/nspawn')
1457 subdir('src/resolve')
1458 subdir('src/timedate')
1459 subdir('src/timesync')
1460 subdir('src/vconsole')
1461 subdir('src/boot/efi')
1468 ############################################################
1470 # only static linking apart from libdl, to make sure that the
1471 # module is linked to all libraries that it uses.
1472 test_dlopen = executable(
1476 include_directories : includes,
1477 link_with : [libbasic],
1478 dependencies : [libdl],
1479 build_by_default : want_tests != 'false')
1481 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1482 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1483 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1484 ['resolve', 'ENABLE_NSS_RESOLVE']]
1486 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1490 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1491 version_script_arg = join_paths(meson.source_root(), sym)
1493 nss = shared_library(
1495 'src/nss-@0@/nss-@0@.c'.format(module),
1498 include_directories : includes,
1499 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1500 link_args : ['-Wl,-z,nodelete',
1502 '-Wl,--version-script=' + version_script_arg,
1504 link_with : [libsystemd_static,
1506 dependencies : [threads,
1510 install_dir : rootlibdir)
1512 # We cannot use shared_module because it does not support version suffix.
1513 # Unfortunately shared_library insists on creating the symlink…
1514 meson.add_install_script('sh', '-c',
1515 'rm $DESTDIR@0@/libnss_@1@.so'
1516 .format(rootlibdir, module))
1518 if want_tests != 'false'
1519 test('dlopen-nss_' + module,
1521 # path to dlopen must include a slash
1522 args : nss.full_path())
1527 ############################################################
1529 executable('systemd',
1531 include_directories : includes,
1532 link_with : [libcore,
1534 dependencies : [threads,
1540 install_rpath : rootlibexecdir,
1542 install_dir : rootlibexecdir)
1544 meson.add_install_script(meson_make_symlink,
1545 join_paths(rootlibexecdir, 'systemd'),
1546 join_paths(rootsbindir, 'init'))
1548 exe = executable('systemd-analyze',
1549 systemd_analyze_sources,
1550 include_directories : includes,
1551 link_with : [libcore,
1553 dependencies : [threads,
1559 install_rpath : rootlibexecdir,
1561 public_programs += exe
1563 executable('systemd-journald',
1564 systemd_journald_sources,
1565 include_directories : includes,
1566 link_with : [libjournal_core,
1568 dependencies : [threads,
1572 install_rpath : rootlibexecdir,
1574 install_dir : rootlibexecdir)
1576 exe = executable('systemd-cat',
1577 systemd_cat_sources,
1578 include_directories : includes,
1579 link_with : [libjournal_core,
1581 dependencies : [threads],
1582 install_rpath : rootlibexecdir,
1584 public_programs += exe
1586 exe = executable('journalctl',
1588 include_directories : includes,
1589 link_with : [libshared],
1590 dependencies : [threads,
1595 install_rpath : rootlibexecdir,
1597 install_dir : rootbindir)
1598 public_programs += exe
1600 executable('systemd-getty-generator',
1601 'src/getty-generator/getty-generator.c',
1602 include_directories : includes,
1603 link_with : [libshared],
1604 install_rpath : rootlibexecdir,
1606 install_dir : systemgeneratordir)
1608 executable('systemd-debug-generator',
1609 'src/debug-generator/debug-generator.c',
1610 include_directories : includes,
1611 link_with : [libshared],
1612 install_rpath : rootlibexecdir,
1614 install_dir : systemgeneratordir)
1616 executable('systemd-fstab-generator',
1617 'src/fstab-generator/fstab-generator.c',
1618 'src/core/mount-setup.c',
1619 include_directories : includes,
1620 link_with : [libshared],
1621 install_rpath : rootlibexecdir,
1623 install_dir : systemgeneratordir)
1625 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1626 executable('30-systemd-environment-d-generator',
1627 'src/environment-d-generator/environment-d-generator.c',
1628 include_directories : includes,
1629 link_with : [libshared],
1630 install_rpath : rootlibexecdir,
1632 install_dir : userenvgeneratordir)
1634 meson.add_install_script(meson_make_symlink,
1635 join_paths(sysconfdir, 'environment'),
1636 join_paths(environmentdir, '99-environment.conf'))
1639 if conf.get('ENABLE_HIBERNATE') == 1
1640 executable('systemd-hibernate-resume-generator',
1641 'src/hibernate-resume/hibernate-resume-generator.c',
1642 include_directories : includes,
1643 link_with : [libshared],
1644 install_rpath : rootlibexecdir,
1646 install_dir : systemgeneratordir)
1648 executable('systemd-hibernate-resume',
1649 'src/hibernate-resume/hibernate-resume.c',
1650 include_directories : includes,
1651 link_with : [libshared],
1652 install_rpath : rootlibexecdir,
1654 install_dir : rootlibexecdir)
1657 if conf.get('HAVE_BLKID') == 1
1658 executable('systemd-gpt-auto-generator',
1659 'src/gpt-auto-generator/gpt-auto-generator.c',
1660 'src/basic/blkid-util.h',
1661 include_directories : includes,
1662 link_with : [libshared],
1663 dependencies : libblkid,
1664 install_rpath : rootlibexecdir,
1666 install_dir : systemgeneratordir)
1668 exe = executable('systemd-dissect',
1669 'src/dissect/dissect.c',
1670 include_directories : includes,
1671 link_with : [libshared],
1672 install_rpath : rootlibexecdir,
1674 install_dir : rootlibexecdir)
1675 public_programs += exe
1678 if conf.get('ENABLE_RESOLVE') == 1
1679 executable('systemd-resolved',
1680 systemd_resolved_sources,
1681 include_directories : includes,
1682 link_with : [libshared,
1684 libsystemd_resolve_core],
1685 dependencies : systemd_resolved_dependencies,
1686 install_rpath : rootlibexecdir,
1688 install_dir : rootlibexecdir)
1690 exe = executable('resolvectl',
1692 include_directories : includes,
1693 link_with : [libshared,
1695 libsystemd_resolve_core],
1696 dependencies : [threads,
1700 install_rpath : rootlibexecdir,
1702 public_programs += exe
1704 meson.add_install_script(meson_make_symlink,
1705 join_paths(bindir, 'resolvectl'),
1706 join_paths(rootsbindir, 'resolvconf'))
1708 meson.add_install_script(meson_make_symlink,
1709 join_paths(bindir, 'resolvectl'),
1710 join_paths(bindir, 'systemd-resolve'))
1713 if conf.get('ENABLE_LOGIND') == 1
1714 executable('systemd-logind',
1715 systemd_logind_sources,
1716 include_directories : includes,
1717 link_with : [liblogind_core,
1719 dependencies : [threads,
1721 install_rpath : rootlibexecdir,
1723 install_dir : rootlibexecdir)
1725 exe = executable('loginctl',
1727 include_directories : includes,
1728 link_with : [libshared],
1729 dependencies : [threads,
1732 install_rpath : rootlibexecdir,
1734 install_dir : rootbindir)
1735 public_programs += exe
1737 exe = executable('systemd-inhibit',
1738 'src/login/inhibit.c',
1739 include_directories : includes,
1740 link_with : [libshared],
1741 install_rpath : rootlibexecdir,
1743 install_dir : rootbindir)
1744 public_programs += exe
1746 if conf.get('HAVE_PAM') == 1
1747 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
1748 pam_systemd = shared_library(
1752 include_directories : includes,
1753 link_args : ['-shared',
1754 '-Wl,--version-script=' + version_script_arg],
1755 link_with : [libsystemd_static,
1757 dependencies : [threads,
1760 link_depends : pam_systemd_sym,
1762 install_dir : pamlibdir)
1764 if want_tests != 'false'
1765 test('dlopen-pam_systemd',
1767 # path to dlopen must include a slash
1768 args : pam_systemd.full_path())
1772 executable('systemd-user-runtime-dir',
1773 user_runtime_dir_sources,
1774 include_directories : includes,
1775 link_with : [libshared],
1776 install_rpath : rootlibexecdir,
1778 install_dir : rootlibexecdir)
1781 if conf.get('HAVE_PAM') == 1
1782 executable('systemd-user-sessions',
1783 'src/user-sessions/user-sessions.c',
1784 include_directories : includes,
1785 link_with : [libshared],
1786 install_rpath : rootlibexecdir,
1788 install_dir : rootlibexecdir)
1791 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1792 exe = executable('bootctl',
1793 'src/boot/bootctl.c',
1794 include_directories : includes,
1795 link_with : [libshared],
1796 dependencies : [libblkid],
1797 install_rpath : rootlibexecdir,
1799 public_programs += exe
1801 executable('systemd-bless-boot',
1802 'src/boot/bless-boot.c',
1803 include_directories : includes,
1804 link_with : [libshared],
1805 dependencies : [libblkid],
1806 install_rpath : rootlibexecdir,
1808 install_dir : rootlibexecdir)
1810 executable('systemd-bless-boot-generator',
1811 'src/boot/bless-boot-generator.c',
1812 include_directories : includes,
1813 link_with : [libshared],
1814 install_rpath : rootlibexecdir,
1816 install_dir : systemgeneratordir)
1819 executable('systemd-boot-check-no-failures',
1820 'src/boot/boot-check-no-failures.c',
1821 include_directories : includes,
1822 link_with : [libshared],
1823 dependencies : [libblkid],
1824 install_rpath : rootlibexecdir,
1826 install_dir : rootlibexecdir)
1828 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1829 include_directories : includes,
1830 link_with : [libshared],
1831 dependencies : [threads],
1832 install_rpath : rootlibexecdir,
1834 public_programs += exe
1837 if get_option('link-systemctl-shared')
1838 systemctl_link_with = [libshared]
1840 systemctl_link_with = [libsystemd_static,
1846 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1847 include_directories : includes,
1848 link_with : systemctl_link_with,
1849 dependencies : [threads,
1854 install_rpath : rootlibexecdir,
1856 install_dir : rootbindir)
1857 public_programs += exe
1859 if conf.get('ENABLE_PORTABLED') == 1
1860 executable('systemd-portabled',
1861 systemd_portabled_sources,
1862 include_directories : includes,
1863 link_with : [libshared],
1864 dependencies : [threads],
1865 install_rpath : rootlibexecdir,
1867 install_dir : rootlibexecdir)
1869 exe = executable('portablectl', 'src/portable/portablectl.c',
1870 include_directories : includes,
1871 link_with : [libshared],
1872 dependencies : [threads],
1873 install_rpath : rootlibexecdir,
1875 install_dir : rootbindir)
1876 public_programs += exe
1879 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1880 meson.add_install_script(meson_make_symlink,
1881 join_paths(rootbindir, 'systemctl'),
1882 join_paths(rootsbindir, alias))
1885 if conf.get('ENABLE_BACKLIGHT') == 1
1886 executable('systemd-backlight',
1887 'src/backlight/backlight.c',
1888 include_directories : includes,
1889 link_with : [libshared],
1890 install_rpath : rootlibexecdir,
1892 install_dir : rootlibexecdir)
1895 if conf.get('ENABLE_RFKILL') == 1
1896 executable('systemd-rfkill',
1897 'src/rfkill/rfkill.c',
1898 include_directories : includes,
1899 link_with : [libshared],
1900 install_rpath : rootlibexecdir,
1902 install_dir : rootlibexecdir)
1905 executable('systemd-system-update-generator',
1906 'src/system-update-generator/system-update-generator.c',
1907 include_directories : includes,
1908 link_with : [libshared],
1909 install_rpath : rootlibexecdir,
1911 install_dir : systemgeneratordir)
1913 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1914 executable('systemd-cryptsetup',
1915 'src/cryptsetup/cryptsetup.c',
1916 include_directories : includes,
1917 link_with : [libshared],
1918 dependencies : [libcryptsetup],
1919 install_rpath : rootlibexecdir,
1921 install_dir : rootlibexecdir)
1923 executable('systemd-cryptsetup-generator',
1924 'src/cryptsetup/cryptsetup-generator.c',
1925 include_directories : includes,
1926 link_with : [libshared],
1927 dependencies : [libcryptsetup],
1928 install_rpath : rootlibexecdir,
1930 install_dir : systemgeneratordir)
1932 executable('systemd-veritysetup',
1933 'src/veritysetup/veritysetup.c',
1934 include_directories : includes,
1935 link_with : [libshared],
1936 dependencies : [libcryptsetup],
1937 install_rpath : rootlibexecdir,
1939 install_dir : rootlibexecdir)
1941 executable('systemd-veritysetup-generator',
1942 'src/veritysetup/veritysetup-generator.c',
1943 include_directories : includes,
1944 link_with : [libshared],
1945 dependencies : [libcryptsetup],
1946 install_rpath : rootlibexecdir,
1948 install_dir : systemgeneratordir)
1951 if conf.get('HAVE_SYSV_COMPAT') == 1
1952 executable('systemd-sysv-generator',
1953 'src/sysv-generator/sysv-generator.c',
1954 include_directories : includes,
1955 link_with : [libshared],
1956 install_rpath : rootlibexecdir,
1958 install_dir : systemgeneratordir)
1960 executable('systemd-rc-local-generator',
1961 'src/rc-local-generator/rc-local-generator.c',
1962 include_directories : includes,
1963 link_with : [libshared],
1964 install_rpath : rootlibexecdir,
1966 install_dir : systemgeneratordir)
1969 if conf.get('ENABLE_HOSTNAMED') == 1
1970 executable('systemd-hostnamed',
1971 'src/hostname/hostnamed.c',
1972 include_directories : includes,
1973 link_with : [libshared],
1974 install_rpath : rootlibexecdir,
1976 install_dir : rootlibexecdir)
1978 exe = executable('hostnamectl',
1979 'src/hostname/hostnamectl.c',
1980 include_directories : includes,
1981 link_with : [libshared],
1982 install_rpath : rootlibexecdir,
1984 public_programs += exe
1987 if conf.get('ENABLE_LOCALED') == 1
1988 if conf.get('HAVE_XKBCOMMON') == 1
1989 # logind will load libxkbcommon.so dynamically on its own
1995 executable('systemd-localed',
1996 systemd_localed_sources,
1997 include_directories : includes,
1998 link_with : [libshared],
1999 dependencies : deps,
2000 install_rpath : rootlibexecdir,
2002 install_dir : rootlibexecdir)
2004 exe = executable('localectl',
2006 include_directories : includes,
2007 link_with : [libshared],
2008 install_rpath : rootlibexecdir,
2010 public_programs += exe
2013 if conf.get('ENABLE_TIMEDATED') == 1
2014 executable('systemd-timedated',
2015 'src/timedate/timedated.c',
2016 include_directories : includes,
2017 link_with : [libshared],
2018 install_rpath : rootlibexecdir,
2020 install_dir : rootlibexecdir)
2023 if conf.get('ENABLE_TIMEDATECTL') == 1
2024 exe = executable('timedatectl',
2025 'src/timedate/timedatectl.c',
2026 include_directories : includes,
2027 install_rpath : rootlibexecdir,
2028 link_with : [libshared],
2029 dependencies : [libm],
2031 public_programs += exe
2034 if conf.get('ENABLE_TIMESYNCD') == 1
2035 executable('systemd-timesyncd',
2036 systemd_timesyncd_sources,
2037 include_directories : includes,
2038 link_with : [libshared],
2039 dependencies : [threads,
2041 install_rpath : rootlibexecdir,
2043 install_dir : rootlibexecdir)
2045 executable('systemd-time-wait-sync',
2046 'src/time-wait-sync/time-wait-sync.c',
2047 include_directories : includes,
2048 link_with : [libshared],
2049 install_rpath : rootlibexecdir,
2051 install_dir : rootlibexecdir)
2054 if conf.get('ENABLE_MACHINED') == 1
2055 executable('systemd-machined',
2056 systemd_machined_sources,
2057 include_directories : includes,
2058 link_with : [libmachine_core,
2060 install_rpath : rootlibexecdir,
2062 install_dir : rootlibexecdir)
2064 exe = executable('machinectl',
2065 'src/machine/machinectl.c',
2066 include_directories : includes,
2067 link_with : [libshared],
2068 dependencies : [threads,
2071 install_rpath : rootlibexecdir,
2073 install_dir : rootbindir)
2074 public_programs += exe
2077 if conf.get('ENABLE_IMPORTD') == 1
2078 executable('systemd-importd',
2079 systemd_importd_sources,
2080 include_directories : includes,
2081 link_with : [libshared],
2082 dependencies : [threads],
2083 install_rpath : rootlibexecdir,
2085 install_dir : rootlibexecdir)
2087 systemd_pull = executable('systemd-pull',
2088 systemd_pull_sources,
2089 include_directories : includes,
2090 link_with : [libshared],
2091 dependencies : [libcurl,
2096 install_rpath : rootlibexecdir,
2098 install_dir : rootlibexecdir)
2100 systemd_import = executable('systemd-import',
2101 systemd_import_sources,
2102 include_directories : includes,
2103 link_with : [libshared],
2104 dependencies : [libcurl,
2108 install_rpath : rootlibexecdir,
2110 install_dir : rootlibexecdir)
2112 systemd_export = executable('systemd-export',
2113 systemd_export_sources,
2114 include_directories : includes,
2115 link_with : [libshared],
2116 dependencies : [libcurl,
2120 install_rpath : rootlibexecdir,
2122 install_dir : rootlibexecdir)
2123 public_programs += [systemd_pull, systemd_import, systemd_export]
2126 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2127 exe = executable('systemd-journal-upload',
2128 systemd_journal_upload_sources,
2129 include_directories : includes,
2130 link_with : [libshared],
2131 dependencies : [threads,
2136 install_rpath : rootlibexecdir,
2138 install_dir : rootlibexecdir)
2139 public_programs += exe
2142 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2143 s_j_remote = executable('systemd-journal-remote',
2144 systemd_journal_remote_sources,
2145 include_directories : includes,
2146 link_with : [libshared,
2147 libsystemd_journal_remote],
2148 dependencies : [threads,
2153 install_rpath : rootlibexecdir,
2155 install_dir : rootlibexecdir)
2157 s_j_gatewayd = executable('systemd-journal-gatewayd',
2158 systemd_journal_gatewayd_sources,
2159 include_directories : includes,
2160 link_with : [libshared],
2161 dependencies : [threads,
2166 install_rpath : rootlibexecdir,
2168 install_dir : rootlibexecdir)
2169 public_programs += [s_j_remote, s_j_gatewayd]
2172 if conf.get('ENABLE_COREDUMP') == 1
2173 executable('systemd-coredump',
2174 systemd_coredump_sources,
2175 include_directories : includes,
2176 link_with : [libshared],
2177 dependencies : [threads,
2182 install_rpath : rootlibexecdir,
2184 install_dir : rootlibexecdir)
2186 exe = executable('coredumpctl',
2187 coredumpctl_sources,
2188 include_directories : includes,
2189 link_with : [libshared],
2190 dependencies : [threads,
2193 install_rpath : rootlibexecdir,
2195 public_programs += exe
2198 if conf.get('ENABLE_BINFMT') == 1
2199 exe = executable('systemd-binfmt',
2200 'src/binfmt/binfmt.c',
2201 include_directories : includes,
2202 link_with : [libshared],
2203 install_rpath : rootlibexecdir,
2205 install_dir : rootlibexecdir)
2206 public_programs += exe
2208 meson.add_install_script('sh', '-c',
2209 mkdir_p.format(binfmtdir))
2210 meson.add_install_script('sh', '-c',
2211 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2214 if conf.get('ENABLE_VCONSOLE') == 1
2215 executable('systemd-vconsole-setup',
2216 'src/vconsole/vconsole-setup.c',
2217 include_directories : includes,
2218 link_with : [libshared],
2219 install_rpath : rootlibexecdir,
2221 install_dir : rootlibexecdir)
2224 if conf.get('ENABLE_RANDOMSEED') == 1
2225 executable('systemd-random-seed',
2226 'src/random-seed/random-seed.c',
2227 include_directories : includes,
2228 link_with : [libshared],
2229 install_rpath : rootlibexecdir,
2231 install_dir : rootlibexecdir)
2234 if conf.get('ENABLE_FIRSTBOOT') == 1
2235 executable('systemd-firstboot',
2236 'src/firstboot/firstboot.c',
2237 include_directories : includes,
2238 link_with : [libshared],
2239 dependencies : [libcrypt],
2240 install_rpath : rootlibexecdir,
2242 install_dir : rootbindir)
2245 executable('systemd-remount-fs',
2246 'src/remount-fs/remount-fs.c',
2247 'src/core/mount-setup.c',
2248 'src/core/mount-setup.h',
2249 include_directories : includes,
2250 link_with : [libshared],
2251 install_rpath : rootlibexecdir,
2253 install_dir : rootlibexecdir)
2255 executable('systemd-machine-id-setup',
2256 'src/machine-id-setup/machine-id-setup-main.c',
2257 'src/core/machine-id-setup.c',
2258 'src/core/machine-id-setup.h',
2259 include_directories : includes,
2260 link_with : [libshared],
2261 install_rpath : rootlibexecdir,
2263 install_dir : rootbindir)
2265 executable('systemd-fsck',
2267 include_directories : includes,
2268 link_with : [libshared],
2269 install_rpath : rootlibexecdir,
2271 install_dir : rootlibexecdir)
2273 executable('systemd-growfs',
2274 'src/partition/growfs.c',
2275 include_directories : includes,
2276 link_with : [libshared],
2277 dependencies : [libcryptsetup],
2278 install_rpath : rootlibexecdir,
2280 install_dir : rootlibexecdir)
2282 executable('systemd-makefs',
2283 'src/partition/makefs.c',
2284 include_directories : includes,
2285 link_with : [libshared],
2286 install_rpath : rootlibexecdir,
2288 install_dir : rootlibexecdir)
2290 executable('systemd-sleep',
2291 'src/sleep/sleep.c',
2292 include_directories : includes,
2293 link_with : [libshared],
2294 install_rpath : rootlibexecdir,
2296 install_dir : rootlibexecdir)
2298 exe = executable('systemd-sysctl',
2299 'src/sysctl/sysctl.c',
2300 include_directories : includes,
2301 link_with : [libshared],
2302 install_rpath : rootlibexecdir,
2304 install_dir : rootlibexecdir)
2305 public_programs += exe
2307 executable('systemd-ac-power',
2308 'src/ac-power/ac-power.c',
2309 include_directories : includes,
2310 link_with : [libshared],
2311 install_rpath : rootlibexecdir,
2313 install_dir : rootlibexecdir)
2315 exe = executable('systemd-detect-virt',
2316 'src/detect-virt/detect-virt.c',
2317 include_directories : includes,
2318 link_with : [libshared],
2319 install_rpath : rootlibexecdir,
2321 public_programs += exe
2323 exe = executable('systemd-delta',
2324 'src/delta/delta.c',
2325 include_directories : includes,
2326 link_with : [libshared],
2327 install_rpath : rootlibexecdir,
2329 public_programs += exe
2331 exe = executable('systemd-escape',
2332 'src/escape/escape.c',
2333 include_directories : includes,
2334 link_with : [libshared],
2335 install_rpath : rootlibexecdir,
2337 install_dir : rootbindir)
2338 public_programs += exe
2340 exe = executable('systemd-notify',
2341 'src/notify/notify.c',
2342 include_directories : includes,
2343 link_with : [libshared],
2344 install_rpath : rootlibexecdir,
2346 install_dir : rootbindir)
2347 public_programs += exe
2349 executable('systemd-volatile-root',
2350 'src/volatile-root/volatile-root.c',
2351 include_directories : includes,
2352 link_with : [libshared],
2353 install_rpath : rootlibexecdir,
2355 install_dir : rootlibexecdir)
2357 executable('systemd-cgroups-agent',
2358 'src/cgroups-agent/cgroups-agent.c',
2359 include_directories : includes,
2360 link_with : [libshared],
2361 install_rpath : rootlibexecdir,
2363 install_dir : rootlibexecdir)
2365 exe = executable('systemd-id128',
2366 'src/id128/id128.c',
2367 include_directories : includes,
2368 link_with : [libshared],
2369 install_rpath : rootlibexecdir,
2371 public_programs += exe
2373 exe = executable('systemd-path',
2375 include_directories : includes,
2376 link_with : [libshared],
2377 install_rpath : rootlibexecdir,
2379 public_programs += exe
2381 exe = executable('systemd-ask-password',
2382 'src/ask-password/ask-password.c',
2383 include_directories : includes,
2384 link_with : [libshared],
2385 install_rpath : rootlibexecdir,
2387 install_dir : rootbindir)
2388 public_programs += exe
2390 executable('systemd-reply-password',
2391 'src/reply-password/reply-password.c',
2392 include_directories : includes,
2393 link_with : [libshared],
2394 install_rpath : rootlibexecdir,
2396 install_dir : rootlibexecdir)
2398 exe = executable('systemd-tty-ask-password-agent',
2399 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2400 include_directories : includes,
2401 link_with : [libshared],
2402 install_rpath : rootlibexecdir,
2404 install_dir : rootbindir)
2405 public_programs += exe
2407 exe = executable('systemd-cgls',
2409 include_directories : includes,
2410 link_with : [libshared],
2411 install_rpath : rootlibexecdir,
2413 public_programs += exe
2415 exe = executable('systemd-cgtop',
2416 'src/cgtop/cgtop.c',
2417 include_directories : includes,
2418 link_with : [libshared],
2419 install_rpath : rootlibexecdir,
2421 public_programs += exe
2423 executable('systemd-initctl',
2424 'src/initctl/initctl.c',
2425 include_directories : includes,
2426 link_with : [libshared],
2427 install_rpath : rootlibexecdir,
2429 install_dir : rootlibexecdir)
2431 exe = executable('systemd-mount',
2432 'src/mount/mount-tool.c',
2433 include_directories : includes,
2434 link_with : [libshared],
2435 install_rpath : rootlibexecdir,
2437 public_programs += exe
2439 meson.add_install_script(meson_make_symlink,
2440 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2442 exe = executable('systemd-run',
2444 include_directories : includes,
2445 link_with : [libshared],
2446 install_rpath : rootlibexecdir,
2448 public_programs += exe
2450 exe = executable('systemd-stdio-bridge',
2451 'src/stdio-bridge/stdio-bridge.c',
2452 include_directories : includes,
2453 link_with : [libshared],
2454 install_rpath : rootlibexecdir,
2456 public_programs += exe
2458 exe = executable('busctl',
2459 'src/busctl/busctl.c',
2460 'src/busctl/busctl-introspect.c',
2461 'src/busctl/busctl-introspect.h',
2462 include_directories : includes,
2463 link_with : [libshared],
2464 install_rpath : rootlibexecdir,
2466 public_programs += exe
2468 if conf.get('ENABLE_SYSUSERS') == 1
2469 exe = executable('systemd-sysusers',
2470 'src/sysusers/sysusers.c',
2471 include_directories : includes,
2472 link_with : [libshared],
2473 install_rpath : rootlibexecdir,
2475 install_dir : rootbindir)
2476 public_programs += exe
2479 if conf.get('ENABLE_TMPFILES') == 1
2480 exe = executable('systemd-tmpfiles',
2481 'src/tmpfiles/tmpfiles.c',
2482 include_directories : includes,
2483 link_with : [libshared],
2484 dependencies : [libacl],
2485 install_rpath : rootlibexecdir,
2487 install_dir : rootbindir)
2488 public_programs += exe
2490 if want_tests != 'false'
2491 test('test-systemd-tmpfiles',
2492 test_systemd_tmpfiles_py,
2493 # https://github.com/mesonbuild/meson/issues/2681
2494 args : exe.full_path())
2498 if conf.get('ENABLE_HWDB') == 1
2499 exe = executable('systemd-hwdb',
2501 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2502 include_directories : includes,
2503 link_with : [libudev_static],
2504 install_rpath : udev_rpath,
2506 install_dir : rootbindir)
2507 public_programs += exe
2510 if conf.get('ENABLE_QUOTACHECK') == 1
2511 executable('systemd-quotacheck',
2512 'src/quotacheck/quotacheck.c',
2513 include_directories : includes,
2514 link_with : [libshared],
2515 install_rpath : rootlibexecdir,
2517 install_dir : rootlibexecdir)
2520 exe = executable('systemd-socket-proxyd',
2521 'src/socket-proxy/socket-proxyd.c',
2522 include_directories : includes,
2523 link_with : [libshared],
2524 dependencies : [threads],
2525 install_rpath : rootlibexecdir,
2527 install_dir : rootlibexecdir)
2528 public_programs += exe
2530 exe = executable('systemd-udevd',
2531 systemd_udevd_sources,
2532 include_directories : includes,
2533 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2534 link_with : [libudev_core,
2537 dependencies : [threads,
2542 install_rpath : udev_rpath,
2544 install_dir : rootlibexecdir)
2545 public_programs += exe
2547 exe = executable('udevadm',
2549 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2550 include_directories : includes,
2551 link_with : [libudev_core,
2554 dependencies : [threads,
2559 install_rpath : udev_rpath,
2561 install_dir : rootbindir)
2562 public_programs += exe
2564 executable('systemd-shutdown',
2565 systemd_shutdown_sources,
2566 include_directories : includes,
2567 link_with : [libshared],
2568 dependencies : [libmount],
2569 install_rpath : rootlibexecdir,
2571 install_dir : rootlibexecdir)
2573 executable('systemd-update-done',
2574 'src/update-done/update-done.c',
2575 include_directories : includes,
2576 link_with : [libshared],
2577 install_rpath : rootlibexecdir,
2579 install_dir : rootlibexecdir)
2581 executable('systemd-update-utmp',
2582 'src/update-utmp/update-utmp.c',
2583 include_directories : includes,
2584 link_with : [libshared],
2585 dependencies : [libaudit],
2586 install_rpath : rootlibexecdir,
2588 install_dir : rootlibexecdir)
2590 if conf.get('HAVE_KMOD') == 1
2591 executable('systemd-modules-load',
2592 'src/modules-load/modules-load.c',
2593 include_directories : includes,
2594 link_with : [libshared],
2595 dependencies : [libkmod],
2596 install_rpath : rootlibexecdir,
2598 install_dir : rootlibexecdir)
2600 meson.add_install_script('sh', '-c',
2601 mkdir_p.format(modulesloaddir))
2602 meson.add_install_script('sh', '-c',
2603 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2606 exe = executable('systemd-nspawn',
2607 systemd_nspawn_sources,
2608 'src/core/mount-setup.c', # FIXME: use a variable?
2609 'src/core/mount-setup.h',
2610 'src/core/loopback-setup.c',
2611 'src/core/loopback-setup.h',
2612 include_directories : includes,
2613 link_with : [libnspawn_core,
2615 dependencies : [libblkid],
2616 install_rpath : rootlibexecdir,
2618 public_programs += exe
2620 if conf.get('ENABLE_NETWORKD') == 1
2621 executable('systemd-networkd',
2622 systemd_networkd_sources,
2623 include_directories : includes,
2624 link_with : [libnetworkd_core,
2628 dependencies : [threads],
2629 install_rpath : rootlibexecdir,
2631 install_dir : rootlibexecdir)
2633 executable('systemd-networkd-wait-online',
2634 systemd_networkd_wait_online_sources,
2635 include_directories : includes,
2636 link_with : [libnetworkd_core,
2638 install_rpath : rootlibexecdir,
2640 install_dir : rootlibexecdir)
2642 exe = executable('networkctl',
2644 include_directories : includes,
2645 link_with : [libsystemd_network,
2647 install_rpath : rootlibexecdir,
2649 install_dir : rootbindir)
2650 public_programs += exe
2653 executable('systemd-sulogin-shell',
2654 ['src/sulogin-shell/sulogin-shell.c'],
2655 include_directories : includes,
2656 link_with : [libshared],
2657 install_rpath : rootlibexecdir,
2659 install_dir : rootlibexecdir)
2661 ############################################################
2664 'systemd-runtest.env',
2665 output : 'systemd-runtest.env',
2666 command : ['sh', '-c', '{ ' +
2667 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2668 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2670 build_by_default : true)
2672 foreach tuple : tests
2674 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2675 dependencies = tuple[2]
2676 condition = tuple.length() >= 4 ? tuple[3] : ''
2677 type = tuple.length() >= 5 ? tuple[4] : ''
2678 defs = tuple.length() >= 6 ? tuple[5] : []
2679 incs = tuple.length() >= 7 ? tuple[6] : includes
2682 name = sources[0].split('/')[-1].split('.')[0]
2683 if type.startswith('timeout=')
2684 timeout = type.split('=')[1].to_int()
2688 if condition == '' or conf.get(condition) == 1
2692 include_directories : incs,
2693 link_with : link_with,
2694 dependencies : dependencies,
2696 build_by_default : want_tests != 'false',
2697 install_rpath : rootlibexecdir,
2698 install : install_tests,
2699 install_dir : join_paths(testsdir, type))
2702 message('@0@ is a manual test'.format(name))
2703 elif type == 'unsafe' and want_tests != 'unsafe'
2704 message('@0@ is an unsafe test'.format(name))
2705 elif want_tests != 'false'
2711 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2716 'test-libsystemd-sym',
2717 test_libsystemd_sym_c,
2718 include_directories : includes,
2719 link_with : [libsystemd],
2720 build_by_default : want_tests != 'false',
2721 install : install_tests,
2722 install_dir : testsdir)
2723 if want_tests != 'false'
2724 test('test-libsystemd-sym', exe)
2728 'test-libsystemd-static-sym',
2729 test_libsystemd_sym_c,
2730 include_directories : includes,
2731 link_with : [install_libsystemd_static],
2732 dependencies : [threads], # threads is already included in dependencies on the library,
2733 # but does not seem to get propagated. Add here as a work-around.
2734 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2735 install : install_tests and static_libsystemd_pic,
2736 install_dir : testsdir)
2737 if want_tests != 'false' and static_libsystemd_pic
2738 test('test-libsystemd-static-sym', exe)
2744 include_directories : includes,
2745 c_args : '-Wno-deprecated-declarations',
2746 link_with : [libudev],
2747 build_by_default : want_tests != 'false',
2748 install : install_tests,
2749 install_dir : testsdir)
2750 if want_tests != 'false'
2751 test('test-libudev-sym', exe)
2755 'test-libudev-static-sym',
2757 include_directories : includes,
2758 c_args : '-Wno-deprecated-declarations',
2759 link_with : [install_libudev_static],
2760 build_by_default : want_tests != 'false' and static_libudev_pic,
2761 install : install_tests and static_libudev_pic,
2762 install_dir : testsdir)
2763 if want_tests != 'false' and static_libudev_pic
2764 test('test-libudev-static-sym', exe)
2767 ############################################################
2771 foreach tuple : fuzzers
2773 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2774 dependencies = tuple[2]
2775 defs = tuple.length() >= 4 ? tuple[3] : []
2776 incs = tuple.length() >= 5 ? tuple[4] : includes
2779 dependencies += fuzzing_engine
2781 sources += 'src/fuzz/fuzz-main.c'
2784 name = sources[0].split('/')[-1].split('.')[0]
2786 fuzzer_exes += executable(
2789 include_directories : [incs, include_directories('src/fuzz')],
2790 link_with : link_with,
2791 dependencies : dependencies,
2796 run_target('fuzzers',
2797 depends : fuzzer_exes,
2800 ############################################################
2802 make_directive_index_py = find_program('tools/make-directive-index.py')
2803 make_man_index_py = find_program('tools/make-man-index.py')
2804 xml_helper_py = find_program('tools/xml_helper.py')
2805 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2809 subdir('sysusers.d')
2810 subdir('tmpfiles.d')
2815 subdir('shell-completion/bash')
2816 subdir('shell-completion/zsh')
2817 subdir('docs/sysvinit')
2818 subdir('docs/var-log')
2820 install_subdir('factory/etc',
2821 install_dir : factorydir)
2823 install_data('xorg/50-systemd-user.sh',
2824 install_dir : xinitrcdir)
2825 install_data('modprobe.d/systemd.conf',
2826 install_dir : modprobedir)
2827 install_data('LICENSE.GPL2',
2831 'docs/CODING_STYLE.md',
2832 'docs/DISTRO_PORTING.md',
2833 'docs/ENVIRONMENT.md',
2835 'docs/TRANSIENT-SETTINGS.md',
2836 'docs/TRANSLATORS.md',
2837 'docs/UIDS-GIDS.md',
2838 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2839 install_dir : docdir)
2841 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2842 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2844 ############################################################
2846 meson_check_help = find_program('tools/meson-check-help.sh')
2848 foreach exec : public_programs
2849 name = exec.full_path().split('/')[-1]
2850 if want_tests != 'false'
2851 test('check-help-' + name,
2853 args : exec.full_path())
2857 ############################################################
2859 # Enable tests for all supported sanitizers
2860 foreach tuple : sanitizers
2861 sanitizer = tuple[0]
2864 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2866 foreach p : fuzz_regression_tests
2867 b = p.split('/')[-2]
2868 c = p.split('/')[-1]
2870 name = '@0@:@1@'.format(b, sanitizer)
2873 if want_tests == 'false'
2874 message('Not compiling @0@ because tests is set to false'.format(name))
2876 exe = custom_target(
2880 command : [env, 'ln', '-fs',
2881 join_paths(build.full_path(), b),
2883 build_by_default : true)
2885 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2890 if want_tests != 'false' and slow_tests
2891 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2893 args : [exe.full_path(),
2894 join_paths(meson.source_root(), p)])
2901 ############################################################
2904 all_files = run_command(
2906 ['--git-dir=@0@/.git'.format(meson.source_root()),
2909 all_files = files(all_files.stdout().split())
2914 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
2917 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
2921 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2924 command : [meson_git_contrib_sh])
2928 git_head = run_command(
2930 ['--git-dir=@0@/.git'.format(meson.source_root()),
2931 'rev-parse', 'HEAD']).stdout().strip()
2932 git_head_short = run_command(
2934 ['--git-dir=@0@/.git'.format(meson.source_root()),
2935 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2939 command : ['git', 'archive',
2940 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
2942 '--prefix', 'systemd-@0@/'.format(git_head),
2946 ############################################################
2948 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2951 depends : [man, libsystemd, libudev],
2952 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2956 command : ['sh', '@0@/tools/make-index-md.sh'.format(meson.source_root()), meson.source_root()])
2958 ############################################################
2961 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2963 'split /usr: @0@'.format(split_usr),
2964 'split bin-sbin: @0@'.format(split_bin),
2965 'prefix directory: @0@'.format(prefixdir),
2966 'rootprefix directory: @0@'.format(rootprefixdir),
2967 'sysconf directory: @0@'.format(sysconfdir),
2968 'include directory: @0@'.format(includedir),
2969 'lib directory: @0@'.format(libdir),
2970 'rootlib directory: @0@'.format(rootlibdir),
2971 'SysV init scripts: @0@'.format(sysvinit_path),
2972 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2973 'PAM modules directory: @0@'.format(pamlibdir),
2974 'PAM configuration directory: @0@'.format(pamconfdir),
2975 'RPM macros directory: @0@'.format(rpmmacrosdir),
2976 'modprobe.d directory: @0@'.format(modprobedir),
2977 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2978 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2979 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2980 'bash completions directory: @0@'.format(bashcompletiondir),
2981 'zsh completions directory: @0@'.format(zshcompletiondir),
2982 'extra start script: @0@'.format(get_option('rc-local')),
2983 'extra stop script: @0@'.format(get_option('halt-local')),
2984 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2985 get_option('debug-tty')),
2986 'TTY GID: @0@'.format(tty_gid),
2987 'users GID: @0@'.format(substs.get('USERS_GID')),
2988 'maximum system UID: @0@'.format(system_uid_max),
2989 'maximum system GID: @0@'.format(system_gid_max),
2990 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2991 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2992 'minimum container UID base: @0@'.format(container_uid_base_min),
2993 'maximum container UID base: @0@'.format(container_uid_base_max),
2994 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2995 'render group access mode: @0@'.format(get_option('group-render-mode')),
2996 'certificate root directory: @0@'.format(get_option('certificate-root')),
2997 'support URL: @0@'.format(support_url),
2998 'nobody user name: @0@'.format(nobody_user),
2999 'nobody group name: @0@'.format(nobody_group),
3000 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3001 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3003 'default DNSSEC mode: @0@'.format(default_dnssec),
3004 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3005 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3006 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
3008 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3009 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3011 'default DNS servers: @0@'.format(alt_dns_servers),
3012 'default NTP servers: @0@'.format(alt_ntp_servers)]
3014 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3015 '@@0@'.format(time_epoch)).stdout().strip()
3017 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3020 'static libsystemd: @0@'.format(static_libsystemd),
3021 'static libudev: @0@'.format(static_libudev)]
3024 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3025 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3026 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3028 if conf.get('ENABLE_EFI') == 1
3029 status += 'efi arch: @0@'.format(efi_arch)
3033 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3034 'EFI CC @0@'.format(efi_cc),
3035 'EFI lib directory: @0@'.format(efi_libdir),
3036 'EFI lds directory: @0@'.format(efi_ldsdir),
3037 'EFI include directory: @0@'.format(efi_incdir)]
3089 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3090 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3093 ['legacy pkla', install_polkit_pkla],
3095 ['gnu-efi', have_gnu_efi],
3108 ['man pages', want_man],
3109 ['html pages', want_html],
3110 ['man page indices', want_man and have_lxml],
3115 ['adm group', get_option('adm-group')],
3116 ['wheel group', get_option('wheel-group')],
3119 ['debug mmap cache'],
3120 ['valgrind', conf.get('VALGRIND') == 1],
3121 ['trace logging', conf.get('LOG_TRACE') == 1],
3122 ['link-udev-shared', get_option('link-udev-shared')],
3123 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3126 if tuple.length() >= 2
3129 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3130 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3131 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3142 'enabled features: @0@'.format(', '.join(found)),
3144 'disabled features: @0@'.format(', '.join(missing)),
3146 message('\n '.join(status))
3148 if rootprefixdir != rootprefix_default
3150 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3151 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3152 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))