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'],
479 ['ETHTOOL_LINK_MODE_10baseT_Half_BIT', 'linux/ethtool.h'],
480 ['ETHTOOL_LINK_MODE_25000baseCR_Full_BIT', 'linux/ethtool.h'],
481 ['ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT', 'linux/ethtool.h'],
482 ['ETHTOOL_LINK_MODE_1000baseX_Full_BIT', 'linux/ethtool.h'],
483 ['ETHTOOL_LINK_MODE_2500baseT_Full_BIT', 'linux/ethtool.h'],
484 ['ETHTOOL_LINK_MODE_FEC_NONE_BIT', 'linux/ethtool.h'],
486 prefix = decl.length() > 2 ? decl[2] : ''
487 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
488 conf.set10('HAVE_' + decl[0], have)
491 foreach ident : ['secure_getenv', '__secure_getenv']
492 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
496 ['memfd_create', '''#include <sys/mman.h>'''],
497 ['gettid', '''#include <sys/types.h>
498 #include <unistd.h>'''],
499 ['pivot_root', '''#include <stdlib.h>
500 #include <unistd.h>'''], # no known header declares pivot_root
501 ['name_to_handle_at', '''#include <sys/types.h>
502 #include <sys/stat.h>
503 #include <fcntl.h>'''],
504 ['setns', '''#include <sched.h>'''],
505 ['renameat2', '''#include <stdio.h>
506 #include <fcntl.h>'''],
507 ['kcmp', '''#include <linux/kcmp.h>'''],
508 ['keyctl', '''#include <sys/types.h>
509 #include <keyutils.h>'''],
510 ['copy_file_range', '''#include <sys/syscall.h>
511 #include <unistd.h>'''],
512 ['bpf', '''#include <sys/syscall.h>
513 #include <unistd.h>'''],
514 ['statx', '''#include <sys/types.h>
515 #include <sys/stat.h>
516 #include <unistd.h>'''],
517 ['explicit_bzero' , '''#include <string.h>'''],
518 ['reallocarray', '''#include <malloc.h>'''],
521 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
522 conf.set10('HAVE_' + ident[0].to_upper(), have)
525 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
526 conf.set10('USE_SYS_RANDOM_H', true)
527 conf.set10('HAVE_GETRANDOM', true)
529 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
530 conf.set10('USE_SYS_RANDOM_H', false)
531 conf.set10('HAVE_GETRANDOM', have)
534 #####################################################################
536 sed = find_program('sed')
537 awk = find_program('awk')
538 m4 = find_program('m4')
539 stat = find_program('stat')
540 git = find_program('git', required : false)
541 env = find_program('env')
542 perl = find_program('perl', required : false)
544 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
545 mkdir_p = 'mkdir -p $DESTDIR/@0@'
546 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
547 splash_bmp = files('test/splash.bmp')
549 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
550 # /usr/sbin, /sbin, and fall back to the default from middle column.
551 progs = [['quotaon', '/usr/sbin/quotaon' ],
552 ['quotacheck', '/usr/sbin/quotacheck' ],
553 ['kmod', '/usr/bin/kmod' ],
554 ['kexec', '/usr/sbin/kexec' ],
555 ['sulogin', '/usr/sbin/sulogin' ],
556 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
557 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
558 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
559 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
562 path = get_option(prog[0] + '-path')
564 message('Using @1@ for @0@'.format(prog[0], path))
566 exe = find_program(prog[0],
567 '/usr/sbin/' + prog[0],
570 path = exe.found() ? exe.path() : prog[1]
572 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
573 conf.set_quoted(name, path)
574 substs.set(name, path)
577 conf.set_quoted('TELINIT', get_option('telinit-path'))
579 if run_command('ln', '--relative', '--help').returncode() != 0
580 error('ln does not support --relative (added in coreutils 8.16)')
583 ############################################################
585 gperf = find_program('gperf')
587 gperf_test_format = '''
589 const char * in_word_set(const char *, @0@);
592 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
593 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
594 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
595 if cc.compiles(gperf_test)
596 gperf_len_type = 'size_t'
598 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
599 if cc.compiles(gperf_test)
600 gperf_len_type = 'unsigned'
602 error('unable to determine gperf len type')
605 message('gperf len type is @0@'.format(gperf_len_type))
606 conf.set('GPERF_LEN_TYPE', gperf_len_type,
607 description : 'The type of gperf "len" parameter')
609 ############################################################
611 if not cc.has_header('sys/capability.h')
612 error('POSIX caps headers not found')
614 foreach header : ['crypt.h',
618 'linux/vm_sockets.h',
620 'valgrind/memcheck.h',
621 'valgrind/valgrind.h',
624 conf.set10('HAVE_' + header.underscorify().to_upper(),
625 cc.has_header(header))
628 ############################################################
630 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
631 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
632 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
634 default_hierarchy = get_option('default-hierarchy')
635 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
636 description : 'default cgroup hierarchy as string')
637 if default_hierarchy == 'legacy'
638 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
639 elif default_hierarchy == 'hybrid'
640 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
642 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
645 time_epoch = get_option('time-epoch')
648 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
650 conf.set('TIME_EPOCH', time_epoch)
652 system_uid_max = get_option('system-uid-max')
653 if system_uid_max == -1
654 system_uid_max = run_command(
656 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
657 '/etc/login.defs').stdout().strip()
658 if system_uid_max == ''
661 system_uid_max = system_uid_max.to_int()
664 conf.set('SYSTEM_UID_MAX', system_uid_max)
665 substs.set('systemuidmax', system_uid_max)
667 system_gid_max = get_option('system-gid-max')
668 if system_gid_max == -1
669 system_gid_max = run_command(
671 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
672 '/etc/login.defs').stdout().strip()
673 if system_gid_max == ''
676 system_gid_max = system_gid_max.to_int()
679 conf.set('SYSTEM_GID_MAX', system_gid_max)
680 substs.set('systemgidmax', system_gid_max)
682 dynamic_uid_min = get_option('dynamic-uid-min')
683 dynamic_uid_max = get_option('dynamic-uid-max')
684 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
685 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
686 substs.set('dynamicuidmin', dynamic_uid_min)
687 substs.set('dynamicuidmax', dynamic_uid_max)
689 container_uid_base_min = get_option('container-uid-base-min')
690 container_uid_base_max = get_option('container-uid-base-max')
691 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
692 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
693 substs.set('containeruidbasemin', container_uid_base_min)
694 substs.set('containeruidbasemax', container_uid_base_max)
696 nobody_user = get_option('nobody-user')
697 nobody_group = get_option('nobody-group')
699 if not meson.is_cross_build()
700 getent_result = run_command('getent', 'passwd', '65534')
701 if getent_result.returncode() == 0
702 name = getent_result.stdout().split(':')[0]
703 if name != nobody_user
705 '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) +
706 'Your build will result in an user table setup that is incompatible with the local system.')
709 id_result = run_command('id', '-u', nobody_user)
710 if id_result.returncode() == 0
711 id = id_result.stdout().to_int()
714 '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) +
715 'Your build will result in an user table setup that is incompatible with the local system.')
719 getent_result = run_command('getent', 'group', '65534')
720 if getent_result.returncode() == 0
721 name = getent_result.stdout().split(':')[0]
722 if name != nobody_group
724 '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) +
725 'Your build will result in an group table setup that is incompatible with the local system.')
728 id_result = run_command('id', '-g', nobody_group)
729 if id_result.returncode() == 0
730 id = id_result.stdout().to_int()
733 '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) +
734 'Your build will result in an group table setup that is incompatible with the local system.')
738 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
740 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
741 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
744 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
745 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
746 substs.set('NOBODY_USER_NAME', nobody_user)
747 substs.set('NOBODY_GROUP_NAME', nobody_group)
749 tty_gid = get_option('tty-gid')
750 conf.set('TTY_GID', tty_gid)
751 substs.set('TTY_GID', tty_gid)
753 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
754 users_gid = get_option('users-gid')
755 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
757 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
758 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
760 dev_kvm_mode = get_option('dev-kvm-mode')
761 substs.set('DEV_KVM_MODE', dev_kvm_mode)
762 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
763 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
765 kill_user_processes = get_option('default-kill-user-processes')
766 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
767 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
768 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
770 dns_servers = get_option('dns-servers')
771 conf.set_quoted('DNS_SERVERS', dns_servers)
772 substs.set('DNS_SERVERS', dns_servers)
774 ntp_servers = get_option('ntp-servers')
775 conf.set_quoted('NTP_SERVERS', ntp_servers)
776 substs.set('NTP_SERVERS', ntp_servers)
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 foreach name : get_option('debug-extra')
787 enable_debug_hashmap = true
788 elif name == 'mmap-cache'
789 enable_debug_mmap_cache = true
791 message('unknown debug option "@0@", ignoring'.format(name))
794 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
795 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
797 conf.set10('VALGRIND', get_option('valgrind'))
798 conf.set10('LOG_TRACE', get_option('log-trace'))
800 #####################################################################
802 threads = dependency('threads')
803 librt = cc.find_library('rt')
804 libm = cc.find_library('m')
805 libdl = cc.find_library('dl')
806 libcrypt = cc.find_library('crypt')
808 libcap = dependency('libcap', required : false)
809 if not libcap.found()
810 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
811 libcap = cc.find_library('cap')
814 libmount = dependency('mount',
815 version : fuzzer_build ? '>= 0' : '>= 2.30')
817 want_seccomp = get_option('seccomp')
818 if want_seccomp != 'false' and not fuzzer_build
819 libseccomp = dependency('libseccomp',
820 version : '>= 2.3.1',
821 required : want_seccomp == 'true')
822 have = libseccomp.found()
827 conf.set10('HAVE_SECCOMP', have)
829 want_selinux = get_option('selinux')
830 if want_selinux != 'false' and not fuzzer_build
831 libselinux = dependency('libselinux',
832 version : '>= 2.1.9',
833 required : want_selinux == 'true')
834 have = libselinux.found()
839 conf.set10('HAVE_SELINUX', have)
841 want_apparmor = get_option('apparmor')
842 if want_apparmor != 'false' and not fuzzer_build
843 libapparmor = dependency('libapparmor',
844 required : want_apparmor == 'true')
845 have = libapparmor.found()
850 conf.set10('HAVE_APPARMOR', have)
852 smack_run_label = get_option('smack-run-label')
853 if smack_run_label != ''
854 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
857 want_polkit = get_option('polkit')
858 install_polkit = false
859 install_polkit_pkla = false
860 if want_polkit != 'false' and not fuzzer_build
861 install_polkit = true
863 libpolkit = dependency('polkit-gobject-1',
865 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
866 message('Old polkit detected, will install pkla files')
867 install_polkit_pkla = true
870 conf.set10('ENABLE_POLKIT', install_polkit)
872 want_acl = get_option('acl')
873 if want_acl != 'false' and not fuzzer_build
874 libacl = cc.find_library('acl', required : want_acl == 'true')
875 have = libacl.found()
880 conf.set10('HAVE_ACL', have)
882 want_audit = get_option('audit')
883 if want_audit != 'false' and not fuzzer_build
884 libaudit = dependency('audit', required : want_audit == 'true')
885 have = libaudit.found()
890 conf.set10('HAVE_AUDIT', have)
892 want_blkid = get_option('blkid')
893 if want_blkid != 'false' and not fuzzer_build
894 libblkid = dependency('blkid', required : want_blkid == 'true')
895 have = libblkid.found()
900 conf.set10('HAVE_BLKID', have)
902 want_kmod = get_option('kmod')
903 if want_kmod != 'false' and not fuzzer_build
904 libkmod = dependency('libkmod',
906 required : want_kmod == 'true')
907 have = libkmod.found()
912 conf.set10('HAVE_KMOD', have)
914 want_pam = get_option('pam')
915 if want_pam != 'false' and not fuzzer_build
916 libpam = cc.find_library('pam', required : want_pam == 'true')
917 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
918 have = libpam.found() and libpam_misc.found()
924 conf.set10('HAVE_PAM', have)
926 want_microhttpd = get_option('microhttpd')
927 if want_microhttpd != 'false' and not fuzzer_build
928 libmicrohttpd = dependency('libmicrohttpd',
929 version : '>= 0.9.33',
930 required : want_microhttpd == 'true')
931 have = libmicrohttpd.found()
936 conf.set10('HAVE_MICROHTTPD', have)
938 want_libcryptsetup = get_option('libcryptsetup')
939 if want_libcryptsetup != 'false' and not fuzzer_build
940 libcryptsetup = dependency('libcryptsetup',
941 version : '>= 1.6.0',
942 required : want_libcryptsetup == 'true')
943 have = libcryptsetup.found()
944 have_sector = cc.has_member(
945 'struct crypt_params_plain',
947 prefix : '#include <libcryptsetup.h>')
953 conf.set10('HAVE_LIBCRYPTSETUP', have)
954 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
956 want_libcurl = get_option('libcurl')
957 if want_libcurl != 'false' and not fuzzer_build
958 libcurl = dependency('libcurl',
959 version : '>= 7.32.0',
960 required : want_libcurl == 'true')
961 have = libcurl.found()
966 conf.set10('HAVE_LIBCURL', have)
968 want_libidn = get_option('libidn')
969 want_libidn2 = get_option('libidn2')
970 if want_libidn == 'true' and want_libidn2 == 'true'
971 error('libidn and libidn2 cannot be requested simultaneously')
974 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
975 libidn = dependency('libidn',
976 required : want_libidn == 'true')
977 have = libidn.found()
982 conf.set10('HAVE_LIBIDN', have)
983 if not have and want_libidn2 != 'false' and not fuzzer_build
984 # libidn is used for both libidn and libidn2 objects
985 libidn = dependency('libidn2',
986 required : want_libidn2 == 'true')
987 have = libidn.found()
991 conf.set10('HAVE_LIBIDN2', have)
993 want_libiptc = get_option('libiptc')
994 if want_libiptc != 'false' and not fuzzer_build
995 libiptc = dependency('libiptc',
996 required : want_libiptc == 'true')
997 have = libiptc.found()
1002 conf.set10('HAVE_LIBIPTC', have)
1004 want_qrencode = get_option('qrencode')
1005 if want_qrencode != 'false' and not fuzzer_build
1006 libqrencode = dependency('libqrencode',
1007 required : want_qrencode == 'true')
1008 have = libqrencode.found()
1013 conf.set10('HAVE_QRENCODE', have)
1015 want_gcrypt = get_option('gcrypt')
1016 if want_gcrypt != 'false' and not fuzzer_build
1017 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1018 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1019 have = libgcrypt.found() and libgpg_error.found()
1024 # link to neither of the libs if one is not found
1028 conf.set10('HAVE_GCRYPT', have)
1030 want_gnutls = get_option('gnutls')
1031 if want_gnutls != 'false' and not fuzzer_build
1032 libgnutls = dependency('gnutls',
1033 version : '>= 3.1.4',
1034 required : want_gnutls == 'true')
1035 have = libgnutls.found()
1040 conf.set10('HAVE_GNUTLS', have)
1042 want_openssl = get_option('openssl')
1043 if want_openssl != 'false' and not fuzzer_build
1044 libopenssl = dependency('openssl',
1045 version : '>= 1.1.0',
1046 required : want_openssl == 'true')
1047 have = libopenssl.found()
1052 conf.set10('HAVE_OPENSSL', have)
1054 want_elfutils = get_option('elfutils')
1055 if want_elfutils != 'false' and not fuzzer_build
1056 libdw = dependency('libdw',
1057 required : want_elfutils == 'true')
1058 have = libdw.found()
1063 conf.set10('HAVE_ELFUTILS', have)
1065 want_zlib = get_option('zlib')
1066 if want_zlib != 'false' and not fuzzer_build
1067 libz = dependency('zlib',
1068 required : want_zlib == 'true')
1074 conf.set10('HAVE_ZLIB', have)
1076 want_bzip2 = get_option('bzip2')
1077 if want_bzip2 != 'false' and not fuzzer_build
1078 libbzip2 = cc.find_library('bz2',
1079 required : want_bzip2 == 'true')
1080 have = libbzip2.found()
1085 conf.set10('HAVE_BZIP2', have)
1087 want_xz = get_option('xz')
1088 if want_xz != 'false' and not fuzzer_build
1089 libxz = dependency('liblzma',
1090 required : want_xz == 'true')
1091 have = libxz.found()
1096 conf.set10('HAVE_XZ', have)
1098 want_lz4 = get_option('lz4')
1099 if want_lz4 != 'false' and not fuzzer_build
1100 liblz4 = dependency('liblz4',
1101 version : '>= 1.3.0',
1102 required : want_lz4 == 'true')
1103 have = liblz4.found()
1108 conf.set10('HAVE_LZ4', have)
1110 want_xkbcommon = get_option('xkbcommon')
1111 if want_xkbcommon != 'false' and not fuzzer_build
1112 libxkbcommon = dependency('xkbcommon',
1113 version : '>= 0.3.0',
1114 required : want_xkbcommon == 'true')
1115 have = libxkbcommon.found()
1120 conf.set10('HAVE_XKBCOMMON', have)
1122 want_pcre2 = get_option('pcre2')
1123 if want_pcre2 != 'false'
1124 libpcre2 = dependency('libpcre2-8',
1125 required : want_pcre2 == 'true')
1126 have = libpcre2.found()
1131 conf.set10('HAVE_PCRE2', have)
1133 want_glib = get_option('glib')
1134 if want_glib != 'false' and not fuzzer_build
1135 libglib = dependency('glib-2.0',
1136 version : '>= 2.22.0',
1137 required : want_glib == 'true')
1138 libgobject = dependency('gobject-2.0',
1139 version : '>= 2.22.0',
1140 required : want_glib == 'true')
1141 libgio = dependency('gio-2.0',
1142 required : want_glib == 'true')
1143 have = libglib.found() and libgobject.found() and libgio.found()
1150 conf.set10('HAVE_GLIB', have)
1152 want_dbus = get_option('dbus')
1153 if want_dbus != 'false' and not fuzzer_build
1154 libdbus = dependency('dbus-1',
1155 version : '>= 1.3.2',
1156 required : want_dbus == 'true')
1157 have = libdbus.found()
1162 conf.set10('HAVE_DBUS', have)
1164 default_dnssec = get_option('default-dnssec')
1166 default_dnssec = 'no'
1168 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1169 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1170 default_dnssec = 'no'
1172 conf.set('DEFAULT_DNSSEC_MODE',
1173 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1174 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1176 dns_over_tls = get_option('dns-over-tls')
1177 if dns_over_tls != 'false'
1178 if dns_over_tls == 'openssl'
1181 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1182 if dns_over_tls == 'gnutls' and not have_gnutls
1183 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1186 if dns_over_tls == 'gnutls' or have_gnutls
1187 have_openssl = false
1189 have_openssl = conf.get('HAVE_OPENSSL') == 1
1190 if dns_over_tls != 'auto' and not have_openssl
1191 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1192 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1195 have = have_gnutls or have_openssl
1199 have_openssl = false
1201 conf.set10('ENABLE_DNS_OVER_TLS', have)
1202 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1203 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1205 default_dns_over_tls = get_option('default-dns-over-tls')
1207 default_dns_over_tls = 'no'
1209 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1210 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1211 default_dns_over_tls = 'no'
1213 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1214 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1215 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1217 want_importd = get_option('importd')
1218 if want_importd != 'false'
1219 have = (conf.get('HAVE_LIBCURL') == 1 and
1220 conf.get('HAVE_ZLIB') == 1 and
1221 conf.get('HAVE_XZ') == 1 and
1222 conf.get('HAVE_GCRYPT') == 1)
1223 if want_importd == 'true' and not have
1224 error('importd support was requested, but dependencies are not available')
1229 conf.set10('ENABLE_IMPORTD', have)
1231 want_remote = get_option('remote')
1232 if want_remote != 'false'
1233 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1234 conf.get('HAVE_LIBCURL') == 1]
1235 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1236 # it's possible to build one without the other. Complain only if
1237 # support was explictly requested. The auxiliary files like sysusers
1238 # config should be installed when any of the programs are built.
1239 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1240 error('remote support was requested, but dependencies are not available')
1242 have = have_deps[0] or have_deps[1]
1246 conf.set10('ENABLE_REMOTE', have)
1248 foreach term : ['utmp',
1280 have = get_option(term)
1281 name = 'ENABLE_' + term.underscorify().to_upper()
1282 conf.set10(name, have)
1285 foreach tuple : [['nss-mymachines', 'machined'],
1286 ['nss-resolve', 'resolve']]
1287 want = get_option(tuple[0])
1289 have = get_option(tuple[1])
1290 if want == 'true' and not have
1291 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1296 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1297 conf.set10(name, have)
1301 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1302 'ENABLE_NSS_MYMACHINES',
1303 'ENABLE_NSS_RESOLVE',
1304 'ENABLE_NSS_SYSTEMD']
1305 if conf.get(term) == 1
1309 conf.set10('ENABLE_NSS', enable_nss)
1311 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1316 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1318 #####################################################################
1320 if get_option('efi')
1321 efi_arch = host_machine.cpu_family()
1323 if efi_arch == 'x86'
1324 EFI_MACHINE_TYPE_NAME = 'ia32'
1325 gnu_efi_arch = 'ia32'
1326 elif efi_arch == 'x86_64'
1327 EFI_MACHINE_TYPE_NAME = 'x64'
1328 gnu_efi_arch = 'x86_64'
1329 elif efi_arch == 'arm'
1330 EFI_MACHINE_TYPE_NAME = 'arm'
1331 gnu_efi_arch = 'arm'
1332 elif efi_arch == 'aarch64'
1333 EFI_MACHINE_TYPE_NAME = 'aa64'
1334 gnu_efi_arch = 'aarch64'
1336 EFI_MACHINE_TYPE_NAME = ''
1341 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1343 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1347 conf.set10('ENABLE_EFI', have)
1349 #####################################################################
1351 config_h = configure_file(
1352 output : 'config.h',
1353 configuration : conf)
1355 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1357 includes = include_directories('src/basic',
1361 'src/journal-remote',
1365 'src/time-wait-sync',
1370 'src/libsystemd/sd-bus',
1371 'src/libsystemd/sd-device',
1372 'src/libsystemd/sd-event',
1373 'src/libsystemd/sd-hwdb',
1374 'src/libsystemd/sd-id128',
1375 'src/libsystemd/sd-netlink',
1376 'src/libsystemd/sd-network',
1377 'src/libsystemd-network',
1380 add_project_arguments('-include', 'config.h', language : 'c')
1384 subdir('src/systemd')
1386 subdir('src/libsystemd')
1387 subdir('src/libsystemd-network')
1388 subdir('src/journal')
1391 libjournal_core = static_library(
1393 libjournal_core_sources,
1395 include_directories : includes,
1398 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1399 libsystemd = shared_library(
1402 version : libsystemd_version,
1403 include_directories : includes,
1404 link_args : ['-shared',
1405 '-Wl,--version-script=' + libsystemd_sym_path],
1406 link_with : [libbasic,
1408 link_whole : [libsystemd_static,
1410 dependencies : [threads,
1414 link_depends : libsystemd_sym,
1416 install_dir : rootlibdir)
1418 static_libsystemd = get_option('static-libsystemd')
1419 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1421 install_libsystemd_static = static_library(
1424 journal_client_sources,
1426 basic_gcrypt_sources,
1428 include_directories : includes,
1429 build_by_default : static_libsystemd != 'false',
1430 install : static_libsystemd != 'false',
1431 install_dir : rootlibdir,
1432 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1433 dependencies : [threads,
1442 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1444 ############################################################
1446 # binaries that have --help and are intended for use by humans,
1447 # usually, but not always, installed in /bin.
1448 public_programs = []
1450 subdir('src/libudev')
1451 subdir('src/shared')
1454 subdir('src/network')
1456 subdir('src/analyze')
1457 subdir('src/journal-remote')
1458 subdir('src/coredump')
1459 subdir('src/hostname')
1460 subdir('src/import')
1461 subdir('src/kernel-install')
1462 subdir('src/locale')
1463 subdir('src/machine')
1464 subdir('src/portable')
1465 subdir('src/nspawn')
1466 subdir('src/resolve')
1467 subdir('src/timedate')
1468 subdir('src/timesync')
1469 subdir('src/vconsole')
1470 subdir('src/boot/efi')
1477 ############################################################
1479 # only static linking apart from libdl, to make sure that the
1480 # module is linked to all libraries that it uses.
1481 test_dlopen = executable(
1485 include_directories : includes,
1486 link_with : [libbasic],
1487 dependencies : [libdl],
1488 build_by_default : want_tests != 'false')
1490 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1491 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1492 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1493 ['resolve', 'ENABLE_NSS_RESOLVE']]
1495 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1499 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1500 version_script_arg = join_paths(meson.source_root(), sym)
1502 nss = shared_library(
1504 'src/nss-@0@/nss-@0@.c'.format(module),
1507 include_directories : includes,
1508 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1509 link_args : ['-Wl,-z,nodelete',
1511 '-Wl,--version-script=' + version_script_arg,
1513 link_with : [libsystemd_static,
1515 dependencies : [threads,
1519 install_dir : rootlibdir)
1521 # We cannot use shared_module because it does not support version suffix.
1522 # Unfortunately shared_library insists on creating the symlink…
1523 meson.add_install_script('sh', '-c',
1524 'rm $DESTDIR@0@/libnss_@1@.so'
1525 .format(rootlibdir, module))
1527 if want_tests != 'false'
1528 test('dlopen-nss_' + module,
1530 # path to dlopen must include a slash
1531 args : nss.full_path())
1536 ############################################################
1538 executable('systemd',
1540 include_directories : includes,
1541 link_with : [libcore,
1543 dependencies : [threads,
1549 install_rpath : rootlibexecdir,
1551 install_dir : rootlibexecdir)
1553 meson.add_install_script(meson_make_symlink,
1554 join_paths(rootlibexecdir, 'systemd'),
1555 join_paths(rootsbindir, 'init'))
1557 exe = executable('systemd-analyze',
1558 systemd_analyze_sources,
1559 include_directories : includes,
1560 link_with : [libcore,
1562 dependencies : [threads,
1568 install_rpath : rootlibexecdir,
1570 public_programs += exe
1572 executable('systemd-journald',
1573 systemd_journald_sources,
1574 include_directories : includes,
1575 link_with : [libjournal_core,
1577 dependencies : [threads,
1581 install_rpath : rootlibexecdir,
1583 install_dir : rootlibexecdir)
1585 exe = executable('systemd-cat',
1586 systemd_cat_sources,
1587 include_directories : includes,
1588 link_with : [libjournal_core,
1590 dependencies : [threads],
1591 install_rpath : rootlibexecdir,
1593 public_programs += exe
1595 exe = executable('journalctl',
1597 include_directories : includes,
1598 link_with : [libshared],
1599 dependencies : [threads,
1604 install_rpath : rootlibexecdir,
1606 install_dir : rootbindir)
1607 public_programs += exe
1609 executable('systemd-getty-generator',
1610 'src/getty-generator/getty-generator.c',
1611 include_directories : includes,
1612 link_with : [libshared],
1613 install_rpath : rootlibexecdir,
1615 install_dir : systemgeneratordir)
1617 executable('systemd-debug-generator',
1618 'src/debug-generator/debug-generator.c',
1619 include_directories : includes,
1620 link_with : [libshared],
1621 install_rpath : rootlibexecdir,
1623 install_dir : systemgeneratordir)
1625 executable('systemd-fstab-generator',
1626 'src/fstab-generator/fstab-generator.c',
1627 'src/core/mount-setup.c',
1628 include_directories : includes,
1629 link_with : [libshared],
1630 install_rpath : rootlibexecdir,
1632 install_dir : systemgeneratordir)
1634 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1635 executable('30-systemd-environment-d-generator',
1636 'src/environment-d-generator/environment-d-generator.c',
1637 include_directories : includes,
1638 link_with : [libshared],
1639 install_rpath : rootlibexecdir,
1641 install_dir : userenvgeneratordir)
1643 meson.add_install_script(meson_make_symlink,
1644 join_paths(sysconfdir, 'environment'),
1645 join_paths(environmentdir, '99-environment.conf'))
1648 if conf.get('ENABLE_HIBERNATE') == 1
1649 executable('systemd-hibernate-resume-generator',
1650 'src/hibernate-resume/hibernate-resume-generator.c',
1651 include_directories : includes,
1652 link_with : [libshared],
1653 install_rpath : rootlibexecdir,
1655 install_dir : systemgeneratordir)
1657 executable('systemd-hibernate-resume',
1658 'src/hibernate-resume/hibernate-resume.c',
1659 include_directories : includes,
1660 link_with : [libshared],
1661 install_rpath : rootlibexecdir,
1663 install_dir : rootlibexecdir)
1666 if conf.get('HAVE_BLKID') == 1
1667 executable('systemd-gpt-auto-generator',
1668 'src/gpt-auto-generator/gpt-auto-generator.c',
1669 'src/basic/blkid-util.h',
1670 include_directories : includes,
1671 link_with : [libshared],
1672 dependencies : libblkid,
1673 install_rpath : rootlibexecdir,
1675 install_dir : systemgeneratordir)
1677 exe = executable('systemd-dissect',
1678 'src/dissect/dissect.c',
1679 include_directories : includes,
1680 link_with : [libshared],
1681 install_rpath : rootlibexecdir,
1683 install_dir : rootlibexecdir)
1684 public_programs += exe
1687 if conf.get('ENABLE_RESOLVE') == 1
1688 executable('systemd-resolved',
1689 systemd_resolved_sources,
1690 include_directories : includes,
1691 link_with : [libshared,
1693 libsystemd_resolve_core],
1694 dependencies : systemd_resolved_dependencies,
1695 install_rpath : rootlibexecdir,
1697 install_dir : rootlibexecdir)
1699 exe = executable('resolvectl',
1701 include_directories : includes,
1702 link_with : [libshared,
1704 libsystemd_resolve_core],
1705 dependencies : [threads,
1709 install_rpath : rootlibexecdir,
1711 public_programs += exe
1713 meson.add_install_script(meson_make_symlink,
1714 join_paths(bindir, 'resolvectl'),
1715 join_paths(rootsbindir, 'resolvconf'))
1717 meson.add_install_script(meson_make_symlink,
1718 join_paths(bindir, 'resolvectl'),
1719 join_paths(bindir, 'systemd-resolve'))
1722 if conf.get('ENABLE_LOGIND') == 1
1723 executable('systemd-logind',
1724 systemd_logind_sources,
1725 include_directories : includes,
1726 link_with : [liblogind_core,
1728 dependencies : [threads,
1730 install_rpath : rootlibexecdir,
1732 install_dir : rootlibexecdir)
1734 exe = executable('loginctl',
1736 include_directories : includes,
1737 link_with : [libshared],
1738 dependencies : [threads,
1741 install_rpath : rootlibexecdir,
1743 install_dir : rootbindir)
1744 public_programs += exe
1746 exe = executable('systemd-inhibit',
1747 'src/login/inhibit.c',
1748 include_directories : includes,
1749 link_with : [libshared],
1750 install_rpath : rootlibexecdir,
1752 install_dir : rootbindir)
1753 public_programs += exe
1755 if conf.get('HAVE_PAM') == 1
1756 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
1757 pam_systemd = shared_library(
1761 include_directories : includes,
1762 link_args : ['-shared',
1763 '-Wl,--version-script=' + version_script_arg],
1764 link_with : [libsystemd_static,
1766 dependencies : [threads,
1769 link_depends : pam_systemd_sym,
1771 install_dir : pamlibdir)
1773 if want_tests != 'false'
1774 test('dlopen-pam_systemd',
1776 # path to dlopen must include a slash
1777 args : pam_systemd.full_path())
1781 executable('systemd-user-runtime-dir',
1782 user_runtime_dir_sources,
1783 include_directories : includes,
1784 link_with : [libshared],
1785 install_rpath : rootlibexecdir,
1787 install_dir : rootlibexecdir)
1790 if conf.get('HAVE_PAM') == 1
1791 executable('systemd-user-sessions',
1792 'src/user-sessions/user-sessions.c',
1793 include_directories : includes,
1794 link_with : [libshared],
1795 install_rpath : rootlibexecdir,
1797 install_dir : rootlibexecdir)
1800 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1801 exe = executable('bootctl',
1802 'src/boot/bootctl.c',
1803 include_directories : includes,
1804 link_with : [libshared],
1805 dependencies : [libblkid],
1806 install_rpath : rootlibexecdir,
1808 public_programs += exe
1810 executable('systemd-bless-boot',
1811 'src/boot/bless-boot.c',
1812 include_directories : includes,
1813 link_with : [libshared],
1814 dependencies : [libblkid],
1815 install_rpath : rootlibexecdir,
1817 install_dir : rootlibexecdir)
1819 executable('systemd-bless-boot-generator',
1820 'src/boot/bless-boot-generator.c',
1821 include_directories : includes,
1822 link_with : [libshared],
1823 install_rpath : rootlibexecdir,
1825 install_dir : systemgeneratordir)
1828 executable('systemd-boot-check-no-failures',
1829 'src/boot/boot-check-no-failures.c',
1830 include_directories : includes,
1831 link_with : [libshared],
1832 dependencies : [libblkid],
1833 install_rpath : rootlibexecdir,
1835 install_dir : rootlibexecdir)
1837 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1838 include_directories : includes,
1839 link_with : [libshared],
1840 dependencies : [threads],
1841 install_rpath : rootlibexecdir,
1843 public_programs += exe
1846 if get_option('link-systemctl-shared')
1847 systemctl_link_with = [libshared]
1849 systemctl_link_with = [libsystemd_static,
1855 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1856 include_directories : includes,
1857 link_with : systemctl_link_with,
1858 dependencies : [threads,
1863 install_rpath : rootlibexecdir,
1865 install_dir : rootbindir)
1866 public_programs += exe
1868 if conf.get('ENABLE_PORTABLED') == 1
1869 executable('systemd-portabled',
1870 systemd_portabled_sources,
1871 include_directories : includes,
1872 link_with : [libshared],
1873 dependencies : [threads],
1874 install_rpath : rootlibexecdir,
1876 install_dir : rootlibexecdir)
1878 exe = executable('portablectl', 'src/portable/portablectl.c',
1879 include_directories : includes,
1880 link_with : [libshared],
1881 dependencies : [threads],
1882 install_rpath : rootlibexecdir,
1884 install_dir : rootbindir)
1885 public_programs += exe
1888 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1889 meson.add_install_script(meson_make_symlink,
1890 join_paths(rootbindir, 'systemctl'),
1891 join_paths(rootsbindir, alias))
1894 if conf.get('ENABLE_BACKLIGHT') == 1
1895 executable('systemd-backlight',
1896 'src/backlight/backlight.c',
1897 include_directories : includes,
1898 link_with : [libshared],
1899 install_rpath : rootlibexecdir,
1901 install_dir : rootlibexecdir)
1904 if conf.get('ENABLE_RFKILL') == 1
1905 executable('systemd-rfkill',
1906 'src/rfkill/rfkill.c',
1907 include_directories : includes,
1908 link_with : [libshared],
1909 install_rpath : rootlibexecdir,
1911 install_dir : rootlibexecdir)
1914 executable('systemd-system-update-generator',
1915 'src/system-update-generator/system-update-generator.c',
1916 include_directories : includes,
1917 link_with : [libshared],
1918 install_rpath : rootlibexecdir,
1920 install_dir : systemgeneratordir)
1922 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1923 executable('systemd-cryptsetup',
1924 'src/cryptsetup/cryptsetup.c',
1925 include_directories : includes,
1926 link_with : [libshared],
1927 dependencies : [libcryptsetup],
1928 install_rpath : rootlibexecdir,
1930 install_dir : rootlibexecdir)
1932 executable('systemd-cryptsetup-generator',
1933 'src/cryptsetup/cryptsetup-generator.c',
1934 include_directories : includes,
1935 link_with : [libshared],
1936 dependencies : [libcryptsetup],
1937 install_rpath : rootlibexecdir,
1939 install_dir : systemgeneratordir)
1941 executable('systemd-veritysetup',
1942 'src/veritysetup/veritysetup.c',
1943 include_directories : includes,
1944 link_with : [libshared],
1945 dependencies : [libcryptsetup],
1946 install_rpath : rootlibexecdir,
1948 install_dir : rootlibexecdir)
1950 executable('systemd-veritysetup-generator',
1951 'src/veritysetup/veritysetup-generator.c',
1952 include_directories : includes,
1953 link_with : [libshared],
1954 dependencies : [libcryptsetup],
1955 install_rpath : rootlibexecdir,
1957 install_dir : systemgeneratordir)
1960 if conf.get('HAVE_SYSV_COMPAT') == 1
1961 executable('systemd-sysv-generator',
1962 'src/sysv-generator/sysv-generator.c',
1963 include_directories : includes,
1964 link_with : [libshared],
1965 install_rpath : rootlibexecdir,
1967 install_dir : systemgeneratordir)
1969 executable('systemd-rc-local-generator',
1970 'src/rc-local-generator/rc-local-generator.c',
1971 include_directories : includes,
1972 link_with : [libshared],
1973 install_rpath : rootlibexecdir,
1975 install_dir : systemgeneratordir)
1978 if conf.get('ENABLE_HOSTNAMED') == 1
1979 executable('systemd-hostnamed',
1980 'src/hostname/hostnamed.c',
1981 include_directories : includes,
1982 link_with : [libshared],
1983 install_rpath : rootlibexecdir,
1985 install_dir : rootlibexecdir)
1987 exe = executable('hostnamectl',
1988 'src/hostname/hostnamectl.c',
1989 include_directories : includes,
1990 link_with : [libshared],
1991 install_rpath : rootlibexecdir,
1993 public_programs += exe
1996 if conf.get('ENABLE_LOCALED') == 1
1997 if conf.get('HAVE_XKBCOMMON') == 1
1998 # logind will load libxkbcommon.so dynamically on its own
2004 executable('systemd-localed',
2005 systemd_localed_sources,
2006 include_directories : includes,
2007 link_with : [libshared],
2008 dependencies : deps,
2009 install_rpath : rootlibexecdir,
2011 install_dir : rootlibexecdir)
2013 exe = executable('localectl',
2015 include_directories : includes,
2016 link_with : [libshared],
2017 install_rpath : rootlibexecdir,
2019 public_programs += exe
2022 if conf.get('ENABLE_TIMEDATED') == 1
2023 executable('systemd-timedated',
2024 'src/timedate/timedated.c',
2025 include_directories : includes,
2026 link_with : [libshared],
2027 install_rpath : rootlibexecdir,
2029 install_dir : rootlibexecdir)
2032 if conf.get('ENABLE_TIMEDATECTL') == 1
2033 exe = executable('timedatectl',
2034 'src/timedate/timedatectl.c',
2035 include_directories : includes,
2036 install_rpath : rootlibexecdir,
2037 link_with : [libshared],
2038 dependencies : [libm],
2040 public_programs += exe
2043 if conf.get('ENABLE_TIMESYNCD') == 1
2044 executable('systemd-timesyncd',
2045 systemd_timesyncd_sources,
2046 include_directories : includes,
2047 link_with : [libshared],
2048 dependencies : [threads,
2050 install_rpath : rootlibexecdir,
2052 install_dir : rootlibexecdir)
2054 executable('systemd-time-wait-sync',
2055 'src/time-wait-sync/time-wait-sync.c',
2056 include_directories : includes,
2057 link_with : [libshared],
2058 install_rpath : rootlibexecdir,
2060 install_dir : rootlibexecdir)
2063 if conf.get('ENABLE_MACHINED') == 1
2064 executable('systemd-machined',
2065 systemd_machined_sources,
2066 include_directories : includes,
2067 link_with : [libmachine_core,
2069 install_rpath : rootlibexecdir,
2071 install_dir : rootlibexecdir)
2073 exe = executable('machinectl',
2074 'src/machine/machinectl.c',
2075 include_directories : includes,
2076 link_with : [libshared],
2077 dependencies : [threads,
2080 install_rpath : rootlibexecdir,
2082 install_dir : rootbindir)
2083 public_programs += exe
2086 if conf.get('ENABLE_IMPORTD') == 1
2087 executable('systemd-importd',
2088 systemd_importd_sources,
2089 include_directories : includes,
2090 link_with : [libshared],
2091 dependencies : [threads],
2092 install_rpath : rootlibexecdir,
2094 install_dir : rootlibexecdir)
2096 systemd_pull = executable('systemd-pull',
2097 systemd_pull_sources,
2098 include_directories : includes,
2099 link_with : [libshared],
2100 dependencies : [libcurl,
2105 install_rpath : rootlibexecdir,
2107 install_dir : rootlibexecdir)
2109 systemd_import = executable('systemd-import',
2110 systemd_import_sources,
2111 include_directories : includes,
2112 link_with : [libshared],
2113 dependencies : [libcurl,
2117 install_rpath : rootlibexecdir,
2119 install_dir : rootlibexecdir)
2121 systemd_export = executable('systemd-export',
2122 systemd_export_sources,
2123 include_directories : includes,
2124 link_with : [libshared],
2125 dependencies : [libcurl,
2129 install_rpath : rootlibexecdir,
2131 install_dir : rootlibexecdir)
2132 public_programs += [systemd_pull, systemd_import, systemd_export]
2135 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2136 exe = executable('systemd-journal-upload',
2137 systemd_journal_upload_sources,
2138 include_directories : includes,
2139 link_with : [libshared],
2140 dependencies : [threads,
2145 install_rpath : rootlibexecdir,
2147 install_dir : rootlibexecdir)
2148 public_programs += exe
2151 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2152 s_j_remote = executable('systemd-journal-remote',
2153 systemd_journal_remote_sources,
2154 include_directories : includes,
2155 link_with : [libshared,
2156 libsystemd_journal_remote],
2157 dependencies : [threads,
2162 install_rpath : rootlibexecdir,
2164 install_dir : rootlibexecdir)
2166 s_j_gatewayd = executable('systemd-journal-gatewayd',
2167 systemd_journal_gatewayd_sources,
2168 include_directories : includes,
2169 link_with : [libshared],
2170 dependencies : [threads,
2175 install_rpath : rootlibexecdir,
2177 install_dir : rootlibexecdir)
2178 public_programs += [s_j_remote, s_j_gatewayd]
2181 if conf.get('ENABLE_COREDUMP') == 1
2182 executable('systemd-coredump',
2183 systemd_coredump_sources,
2184 include_directories : includes,
2185 link_with : [libshared],
2186 dependencies : [threads,
2191 install_rpath : rootlibexecdir,
2193 install_dir : rootlibexecdir)
2195 exe = executable('coredumpctl',
2196 coredumpctl_sources,
2197 include_directories : includes,
2198 link_with : [libshared],
2199 dependencies : [threads,
2202 install_rpath : rootlibexecdir,
2204 public_programs += exe
2207 if conf.get('ENABLE_BINFMT') == 1
2208 exe = executable('systemd-binfmt',
2209 'src/binfmt/binfmt.c',
2210 include_directories : includes,
2211 link_with : [libshared],
2212 install_rpath : rootlibexecdir,
2214 install_dir : rootlibexecdir)
2215 public_programs += exe
2217 meson.add_install_script('sh', '-c',
2218 mkdir_p.format(binfmtdir))
2219 meson.add_install_script('sh', '-c',
2220 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2223 if conf.get('ENABLE_VCONSOLE') == 1
2224 executable('systemd-vconsole-setup',
2225 'src/vconsole/vconsole-setup.c',
2226 include_directories : includes,
2227 link_with : [libshared],
2228 install_rpath : rootlibexecdir,
2230 install_dir : rootlibexecdir)
2233 if conf.get('ENABLE_RANDOMSEED') == 1
2234 executable('systemd-random-seed',
2235 'src/random-seed/random-seed.c',
2236 include_directories : includes,
2237 link_with : [libshared],
2238 install_rpath : rootlibexecdir,
2240 install_dir : rootlibexecdir)
2243 if conf.get('ENABLE_FIRSTBOOT') == 1
2244 executable('systemd-firstboot',
2245 'src/firstboot/firstboot.c',
2246 include_directories : includes,
2247 link_with : [libshared],
2248 dependencies : [libcrypt],
2249 install_rpath : rootlibexecdir,
2251 install_dir : rootbindir)
2254 executable('systemd-remount-fs',
2255 'src/remount-fs/remount-fs.c',
2256 'src/core/mount-setup.c',
2257 'src/core/mount-setup.h',
2258 include_directories : includes,
2259 link_with : [libshared],
2260 install_rpath : rootlibexecdir,
2262 install_dir : rootlibexecdir)
2264 executable('systemd-machine-id-setup',
2265 'src/machine-id-setup/machine-id-setup-main.c',
2266 'src/core/machine-id-setup.c',
2267 'src/core/machine-id-setup.h',
2268 include_directories : includes,
2269 link_with : [libshared],
2270 install_rpath : rootlibexecdir,
2272 install_dir : rootbindir)
2274 executable('systemd-fsck',
2276 include_directories : includes,
2277 link_with : [libshared],
2278 install_rpath : rootlibexecdir,
2280 install_dir : rootlibexecdir)
2282 executable('systemd-growfs',
2283 'src/partition/growfs.c',
2284 include_directories : includes,
2285 link_with : [libshared],
2286 dependencies : [libcryptsetup],
2287 install_rpath : rootlibexecdir,
2289 install_dir : rootlibexecdir)
2291 executable('systemd-makefs',
2292 'src/partition/makefs.c',
2293 include_directories : includes,
2294 link_with : [libshared],
2295 install_rpath : rootlibexecdir,
2297 install_dir : rootlibexecdir)
2299 executable('systemd-sleep',
2300 'src/sleep/sleep.c',
2301 include_directories : includes,
2302 link_with : [libshared],
2303 install_rpath : rootlibexecdir,
2305 install_dir : rootlibexecdir)
2307 exe = executable('systemd-sysctl',
2308 'src/sysctl/sysctl.c',
2309 include_directories : includes,
2310 link_with : [libshared],
2311 install_rpath : rootlibexecdir,
2313 install_dir : rootlibexecdir)
2314 public_programs += exe
2316 executable('systemd-ac-power',
2317 'src/ac-power/ac-power.c',
2318 include_directories : includes,
2319 link_with : [libshared],
2320 install_rpath : rootlibexecdir,
2322 install_dir : rootlibexecdir)
2324 exe = executable('systemd-detect-virt',
2325 'src/detect-virt/detect-virt.c',
2326 include_directories : includes,
2327 link_with : [libshared],
2328 install_rpath : rootlibexecdir,
2330 public_programs += exe
2332 exe = executable('systemd-delta',
2333 'src/delta/delta.c',
2334 include_directories : includes,
2335 link_with : [libshared],
2336 install_rpath : rootlibexecdir,
2338 public_programs += exe
2340 exe = executable('systemd-escape',
2341 'src/escape/escape.c',
2342 include_directories : includes,
2343 link_with : [libshared],
2344 install_rpath : rootlibexecdir,
2346 install_dir : rootbindir)
2347 public_programs += exe
2349 exe = executable('systemd-notify',
2350 'src/notify/notify.c',
2351 include_directories : includes,
2352 link_with : [libshared],
2353 install_rpath : rootlibexecdir,
2355 install_dir : rootbindir)
2356 public_programs += exe
2358 executable('systemd-volatile-root',
2359 'src/volatile-root/volatile-root.c',
2360 include_directories : includes,
2361 link_with : [libshared],
2362 install_rpath : rootlibexecdir,
2364 install_dir : rootlibexecdir)
2366 executable('systemd-cgroups-agent',
2367 'src/cgroups-agent/cgroups-agent.c',
2368 include_directories : includes,
2369 link_with : [libshared],
2370 install_rpath : rootlibexecdir,
2372 install_dir : rootlibexecdir)
2374 exe = executable('systemd-id128',
2375 'src/id128/id128.c',
2376 include_directories : includes,
2377 link_with : [libshared],
2378 install_rpath : rootlibexecdir,
2380 public_programs += exe
2382 exe = executable('systemd-path',
2384 include_directories : includes,
2385 link_with : [libshared],
2386 install_rpath : rootlibexecdir,
2388 public_programs += exe
2390 exe = executable('systemd-ask-password',
2391 'src/ask-password/ask-password.c',
2392 include_directories : includes,
2393 link_with : [libshared],
2394 install_rpath : rootlibexecdir,
2396 install_dir : rootbindir)
2397 public_programs += exe
2399 executable('systemd-reply-password',
2400 'src/reply-password/reply-password.c',
2401 include_directories : includes,
2402 link_with : [libshared],
2403 install_rpath : rootlibexecdir,
2405 install_dir : rootlibexecdir)
2407 exe = executable('systemd-tty-ask-password-agent',
2408 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2409 include_directories : includes,
2410 link_with : [libshared],
2411 install_rpath : rootlibexecdir,
2413 install_dir : rootbindir)
2414 public_programs += exe
2416 exe = executable('systemd-cgls',
2418 include_directories : includes,
2419 link_with : [libshared],
2420 install_rpath : rootlibexecdir,
2422 public_programs += exe
2424 exe = executable('systemd-cgtop',
2425 'src/cgtop/cgtop.c',
2426 include_directories : includes,
2427 link_with : [libshared],
2428 install_rpath : rootlibexecdir,
2430 public_programs += exe
2432 executable('systemd-initctl',
2433 'src/initctl/initctl.c',
2434 include_directories : includes,
2435 link_with : [libshared],
2436 install_rpath : rootlibexecdir,
2438 install_dir : rootlibexecdir)
2440 exe = executable('systemd-mount',
2441 'src/mount/mount-tool.c',
2442 include_directories : includes,
2443 link_with : [libshared],
2444 install_rpath : rootlibexecdir,
2446 public_programs += exe
2448 meson.add_install_script(meson_make_symlink,
2449 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2451 exe = executable('systemd-run',
2453 include_directories : includes,
2454 link_with : [libshared],
2455 install_rpath : rootlibexecdir,
2457 public_programs += exe
2459 exe = executable('systemd-stdio-bridge',
2460 'src/stdio-bridge/stdio-bridge.c',
2461 include_directories : includes,
2462 link_with : [libshared],
2463 install_rpath : rootlibexecdir,
2465 public_programs += exe
2467 exe = executable('busctl',
2468 'src/busctl/busctl.c',
2469 'src/busctl/busctl-introspect.c',
2470 'src/busctl/busctl-introspect.h',
2471 include_directories : includes,
2472 link_with : [libshared],
2473 install_rpath : rootlibexecdir,
2475 public_programs += exe
2477 if conf.get('ENABLE_SYSUSERS') == 1
2478 exe = executable('systemd-sysusers',
2479 'src/sysusers/sysusers.c',
2480 include_directories : includes,
2481 link_with : [libshared],
2482 install_rpath : rootlibexecdir,
2484 install_dir : rootbindir)
2485 public_programs += exe
2488 if conf.get('ENABLE_TMPFILES') == 1
2489 exe = executable('systemd-tmpfiles',
2490 'src/tmpfiles/tmpfiles.c',
2491 include_directories : includes,
2492 link_with : [libshared],
2493 dependencies : [libacl],
2494 install_rpath : rootlibexecdir,
2496 install_dir : rootbindir)
2497 public_programs += exe
2499 if want_tests != 'false'
2500 test('test-systemd-tmpfiles',
2501 test_systemd_tmpfiles_py,
2502 # https://github.com/mesonbuild/meson/issues/2681
2503 args : exe.full_path())
2507 if conf.get('ENABLE_HWDB') == 1
2508 exe = executable('systemd-hwdb',
2510 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2511 include_directories : includes,
2512 link_with : [libudev_static],
2513 install_rpath : udev_rpath,
2515 install_dir : rootbindir)
2516 public_programs += exe
2519 if conf.get('ENABLE_QUOTACHECK') == 1
2520 executable('systemd-quotacheck',
2521 'src/quotacheck/quotacheck.c',
2522 include_directories : includes,
2523 link_with : [libshared],
2524 install_rpath : rootlibexecdir,
2526 install_dir : rootlibexecdir)
2529 exe = executable('systemd-socket-proxyd',
2530 'src/socket-proxy/socket-proxyd.c',
2531 include_directories : includes,
2532 link_with : [libshared],
2533 dependencies : [threads],
2534 install_rpath : rootlibexecdir,
2536 install_dir : rootlibexecdir)
2537 public_programs += exe
2539 exe = executable('systemd-udevd',
2540 systemd_udevd_sources,
2541 include_directories : includes,
2542 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2543 link_with : [libudev_core,
2546 dependencies : [threads,
2551 install_rpath : udev_rpath,
2553 install_dir : rootlibexecdir)
2554 public_programs += exe
2556 exe = executable('udevadm',
2558 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2559 include_directories : includes,
2560 link_with : [libudev_core,
2563 dependencies : [threads,
2568 install_rpath : udev_rpath,
2570 install_dir : rootbindir)
2571 public_programs += exe
2573 executable('systemd-shutdown',
2574 systemd_shutdown_sources,
2575 include_directories : includes,
2576 link_with : [libshared],
2577 dependencies : [libmount],
2578 install_rpath : rootlibexecdir,
2580 install_dir : rootlibexecdir)
2582 executable('systemd-update-done',
2583 'src/update-done/update-done.c',
2584 include_directories : includes,
2585 link_with : [libshared],
2586 install_rpath : rootlibexecdir,
2588 install_dir : rootlibexecdir)
2590 executable('systemd-update-utmp',
2591 'src/update-utmp/update-utmp.c',
2592 include_directories : includes,
2593 link_with : [libshared],
2594 dependencies : [libaudit],
2595 install_rpath : rootlibexecdir,
2597 install_dir : rootlibexecdir)
2599 if conf.get('HAVE_KMOD') == 1
2600 executable('systemd-modules-load',
2601 'src/modules-load/modules-load.c',
2602 include_directories : includes,
2603 link_with : [libshared],
2604 dependencies : [libkmod],
2605 install_rpath : rootlibexecdir,
2607 install_dir : rootlibexecdir)
2609 meson.add_install_script('sh', '-c',
2610 mkdir_p.format(modulesloaddir))
2611 meson.add_install_script('sh', '-c',
2612 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2615 exe = executable('systemd-nspawn',
2616 systemd_nspawn_sources,
2617 'src/core/mount-setup.c', # FIXME: use a variable?
2618 'src/core/mount-setup.h',
2619 'src/core/loopback-setup.c',
2620 'src/core/loopback-setup.h',
2621 include_directories : includes,
2622 link_with : [libnspawn_core,
2624 dependencies : [libblkid],
2625 install_rpath : rootlibexecdir,
2627 public_programs += exe
2629 if conf.get('ENABLE_NETWORKD') == 1
2630 executable('systemd-networkd',
2631 systemd_networkd_sources,
2632 include_directories : includes,
2633 link_with : [libnetworkd_core,
2637 dependencies : [threads],
2638 install_rpath : rootlibexecdir,
2640 install_dir : rootlibexecdir)
2642 executable('systemd-networkd-wait-online',
2643 systemd_networkd_wait_online_sources,
2644 include_directories : includes,
2645 link_with : [libnetworkd_core,
2647 install_rpath : rootlibexecdir,
2649 install_dir : rootlibexecdir)
2651 exe = executable('networkctl',
2653 include_directories : includes,
2654 link_with : [libsystemd_network,
2656 install_rpath : rootlibexecdir,
2658 install_dir : rootbindir)
2659 public_programs += exe
2662 executable('systemd-sulogin-shell',
2663 ['src/sulogin-shell/sulogin-shell.c'],
2664 include_directories : includes,
2665 link_with : [libshared],
2666 install_rpath : rootlibexecdir,
2668 install_dir : rootlibexecdir)
2670 ############################################################
2673 'systemd-runtest.env',
2674 output : 'systemd-runtest.env',
2675 command : ['sh', '-c', '{ ' +
2676 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2677 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2679 build_by_default : true)
2681 foreach tuple : tests
2683 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2684 dependencies = tuple[2]
2685 condition = tuple.length() >= 4 ? tuple[3] : ''
2686 type = tuple.length() >= 5 ? tuple[4] : ''
2687 defs = tuple.length() >= 6 ? tuple[5] : []
2688 incs = tuple.length() >= 7 ? tuple[6] : includes
2691 name = sources[0].split('/')[-1].split('.')[0]
2692 if type.startswith('timeout=')
2693 timeout = type.split('=')[1].to_int()
2697 if condition == '' or conf.get(condition) == 1
2701 include_directories : incs,
2702 link_with : link_with,
2703 dependencies : dependencies,
2705 build_by_default : want_tests != 'false',
2706 install_rpath : rootlibexecdir,
2707 install : install_tests,
2708 install_dir : join_paths(testsdir, type))
2711 message('@0@ is a manual test'.format(name))
2712 elif type == 'unsafe' and want_tests != 'unsafe'
2713 message('@0@ is an unsafe test'.format(name))
2714 elif want_tests != 'false'
2720 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2725 'test-libsystemd-sym',
2726 test_libsystemd_sym_c,
2727 include_directories : includes,
2728 link_with : [libsystemd],
2729 build_by_default : want_tests != 'false',
2730 install : install_tests,
2731 install_dir : testsdir)
2732 if want_tests != 'false'
2733 test('test-libsystemd-sym', exe)
2737 'test-libsystemd-static-sym',
2738 test_libsystemd_sym_c,
2739 include_directories : includes,
2740 link_with : [install_libsystemd_static],
2741 dependencies : [threads], # threads is already included in dependencies on the library,
2742 # but does not seem to get propagated. Add here as a work-around.
2743 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2744 install : install_tests and static_libsystemd_pic,
2745 install_dir : testsdir)
2746 if want_tests != 'false' and static_libsystemd_pic
2747 test('test-libsystemd-static-sym', exe)
2753 include_directories : includes,
2754 c_args : '-Wno-deprecated-declarations',
2755 link_with : [libudev],
2756 build_by_default : want_tests != 'false',
2757 install : install_tests,
2758 install_dir : testsdir)
2759 if want_tests != 'false'
2760 test('test-libudev-sym', exe)
2764 'test-libudev-static-sym',
2766 include_directories : includes,
2767 c_args : '-Wno-deprecated-declarations',
2768 link_with : [install_libudev_static],
2769 build_by_default : want_tests != 'false' and static_libudev_pic,
2770 install : install_tests and static_libudev_pic,
2771 install_dir : testsdir)
2772 if want_tests != 'false' and static_libudev_pic
2773 test('test-libudev-static-sym', exe)
2776 ############################################################
2780 if get_option('tests') != 'false'
2781 foreach tuple : fuzzers
2783 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2784 dependencies = tuple[2]
2785 defs = tuple.length() >= 4 ? tuple[3] : []
2786 incs = tuple.length() >= 5 ? tuple[4] : includes
2789 dependencies += fuzzing_engine
2791 sources += 'src/fuzz/fuzz-main.c'
2794 name = sources[0].split('/')[-1].split('.')[0]
2796 fuzzer_exes += executable(
2799 include_directories : [incs, include_directories('src/fuzz')],
2800 link_with : link_with,
2801 dependencies : dependencies,
2807 run_target('fuzzers',
2808 depends : fuzzer_exes,
2811 ############################################################
2813 make_directive_index_py = find_program('tools/make-directive-index.py')
2814 make_man_index_py = find_program('tools/make-man-index.py')
2815 xml_helper_py = find_program('tools/xml_helper.py')
2816 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2820 subdir('sysusers.d')
2821 subdir('tmpfiles.d')
2826 subdir('shell-completion/bash')
2827 subdir('shell-completion/zsh')
2828 subdir('docs/sysvinit')
2829 subdir('docs/var-log')
2831 install_subdir('factory/etc',
2832 install_dir : factorydir)
2834 install_data('xorg/50-systemd-user.sh',
2835 install_dir : xinitrcdir)
2836 install_data('modprobe.d/systemd.conf',
2837 install_dir : modprobedir)
2838 install_data('LICENSE.GPL2',
2842 'docs/CODING_STYLE.md',
2843 'docs/DISTRO_PORTING.md',
2844 'docs/ENVIRONMENT.md',
2846 'docs/TRANSIENT-SETTINGS.md',
2847 'docs/TRANSLATORS.md',
2848 'docs/UIDS-GIDS.md',
2849 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2850 install_dir : docdir)
2852 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2853 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2855 ############################################################
2857 meson_check_help = find_program('tools/meson-check-help.sh')
2859 foreach exec : public_programs
2860 name = exec.full_path().split('/')[-1]
2861 if want_tests != 'false'
2862 test('check-help-' + name,
2864 args : exec.full_path())
2868 ############################################################
2870 # Enable tests for all supported sanitizers
2871 foreach tuple : sanitizers
2872 sanitizer = tuple[0]
2875 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2877 foreach p : fuzz_regression_tests
2878 b = p.split('/')[-2]
2879 c = p.split('/')[-1]
2881 name = '@0@:@1@'.format(b, sanitizer)
2884 if want_tests == 'false'
2885 message('Not compiling @0@ because tests is set to false'.format(name))
2887 exe = custom_target(
2891 command : [env, 'ln', '-fs',
2892 join_paths(build.full_path(), b),
2894 build_by_default : true)
2896 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2901 if want_tests != 'false' and slow_tests
2902 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2904 args : [exe.full_path(),
2905 join_paths(meson.source_root(), p)])
2912 ############################################################
2915 all_files = run_command(
2917 ['--git-dir=@0@/.git'.format(meson.source_root()),
2920 all_files = files(all_files.stdout().split())
2925 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
2928 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
2932 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2935 command : [meson_git_contrib_sh])
2939 git_head = run_command(
2941 ['--git-dir=@0@/.git'.format(meson.source_root()),
2942 'rev-parse', 'HEAD']).stdout().strip()
2943 git_head_short = run_command(
2945 ['--git-dir=@0@/.git'.format(meson.source_root()),
2946 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2950 command : ['git', 'archive',
2951 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
2953 '--prefix', 'systemd-@0@/'.format(git_head),
2957 ############################################################
2959 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2962 depends : [man, libsystemd, libudev],
2963 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2967 command : ['sh', '@0@/tools/make-index-md.sh'.format(meson.source_root()), meson.source_root()])
2969 ############################################################
2972 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2974 'split /usr: @0@'.format(split_usr),
2975 'split bin-sbin: @0@'.format(split_bin),
2976 'prefix directory: @0@'.format(prefixdir),
2977 'rootprefix directory: @0@'.format(rootprefixdir),
2978 'sysconf directory: @0@'.format(sysconfdir),
2979 'include directory: @0@'.format(includedir),
2980 'lib directory: @0@'.format(libdir),
2981 'rootlib directory: @0@'.format(rootlibdir),
2982 'SysV init scripts: @0@'.format(sysvinit_path),
2983 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2984 'PAM modules directory: @0@'.format(pamlibdir),
2985 'PAM configuration directory: @0@'.format(pamconfdir),
2986 'RPM macros directory: @0@'.format(rpmmacrosdir),
2987 'modprobe.d directory: @0@'.format(modprobedir),
2988 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2989 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2990 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2991 'bash completions directory: @0@'.format(bashcompletiondir),
2992 'zsh completions directory: @0@'.format(zshcompletiondir),
2993 'extra start script: @0@'.format(get_option('rc-local')),
2994 'extra stop script: @0@'.format(get_option('halt-local')),
2995 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2996 get_option('debug-tty')),
2997 'TTY GID: @0@'.format(tty_gid),
2998 'users GID: @0@'.format(substs.get('USERS_GID')),
2999 'maximum system UID: @0@'.format(system_uid_max),
3000 'maximum system GID: @0@'.format(system_gid_max),
3001 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3002 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3003 'minimum container UID base: @0@'.format(container_uid_base_min),
3004 'maximum container UID base: @0@'.format(container_uid_base_max),
3005 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3006 'render group access mode: @0@'.format(get_option('group-render-mode')),
3007 'certificate root directory: @0@'.format(get_option('certificate-root')),
3008 'support URL: @0@'.format(support_url),
3009 'nobody user name: @0@'.format(nobody_user),
3010 'nobody group name: @0@'.format(nobody_group),
3011 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3012 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3014 'default DNSSEC mode: @0@'.format(default_dnssec),
3015 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3016 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3017 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
3019 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3020 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3022 'default DNS servers: @0@'.format(alt_dns_servers),
3023 'default NTP servers: @0@'.format(alt_ntp_servers)]
3025 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3026 '@@0@'.format(time_epoch)).stdout().strip()
3028 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3031 'static libsystemd: @0@'.format(static_libsystemd),
3032 'static libudev: @0@'.format(static_libudev)]
3035 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3036 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3037 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3039 if conf.get('ENABLE_EFI') == 1
3040 status += 'efi arch: @0@'.format(efi_arch)
3044 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3045 'EFI CC @0@'.format(efi_cc),
3046 'EFI lib directory: @0@'.format(efi_libdir),
3047 'EFI lds directory: @0@'.format(efi_ldsdir),
3048 'EFI include directory: @0@'.format(efi_incdir)]
3100 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3101 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3104 ['legacy pkla', install_polkit_pkla],
3106 ['gnu-efi', have_gnu_efi],
3119 ['man pages', want_man],
3120 ['html pages', want_html],
3121 ['man page indices', want_man and have_lxml],
3126 ['adm group', get_option('adm-group')],
3127 ['wheel group', get_option('wheel-group')],
3130 ['debug mmap cache'],
3131 ['valgrind', conf.get('VALGRIND') == 1],
3132 ['trace logging', conf.get('LOG_TRACE') == 1],
3133 ['link-udev-shared', get_option('link-udev-shared')],
3134 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3137 if tuple.length() >= 2
3140 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3141 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3142 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3153 'enabled features: @0@'.format(', '.join(found)),
3155 'disabled features: @0@'.format(', '.join(missing)),
3157 message('\n '.join(status))
3159 if rootprefixdir != rootprefix_default
3161 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3162 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3163 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))