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', 512*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_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
231 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
232 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
233 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
234 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
235 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
236 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
238 substs.set('prefix', prefixdir)
239 substs.set('exec_prefix', prefixdir)
240 substs.set('libdir', libdir)
241 substs.set('rootlibdir', rootlibdir)
242 substs.set('includedir', includedir)
243 substs.set('pkgsysconfdir', pkgsysconfdir)
244 substs.set('bindir', bindir)
245 substs.set('rootbindir', rootbindir)
246 substs.set('rootlibexecdir', rootlibexecdir)
247 substs.set('systemunitdir', systemunitdir)
248 substs.set('userunitdir', userunitdir)
249 substs.set('systempresetdir', systempresetdir)
250 substs.set('userpresetdir', userpresetdir)
251 substs.set('udevhwdbdir', udevhwdbdir)
252 substs.set('udevrulesdir', udevrulesdir)
253 substs.set('udevlibexecdir', udevlibexecdir)
254 substs.set('environmentdir', environmentdir)
255 substs.set('catalogdir', catalogdir)
256 substs.set('tmpfilesdir', tmpfilesdir)
257 substs.set('sysusersdir', sysusersdir)
258 substs.set('sysctldir', sysctldir)
259 substs.set('binfmtdir', binfmtdir)
260 substs.set('modulesloaddir', modulesloaddir)
261 substs.set('modprobedir', modprobedir)
262 substs.set('systemgeneratordir', systemgeneratordir)
263 substs.set('usergeneratordir', usergeneratordir)
264 substs.set('systemenvgeneratordir', systemenvgeneratordir)
265 substs.set('userenvgeneratordir', userenvgeneratordir)
266 substs.set('systemshutdowndir', systemshutdowndir)
267 substs.set('systemsleepdir', systemsleepdir)
268 substs.set('VARLOGDIR', varlogdir)
269 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
270 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
271 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
272 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
273 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
274 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
275 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
276 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
277 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
279 #####################################################################
281 cc = meson.get_compiler('c')
282 pkgconfig = import('pkgconfig')
283 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
284 meson_build_sh = find_program('tools/meson-build.sh')
286 want_tests = get_option('tests')
287 slow_tests = want_tests != 'false' and get_option('slow-tests')
288 install_tests = get_option('install-tests')
290 cxx = find_program('c++', required : fuzzer_build)
292 # Used only for tests
294 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
300 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
302 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
305 possible_cc_flags = [
309 '-Wmissing-include-dirs',
310 '-Wold-style-definition',
314 '-Wsuggest-attribute=noreturn',
315 '-Werror=missing-prototypes',
316 '-Werror=implicit-function-declaration',
317 '-Werror=missing-declarations',
318 '-Werror=return-type',
319 '-Werror=incompatible-pointer-types',
321 '-Wstrict-prototypes',
323 '-Wmissing-noreturn',
324 '-Wimplicit-fallthrough=5',
327 '-Wstrict-aliasing=2',
330 '-Werror=shift-count-overflow',
331 '-Werror=shift-overflow=2',
335 # negative arguments are correctly detected starting with meson 0.46.
336 '-Wno-unused-parameter',
337 '-Wno-missing-field-initializers',
338 '-Wno-unused-result',
339 '-Wno-format-signedness',
341 # work-around for gcc 7.1 turning this on on its own.
342 '-Wno-error=nonnull',
344 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
345 # optimizations enabled, producing essentially false positives.
346 '-Wno-maybe-uninitialized',
350 '-fdiagnostics-show-option',
351 '-fno-strict-aliasing',
352 '-fvisibility=hidden',
354 '-fstack-protector-strong',
355 '--param=ssp-buffer-size=4',
358 # --as-needed and --no-undefined are provided by meson by default,
359 # run mesonconf to see what is enabled
360 possible_link_flags = [
365 # the oss-fuzz fuzzers are not built with -fPIE, so don't
366 # enable it when we are linking against them
368 possible_cc_flags += '-fPIE'
369 possible_link_flags += '-pie'
372 if cc.get_id() == 'clang'
373 possible_cc_flags += [
374 '-Wno-typedef-redefinition',
375 '-Wno-gnu-variable-sized-type-not-at-end',
379 if get_option('buildtype') != 'debug'
380 possible_cc_flags += [
381 '-ffunction-sections',
385 possible_link_flags += '-Wl,--gc-sections'
388 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
389 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
393 #include <inttypes.h>
394 typedef uint64_t usec_t;
395 usec_t now(clockid_t clock);
400 ''', name : '-Werror=shadow with local shadowing')
401 add_project_arguments('-Werror=shadow', language : 'c')
404 cpp = ' '.join(cc.cmd_array()) + ' -E'
406 #####################################################################
407 # compilation result tests
409 conf.set('_GNU_SOURCE', true)
410 conf.set('__SANE_USERSPACE_TYPES__', true)
412 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
413 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
414 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
415 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
416 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
417 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
418 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
422 #include <linux/ethtool.h>
423 #include <linux/fib_rules.h>
424 #include <sys/stat.h>
427 foreach decl : ['char16_t',
429 'struct fib_rule_uid_range',
430 'struct fib_rule_port_range',
434 # We get -1 if the size cannot be determined
435 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
437 if decl == 'struct statx'
439 want_linux_stat_h = false
441 have = cc.sizeof(decl,
442 prefix : decl_headers + '#include <linux/stat.h>',
443 args : '-D_GNU_SOURCE') > 0
444 want_linux_stat_h = have
448 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
451 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
453 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
454 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
455 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
456 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
457 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
458 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
459 ['IFLA_BOND_AD_ACTOR_SYSTEM', 'linux/if_link.h'],
460 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
461 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
462 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
463 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
464 # if_tunnel.h is buggy and cannot be included on its own
465 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
466 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
467 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
468 ['IFLA_GRE_ERSPAN_HWID', 'linux/if_tunnel.h', '#include <net/if.h>'],
469 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
470 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
471 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
472 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
473 ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
474 ['NDA_IFINDEX', 'linux/neighbour.h'],
475 ['IFA_FLAGS', 'linux/if_addr.h'],
476 ['FRA_DPORT_RANGE', 'linux/fib_rules.h'],
477 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
478 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
479 ['FOU_ATTR_REMCSUM_NOPARTIAL', 'linux/fou.h'],
480 ['FOU_CMD_GET', 'linux/fou.h'],
481 ['ETHTOOL_LINK_MODE_10baseT_Half_BIT', 'linux/ethtool.h'],
482 ['ETHTOOL_LINK_MODE_25000baseCR_Full_BIT', 'linux/ethtool.h'],
483 ['ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT', 'linux/ethtool.h'],
484 ['ETHTOOL_LINK_MODE_1000baseX_Full_BIT', 'linux/ethtool.h'],
485 ['ETHTOOL_LINK_MODE_2500baseT_Full_BIT', 'linux/ethtool.h'],
486 ['ETHTOOL_LINK_MODE_FEC_NONE_BIT', 'linux/ethtool.h'],
488 prefix = decl.length() > 2 ? decl[2] : ''
489 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
490 conf.set10('HAVE_' + decl[0], have)
493 foreach ident : ['secure_getenv', '__secure_getenv']
494 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
498 ['memfd_create', '''#include <sys/mman.h>'''],
499 ['gettid', '''#include <sys/types.h>
500 #include <unistd.h>'''],
501 ['pivot_root', '''#include <stdlib.h>
502 #include <unistd.h>'''], # no known header declares pivot_root
503 ['name_to_handle_at', '''#include <sys/types.h>
504 #include <sys/stat.h>
505 #include <fcntl.h>'''],
506 ['setns', '''#include <sched.h>'''],
507 ['renameat2', '''#include <stdio.h>
508 #include <fcntl.h>'''],
509 ['kcmp', '''#include <linux/kcmp.h>'''],
510 ['keyctl', '''#include <sys/types.h>
511 #include <keyutils.h>'''],
512 ['copy_file_range', '''#include <sys/syscall.h>
513 #include <unistd.h>'''],
514 ['bpf', '''#include <sys/syscall.h>
515 #include <unistd.h>'''],
516 ['statx', '''#include <sys/types.h>
517 #include <sys/stat.h>
518 #include <unistd.h>'''],
519 ['explicit_bzero' , '''#include <string.h>'''],
520 ['reallocarray', '''#include <malloc.h>'''],
523 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
524 conf.set10('HAVE_' + ident[0].to_upper(), have)
527 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
528 conf.set10('USE_SYS_RANDOM_H', true)
529 conf.set10('HAVE_GETRANDOM', true)
531 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
532 conf.set10('USE_SYS_RANDOM_H', false)
533 conf.set10('HAVE_GETRANDOM', have)
536 #####################################################################
538 sed = find_program('sed')
539 awk = find_program('awk')
540 m4 = find_program('m4')
541 stat = find_program('stat')
542 git = find_program('git', required : false)
543 env = find_program('env')
544 perl = find_program('perl', required : false)
546 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
547 mkdir_p = 'mkdir -p $DESTDIR/@0@'
548 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
549 splash_bmp = files('test/splash.bmp')
551 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
552 # /usr/sbin, /sbin, and fall back to the default from middle column.
553 progs = [['quotaon', '/usr/sbin/quotaon' ],
554 ['quotacheck', '/usr/sbin/quotacheck' ],
555 ['kmod', '/usr/bin/kmod' ],
556 ['kexec', '/usr/sbin/kexec' ],
557 ['sulogin', '/usr/sbin/sulogin' ],
558 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
559 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
560 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
561 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
564 path = get_option(prog[0] + '-path')
566 message('Using @1@ for @0@'.format(prog[0], path))
568 exe = find_program(prog[0],
569 '/usr/sbin/' + prog[0],
572 path = exe.found() ? exe.path() : prog[1]
574 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
575 conf.set_quoted(name, path)
576 substs.set(name, path)
579 conf.set_quoted('TELINIT', get_option('telinit-path'))
581 if run_command('ln', '--relative', '--help').returncode() != 0
582 error('ln does not support --relative (added in coreutils 8.16)')
585 ############################################################
587 gperf = find_program('gperf')
589 gperf_test_format = '''
591 const char * in_word_set(const char *, @0@);
594 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
595 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
596 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
597 if cc.compiles(gperf_test)
598 gperf_len_type = 'size_t'
600 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
601 if cc.compiles(gperf_test)
602 gperf_len_type = 'unsigned'
604 error('unable to determine gperf len type')
607 message('gperf len type is @0@'.format(gperf_len_type))
608 conf.set('GPERF_LEN_TYPE', gperf_len_type,
609 description : 'The type of gperf "len" parameter')
611 ############################################################
613 if not cc.has_header('sys/capability.h')
614 error('POSIX caps headers not found')
616 foreach header : ['crypt.h',
620 'linux/vm_sockets.h',
622 'valgrind/memcheck.h',
623 'valgrind/valgrind.h',
626 conf.set10('HAVE_' + header.underscorify().to_upper(),
627 cc.has_header(header))
630 ############################################################
632 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
633 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
634 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
636 default_hierarchy = get_option('default-hierarchy')
637 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
638 description : 'default cgroup hierarchy as string')
639 if default_hierarchy == 'legacy'
640 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
641 elif default_hierarchy == 'hybrid'
642 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
644 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
647 time_epoch = get_option('time-epoch')
650 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
652 conf.set('TIME_EPOCH', time_epoch)
654 system_uid_max = get_option('system-uid-max')
655 if system_uid_max == -1
656 system_uid_max = run_command(
658 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
659 '/etc/login.defs').stdout().strip()
660 if system_uid_max == ''
663 system_uid_max = system_uid_max.to_int()
666 conf.set('SYSTEM_UID_MAX', system_uid_max)
667 substs.set('systemuidmax', system_uid_max)
669 system_gid_max = get_option('system-gid-max')
670 if system_gid_max == -1
671 system_gid_max = run_command(
673 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
674 '/etc/login.defs').stdout().strip()
675 if system_gid_max == ''
678 system_gid_max = system_gid_max.to_int()
681 conf.set('SYSTEM_GID_MAX', system_gid_max)
682 substs.set('systemgidmax', system_gid_max)
684 dynamic_uid_min = get_option('dynamic-uid-min')
685 dynamic_uid_max = get_option('dynamic-uid-max')
686 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
687 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
688 substs.set('dynamicuidmin', dynamic_uid_min)
689 substs.set('dynamicuidmax', dynamic_uid_max)
691 container_uid_base_min = get_option('container-uid-base-min')
692 container_uid_base_max = get_option('container-uid-base-max')
693 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
694 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
695 substs.set('containeruidbasemin', container_uid_base_min)
696 substs.set('containeruidbasemax', container_uid_base_max)
698 nobody_user = get_option('nobody-user')
699 nobody_group = get_option('nobody-group')
701 if not meson.is_cross_build()
702 getent_result = run_command('getent', 'passwd', '65534')
703 if getent_result.returncode() == 0
704 name = getent_result.stdout().split(':')[0]
705 if name != nobody_user
707 '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) +
708 'Your build will result in an user table setup that is incompatible with the local system.')
711 id_result = run_command('id', '-u', nobody_user)
712 if id_result.returncode() == 0
713 id = id_result.stdout().to_int()
716 '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) +
717 'Your build will result in an user table setup that is incompatible with the local system.')
721 getent_result = run_command('getent', 'group', '65534')
722 if getent_result.returncode() == 0
723 name = getent_result.stdout().split(':')[0]
724 if name != nobody_group
726 '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) +
727 'Your build will result in an group table setup that is incompatible with the local system.')
730 id_result = run_command('id', '-g', nobody_group)
731 if id_result.returncode() == 0
732 id = id_result.stdout().to_int()
735 '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) +
736 'Your build will result in an group table setup that is incompatible with the local system.')
740 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
742 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
743 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
746 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
747 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
748 substs.set('NOBODY_USER_NAME', nobody_user)
749 substs.set('NOBODY_GROUP_NAME', nobody_group)
751 tty_gid = get_option('tty-gid')
752 conf.set('TTY_GID', tty_gid)
753 substs.set('TTY_GID', tty_gid)
755 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
756 users_gid = get_option('users-gid')
757 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
759 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
760 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
762 dev_kvm_mode = get_option('dev-kvm-mode')
763 substs.set('DEV_KVM_MODE', dev_kvm_mode)
764 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
765 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
767 kill_user_processes = get_option('default-kill-user-processes')
768 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
769 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
770 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
772 dns_servers = get_option('dns-servers')
773 conf.set_quoted('DNS_SERVERS', dns_servers)
774 substs.set('DNS_SERVERS', dns_servers)
776 ntp_servers = get_option('ntp-servers')
777 conf.set_quoted('NTP_SERVERS', ntp_servers)
778 substs.set('NTP_SERVERS', ntp_servers)
780 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
782 substs.set('SUSHELL', get_option('debug-shell'))
783 substs.set('DEBUGTTY', get_option('debug-tty'))
785 enable_debug_hashmap = false
786 enable_debug_mmap_cache = false
787 enable_debug_siphash = false
788 enable_debug_udev = false
789 foreach name : get_option('debug-extra')
791 enable_debug_hashmap = true
792 elif name == 'mmap-cache'
793 enable_debug_mmap_cache = true
794 elif name == 'siphash'
795 enable_debug_siphash = true
797 enable_debug_udev = true
799 message('unknown debug option "@0@", ignoring'.format(name))
802 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
803 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
804 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
805 conf.set10('ENABLE_DEBUG_UDEV', enable_debug_udev)
807 conf.set10('VALGRIND', get_option('valgrind'))
808 conf.set10('LOG_TRACE', get_option('log-trace'))
810 #####################################################################
812 threads = dependency('threads')
813 librt = cc.find_library('rt')
814 libm = cc.find_library('m')
815 libdl = cc.find_library('dl')
816 libcrypt = cc.find_library('crypt')
818 libcap = dependency('libcap', required : false)
819 if not libcap.found()
820 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
821 libcap = cc.find_library('cap')
824 libmount = dependency('mount',
825 version : fuzzer_build ? '>= 0' : '>= 2.30')
827 want_seccomp = get_option('seccomp')
828 if want_seccomp != 'false' and not fuzzer_build
829 libseccomp = dependency('libseccomp',
830 version : '>= 2.3.1',
831 required : want_seccomp == 'true')
832 have = libseccomp.found()
837 conf.set10('HAVE_SECCOMP', have)
839 want_selinux = get_option('selinux')
840 if want_selinux != 'false' and not fuzzer_build
841 libselinux = dependency('libselinux',
842 version : '>= 2.1.9',
843 required : want_selinux == 'true')
844 have = libselinux.found()
849 conf.set10('HAVE_SELINUX', have)
851 want_apparmor = get_option('apparmor')
852 if want_apparmor != 'false' and not fuzzer_build
853 libapparmor = dependency('libapparmor',
854 required : want_apparmor == 'true')
855 have = libapparmor.found()
860 conf.set10('HAVE_APPARMOR', have)
862 smack_run_label = get_option('smack-run-label')
863 if smack_run_label != ''
864 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
867 want_polkit = get_option('polkit')
868 install_polkit = false
869 install_polkit_pkla = false
870 if want_polkit != 'false' and not fuzzer_build
871 install_polkit = true
873 libpolkit = dependency('polkit-gobject-1',
875 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
876 message('Old polkit detected, will install pkla files')
877 install_polkit_pkla = true
880 conf.set10('ENABLE_POLKIT', install_polkit)
882 want_acl = get_option('acl')
883 if want_acl != 'false' and not fuzzer_build
884 libacl = cc.find_library('acl', required : want_acl == 'true')
885 have = libacl.found()
890 conf.set10('HAVE_ACL', have)
892 want_audit = get_option('audit')
893 if want_audit != 'false' and not fuzzer_build
894 libaudit = dependency('audit', required : want_audit == 'true')
895 have = libaudit.found()
900 conf.set10('HAVE_AUDIT', have)
902 want_blkid = get_option('blkid')
903 if want_blkid != 'false' and not fuzzer_build
904 libblkid = dependency('blkid', required : want_blkid == 'true')
905 have = libblkid.found()
910 conf.set10('HAVE_BLKID', have)
912 want_kmod = get_option('kmod')
913 if want_kmod != 'false' and not fuzzer_build
914 libkmod = dependency('libkmod',
916 required : want_kmod == 'true')
917 have = libkmod.found()
922 conf.set10('HAVE_KMOD', have)
924 want_pam = get_option('pam')
925 if want_pam != 'false' and not fuzzer_build
926 libpam = cc.find_library('pam', required : want_pam == 'true')
927 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
928 have = libpam.found() and libpam_misc.found()
934 conf.set10('HAVE_PAM', have)
936 want_microhttpd = get_option('microhttpd')
937 if want_microhttpd != 'false' and not fuzzer_build
938 libmicrohttpd = dependency('libmicrohttpd',
939 version : '>= 0.9.33',
940 required : want_microhttpd == 'true')
941 have = libmicrohttpd.found()
946 conf.set10('HAVE_MICROHTTPD', have)
948 want_libcryptsetup = get_option('libcryptsetup')
949 if want_libcryptsetup != 'false' and not fuzzer_build
950 libcryptsetup = dependency('libcryptsetup',
951 version : '>= 1.6.0',
952 required : want_libcryptsetup == 'true')
953 have = libcryptsetup.found()
954 have_sector = cc.has_member(
955 'struct crypt_params_plain',
957 prefix : '#include <libcryptsetup.h>')
963 conf.set10('HAVE_LIBCRYPTSETUP', have)
964 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
966 want_libcurl = get_option('libcurl')
967 if want_libcurl != 'false' and not fuzzer_build
968 libcurl = dependency('libcurl',
969 version : '>= 7.32.0',
970 required : want_libcurl == 'true')
971 have = libcurl.found()
976 conf.set10('HAVE_LIBCURL', have)
978 want_libidn = get_option('libidn')
979 want_libidn2 = get_option('libidn2')
980 if want_libidn == 'true' and want_libidn2 == 'true'
981 error('libidn and libidn2 cannot be requested simultaneously')
984 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
985 libidn = dependency('libidn',
986 required : want_libidn == 'true')
987 have = libidn.found()
992 conf.set10('HAVE_LIBIDN', have)
993 if not have and want_libidn2 != 'false' and not fuzzer_build
994 # libidn is used for both libidn and libidn2 objects
995 libidn = dependency('libidn2',
996 required : want_libidn2 == 'true')
997 have = libidn.found()
1001 conf.set10('HAVE_LIBIDN2', have)
1003 want_libiptc = get_option('libiptc')
1004 if want_libiptc != 'false' and not fuzzer_build
1005 libiptc = dependency('libiptc',
1006 required : want_libiptc == 'true')
1007 have = libiptc.found()
1012 conf.set10('HAVE_LIBIPTC', have)
1014 want_qrencode = get_option('qrencode')
1015 if want_qrencode != 'false' and not fuzzer_build
1016 libqrencode = dependency('libqrencode',
1017 required : want_qrencode == 'true')
1018 have = libqrencode.found()
1023 conf.set10('HAVE_QRENCODE', have)
1025 want_gcrypt = get_option('gcrypt')
1026 if want_gcrypt != 'false' and not fuzzer_build
1027 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1028 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1029 have = libgcrypt.found() and libgpg_error.found()
1034 # link to neither of the libs if one is not found
1038 conf.set10('HAVE_GCRYPT', have)
1040 want_gnutls = get_option('gnutls')
1041 if want_gnutls != 'false' and not fuzzer_build
1042 libgnutls = dependency('gnutls',
1043 version : '>= 3.1.4',
1044 required : want_gnutls == 'true')
1045 have = libgnutls.found()
1050 conf.set10('HAVE_GNUTLS', have)
1052 want_openssl = get_option('openssl')
1053 if want_openssl != 'false' and not fuzzer_build
1054 libopenssl = dependency('openssl',
1055 version : '>= 1.1.0',
1056 required : want_openssl == 'true')
1057 have = libopenssl.found()
1062 conf.set10('HAVE_OPENSSL', have)
1064 want_elfutils = get_option('elfutils')
1065 if want_elfutils != 'false' and not fuzzer_build
1066 libdw = dependency('libdw',
1067 required : want_elfutils == 'true')
1068 have = libdw.found()
1073 conf.set10('HAVE_ELFUTILS', have)
1075 want_zlib = get_option('zlib')
1076 if want_zlib != 'false' and not fuzzer_build
1077 libz = dependency('zlib',
1078 required : want_zlib == 'true')
1084 conf.set10('HAVE_ZLIB', have)
1086 want_bzip2 = get_option('bzip2')
1087 if want_bzip2 != 'false' and not fuzzer_build
1088 libbzip2 = cc.find_library('bz2',
1089 required : want_bzip2 == 'true')
1090 have = libbzip2.found()
1095 conf.set10('HAVE_BZIP2', have)
1097 want_xz = get_option('xz')
1098 if want_xz != 'false' and not fuzzer_build
1099 libxz = dependency('liblzma',
1100 required : want_xz == 'true')
1101 have = libxz.found()
1106 conf.set10('HAVE_XZ', have)
1108 want_lz4 = get_option('lz4')
1109 if want_lz4 != 'false' and not fuzzer_build
1110 liblz4 = dependency('liblz4',
1111 version : '>= 1.3.0',
1112 required : want_lz4 == 'true')
1113 have = liblz4.found()
1118 conf.set10('HAVE_LZ4', have)
1120 want_xkbcommon = get_option('xkbcommon')
1121 if want_xkbcommon != 'false' and not fuzzer_build
1122 libxkbcommon = dependency('xkbcommon',
1123 version : '>= 0.3.0',
1124 required : want_xkbcommon == 'true')
1125 have = libxkbcommon.found()
1130 conf.set10('HAVE_XKBCOMMON', have)
1132 want_pcre2 = get_option('pcre2')
1133 if want_pcre2 != 'false'
1134 libpcre2 = dependency('libpcre2-8',
1135 required : want_pcre2 == 'true')
1136 have = libpcre2.found()
1141 conf.set10('HAVE_PCRE2', have)
1143 want_glib = get_option('glib')
1144 if want_glib != 'false' and not fuzzer_build
1145 libglib = dependency('glib-2.0',
1146 version : '>= 2.22.0',
1147 required : want_glib == 'true')
1148 libgobject = dependency('gobject-2.0',
1149 version : '>= 2.22.0',
1150 required : want_glib == 'true')
1151 libgio = dependency('gio-2.0',
1152 required : want_glib == 'true')
1153 have = libglib.found() and libgobject.found() and libgio.found()
1160 conf.set10('HAVE_GLIB', have)
1162 want_dbus = get_option('dbus')
1163 if want_dbus != 'false' and not fuzzer_build
1164 libdbus = dependency('dbus-1',
1165 version : '>= 1.3.2',
1166 required : want_dbus == 'true')
1167 have = libdbus.found()
1172 conf.set10('HAVE_DBUS', have)
1174 default_dnssec = get_option('default-dnssec')
1176 default_dnssec = 'no'
1178 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1179 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1180 default_dnssec = 'no'
1182 conf.set('DEFAULT_DNSSEC_MODE',
1183 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1184 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1186 dns_over_tls = get_option('dns-over-tls')
1187 if dns_over_tls != 'false'
1188 if dns_over_tls == 'openssl'
1191 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1192 if dns_over_tls == 'gnutls' and not have_gnutls
1193 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1196 if dns_over_tls == 'gnutls' or have_gnutls
1197 have_openssl = false
1199 have_openssl = conf.get('HAVE_OPENSSL') == 1
1200 if dns_over_tls != 'auto' and not have_openssl
1201 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1202 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1205 have = have_gnutls or have_openssl
1209 have_openssl = false
1211 conf.set10('ENABLE_DNS_OVER_TLS', have)
1212 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1213 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1215 default_dns_over_tls = get_option('default-dns-over-tls')
1217 default_dns_over_tls = 'no'
1219 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1220 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1221 default_dns_over_tls = 'no'
1223 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1224 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1225 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1227 want_importd = get_option('importd')
1228 if want_importd != 'false'
1229 have = (conf.get('HAVE_LIBCURL') == 1 and
1230 conf.get('HAVE_ZLIB') == 1 and
1231 conf.get('HAVE_XZ') == 1 and
1232 conf.get('HAVE_GCRYPT') == 1)
1233 if want_importd == 'true' and not have
1234 error('importd support was requested, but dependencies are not available')
1239 conf.set10('ENABLE_IMPORTD', have)
1241 want_remote = get_option('remote')
1242 if want_remote != 'false'
1243 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1244 conf.get('HAVE_LIBCURL') == 1]
1245 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1246 # it's possible to build one without the other. Complain only if
1247 # support was explictly requested. The auxiliary files like sysusers
1248 # config should be installed when any of the programs are built.
1249 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1250 error('remote support was requested, but dependencies are not available')
1252 have = have_deps[0] or have_deps[1]
1256 conf.set10('ENABLE_REMOTE', have)
1258 foreach term : ['utmp',
1290 have = get_option(term)
1291 name = 'ENABLE_' + term.underscorify().to_upper()
1292 conf.set10(name, have)
1295 foreach tuple : [['nss-mymachines', 'machined'],
1296 ['nss-resolve', 'resolve']]
1297 want = get_option(tuple[0])
1299 have = get_option(tuple[1])
1300 if want == 'true' and not have
1301 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1306 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1307 conf.set10(name, have)
1311 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1312 'ENABLE_NSS_MYMACHINES',
1313 'ENABLE_NSS_RESOLVE',
1314 'ENABLE_NSS_SYSTEMD']
1315 if conf.get(term) == 1
1319 conf.set10('ENABLE_NSS', enable_nss)
1321 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1326 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1328 #####################################################################
1330 if get_option('efi')
1331 efi_arch = host_machine.cpu_family()
1333 if efi_arch == 'x86'
1334 EFI_MACHINE_TYPE_NAME = 'ia32'
1335 gnu_efi_arch = 'ia32'
1336 elif efi_arch == 'x86_64'
1337 EFI_MACHINE_TYPE_NAME = 'x64'
1338 gnu_efi_arch = 'x86_64'
1339 elif efi_arch == 'arm'
1340 EFI_MACHINE_TYPE_NAME = 'arm'
1341 gnu_efi_arch = 'arm'
1342 elif efi_arch == 'aarch64'
1343 EFI_MACHINE_TYPE_NAME = 'aa64'
1344 gnu_efi_arch = 'aarch64'
1346 EFI_MACHINE_TYPE_NAME = ''
1351 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1353 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1357 conf.set10('ENABLE_EFI', have)
1359 #####################################################################
1361 config_h = configure_file(
1362 output : 'config.h',
1363 configuration : conf)
1365 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1367 includes = include_directories('src/basic',
1371 'src/journal-remote',
1375 'src/time-wait-sync',
1380 'src/libsystemd/sd-bus',
1381 'src/libsystemd/sd-device',
1382 'src/libsystemd/sd-event',
1383 'src/libsystemd/sd-hwdb',
1384 'src/libsystemd/sd-id128',
1385 'src/libsystemd/sd-netlink',
1386 'src/libsystemd/sd-network',
1387 'src/libsystemd-network',
1390 add_project_arguments('-include', 'config.h', language : 'c')
1392 generate_gperfs = find_program('tools/generate-gperfs.py')
1396 subdir('src/systemd')
1398 subdir('src/libsystemd')
1399 subdir('src/libsystemd-network')
1400 subdir('src/journal')
1403 libjournal_core = static_library(
1405 libjournal_core_sources,
1407 include_directories : includes,
1410 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1411 libsystemd = shared_library(
1414 version : libsystemd_version,
1415 include_directories : includes,
1416 link_args : ['-shared',
1417 '-Wl,--version-script=' + libsystemd_sym_path],
1418 link_with : [libbasic,
1420 link_whole : [libsystemd_static,
1422 dependencies : [threads,
1426 link_depends : libsystemd_sym,
1428 install_dir : rootlibdir)
1430 static_libsystemd = get_option('static-libsystemd')
1431 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1433 install_libsystemd_static = static_library(
1436 journal_client_sources,
1438 basic_gcrypt_sources,
1440 include_directories : includes,
1441 build_by_default : static_libsystemd != 'false',
1442 install : static_libsystemd != 'false',
1443 install_dir : rootlibdir,
1444 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1445 dependencies : [threads,
1454 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1456 ############################################################
1458 # binaries that have --help and are intended for use by humans,
1459 # usually, but not always, installed in /bin.
1460 public_programs = []
1462 subdir('src/libudev')
1463 subdir('src/shared')
1466 subdir('src/network')
1468 subdir('src/analyze')
1469 subdir('src/journal-remote')
1470 subdir('src/coredump')
1471 subdir('src/hostname')
1472 subdir('src/import')
1473 subdir('src/kernel-install')
1474 subdir('src/locale')
1475 subdir('src/machine')
1476 subdir('src/portable')
1477 subdir('src/nspawn')
1478 subdir('src/resolve')
1479 subdir('src/timedate')
1480 subdir('src/timesync')
1481 subdir('src/vconsole')
1482 subdir('src/boot/efi')
1489 ############################################################
1491 # only static linking apart from libdl, to make sure that the
1492 # module is linked to all libraries that it uses.
1493 test_dlopen = executable(
1497 include_directories : includes,
1498 link_with : [libbasic],
1499 dependencies : [libdl],
1500 build_by_default : want_tests != 'false')
1502 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1503 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1504 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1505 ['resolve', 'ENABLE_NSS_RESOLVE']]
1507 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1511 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1512 version_script_arg = join_paths(meson.source_root(), sym)
1514 nss = shared_library(
1516 'src/nss-@0@/nss-@0@.c'.format(module),
1519 include_directories : includes,
1520 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1521 link_args : ['-Wl,-z,nodelete',
1523 '-Wl,--version-script=' + version_script_arg,
1525 link_with : [libsystemd_static,
1527 dependencies : [threads,
1531 install_dir : rootlibdir)
1533 # We cannot use shared_module because it does not support version suffix.
1534 # Unfortunately shared_library insists on creating the symlink…
1535 meson.add_install_script('sh', '-c',
1536 'rm $DESTDIR@0@/libnss_@1@.so'
1537 .format(rootlibdir, module))
1539 if want_tests != 'false'
1540 test('dlopen-nss_' + module,
1542 # path to dlopen must include a slash
1543 args : nss.full_path())
1548 ############################################################
1550 executable('systemd',
1552 include_directories : includes,
1553 link_with : [libcore,
1555 dependencies : [threads,
1561 install_rpath : rootlibexecdir,
1563 install_dir : rootlibexecdir)
1565 meson.add_install_script(meson_make_symlink,
1566 join_paths(rootlibexecdir, 'systemd'),
1567 join_paths(rootsbindir, 'init'))
1569 exe = executable('systemd-analyze',
1570 systemd_analyze_sources,
1571 include_directories : includes,
1572 link_with : [libcore,
1574 dependencies : [threads,
1580 install_rpath : rootlibexecdir,
1582 public_programs += exe
1584 executable('systemd-journald',
1585 systemd_journald_sources,
1586 include_directories : includes,
1587 link_with : [libjournal_core,
1589 dependencies : [threads,
1593 install_rpath : rootlibexecdir,
1595 install_dir : rootlibexecdir)
1597 exe = executable('systemd-cat',
1598 systemd_cat_sources,
1599 include_directories : includes,
1600 link_with : [libjournal_core,
1602 dependencies : [threads],
1603 install_rpath : rootlibexecdir,
1605 public_programs += exe
1607 exe = executable('journalctl',
1609 include_directories : includes,
1610 link_with : [libshared],
1611 dependencies : [threads,
1616 install_rpath : rootlibexecdir,
1618 install_dir : rootbindir)
1619 public_programs += exe
1621 executable('systemd-getty-generator',
1622 'src/getty-generator/getty-generator.c',
1623 include_directories : includes,
1624 link_with : [libshared],
1625 install_rpath : rootlibexecdir,
1627 install_dir : systemgeneratordir)
1629 executable('systemd-debug-generator',
1630 'src/debug-generator/debug-generator.c',
1631 include_directories : includes,
1632 link_with : [libshared],
1633 install_rpath : rootlibexecdir,
1635 install_dir : systemgeneratordir)
1637 executable('systemd-run-generator',
1638 'src/run-generator/run-generator.c',
1639 include_directories : includes,
1640 link_with : [libshared],
1641 install_rpath : rootlibexecdir,
1643 install_dir : systemgeneratordir)
1645 executable('systemd-fstab-generator',
1646 'src/fstab-generator/fstab-generator.c',
1647 'src/core/mount-setup.c',
1648 include_directories : includes,
1649 link_with : [libshared],
1650 install_rpath : rootlibexecdir,
1652 install_dir : systemgeneratordir)
1654 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1655 executable('30-systemd-environment-d-generator',
1656 'src/environment-d-generator/environment-d-generator.c',
1657 include_directories : includes,
1658 link_with : [libshared],
1659 install_rpath : rootlibexecdir,
1661 install_dir : userenvgeneratordir)
1663 meson.add_install_script(meson_make_symlink,
1664 join_paths(sysconfdir, 'environment'),
1665 join_paths(environmentdir, '99-environment.conf'))
1668 if conf.get('ENABLE_HIBERNATE') == 1
1669 executable('systemd-hibernate-resume-generator',
1670 'src/hibernate-resume/hibernate-resume-generator.c',
1671 include_directories : includes,
1672 link_with : [libshared],
1673 install_rpath : rootlibexecdir,
1675 install_dir : systemgeneratordir)
1677 executable('systemd-hibernate-resume',
1678 'src/hibernate-resume/hibernate-resume.c',
1679 include_directories : includes,
1680 link_with : [libshared],
1681 install_rpath : rootlibexecdir,
1683 install_dir : rootlibexecdir)
1686 if conf.get('HAVE_BLKID') == 1
1687 executable('systemd-gpt-auto-generator',
1688 'src/gpt-auto-generator/gpt-auto-generator.c',
1689 'src/shared/blkid-util.h',
1690 include_directories : includes,
1691 link_with : [libshared],
1692 dependencies : libblkid,
1693 install_rpath : rootlibexecdir,
1695 install_dir : systemgeneratordir)
1697 exe = executable('systemd-dissect',
1698 'src/dissect/dissect.c',
1699 include_directories : includes,
1700 link_with : [libshared],
1701 install_rpath : rootlibexecdir,
1703 install_dir : rootlibexecdir)
1704 public_programs += exe
1707 if conf.get('ENABLE_RESOLVE') == 1
1708 executable('systemd-resolved',
1709 systemd_resolved_sources,
1710 include_directories : includes,
1711 link_with : [libshared,
1713 libsystemd_resolve_core],
1714 dependencies : systemd_resolved_dependencies,
1715 install_rpath : rootlibexecdir,
1717 install_dir : rootlibexecdir)
1719 exe = executable('resolvectl',
1721 include_directories : includes,
1722 link_with : [libshared,
1724 libsystemd_resolve_core],
1725 dependencies : [threads,
1729 install_rpath : rootlibexecdir,
1731 public_programs += exe
1733 meson.add_install_script(meson_make_symlink,
1734 join_paths(bindir, 'resolvectl'),
1735 join_paths(rootsbindir, 'resolvconf'))
1737 meson.add_install_script(meson_make_symlink,
1738 join_paths(bindir, 'resolvectl'),
1739 join_paths(bindir, 'systemd-resolve'))
1742 if conf.get('ENABLE_LOGIND') == 1
1743 executable('systemd-logind',
1744 systemd_logind_sources,
1745 include_directories : includes,
1746 link_with : [liblogind_core,
1748 dependencies : [threads,
1750 install_rpath : rootlibexecdir,
1752 install_dir : rootlibexecdir)
1754 exe = executable('loginctl',
1756 include_directories : includes,
1757 link_with : [libshared],
1758 dependencies : [threads,
1761 install_rpath : rootlibexecdir,
1763 install_dir : rootbindir)
1764 public_programs += exe
1766 exe = executable('systemd-inhibit',
1767 'src/login/inhibit.c',
1768 include_directories : includes,
1769 link_with : [libshared],
1770 install_rpath : rootlibexecdir,
1772 install_dir : rootbindir)
1773 public_programs += exe
1775 if conf.get('HAVE_PAM') == 1
1776 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
1777 pam_systemd = shared_library(
1781 include_directories : includes,
1782 link_args : ['-shared',
1783 '-Wl,--version-script=' + version_script_arg],
1784 link_with : [libsystemd_static,
1786 dependencies : [threads,
1789 link_depends : pam_systemd_sym,
1791 install_dir : pamlibdir)
1793 if want_tests != 'false'
1794 test('dlopen-pam_systemd',
1796 # path to dlopen must include a slash
1797 args : pam_systemd.full_path())
1801 executable('systemd-user-runtime-dir',
1802 user_runtime_dir_sources,
1803 include_directories : includes,
1804 link_with : [libshared],
1805 install_rpath : rootlibexecdir,
1807 install_dir : rootlibexecdir)
1810 if conf.get('HAVE_PAM') == 1
1811 executable('systemd-user-sessions',
1812 'src/user-sessions/user-sessions.c',
1813 include_directories : includes,
1814 link_with : [libshared],
1815 install_rpath : rootlibexecdir,
1817 install_dir : rootlibexecdir)
1820 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1821 exe = executable('bootctl',
1822 'src/boot/bootctl.c',
1823 include_directories : includes,
1824 link_with : [libshared],
1825 dependencies : [libblkid],
1826 install_rpath : rootlibexecdir,
1828 public_programs += exe
1830 executable('systemd-bless-boot',
1831 'src/boot/bless-boot.c',
1832 include_directories : includes,
1833 link_with : [libshared],
1834 dependencies : [libblkid],
1835 install_rpath : rootlibexecdir,
1837 install_dir : rootlibexecdir)
1839 executable('systemd-bless-boot-generator',
1840 'src/boot/bless-boot-generator.c',
1841 include_directories : includes,
1842 link_with : [libshared],
1843 install_rpath : rootlibexecdir,
1845 install_dir : systemgeneratordir)
1848 executable('systemd-boot-check-no-failures',
1849 'src/boot/boot-check-no-failures.c',
1850 include_directories : includes,
1851 link_with : [libshared],
1852 dependencies : [libblkid],
1853 install_rpath : rootlibexecdir,
1855 install_dir : rootlibexecdir)
1857 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1858 include_directories : includes,
1859 link_with : [libshared],
1860 dependencies : [threads],
1861 install_rpath : rootlibexecdir,
1863 public_programs += exe
1866 if get_option('link-systemctl-shared')
1867 systemctl_link_with = [libshared]
1869 systemctl_link_with = [libsystemd_static,
1875 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1876 include_directories : includes,
1877 link_with : systemctl_link_with,
1878 dependencies : [threads,
1883 install_rpath : rootlibexecdir,
1885 install_dir : rootbindir)
1886 public_programs += exe
1888 if conf.get('ENABLE_PORTABLED') == 1
1889 executable('systemd-portabled',
1890 systemd_portabled_sources,
1891 include_directories : includes,
1892 link_with : [libshared],
1893 dependencies : [threads],
1894 install_rpath : rootlibexecdir,
1896 install_dir : rootlibexecdir)
1898 exe = executable('portablectl', 'src/portable/portablectl.c',
1899 include_directories : includes,
1900 link_with : [libshared],
1901 dependencies : [threads],
1902 install_rpath : rootlibexecdir,
1904 install_dir : rootbindir)
1905 public_programs += exe
1908 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1909 meson.add_install_script(meson_make_symlink,
1910 join_paths(rootbindir, 'systemctl'),
1911 join_paths(rootsbindir, alias))
1914 if conf.get('ENABLE_BACKLIGHT') == 1
1915 executable('systemd-backlight',
1916 'src/backlight/backlight.c',
1917 include_directories : includes,
1918 link_with : [libshared],
1919 install_rpath : rootlibexecdir,
1921 install_dir : rootlibexecdir)
1924 if conf.get('ENABLE_RFKILL') == 1
1925 executable('systemd-rfkill',
1926 'src/rfkill/rfkill.c',
1927 include_directories : includes,
1928 link_with : [libshared],
1929 install_rpath : rootlibexecdir,
1931 install_dir : rootlibexecdir)
1934 executable('systemd-system-update-generator',
1935 'src/system-update-generator/system-update-generator.c',
1936 include_directories : includes,
1937 link_with : [libshared],
1938 install_rpath : rootlibexecdir,
1940 install_dir : systemgeneratordir)
1942 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1943 executable('systemd-cryptsetup',
1944 'src/cryptsetup/cryptsetup.c',
1945 include_directories : includes,
1946 link_with : [libshared],
1947 dependencies : [libcryptsetup],
1948 install_rpath : rootlibexecdir,
1950 install_dir : rootlibexecdir)
1952 executable('systemd-cryptsetup-generator',
1953 'src/cryptsetup/cryptsetup-generator.c',
1954 include_directories : includes,
1955 link_with : [libshared],
1956 dependencies : [libcryptsetup],
1957 install_rpath : rootlibexecdir,
1959 install_dir : systemgeneratordir)
1961 executable('systemd-veritysetup',
1962 'src/veritysetup/veritysetup.c',
1963 include_directories : includes,
1964 link_with : [libshared],
1965 dependencies : [libcryptsetup],
1966 install_rpath : rootlibexecdir,
1968 install_dir : rootlibexecdir)
1970 executable('systemd-veritysetup-generator',
1971 'src/veritysetup/veritysetup-generator.c',
1972 include_directories : includes,
1973 link_with : [libshared],
1974 dependencies : [libcryptsetup],
1975 install_rpath : rootlibexecdir,
1977 install_dir : systemgeneratordir)
1980 if conf.get('HAVE_SYSV_COMPAT') == 1
1981 executable('systemd-sysv-generator',
1982 'src/sysv-generator/sysv-generator.c',
1983 include_directories : includes,
1984 link_with : [libshared],
1985 install_rpath : rootlibexecdir,
1987 install_dir : systemgeneratordir)
1989 executable('systemd-rc-local-generator',
1990 'src/rc-local-generator/rc-local-generator.c',
1991 include_directories : includes,
1992 link_with : [libshared],
1993 install_rpath : rootlibexecdir,
1995 install_dir : systemgeneratordir)
1998 if conf.get('ENABLE_HOSTNAMED') == 1
1999 executable('systemd-hostnamed',
2000 'src/hostname/hostnamed.c',
2001 include_directories : includes,
2002 link_with : [libshared],
2003 install_rpath : rootlibexecdir,
2005 install_dir : rootlibexecdir)
2007 exe = executable('hostnamectl',
2008 'src/hostname/hostnamectl.c',
2009 include_directories : includes,
2010 link_with : [libshared],
2011 install_rpath : rootlibexecdir,
2013 public_programs += exe
2016 if conf.get('ENABLE_LOCALED') == 1
2017 if conf.get('HAVE_XKBCOMMON') == 1
2018 # logind will load libxkbcommon.so dynamically on its own
2024 executable('systemd-localed',
2025 systemd_localed_sources,
2026 include_directories : includes,
2027 link_with : [libshared],
2028 dependencies : deps,
2029 install_rpath : rootlibexecdir,
2031 install_dir : rootlibexecdir)
2033 exe = executable('localectl',
2035 include_directories : includes,
2036 link_with : [libshared],
2037 install_rpath : rootlibexecdir,
2039 public_programs += exe
2042 if conf.get('ENABLE_TIMEDATED') == 1
2043 executable('systemd-timedated',
2044 'src/timedate/timedated.c',
2045 include_directories : includes,
2046 link_with : [libshared],
2047 install_rpath : rootlibexecdir,
2049 install_dir : rootlibexecdir)
2052 if conf.get('ENABLE_TIMEDATECTL') == 1
2053 exe = executable('timedatectl',
2054 'src/timedate/timedatectl.c',
2055 include_directories : includes,
2056 install_rpath : rootlibexecdir,
2057 link_with : [libshared],
2058 dependencies : [libm],
2060 public_programs += exe
2063 if conf.get('ENABLE_TIMESYNCD') == 1
2064 executable('systemd-timesyncd',
2065 systemd_timesyncd_sources,
2066 include_directories : includes,
2067 link_with : [libshared],
2068 dependencies : [threads,
2070 install_rpath : rootlibexecdir,
2072 install_dir : rootlibexecdir)
2074 executable('systemd-time-wait-sync',
2075 'src/time-wait-sync/time-wait-sync.c',
2076 include_directories : includes,
2077 link_with : [libshared],
2078 install_rpath : rootlibexecdir,
2080 install_dir : rootlibexecdir)
2083 if conf.get('ENABLE_MACHINED') == 1
2084 executable('systemd-machined',
2085 systemd_machined_sources,
2086 include_directories : includes,
2087 link_with : [libmachine_core,
2089 install_rpath : rootlibexecdir,
2091 install_dir : rootlibexecdir)
2093 exe = executable('machinectl',
2094 'src/machine/machinectl.c',
2095 include_directories : includes,
2096 link_with : [libshared],
2097 dependencies : [threads,
2100 install_rpath : rootlibexecdir,
2102 install_dir : rootbindir)
2103 public_programs += exe
2106 if conf.get('ENABLE_IMPORTD') == 1
2107 executable('systemd-importd',
2108 systemd_importd_sources,
2109 include_directories : includes,
2110 link_with : [libshared],
2111 dependencies : [threads],
2112 install_rpath : rootlibexecdir,
2114 install_dir : rootlibexecdir)
2116 systemd_pull = executable('systemd-pull',
2117 systemd_pull_sources,
2118 include_directories : includes,
2119 link_with : [libshared],
2120 dependencies : [libcurl,
2125 install_rpath : rootlibexecdir,
2127 install_dir : rootlibexecdir)
2129 systemd_import = executable('systemd-import',
2130 systemd_import_sources,
2131 include_directories : includes,
2132 link_with : [libshared],
2133 dependencies : [libcurl,
2137 install_rpath : rootlibexecdir,
2139 install_dir : rootlibexecdir)
2141 systemd_import_fs = executable('systemd-import-fs',
2142 systemd_import_fs_sources,
2143 include_directories : includes,
2144 link_with : [libshared],
2145 install_rpath : rootlibexecdir,
2147 install_dir : rootlibexecdir)
2149 systemd_export = executable('systemd-export',
2150 systemd_export_sources,
2151 include_directories : includes,
2152 link_with : [libshared],
2153 dependencies : [libcurl,
2157 install_rpath : rootlibexecdir,
2159 install_dir : rootlibexecdir)
2161 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2164 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2165 exe = executable('systemd-journal-upload',
2166 systemd_journal_upload_sources,
2167 include_directories : includes,
2168 link_with : [libshared],
2169 dependencies : [threads,
2174 install_rpath : rootlibexecdir,
2176 install_dir : rootlibexecdir)
2177 public_programs += exe
2180 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2181 s_j_remote = executable('systemd-journal-remote',
2182 systemd_journal_remote_sources,
2183 include_directories : includes,
2184 link_with : [libshared,
2185 libsystemd_journal_remote],
2186 dependencies : [threads,
2191 install_rpath : rootlibexecdir,
2193 install_dir : rootlibexecdir)
2195 s_j_gatewayd = executable('systemd-journal-gatewayd',
2196 systemd_journal_gatewayd_sources,
2197 include_directories : includes,
2198 link_with : [libshared],
2199 dependencies : [threads,
2204 install_rpath : rootlibexecdir,
2206 install_dir : rootlibexecdir)
2207 public_programs += [s_j_remote, s_j_gatewayd]
2210 if conf.get('ENABLE_COREDUMP') == 1
2211 executable('systemd-coredump',
2212 systemd_coredump_sources,
2213 include_directories : includes,
2214 link_with : [libshared],
2215 dependencies : [threads,
2220 install_rpath : rootlibexecdir,
2222 install_dir : rootlibexecdir)
2224 exe = executable('coredumpctl',
2225 coredumpctl_sources,
2226 include_directories : includes,
2227 link_with : [libshared],
2228 dependencies : [threads,
2231 install_rpath : rootlibexecdir,
2233 public_programs += exe
2236 if conf.get('ENABLE_BINFMT') == 1
2237 exe = executable('systemd-binfmt',
2238 'src/binfmt/binfmt.c',
2239 include_directories : includes,
2240 link_with : [libshared],
2241 install_rpath : rootlibexecdir,
2243 install_dir : rootlibexecdir)
2244 public_programs += exe
2246 meson.add_install_script('sh', '-c',
2247 mkdir_p.format(binfmtdir))
2248 meson.add_install_script('sh', '-c',
2249 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2252 if conf.get('ENABLE_VCONSOLE') == 1
2253 executable('systemd-vconsole-setup',
2254 'src/vconsole/vconsole-setup.c',
2255 include_directories : includes,
2256 link_with : [libshared],
2257 install_rpath : rootlibexecdir,
2259 install_dir : rootlibexecdir)
2262 if conf.get('ENABLE_RANDOMSEED') == 1
2263 executable('systemd-random-seed',
2264 'src/random-seed/random-seed.c',
2265 include_directories : includes,
2266 link_with : [libshared],
2267 install_rpath : rootlibexecdir,
2269 install_dir : rootlibexecdir)
2272 if conf.get('ENABLE_FIRSTBOOT') == 1
2273 executable('systemd-firstboot',
2274 'src/firstboot/firstboot.c',
2275 include_directories : includes,
2276 link_with : [libshared],
2277 dependencies : [libcrypt],
2278 install_rpath : rootlibexecdir,
2280 install_dir : rootbindir)
2283 executable('systemd-remount-fs',
2284 'src/remount-fs/remount-fs.c',
2285 'src/core/mount-setup.c',
2286 'src/core/mount-setup.h',
2287 include_directories : includes,
2288 link_with : [libshared],
2289 install_rpath : rootlibexecdir,
2291 install_dir : rootlibexecdir)
2293 executable('systemd-machine-id-setup',
2294 'src/machine-id-setup/machine-id-setup-main.c',
2295 'src/core/machine-id-setup.c',
2296 'src/core/machine-id-setup.h',
2297 include_directories : includes,
2298 link_with : [libshared],
2299 install_rpath : rootlibexecdir,
2301 install_dir : rootbindir)
2303 executable('systemd-fsck',
2305 include_directories : includes,
2306 link_with : [libshared],
2307 install_rpath : rootlibexecdir,
2309 install_dir : rootlibexecdir)
2311 executable('systemd-growfs',
2312 'src/partition/growfs.c',
2313 include_directories : includes,
2314 link_with : [libshared],
2315 dependencies : [libcryptsetup],
2316 install_rpath : rootlibexecdir,
2318 install_dir : rootlibexecdir)
2320 executable('systemd-makefs',
2321 'src/partition/makefs.c',
2322 include_directories : includes,
2323 link_with : [libshared],
2324 install_rpath : rootlibexecdir,
2326 install_dir : rootlibexecdir)
2328 executable('systemd-sleep',
2329 'src/sleep/sleep.c',
2330 include_directories : includes,
2331 link_with : [libshared],
2332 install_rpath : rootlibexecdir,
2334 install_dir : rootlibexecdir)
2336 exe = executable('systemd-sysctl',
2337 'src/sysctl/sysctl.c',
2338 include_directories : includes,
2339 link_with : [libshared],
2340 install_rpath : rootlibexecdir,
2342 install_dir : rootlibexecdir)
2343 public_programs += exe
2345 executable('systemd-ac-power',
2346 'src/ac-power/ac-power.c',
2347 include_directories : includes,
2348 link_with : [libshared],
2349 install_rpath : rootlibexecdir,
2351 install_dir : rootlibexecdir)
2353 exe = executable('systemd-detect-virt',
2354 'src/detect-virt/detect-virt.c',
2355 include_directories : includes,
2356 link_with : [libshared],
2357 install_rpath : rootlibexecdir,
2359 public_programs += exe
2361 exe = executable('systemd-delta',
2362 'src/delta/delta.c',
2363 include_directories : includes,
2364 link_with : [libshared],
2365 install_rpath : rootlibexecdir,
2367 public_programs += exe
2369 exe = executable('systemd-escape',
2370 'src/escape/escape.c',
2371 include_directories : includes,
2372 link_with : [libshared],
2373 install_rpath : rootlibexecdir,
2375 install_dir : rootbindir)
2376 public_programs += exe
2378 exe = executable('systemd-notify',
2379 'src/notify/notify.c',
2380 include_directories : includes,
2381 link_with : [libshared],
2382 install_rpath : rootlibexecdir,
2384 install_dir : rootbindir)
2385 public_programs += exe
2387 executable('systemd-volatile-root',
2388 'src/volatile-root/volatile-root.c',
2389 include_directories : includes,
2390 link_with : [libshared],
2391 install_rpath : rootlibexecdir,
2393 install_dir : rootlibexecdir)
2395 executable('systemd-cgroups-agent',
2396 'src/cgroups-agent/cgroups-agent.c',
2397 include_directories : includes,
2398 link_with : [libshared],
2399 install_rpath : rootlibexecdir,
2401 install_dir : rootlibexecdir)
2403 exe = executable('systemd-id128',
2404 'src/id128/id128.c',
2405 include_directories : includes,
2406 link_with : [libshared],
2407 install_rpath : rootlibexecdir,
2409 public_programs += exe
2411 exe = executable('systemd-path',
2413 include_directories : includes,
2414 link_with : [libshared],
2415 install_rpath : rootlibexecdir,
2417 public_programs += exe
2419 exe = executable('systemd-ask-password',
2420 'src/ask-password/ask-password.c',
2421 include_directories : includes,
2422 link_with : [libshared],
2423 install_rpath : rootlibexecdir,
2425 install_dir : rootbindir)
2426 public_programs += exe
2428 executable('systemd-reply-password',
2429 'src/reply-password/reply-password.c',
2430 include_directories : includes,
2431 link_with : [libshared],
2432 install_rpath : rootlibexecdir,
2434 install_dir : rootlibexecdir)
2436 exe = executable('systemd-tty-ask-password-agent',
2437 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2438 include_directories : includes,
2439 link_with : [libshared],
2440 install_rpath : rootlibexecdir,
2442 install_dir : rootbindir)
2443 public_programs += exe
2445 exe = executable('systemd-cgls',
2447 include_directories : includes,
2448 link_with : [libshared],
2449 install_rpath : rootlibexecdir,
2451 public_programs += exe
2453 exe = executable('systemd-cgtop',
2454 'src/cgtop/cgtop.c',
2455 include_directories : includes,
2456 link_with : [libshared],
2457 install_rpath : rootlibexecdir,
2459 public_programs += exe
2461 executable('systemd-initctl',
2462 'src/initctl/initctl.c',
2463 include_directories : includes,
2464 link_with : [libshared],
2465 install_rpath : rootlibexecdir,
2467 install_dir : rootlibexecdir)
2469 exe = executable('systemd-mount',
2470 'src/mount/mount-tool.c',
2471 include_directories : includes,
2472 link_with : [libshared],
2473 install_rpath : rootlibexecdir,
2475 public_programs += exe
2477 meson.add_install_script(meson_make_symlink,
2478 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2480 exe = executable('systemd-run',
2482 include_directories : includes,
2483 link_with : [libshared],
2484 install_rpath : rootlibexecdir,
2486 public_programs += exe
2488 exe = executable('systemd-stdio-bridge',
2489 'src/stdio-bridge/stdio-bridge.c',
2490 include_directories : includes,
2491 link_with : [libshared],
2492 install_rpath : rootlibexecdir,
2494 public_programs += exe
2496 exe = executable('busctl',
2497 'src/busctl/busctl.c',
2498 'src/busctl/busctl-introspect.c',
2499 'src/busctl/busctl-introspect.h',
2500 include_directories : includes,
2501 link_with : [libshared],
2502 install_rpath : rootlibexecdir,
2504 public_programs += exe
2506 if conf.get('ENABLE_SYSUSERS') == 1
2507 exe = executable('systemd-sysusers',
2508 'src/sysusers/sysusers.c',
2509 include_directories : includes,
2510 link_with : [libshared],
2511 install_rpath : rootlibexecdir,
2513 install_dir : rootbindir)
2514 public_programs += exe
2517 if conf.get('ENABLE_TMPFILES') == 1
2518 exe = executable('systemd-tmpfiles',
2519 'src/tmpfiles/tmpfiles.c',
2520 include_directories : includes,
2521 link_with : [libshared],
2522 dependencies : [libacl],
2523 install_rpath : rootlibexecdir,
2525 install_dir : rootbindir)
2526 public_programs += exe
2528 if want_tests != 'false'
2529 test('test-systemd-tmpfiles',
2530 test_systemd_tmpfiles_py,
2531 # https://github.com/mesonbuild/meson/issues/2681
2532 args : exe.full_path())
2536 if conf.get('ENABLE_HWDB') == 1
2537 exe = executable('systemd-hwdb',
2539 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2540 include_directories : includes,
2541 link_with : [libudev_static],
2542 install_rpath : udev_rpath,
2544 install_dir : rootbindir)
2545 public_programs += exe
2548 if conf.get('ENABLE_QUOTACHECK') == 1
2549 executable('systemd-quotacheck',
2550 'src/quotacheck/quotacheck.c',
2551 include_directories : includes,
2552 link_with : [libshared],
2553 install_rpath : rootlibexecdir,
2555 install_dir : rootlibexecdir)
2558 exe = executable('systemd-socket-proxyd',
2559 'src/socket-proxy/socket-proxyd.c',
2560 include_directories : includes,
2561 link_with : [libshared],
2562 dependencies : [threads],
2563 install_rpath : rootlibexecdir,
2565 install_dir : rootlibexecdir)
2566 public_programs += exe
2568 exe = executable('systemd-udevd',
2569 systemd_udevd_sources,
2570 include_directories : includes,
2571 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2572 link_with : [libudev_core,
2575 dependencies : [threads,
2580 install_rpath : udev_rpath,
2582 install_dir : rootlibexecdir)
2583 public_programs += exe
2585 exe = executable('udevadm',
2587 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2588 include_directories : includes,
2589 link_with : [libudev_core,
2592 dependencies : [threads,
2597 install_rpath : udev_rpath,
2599 install_dir : rootbindir)
2600 public_programs += exe
2602 executable('systemd-shutdown',
2603 systemd_shutdown_sources,
2604 include_directories : includes,
2605 link_with : [libshared],
2606 dependencies : [libmount],
2607 install_rpath : rootlibexecdir,
2609 install_dir : rootlibexecdir)
2611 executable('systemd-update-done',
2612 'src/update-done/update-done.c',
2613 include_directories : includes,
2614 link_with : [libshared],
2615 install_rpath : rootlibexecdir,
2617 install_dir : rootlibexecdir)
2619 executable('systemd-update-utmp',
2620 'src/update-utmp/update-utmp.c',
2621 include_directories : includes,
2622 link_with : [libshared],
2623 dependencies : [libaudit],
2624 install_rpath : rootlibexecdir,
2626 install_dir : rootlibexecdir)
2628 if conf.get('HAVE_KMOD') == 1
2629 executable('systemd-modules-load',
2630 'src/modules-load/modules-load.c',
2631 include_directories : includes,
2632 link_with : [libshared],
2633 dependencies : [libkmod],
2634 install_rpath : rootlibexecdir,
2636 install_dir : rootlibexecdir)
2638 meson.add_install_script('sh', '-c',
2639 mkdir_p.format(modulesloaddir))
2640 meson.add_install_script('sh', '-c',
2641 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2644 exe = executable('systemd-nspawn',
2645 systemd_nspawn_sources,
2646 'src/core/mount-setup.c', # FIXME: use a variable?
2647 'src/core/mount-setup.h',
2648 'src/core/loopback-setup.c',
2649 'src/core/loopback-setup.h',
2650 include_directories : includes,
2651 link_with : [libnspawn_core,
2653 dependencies : [libblkid],
2654 install_rpath : rootlibexecdir,
2656 public_programs += exe
2658 if conf.get('ENABLE_NETWORKD') == 1
2659 executable('systemd-networkd',
2660 systemd_networkd_sources,
2661 include_directories : includes,
2662 link_with : [libnetworkd_core,
2666 dependencies : [threads],
2667 install_rpath : rootlibexecdir,
2669 install_dir : rootlibexecdir)
2671 executable('systemd-networkd-wait-online',
2672 systemd_networkd_wait_online_sources,
2673 include_directories : includes,
2674 link_with : [libnetworkd_core,
2676 install_rpath : rootlibexecdir,
2678 install_dir : rootlibexecdir)
2680 exe = executable('networkctl',
2682 include_directories : includes,
2683 link_with : [libsystemd_network,
2685 install_rpath : rootlibexecdir,
2687 install_dir : rootbindir)
2688 public_programs += exe
2691 executable('systemd-sulogin-shell',
2692 ['src/sulogin-shell/sulogin-shell.c'],
2693 include_directories : includes,
2694 link_with : [libshared],
2695 install_rpath : rootlibexecdir,
2697 install_dir : rootlibexecdir)
2699 ############################################################
2702 'systemd-runtest.env',
2703 output : 'systemd-runtest.env',
2704 command : ['sh', '-c', '{ ' +
2705 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2706 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2708 build_by_default : true)
2710 foreach tuple : tests
2712 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2713 dependencies = tuple[2]
2714 condition = tuple.length() >= 4 ? tuple[3] : ''
2715 type = tuple.length() >= 5 ? tuple[4] : ''
2716 defs = tuple.length() >= 6 ? tuple[5] : []
2717 incs = tuple.length() >= 7 ? tuple[6] : includes
2720 name = sources[0].split('/')[-1].split('.')[0]
2721 if type.startswith('timeout=')
2722 timeout = type.split('=')[1].to_int()
2726 if condition == '' or conf.get(condition) == 1
2730 include_directories : incs,
2731 link_with : link_with,
2732 dependencies : dependencies,
2734 build_by_default : want_tests != 'false',
2735 install_rpath : rootlibexecdir,
2736 install : install_tests,
2737 install_dir : join_paths(testsdir, type))
2740 message('@0@ is a manual test'.format(name))
2741 elif type == 'unsafe' and want_tests != 'unsafe'
2742 message('@0@ is an unsafe test'.format(name))
2743 elif want_tests != 'false'
2749 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2754 'test-libsystemd-sym',
2755 test_libsystemd_sym_c,
2756 include_directories : includes,
2757 link_with : [libsystemd],
2758 build_by_default : want_tests != 'false',
2759 install : install_tests,
2760 install_dir : testsdir)
2761 if want_tests != 'false'
2762 test('test-libsystemd-sym', exe)
2766 'test-libsystemd-static-sym',
2767 test_libsystemd_sym_c,
2768 include_directories : includes,
2769 link_with : [install_libsystemd_static],
2770 dependencies : [threads], # threads is already included in dependencies on the library,
2771 # but does not seem to get propagated. Add here as a work-around.
2772 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2773 install : install_tests and static_libsystemd_pic,
2774 install_dir : testsdir)
2775 if want_tests != 'false' and static_libsystemd_pic
2776 test('test-libsystemd-static-sym', exe)
2782 include_directories : includes,
2783 c_args : '-Wno-deprecated-declarations',
2784 link_with : [libudev],
2785 build_by_default : want_tests != 'false',
2786 install : install_tests,
2787 install_dir : testsdir)
2788 if want_tests != 'false'
2789 test('test-libudev-sym', exe)
2793 'test-libudev-static-sym',
2795 include_directories : includes,
2796 c_args : '-Wno-deprecated-declarations',
2797 link_with : [install_libudev_static],
2798 build_by_default : want_tests != 'false' and static_libudev_pic,
2799 install : install_tests and static_libudev_pic,
2800 install_dir : testsdir)
2801 if want_tests != 'false' and static_libudev_pic
2802 test('test-libudev-static-sym', exe)
2805 ############################################################
2809 if get_option('tests') != 'false'
2810 foreach tuple : fuzzers
2812 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2813 dependencies = tuple[2]
2814 defs = tuple.length() >= 4 ? tuple[3] : []
2815 incs = tuple.length() >= 5 ? tuple[4] : includes
2818 dependencies += fuzzing_engine
2820 sources += 'src/fuzz/fuzz-main.c'
2823 name = sources[0].split('/')[-1].split('.')[0]
2825 fuzzer_exes += executable(
2828 include_directories : [incs, include_directories('src/fuzz')],
2829 link_with : link_with,
2830 dependencies : dependencies,
2836 run_target('fuzzers',
2837 depends : fuzzer_exes,
2840 ############################################################
2842 make_directive_index_py = find_program('tools/make-directive-index.py')
2843 make_man_index_py = find_program('tools/make-man-index.py')
2844 xml_helper_py = find_program('tools/xml_helper.py')
2845 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2849 subdir('sysusers.d')
2850 subdir('tmpfiles.d')
2855 subdir('shell-completion/bash')
2856 subdir('shell-completion/zsh')
2857 subdir('docs/sysvinit')
2858 subdir('docs/var-log')
2860 install_subdir('factory/etc',
2861 install_dir : factorydir)
2863 install_data('xorg/50-systemd-user.sh',
2864 install_dir : xinitrcdir)
2865 install_data('modprobe.d/systemd.conf',
2866 install_dir : modprobedir)
2867 install_data('LICENSE.GPL2',
2871 'docs/CODING_STYLE.md',
2872 'docs/DISTRO_PORTING.md',
2873 'docs/ENVIRONMENT.md',
2875 'docs/TRANSIENT-SETTINGS.md',
2876 'docs/TRANSLATORS.md',
2877 'docs/UIDS-GIDS.md',
2878 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2879 install_dir : docdir)
2881 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2882 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2884 ############################################################
2886 meson_check_help = find_program('tools/meson-check-help.sh')
2888 foreach exec : public_programs
2889 name = exec.full_path().split('/')[-1]
2890 if want_tests != 'false'
2891 test('check-help-' + name,
2893 args : exec.full_path())
2897 ############################################################
2899 # Enable tests for all supported sanitizers
2900 foreach tuple : sanitizers
2901 sanitizer = tuple[0]
2904 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2906 foreach p : fuzz_regression_tests
2907 b = p.split('/')[-2]
2908 c = p.split('/')[-1]
2910 name = '@0@:@1@'.format(b, sanitizer)
2913 if want_tests == 'false'
2914 message('Not compiling @0@ because tests is set to false'.format(name))
2916 exe = custom_target(
2920 command : [env, 'ln', '-fs',
2921 join_paths(build.full_path(), b),
2923 build_by_default : true)
2925 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2930 if want_tests != 'false' and slow_tests
2931 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2933 args : [exe.full_path(),
2934 join_paths(meson.source_root(), p)])
2941 ############################################################
2944 all_files = run_command(
2946 ['--git-dir=@0@/.git'.format(meson.source_root()),
2949 all_files = files(all_files.stdout().split())
2954 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
2957 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
2961 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2964 command : [meson_git_contrib_sh])
2968 git_head = run_command(
2970 ['--git-dir=@0@/.git'.format(meson.source_root()),
2971 'rev-parse', 'HEAD']).stdout().strip()
2972 git_head_short = run_command(
2974 ['--git-dir=@0@/.git'.format(meson.source_root()),
2975 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2979 command : ['git', 'archive',
2980 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
2982 '--prefix', 'systemd-@0@/'.format(git_head),
2986 ############################################################
2988 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2991 depends : [man, libsystemd, libudev],
2992 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2996 command : ['sh', '@0@/tools/make-index-md.sh'.format(meson.source_root()), meson.source_root()])
2998 ############################################################
3001 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3003 'split /usr: @0@'.format(split_usr),
3004 'split bin-sbin: @0@'.format(split_bin),
3005 'prefix directory: @0@'.format(prefixdir),
3006 'rootprefix directory: @0@'.format(rootprefixdir),
3007 'sysconf directory: @0@'.format(sysconfdir),
3008 'include directory: @0@'.format(includedir),
3009 'lib directory: @0@'.format(libdir),
3010 'rootlib directory: @0@'.format(rootlibdir),
3011 'SysV init scripts: @0@'.format(sysvinit_path),
3012 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3013 'PAM modules directory: @0@'.format(pamlibdir),
3014 'PAM configuration directory: @0@'.format(pamconfdir),
3015 'RPM macros directory: @0@'.format(rpmmacrosdir),
3016 'modprobe.d directory: @0@'.format(modprobedir),
3017 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3018 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3019 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3020 'bash completions directory: @0@'.format(bashcompletiondir),
3021 'zsh completions directory: @0@'.format(zshcompletiondir),
3022 'extra start script: @0@'.format(get_option('rc-local')),
3023 'extra stop script: @0@'.format(get_option('halt-local')),
3024 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3025 get_option('debug-tty')),
3026 'TTY GID: @0@'.format(tty_gid),
3027 'users GID: @0@'.format(substs.get('USERS_GID')),
3028 'maximum system UID: @0@'.format(system_uid_max),
3029 'maximum system GID: @0@'.format(system_gid_max),
3030 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3031 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3032 'minimum container UID base: @0@'.format(container_uid_base_min),
3033 'maximum container UID base: @0@'.format(container_uid_base_max),
3034 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3035 'render group access mode: @0@'.format(get_option('group-render-mode')),
3036 'certificate root directory: @0@'.format(get_option('certificate-root')),
3037 'support URL: @0@'.format(support_url),
3038 'nobody user name: @0@'.format(nobody_user),
3039 'nobody group name: @0@'.format(nobody_group),
3040 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3041 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3043 'default DNSSEC mode: @0@'.format(default_dnssec),
3044 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3045 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3046 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
3048 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3049 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3051 'default DNS servers: @0@'.format(alt_dns_servers),
3052 'default NTP servers: @0@'.format(alt_ntp_servers)]
3054 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3055 '@@0@'.format(time_epoch)).stdout().strip()
3057 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3060 'static libsystemd: @0@'.format(static_libsystemd),
3061 'static libudev: @0@'.format(static_libudev)]
3064 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3065 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3066 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3068 if conf.get('ENABLE_EFI') == 1
3069 status += 'efi arch: @0@'.format(efi_arch)
3073 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3074 'EFI CC @0@'.format(efi_cc),
3075 'EFI lib directory: @0@'.format(efi_libdir),
3076 'EFI lds directory: @0@'.format(efi_ldsdir),
3077 'EFI include directory: @0@'.format(efi_incdir)]
3129 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3130 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3133 ['legacy pkla', install_polkit_pkla],
3135 ['gnu-efi', have_gnu_efi],
3148 ['man pages', want_man],
3149 ['html pages', want_html],
3150 ['man page indices', want_man and have_lxml],
3155 ['adm group', get_option('adm-group')],
3156 ['wheel group', get_option('wheel-group')],
3159 ['debug mmap cache'],
3162 ['valgrind', conf.get('VALGRIND') == 1],
3163 ['trace logging', conf.get('LOG_TRACE') == 1],
3164 ['link-udev-shared', get_option('link-udev-shared')],
3165 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3168 if tuple.length() >= 2
3171 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3172 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3173 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3184 'enabled features: @0@'.format(', '.join(found)),
3186 'disabled features: @0@'.format(', '.join(missing)),
3188 message('\n '.join(status))
3190 if rootprefixdir != rootprefix_default
3192 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3193 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3194 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))