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_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 fib_rule_uid_range',
429 'struct fib_rule_port_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_GRE_ERSPAN_HWID', 'linux/if_tunnel.h', '#include <net/if.h>'],
468 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
469 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
470 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
471 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
472 ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
473 ['NDA_IFINDEX', 'linux/neighbour.h'],
474 ['IFA_FLAGS', 'linux/if_addr.h'],
475 ['FRA_DPORT_RANGE', 'linux/fib_rules.h'],
476 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
477 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
478 ['FOU_ATTR_REMCSUM_NOPARTIAL', 'linux/fou.h'],
479 ['FOU_CMD_GET', 'linux/fou.h'],
480 ['ETHTOOL_LINK_MODE_10baseT_Half_BIT', 'linux/ethtool.h'],
481 ['ETHTOOL_LINK_MODE_25000baseCR_Full_BIT', 'linux/ethtool.h'],
482 ['ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT', 'linux/ethtool.h'],
483 ['ETHTOOL_LINK_MODE_1000baseX_Full_BIT', 'linux/ethtool.h'],
484 ['ETHTOOL_LINK_MODE_2500baseT_Full_BIT', 'linux/ethtool.h'],
485 ['ETHTOOL_LINK_MODE_FEC_NONE_BIT', 'linux/ethtool.h'],
487 prefix = decl.length() > 2 ? decl[2] : ''
488 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
489 conf.set10('HAVE_' + decl[0], have)
492 foreach ident : ['secure_getenv', '__secure_getenv']
493 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
497 ['memfd_create', '''#include <sys/mman.h>'''],
498 ['gettid', '''#include <sys/types.h>
499 #include <unistd.h>'''],
500 ['pivot_root', '''#include <stdlib.h>
501 #include <unistd.h>'''], # no known header declares pivot_root
502 ['name_to_handle_at', '''#include <sys/types.h>
503 #include <sys/stat.h>
504 #include <fcntl.h>'''],
505 ['setns', '''#include <sched.h>'''],
506 ['renameat2', '''#include <stdio.h>
507 #include <fcntl.h>'''],
508 ['kcmp', '''#include <linux/kcmp.h>'''],
509 ['keyctl', '''#include <sys/types.h>
510 #include <keyutils.h>'''],
511 ['copy_file_range', '''#include <sys/syscall.h>
512 #include <unistd.h>'''],
513 ['bpf', '''#include <sys/syscall.h>
514 #include <unistd.h>'''],
515 ['statx', '''#include <sys/types.h>
516 #include <sys/stat.h>
517 #include <unistd.h>'''],
518 ['explicit_bzero' , '''#include <string.h>'''],
519 ['reallocarray', '''#include <malloc.h>'''],
522 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
523 conf.set10('HAVE_' + ident[0].to_upper(), have)
526 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
527 conf.set10('USE_SYS_RANDOM_H', true)
528 conf.set10('HAVE_GETRANDOM', true)
530 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
531 conf.set10('USE_SYS_RANDOM_H', false)
532 conf.set10('HAVE_GETRANDOM', have)
535 #####################################################################
537 sed = find_program('sed')
538 awk = find_program('awk')
539 m4 = find_program('m4')
540 stat = find_program('stat')
541 git = find_program('git', required : false)
542 env = find_program('env')
543 perl = find_program('perl', required : false)
545 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
546 mkdir_p = 'mkdir -p $DESTDIR/@0@'
547 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
548 splash_bmp = files('test/splash.bmp')
550 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
551 # /usr/sbin, /sbin, and fall back to the default from middle column.
552 progs = [['quotaon', '/usr/sbin/quotaon' ],
553 ['quotacheck', '/usr/sbin/quotacheck' ],
554 ['kmod', '/usr/bin/kmod' ],
555 ['kexec', '/usr/sbin/kexec' ],
556 ['sulogin', '/usr/sbin/sulogin' ],
557 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
558 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
559 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
560 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
563 path = get_option(prog[0] + '-path')
565 message('Using @1@ for @0@'.format(prog[0], path))
567 exe = find_program(prog[0],
568 '/usr/sbin/' + prog[0],
571 path = exe.found() ? exe.path() : prog[1]
573 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
574 conf.set_quoted(name, path)
575 substs.set(name, path)
578 conf.set_quoted('TELINIT', get_option('telinit-path'))
580 if run_command('ln', '--relative', '--help').returncode() != 0
581 error('ln does not support --relative (added in coreutils 8.16)')
584 ############################################################
586 gperf = find_program('gperf')
588 gperf_test_format = '''
590 const char * in_word_set(const char *, @0@);
593 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
594 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
595 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
596 if cc.compiles(gperf_test)
597 gperf_len_type = 'size_t'
599 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
600 if cc.compiles(gperf_test)
601 gperf_len_type = 'unsigned'
603 error('unable to determine gperf len type')
606 message('gperf len type is @0@'.format(gperf_len_type))
607 conf.set('GPERF_LEN_TYPE', gperf_len_type,
608 description : 'The type of gperf "len" parameter')
610 ############################################################
612 if not cc.has_header('sys/capability.h')
613 error('POSIX caps headers not found')
615 foreach header : ['crypt.h',
619 'linux/vm_sockets.h',
621 'valgrind/memcheck.h',
622 'valgrind/valgrind.h',
625 conf.set10('HAVE_' + header.underscorify().to_upper(),
626 cc.has_header(header))
629 ############################################################
631 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
632 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
633 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
635 default_hierarchy = get_option('default-hierarchy')
636 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
637 description : 'default cgroup hierarchy as string')
638 if default_hierarchy == 'legacy'
639 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
640 elif default_hierarchy == 'hybrid'
641 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
643 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
646 time_epoch = get_option('time-epoch')
649 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
651 conf.set('TIME_EPOCH', time_epoch)
653 system_uid_max = get_option('system-uid-max')
654 if system_uid_max == -1
655 system_uid_max = run_command(
657 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
658 '/etc/login.defs').stdout().strip()
659 if system_uid_max == ''
662 system_uid_max = system_uid_max.to_int()
665 conf.set('SYSTEM_UID_MAX', system_uid_max)
666 substs.set('systemuidmax', system_uid_max)
668 system_gid_max = get_option('system-gid-max')
669 if system_gid_max == -1
670 system_gid_max = run_command(
672 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
673 '/etc/login.defs').stdout().strip()
674 if system_gid_max == ''
677 system_gid_max = system_gid_max.to_int()
680 conf.set('SYSTEM_GID_MAX', system_gid_max)
681 substs.set('systemgidmax', system_gid_max)
683 dynamic_uid_min = get_option('dynamic-uid-min')
684 dynamic_uid_max = get_option('dynamic-uid-max')
685 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
686 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
687 substs.set('dynamicuidmin', dynamic_uid_min)
688 substs.set('dynamicuidmax', dynamic_uid_max)
690 container_uid_base_min = get_option('container-uid-base-min')
691 container_uid_base_max = get_option('container-uid-base-max')
692 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
693 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
694 substs.set('containeruidbasemin', container_uid_base_min)
695 substs.set('containeruidbasemax', container_uid_base_max)
697 nobody_user = get_option('nobody-user')
698 nobody_group = get_option('nobody-group')
700 if not meson.is_cross_build()
701 getent_result = run_command('getent', 'passwd', '65534')
702 if getent_result.returncode() == 0
703 name = getent_result.stdout().split(':')[0]
704 if name != nobody_user
706 '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) +
707 'Your build will result in an user table setup that is incompatible with the local system.')
710 id_result = run_command('id', '-u', nobody_user)
711 if id_result.returncode() == 0
712 id = id_result.stdout().to_int()
715 '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) +
716 'Your build will result in an user table setup that is incompatible with the local system.')
720 getent_result = run_command('getent', 'group', '65534')
721 if getent_result.returncode() == 0
722 name = getent_result.stdout().split(':')[0]
723 if name != nobody_group
725 '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) +
726 'Your build will result in an group table setup that is incompatible with the local system.')
729 id_result = run_command('id', '-g', nobody_group)
730 if id_result.returncode() == 0
731 id = id_result.stdout().to_int()
734 '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) +
735 'Your build will result in an group table setup that is incompatible with the local system.')
739 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
741 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
742 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
745 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
746 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
747 substs.set('NOBODY_USER_NAME', nobody_user)
748 substs.set('NOBODY_GROUP_NAME', nobody_group)
750 tty_gid = get_option('tty-gid')
751 conf.set('TTY_GID', tty_gid)
752 substs.set('TTY_GID', tty_gid)
754 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
755 users_gid = get_option('users-gid')
756 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
758 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
759 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
761 dev_kvm_mode = get_option('dev-kvm-mode')
762 substs.set('DEV_KVM_MODE', dev_kvm_mode)
763 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
764 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
766 kill_user_processes = get_option('default-kill-user-processes')
767 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
768 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
769 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
771 dns_servers = get_option('dns-servers')
772 conf.set_quoted('DNS_SERVERS', dns_servers)
773 substs.set('DNS_SERVERS', dns_servers)
775 ntp_servers = get_option('ntp-servers')
776 conf.set_quoted('NTP_SERVERS', ntp_servers)
777 substs.set('NTP_SERVERS', ntp_servers)
779 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
781 substs.set('SUSHELL', get_option('debug-shell'))
782 substs.set('DEBUGTTY', get_option('debug-tty'))
784 enable_debug_hashmap = false
785 enable_debug_mmap_cache = false
786 enable_debug_siphash = false
787 enable_debug_udev = false
788 foreach name : get_option('debug-extra')
790 enable_debug_hashmap = true
791 elif name == 'mmap-cache'
792 enable_debug_mmap_cache = true
793 elif name == 'siphash'
794 enable_debug_siphash = true
796 enable_debug_udev = true
798 message('unknown debug option "@0@", ignoring'.format(name))
801 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
802 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
803 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
804 conf.set10('ENABLE_DEBUG_UDEV', enable_debug_udev)
806 conf.set10('VALGRIND', get_option('valgrind'))
807 conf.set10('LOG_TRACE', get_option('log-trace'))
809 #####################################################################
811 threads = dependency('threads')
812 librt = cc.find_library('rt')
813 libm = cc.find_library('m')
814 libdl = cc.find_library('dl')
815 libcrypt = cc.find_library('crypt')
817 libcap = dependency('libcap', required : false)
818 if not libcap.found()
819 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
820 libcap = cc.find_library('cap')
823 libmount = dependency('mount',
824 version : fuzzer_build ? '>= 0' : '>= 2.30')
826 want_seccomp = get_option('seccomp')
827 if want_seccomp != 'false' and not fuzzer_build
828 libseccomp = dependency('libseccomp',
829 version : '>= 2.3.1',
830 required : want_seccomp == 'true')
831 have = libseccomp.found()
836 conf.set10('HAVE_SECCOMP', have)
838 want_selinux = get_option('selinux')
839 if want_selinux != 'false' and not fuzzer_build
840 libselinux = dependency('libselinux',
841 version : '>= 2.1.9',
842 required : want_selinux == 'true')
843 have = libselinux.found()
848 conf.set10('HAVE_SELINUX', have)
850 want_apparmor = get_option('apparmor')
851 if want_apparmor != 'false' and not fuzzer_build
852 libapparmor = dependency('libapparmor',
853 required : want_apparmor == 'true')
854 have = libapparmor.found()
859 conf.set10('HAVE_APPARMOR', have)
861 smack_run_label = get_option('smack-run-label')
862 if smack_run_label != ''
863 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
866 want_polkit = get_option('polkit')
867 install_polkit = false
868 install_polkit_pkla = false
869 if want_polkit != 'false' and not fuzzer_build
870 install_polkit = true
872 libpolkit = dependency('polkit-gobject-1',
874 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
875 message('Old polkit detected, will install pkla files')
876 install_polkit_pkla = true
879 conf.set10('ENABLE_POLKIT', install_polkit)
881 want_acl = get_option('acl')
882 if want_acl != 'false' and not fuzzer_build
883 libacl = cc.find_library('acl', required : want_acl == 'true')
884 have = libacl.found()
889 conf.set10('HAVE_ACL', have)
891 want_audit = get_option('audit')
892 if want_audit != 'false' and not fuzzer_build
893 libaudit = dependency('audit', required : want_audit == 'true')
894 have = libaudit.found()
899 conf.set10('HAVE_AUDIT', have)
901 want_blkid = get_option('blkid')
902 if want_blkid != 'false' and not fuzzer_build
903 libblkid = dependency('blkid', required : want_blkid == 'true')
904 have = libblkid.found()
909 conf.set10('HAVE_BLKID', have)
911 want_kmod = get_option('kmod')
912 if want_kmod != 'false' and not fuzzer_build
913 libkmod = dependency('libkmod',
915 required : want_kmod == 'true')
916 have = libkmod.found()
921 conf.set10('HAVE_KMOD', have)
923 want_pam = get_option('pam')
924 if want_pam != 'false' and not fuzzer_build
925 libpam = cc.find_library('pam', required : want_pam == 'true')
926 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
927 have = libpam.found() and libpam_misc.found()
933 conf.set10('HAVE_PAM', have)
935 want_microhttpd = get_option('microhttpd')
936 if want_microhttpd != 'false' and not fuzzer_build
937 libmicrohttpd = dependency('libmicrohttpd',
938 version : '>= 0.9.33',
939 required : want_microhttpd == 'true')
940 have = libmicrohttpd.found()
945 conf.set10('HAVE_MICROHTTPD', have)
947 want_libcryptsetup = get_option('libcryptsetup')
948 if want_libcryptsetup != 'false' and not fuzzer_build
949 libcryptsetup = dependency('libcryptsetup',
950 version : '>= 1.6.0',
951 required : want_libcryptsetup == 'true')
952 have = libcryptsetup.found()
953 have_sector = cc.has_member(
954 'struct crypt_params_plain',
956 prefix : '#include <libcryptsetup.h>')
962 conf.set10('HAVE_LIBCRYPTSETUP', have)
963 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
965 want_libcurl = get_option('libcurl')
966 if want_libcurl != 'false' and not fuzzer_build
967 libcurl = dependency('libcurl',
968 version : '>= 7.32.0',
969 required : want_libcurl == 'true')
970 have = libcurl.found()
975 conf.set10('HAVE_LIBCURL', have)
977 want_libidn = get_option('libidn')
978 want_libidn2 = get_option('libidn2')
979 if want_libidn == 'true' and want_libidn2 == 'true'
980 error('libidn and libidn2 cannot be requested simultaneously')
983 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
984 libidn = dependency('libidn',
985 required : want_libidn == 'true')
986 have = libidn.found()
991 conf.set10('HAVE_LIBIDN', have)
992 if not have and want_libidn2 != 'false' and not fuzzer_build
993 # libidn is used for both libidn and libidn2 objects
994 libidn = dependency('libidn2',
995 required : want_libidn2 == 'true')
996 have = libidn.found()
1000 conf.set10('HAVE_LIBIDN2', have)
1002 want_libiptc = get_option('libiptc')
1003 if want_libiptc != 'false' and not fuzzer_build
1004 libiptc = dependency('libiptc',
1005 required : want_libiptc == 'true')
1006 have = libiptc.found()
1011 conf.set10('HAVE_LIBIPTC', have)
1013 want_qrencode = get_option('qrencode')
1014 if want_qrencode != 'false' and not fuzzer_build
1015 libqrencode = dependency('libqrencode',
1016 required : want_qrencode == 'true')
1017 have = libqrencode.found()
1022 conf.set10('HAVE_QRENCODE', have)
1024 want_gcrypt = get_option('gcrypt')
1025 if want_gcrypt != 'false' and not fuzzer_build
1026 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1027 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1028 have = libgcrypt.found() and libgpg_error.found()
1033 # link to neither of the libs if one is not found
1037 conf.set10('HAVE_GCRYPT', have)
1039 want_gnutls = get_option('gnutls')
1040 if want_gnutls != 'false' and not fuzzer_build
1041 libgnutls = dependency('gnutls',
1042 version : '>= 3.1.4',
1043 required : want_gnutls == 'true')
1044 have = libgnutls.found()
1049 conf.set10('HAVE_GNUTLS', have)
1051 want_openssl = get_option('openssl')
1052 if want_openssl != 'false' and not fuzzer_build
1053 libopenssl = dependency('openssl',
1054 version : '>= 1.1.0',
1055 required : want_openssl == 'true')
1056 have = libopenssl.found()
1061 conf.set10('HAVE_OPENSSL', have)
1063 want_elfutils = get_option('elfutils')
1064 if want_elfutils != 'false' and not fuzzer_build
1065 libdw = dependency('libdw',
1066 required : want_elfutils == 'true')
1067 have = libdw.found()
1072 conf.set10('HAVE_ELFUTILS', have)
1074 want_zlib = get_option('zlib')
1075 if want_zlib != 'false' and not fuzzer_build
1076 libz = dependency('zlib',
1077 required : want_zlib == 'true')
1083 conf.set10('HAVE_ZLIB', have)
1085 want_bzip2 = get_option('bzip2')
1086 if want_bzip2 != 'false' and not fuzzer_build
1087 libbzip2 = cc.find_library('bz2',
1088 required : want_bzip2 == 'true')
1089 have = libbzip2.found()
1094 conf.set10('HAVE_BZIP2', have)
1096 want_xz = get_option('xz')
1097 if want_xz != 'false' and not fuzzer_build
1098 libxz = dependency('liblzma',
1099 required : want_xz == 'true')
1100 have = libxz.found()
1105 conf.set10('HAVE_XZ', have)
1107 want_lz4 = get_option('lz4')
1108 if want_lz4 != 'false' and not fuzzer_build
1109 liblz4 = dependency('liblz4',
1110 version : '>= 1.3.0',
1111 required : want_lz4 == 'true')
1112 have = liblz4.found()
1117 conf.set10('HAVE_LZ4', have)
1119 want_xkbcommon = get_option('xkbcommon')
1120 if want_xkbcommon != 'false' and not fuzzer_build
1121 libxkbcommon = dependency('xkbcommon',
1122 version : '>= 0.3.0',
1123 required : want_xkbcommon == 'true')
1124 have = libxkbcommon.found()
1129 conf.set10('HAVE_XKBCOMMON', have)
1131 want_pcre2 = get_option('pcre2')
1132 if want_pcre2 != 'false'
1133 libpcre2 = dependency('libpcre2-8',
1134 required : want_pcre2 == 'true')
1135 have = libpcre2.found()
1140 conf.set10('HAVE_PCRE2', have)
1142 want_glib = get_option('glib')
1143 if want_glib != 'false' and not fuzzer_build
1144 libglib = dependency('glib-2.0',
1145 version : '>= 2.22.0',
1146 required : want_glib == 'true')
1147 libgobject = dependency('gobject-2.0',
1148 version : '>= 2.22.0',
1149 required : want_glib == 'true')
1150 libgio = dependency('gio-2.0',
1151 required : want_glib == 'true')
1152 have = libglib.found() and libgobject.found() and libgio.found()
1159 conf.set10('HAVE_GLIB', have)
1161 want_dbus = get_option('dbus')
1162 if want_dbus != 'false' and not fuzzer_build
1163 libdbus = dependency('dbus-1',
1164 version : '>= 1.3.2',
1165 required : want_dbus == 'true')
1166 have = libdbus.found()
1171 conf.set10('HAVE_DBUS', have)
1173 default_dnssec = get_option('default-dnssec')
1175 default_dnssec = 'no'
1177 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1178 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1179 default_dnssec = 'no'
1181 conf.set('DEFAULT_DNSSEC_MODE',
1182 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1183 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1185 dns_over_tls = get_option('dns-over-tls')
1186 if dns_over_tls != 'false'
1187 if dns_over_tls == 'openssl'
1190 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1191 if dns_over_tls == 'gnutls' and not have_gnutls
1192 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1195 if dns_over_tls == 'gnutls' or have_gnutls
1196 have_openssl = false
1198 have_openssl = conf.get('HAVE_OPENSSL') == 1
1199 if dns_over_tls != 'auto' and not have_openssl
1200 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1201 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1204 have = have_gnutls or have_openssl
1208 have_openssl = false
1210 conf.set10('ENABLE_DNS_OVER_TLS', have)
1211 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1212 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1214 default_dns_over_tls = get_option('default-dns-over-tls')
1216 default_dns_over_tls = 'no'
1218 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1219 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1220 default_dns_over_tls = 'no'
1222 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1223 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1224 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1226 want_importd = get_option('importd')
1227 if want_importd != 'false'
1228 have = (conf.get('HAVE_LIBCURL') == 1 and
1229 conf.get('HAVE_ZLIB') == 1 and
1230 conf.get('HAVE_XZ') == 1 and
1231 conf.get('HAVE_GCRYPT') == 1)
1232 if want_importd == 'true' and not have
1233 error('importd support was requested, but dependencies are not available')
1238 conf.set10('ENABLE_IMPORTD', have)
1240 want_remote = get_option('remote')
1241 if want_remote != 'false'
1242 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1243 conf.get('HAVE_LIBCURL') == 1]
1244 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1245 # it's possible to build one without the other. Complain only if
1246 # support was explictly requested. The auxiliary files like sysusers
1247 # config should be installed when any of the programs are built.
1248 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1249 error('remote support was requested, but dependencies are not available')
1251 have = have_deps[0] or have_deps[1]
1255 conf.set10('ENABLE_REMOTE', have)
1257 foreach term : ['utmp',
1289 have = get_option(term)
1290 name = 'ENABLE_' + term.underscorify().to_upper()
1291 conf.set10(name, have)
1294 foreach tuple : [['nss-mymachines', 'machined'],
1295 ['nss-resolve', 'resolve']]
1296 want = get_option(tuple[0])
1298 have = get_option(tuple[1])
1299 if want == 'true' and not have
1300 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1305 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1306 conf.set10(name, have)
1310 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1311 'ENABLE_NSS_MYMACHINES',
1312 'ENABLE_NSS_RESOLVE',
1313 'ENABLE_NSS_SYSTEMD']
1314 if conf.get(term) == 1
1318 conf.set10('ENABLE_NSS', enable_nss)
1320 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1325 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1327 #####################################################################
1329 if get_option('efi')
1330 efi_arch = host_machine.cpu_family()
1332 if efi_arch == 'x86'
1333 EFI_MACHINE_TYPE_NAME = 'ia32'
1334 gnu_efi_arch = 'ia32'
1335 elif efi_arch == 'x86_64'
1336 EFI_MACHINE_TYPE_NAME = 'x64'
1337 gnu_efi_arch = 'x86_64'
1338 elif efi_arch == 'arm'
1339 EFI_MACHINE_TYPE_NAME = 'arm'
1340 gnu_efi_arch = 'arm'
1341 elif efi_arch == 'aarch64'
1342 EFI_MACHINE_TYPE_NAME = 'aa64'
1343 gnu_efi_arch = 'aarch64'
1345 EFI_MACHINE_TYPE_NAME = ''
1350 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1352 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1356 conf.set10('ENABLE_EFI', have)
1358 #####################################################################
1360 config_h = configure_file(
1361 output : 'config.h',
1362 configuration : conf)
1364 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1366 includes = include_directories('src/basic',
1370 'src/journal-remote',
1374 'src/time-wait-sync',
1379 'src/libsystemd/sd-bus',
1380 'src/libsystemd/sd-device',
1381 'src/libsystemd/sd-event',
1382 'src/libsystemd/sd-hwdb',
1383 'src/libsystemd/sd-id128',
1384 'src/libsystemd/sd-netlink',
1385 'src/libsystemd/sd-network',
1386 'src/libsystemd-network',
1389 add_project_arguments('-include', 'config.h', language : 'c')
1391 generate_gperfs = find_program('tools/generate-gperfs.py')
1395 subdir('src/systemd')
1397 subdir('src/libsystemd')
1398 subdir('src/libsystemd-network')
1399 subdir('src/journal')
1402 libjournal_core = static_library(
1404 libjournal_core_sources,
1406 include_directories : includes,
1409 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1410 libsystemd = shared_library(
1413 version : libsystemd_version,
1414 include_directories : includes,
1415 link_args : ['-shared',
1416 '-Wl,--version-script=' + libsystemd_sym_path],
1417 link_with : [libbasic,
1419 link_whole : [libsystemd_static,
1421 dependencies : [threads,
1425 link_depends : libsystemd_sym,
1427 install_dir : rootlibdir)
1429 static_libsystemd = get_option('static-libsystemd')
1430 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1432 install_libsystemd_static = static_library(
1435 journal_client_sources,
1437 basic_gcrypt_sources,
1439 include_directories : includes,
1440 build_by_default : static_libsystemd != 'false',
1441 install : static_libsystemd != 'false',
1442 install_dir : rootlibdir,
1443 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1444 dependencies : [threads,
1453 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1455 ############################################################
1457 # binaries that have --help and are intended for use by humans,
1458 # usually, but not always, installed in /bin.
1459 public_programs = []
1461 subdir('src/libudev')
1462 subdir('src/shared')
1465 subdir('src/network')
1467 subdir('src/analyze')
1468 subdir('src/journal-remote')
1469 subdir('src/coredump')
1470 subdir('src/hostname')
1471 subdir('src/import')
1472 subdir('src/kernel-install')
1473 subdir('src/locale')
1474 subdir('src/machine')
1475 subdir('src/portable')
1476 subdir('src/nspawn')
1477 subdir('src/resolve')
1478 subdir('src/timedate')
1479 subdir('src/timesync')
1480 subdir('src/vconsole')
1481 subdir('src/boot/efi')
1488 ############################################################
1490 # only static linking apart from libdl, to make sure that the
1491 # module is linked to all libraries that it uses.
1492 test_dlopen = executable(
1496 include_directories : includes,
1497 link_with : [libbasic],
1498 dependencies : [libdl],
1499 build_by_default : want_tests != 'false')
1501 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1502 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1503 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1504 ['resolve', 'ENABLE_NSS_RESOLVE']]
1506 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1510 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1511 version_script_arg = join_paths(meson.source_root(), sym)
1513 nss = shared_library(
1515 'src/nss-@0@/nss-@0@.c'.format(module),
1518 include_directories : includes,
1519 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1520 link_args : ['-Wl,-z,nodelete',
1522 '-Wl,--version-script=' + version_script_arg,
1524 link_with : [libsystemd_static,
1526 dependencies : [threads,
1530 install_dir : rootlibdir)
1532 # We cannot use shared_module because it does not support version suffix.
1533 # Unfortunately shared_library insists on creating the symlink…
1534 meson.add_install_script('sh', '-c',
1535 'rm $DESTDIR@0@/libnss_@1@.so'
1536 .format(rootlibdir, module))
1538 if want_tests != 'false'
1539 test('dlopen-nss_' + module,
1541 # path to dlopen must include a slash
1542 args : nss.full_path())
1547 ############################################################
1549 executable('systemd',
1551 include_directories : includes,
1552 link_with : [libcore,
1554 dependencies : [threads,
1560 install_rpath : rootlibexecdir,
1562 install_dir : rootlibexecdir)
1564 meson.add_install_script(meson_make_symlink,
1565 join_paths(rootlibexecdir, 'systemd'),
1566 join_paths(rootsbindir, 'init'))
1568 exe = executable('systemd-analyze',
1569 systemd_analyze_sources,
1570 include_directories : includes,
1571 link_with : [libcore,
1573 dependencies : [threads,
1579 install_rpath : rootlibexecdir,
1581 public_programs += exe
1583 executable('systemd-journald',
1584 systemd_journald_sources,
1585 include_directories : includes,
1586 link_with : [libjournal_core,
1588 dependencies : [threads,
1592 install_rpath : rootlibexecdir,
1594 install_dir : rootlibexecdir)
1596 exe = executable('systemd-cat',
1597 systemd_cat_sources,
1598 include_directories : includes,
1599 link_with : [libjournal_core,
1601 dependencies : [threads],
1602 install_rpath : rootlibexecdir,
1604 public_programs += exe
1606 exe = executable('journalctl',
1608 include_directories : includes,
1609 link_with : [libshared],
1610 dependencies : [threads,
1615 install_rpath : rootlibexecdir,
1617 install_dir : rootbindir)
1618 public_programs += exe
1620 executable('systemd-getty-generator',
1621 'src/getty-generator/getty-generator.c',
1622 include_directories : includes,
1623 link_with : [libshared],
1624 install_rpath : rootlibexecdir,
1626 install_dir : systemgeneratordir)
1628 executable('systemd-debug-generator',
1629 'src/debug-generator/debug-generator.c',
1630 include_directories : includes,
1631 link_with : [libshared],
1632 install_rpath : rootlibexecdir,
1634 install_dir : systemgeneratordir)
1636 executable('systemd-run-generator',
1637 'src/run-generator/run-generator.c',
1638 include_directories : includes,
1639 link_with : [libshared],
1640 install_rpath : rootlibexecdir,
1642 install_dir : systemgeneratordir)
1644 executable('systemd-fstab-generator',
1645 'src/fstab-generator/fstab-generator.c',
1646 'src/core/mount-setup.c',
1647 include_directories : includes,
1648 link_with : [libshared],
1649 install_rpath : rootlibexecdir,
1651 install_dir : systemgeneratordir)
1653 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1654 executable('30-systemd-environment-d-generator',
1655 'src/environment-d-generator/environment-d-generator.c',
1656 include_directories : includes,
1657 link_with : [libshared],
1658 install_rpath : rootlibexecdir,
1660 install_dir : userenvgeneratordir)
1662 meson.add_install_script(meson_make_symlink,
1663 join_paths(sysconfdir, 'environment'),
1664 join_paths(environmentdir, '99-environment.conf'))
1667 if conf.get('ENABLE_HIBERNATE') == 1
1668 executable('systemd-hibernate-resume-generator',
1669 'src/hibernate-resume/hibernate-resume-generator.c',
1670 include_directories : includes,
1671 link_with : [libshared],
1672 install_rpath : rootlibexecdir,
1674 install_dir : systemgeneratordir)
1676 executable('systemd-hibernate-resume',
1677 'src/hibernate-resume/hibernate-resume.c',
1678 include_directories : includes,
1679 link_with : [libshared],
1680 install_rpath : rootlibexecdir,
1682 install_dir : rootlibexecdir)
1685 if conf.get('HAVE_BLKID') == 1
1686 executable('systemd-gpt-auto-generator',
1687 'src/gpt-auto-generator/gpt-auto-generator.c',
1688 'src/shared/blkid-util.h',
1689 include_directories : includes,
1690 link_with : [libshared],
1691 dependencies : libblkid,
1692 install_rpath : rootlibexecdir,
1694 install_dir : systemgeneratordir)
1696 exe = executable('systemd-dissect',
1697 'src/dissect/dissect.c',
1698 include_directories : includes,
1699 link_with : [libshared],
1700 install_rpath : rootlibexecdir,
1702 install_dir : rootlibexecdir)
1703 public_programs += exe
1706 if conf.get('ENABLE_RESOLVE') == 1
1707 executable('systemd-resolved',
1708 systemd_resolved_sources,
1709 include_directories : includes,
1710 link_with : [libshared,
1712 libsystemd_resolve_core],
1713 dependencies : systemd_resolved_dependencies,
1714 install_rpath : rootlibexecdir,
1716 install_dir : rootlibexecdir)
1718 exe = executable('resolvectl',
1720 include_directories : includes,
1721 link_with : [libshared,
1723 libsystemd_resolve_core],
1724 dependencies : [threads,
1728 install_rpath : rootlibexecdir,
1730 public_programs += exe
1732 meson.add_install_script(meson_make_symlink,
1733 join_paths(bindir, 'resolvectl'),
1734 join_paths(rootsbindir, 'resolvconf'))
1736 meson.add_install_script(meson_make_symlink,
1737 join_paths(bindir, 'resolvectl'),
1738 join_paths(bindir, 'systemd-resolve'))
1741 if conf.get('ENABLE_LOGIND') == 1
1742 executable('systemd-logind',
1743 systemd_logind_sources,
1744 include_directories : includes,
1745 link_with : [liblogind_core,
1747 dependencies : [threads,
1749 install_rpath : rootlibexecdir,
1751 install_dir : rootlibexecdir)
1753 exe = executable('loginctl',
1755 include_directories : includes,
1756 link_with : [libshared],
1757 dependencies : [threads,
1760 install_rpath : rootlibexecdir,
1762 install_dir : rootbindir)
1763 public_programs += exe
1765 exe = executable('systemd-inhibit',
1766 'src/login/inhibit.c',
1767 include_directories : includes,
1768 link_with : [libshared],
1769 install_rpath : rootlibexecdir,
1771 install_dir : rootbindir)
1772 public_programs += exe
1774 if conf.get('HAVE_PAM') == 1
1775 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
1776 pam_systemd = shared_library(
1780 include_directories : includes,
1781 link_args : ['-shared',
1782 '-Wl,--version-script=' + version_script_arg],
1783 link_with : [libsystemd_static,
1785 dependencies : [threads,
1788 link_depends : pam_systemd_sym,
1790 install_dir : pamlibdir)
1792 if want_tests != 'false'
1793 test('dlopen-pam_systemd',
1795 # path to dlopen must include a slash
1796 args : pam_systemd.full_path())
1800 executable('systemd-user-runtime-dir',
1801 user_runtime_dir_sources,
1802 include_directories : includes,
1803 link_with : [libshared],
1804 install_rpath : rootlibexecdir,
1806 install_dir : rootlibexecdir)
1809 if conf.get('HAVE_PAM') == 1
1810 executable('systemd-user-sessions',
1811 'src/user-sessions/user-sessions.c',
1812 include_directories : includes,
1813 link_with : [libshared],
1814 install_rpath : rootlibexecdir,
1816 install_dir : rootlibexecdir)
1819 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1820 exe = executable('bootctl',
1821 'src/boot/bootctl.c',
1822 include_directories : includes,
1823 link_with : [libshared],
1824 dependencies : [libblkid],
1825 install_rpath : rootlibexecdir,
1827 public_programs += exe
1829 executable('systemd-bless-boot',
1830 'src/boot/bless-boot.c',
1831 include_directories : includes,
1832 link_with : [libshared],
1833 dependencies : [libblkid],
1834 install_rpath : rootlibexecdir,
1836 install_dir : rootlibexecdir)
1838 executable('systemd-bless-boot-generator',
1839 'src/boot/bless-boot-generator.c',
1840 include_directories : includes,
1841 link_with : [libshared],
1842 install_rpath : rootlibexecdir,
1844 install_dir : systemgeneratordir)
1847 executable('systemd-boot-check-no-failures',
1848 'src/boot/boot-check-no-failures.c',
1849 include_directories : includes,
1850 link_with : [libshared],
1851 dependencies : [libblkid],
1852 install_rpath : rootlibexecdir,
1854 install_dir : rootlibexecdir)
1856 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1857 include_directories : includes,
1858 link_with : [libshared],
1859 dependencies : [threads],
1860 install_rpath : rootlibexecdir,
1862 public_programs += exe
1865 if get_option('link-systemctl-shared')
1866 systemctl_link_with = [libshared]
1868 systemctl_link_with = [libsystemd_static,
1874 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1875 include_directories : includes,
1876 link_with : systemctl_link_with,
1877 dependencies : [threads,
1882 install_rpath : rootlibexecdir,
1884 install_dir : rootbindir)
1885 public_programs += exe
1887 if conf.get('ENABLE_PORTABLED') == 1
1888 executable('systemd-portabled',
1889 systemd_portabled_sources,
1890 include_directories : includes,
1891 link_with : [libshared],
1892 dependencies : [threads],
1893 install_rpath : rootlibexecdir,
1895 install_dir : rootlibexecdir)
1897 exe = executable('portablectl', 'src/portable/portablectl.c',
1898 include_directories : includes,
1899 link_with : [libshared],
1900 dependencies : [threads],
1901 install_rpath : rootlibexecdir,
1903 install_dir : rootbindir)
1904 public_programs += exe
1907 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1908 meson.add_install_script(meson_make_symlink,
1909 join_paths(rootbindir, 'systemctl'),
1910 join_paths(rootsbindir, alias))
1913 if conf.get('ENABLE_BACKLIGHT') == 1
1914 executable('systemd-backlight',
1915 'src/backlight/backlight.c',
1916 include_directories : includes,
1917 link_with : [libshared],
1918 install_rpath : rootlibexecdir,
1920 install_dir : rootlibexecdir)
1923 if conf.get('ENABLE_RFKILL') == 1
1924 executable('systemd-rfkill',
1925 'src/rfkill/rfkill.c',
1926 include_directories : includes,
1927 link_with : [libshared],
1928 install_rpath : rootlibexecdir,
1930 install_dir : rootlibexecdir)
1933 executable('systemd-system-update-generator',
1934 'src/system-update-generator/system-update-generator.c',
1935 include_directories : includes,
1936 link_with : [libshared],
1937 install_rpath : rootlibexecdir,
1939 install_dir : systemgeneratordir)
1941 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1942 executable('systemd-cryptsetup',
1943 'src/cryptsetup/cryptsetup.c',
1944 include_directories : includes,
1945 link_with : [libshared],
1946 dependencies : [libcryptsetup],
1947 install_rpath : rootlibexecdir,
1949 install_dir : rootlibexecdir)
1951 executable('systemd-cryptsetup-generator',
1952 'src/cryptsetup/cryptsetup-generator.c',
1953 include_directories : includes,
1954 link_with : [libshared],
1955 dependencies : [libcryptsetup],
1956 install_rpath : rootlibexecdir,
1958 install_dir : systemgeneratordir)
1960 executable('systemd-veritysetup',
1961 'src/veritysetup/veritysetup.c',
1962 include_directories : includes,
1963 link_with : [libshared],
1964 dependencies : [libcryptsetup],
1965 install_rpath : rootlibexecdir,
1967 install_dir : rootlibexecdir)
1969 executable('systemd-veritysetup-generator',
1970 'src/veritysetup/veritysetup-generator.c',
1971 include_directories : includes,
1972 link_with : [libshared],
1973 dependencies : [libcryptsetup],
1974 install_rpath : rootlibexecdir,
1976 install_dir : systemgeneratordir)
1979 if conf.get('HAVE_SYSV_COMPAT') == 1
1980 executable('systemd-sysv-generator',
1981 'src/sysv-generator/sysv-generator.c',
1982 include_directories : includes,
1983 link_with : [libshared],
1984 install_rpath : rootlibexecdir,
1986 install_dir : systemgeneratordir)
1988 executable('systemd-rc-local-generator',
1989 'src/rc-local-generator/rc-local-generator.c',
1990 include_directories : includes,
1991 link_with : [libshared],
1992 install_rpath : rootlibexecdir,
1994 install_dir : systemgeneratordir)
1997 if conf.get('ENABLE_HOSTNAMED') == 1
1998 executable('systemd-hostnamed',
1999 'src/hostname/hostnamed.c',
2000 include_directories : includes,
2001 link_with : [libshared],
2002 install_rpath : rootlibexecdir,
2004 install_dir : rootlibexecdir)
2006 exe = executable('hostnamectl',
2007 'src/hostname/hostnamectl.c',
2008 include_directories : includes,
2009 link_with : [libshared],
2010 install_rpath : rootlibexecdir,
2012 public_programs += exe
2015 if conf.get('ENABLE_LOCALED') == 1
2016 if conf.get('HAVE_XKBCOMMON') == 1
2017 # logind will load libxkbcommon.so dynamically on its own
2023 executable('systemd-localed',
2024 systemd_localed_sources,
2025 include_directories : includes,
2026 link_with : [libshared],
2027 dependencies : deps,
2028 install_rpath : rootlibexecdir,
2030 install_dir : rootlibexecdir)
2032 exe = executable('localectl',
2034 include_directories : includes,
2035 link_with : [libshared],
2036 install_rpath : rootlibexecdir,
2038 public_programs += exe
2041 if conf.get('ENABLE_TIMEDATED') == 1
2042 executable('systemd-timedated',
2043 'src/timedate/timedated.c',
2044 include_directories : includes,
2045 link_with : [libshared],
2046 install_rpath : rootlibexecdir,
2048 install_dir : rootlibexecdir)
2051 if conf.get('ENABLE_TIMEDATECTL') == 1
2052 exe = executable('timedatectl',
2053 'src/timedate/timedatectl.c',
2054 include_directories : includes,
2055 install_rpath : rootlibexecdir,
2056 link_with : [libshared],
2057 dependencies : [libm],
2059 public_programs += exe
2062 if conf.get('ENABLE_TIMESYNCD') == 1
2063 executable('systemd-timesyncd',
2064 systemd_timesyncd_sources,
2065 include_directories : includes,
2066 link_with : [libshared],
2067 dependencies : [threads,
2069 install_rpath : rootlibexecdir,
2071 install_dir : rootlibexecdir)
2073 executable('systemd-time-wait-sync',
2074 'src/time-wait-sync/time-wait-sync.c',
2075 include_directories : includes,
2076 link_with : [libshared],
2077 install_rpath : rootlibexecdir,
2079 install_dir : rootlibexecdir)
2082 if conf.get('ENABLE_MACHINED') == 1
2083 executable('systemd-machined',
2084 systemd_machined_sources,
2085 include_directories : includes,
2086 link_with : [libmachine_core,
2088 install_rpath : rootlibexecdir,
2090 install_dir : rootlibexecdir)
2092 exe = executable('machinectl',
2093 'src/machine/machinectl.c',
2094 include_directories : includes,
2095 link_with : [libshared],
2096 dependencies : [threads,
2099 install_rpath : rootlibexecdir,
2101 install_dir : rootbindir)
2102 public_programs += exe
2105 if conf.get('ENABLE_IMPORTD') == 1
2106 executable('systemd-importd',
2107 systemd_importd_sources,
2108 include_directories : includes,
2109 link_with : [libshared],
2110 dependencies : [threads],
2111 install_rpath : rootlibexecdir,
2113 install_dir : rootlibexecdir)
2115 systemd_pull = executable('systemd-pull',
2116 systemd_pull_sources,
2117 include_directories : includes,
2118 link_with : [libshared],
2119 dependencies : [libcurl,
2124 install_rpath : rootlibexecdir,
2126 install_dir : rootlibexecdir)
2128 systemd_import = executable('systemd-import',
2129 systemd_import_sources,
2130 include_directories : includes,
2131 link_with : [libshared],
2132 dependencies : [libcurl,
2136 install_rpath : rootlibexecdir,
2138 install_dir : rootlibexecdir)
2140 systemd_export = executable('systemd-export',
2141 systemd_export_sources,
2142 include_directories : includes,
2143 link_with : [libshared],
2144 dependencies : [libcurl,
2148 install_rpath : rootlibexecdir,
2150 install_dir : rootlibexecdir)
2151 public_programs += [systemd_pull, systemd_import, systemd_export]
2154 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2155 exe = executable('systemd-journal-upload',
2156 systemd_journal_upload_sources,
2157 include_directories : includes,
2158 link_with : [libshared],
2159 dependencies : [threads,
2164 install_rpath : rootlibexecdir,
2166 install_dir : rootlibexecdir)
2167 public_programs += exe
2170 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2171 s_j_remote = executable('systemd-journal-remote',
2172 systemd_journal_remote_sources,
2173 include_directories : includes,
2174 link_with : [libshared,
2175 libsystemd_journal_remote],
2176 dependencies : [threads,
2181 install_rpath : rootlibexecdir,
2183 install_dir : rootlibexecdir)
2185 s_j_gatewayd = executable('systemd-journal-gatewayd',
2186 systemd_journal_gatewayd_sources,
2187 include_directories : includes,
2188 link_with : [libshared],
2189 dependencies : [threads,
2194 install_rpath : rootlibexecdir,
2196 install_dir : rootlibexecdir)
2197 public_programs += [s_j_remote, s_j_gatewayd]
2200 if conf.get('ENABLE_COREDUMP') == 1
2201 executable('systemd-coredump',
2202 systemd_coredump_sources,
2203 include_directories : includes,
2204 link_with : [libshared],
2205 dependencies : [threads,
2210 install_rpath : rootlibexecdir,
2212 install_dir : rootlibexecdir)
2214 exe = executable('coredumpctl',
2215 coredumpctl_sources,
2216 include_directories : includes,
2217 link_with : [libshared],
2218 dependencies : [threads,
2221 install_rpath : rootlibexecdir,
2223 public_programs += exe
2226 if conf.get('ENABLE_BINFMT') == 1
2227 exe = executable('systemd-binfmt',
2228 'src/binfmt/binfmt.c',
2229 include_directories : includes,
2230 link_with : [libshared],
2231 install_rpath : rootlibexecdir,
2233 install_dir : rootlibexecdir)
2234 public_programs += exe
2236 meson.add_install_script('sh', '-c',
2237 mkdir_p.format(binfmtdir))
2238 meson.add_install_script('sh', '-c',
2239 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2242 if conf.get('ENABLE_VCONSOLE') == 1
2243 executable('systemd-vconsole-setup',
2244 'src/vconsole/vconsole-setup.c',
2245 include_directories : includes,
2246 link_with : [libshared],
2247 install_rpath : rootlibexecdir,
2249 install_dir : rootlibexecdir)
2252 if conf.get('ENABLE_RANDOMSEED') == 1
2253 executable('systemd-random-seed',
2254 'src/random-seed/random-seed.c',
2255 include_directories : includes,
2256 link_with : [libshared],
2257 install_rpath : rootlibexecdir,
2259 install_dir : rootlibexecdir)
2262 if conf.get('ENABLE_FIRSTBOOT') == 1
2263 executable('systemd-firstboot',
2264 'src/firstboot/firstboot.c',
2265 include_directories : includes,
2266 link_with : [libshared],
2267 dependencies : [libcrypt],
2268 install_rpath : rootlibexecdir,
2270 install_dir : rootbindir)
2273 executable('systemd-remount-fs',
2274 'src/remount-fs/remount-fs.c',
2275 'src/core/mount-setup.c',
2276 'src/core/mount-setup.h',
2277 include_directories : includes,
2278 link_with : [libshared],
2279 install_rpath : rootlibexecdir,
2281 install_dir : rootlibexecdir)
2283 executable('systemd-machine-id-setup',
2284 'src/machine-id-setup/machine-id-setup-main.c',
2285 'src/core/machine-id-setup.c',
2286 'src/core/machine-id-setup.h',
2287 include_directories : includes,
2288 link_with : [libshared],
2289 install_rpath : rootlibexecdir,
2291 install_dir : rootbindir)
2293 executable('systemd-fsck',
2295 include_directories : includes,
2296 link_with : [libshared],
2297 install_rpath : rootlibexecdir,
2299 install_dir : rootlibexecdir)
2301 executable('systemd-growfs',
2302 'src/partition/growfs.c',
2303 include_directories : includes,
2304 link_with : [libshared],
2305 dependencies : [libcryptsetup],
2306 install_rpath : rootlibexecdir,
2308 install_dir : rootlibexecdir)
2310 executable('systemd-makefs',
2311 'src/partition/makefs.c',
2312 include_directories : includes,
2313 link_with : [libshared],
2314 install_rpath : rootlibexecdir,
2316 install_dir : rootlibexecdir)
2318 executable('systemd-sleep',
2319 'src/sleep/sleep.c',
2320 include_directories : includes,
2321 link_with : [libshared],
2322 install_rpath : rootlibexecdir,
2324 install_dir : rootlibexecdir)
2326 exe = executable('systemd-sysctl',
2327 'src/sysctl/sysctl.c',
2328 include_directories : includes,
2329 link_with : [libshared],
2330 install_rpath : rootlibexecdir,
2332 install_dir : rootlibexecdir)
2333 public_programs += exe
2335 executable('systemd-ac-power',
2336 'src/ac-power/ac-power.c',
2337 include_directories : includes,
2338 link_with : [libshared],
2339 install_rpath : rootlibexecdir,
2341 install_dir : rootlibexecdir)
2343 exe = executable('systemd-detect-virt',
2344 'src/detect-virt/detect-virt.c',
2345 include_directories : includes,
2346 link_with : [libshared],
2347 install_rpath : rootlibexecdir,
2349 public_programs += exe
2351 exe = executable('systemd-delta',
2352 'src/delta/delta.c',
2353 include_directories : includes,
2354 link_with : [libshared],
2355 install_rpath : rootlibexecdir,
2357 public_programs += exe
2359 exe = executable('systemd-escape',
2360 'src/escape/escape.c',
2361 include_directories : includes,
2362 link_with : [libshared],
2363 install_rpath : rootlibexecdir,
2365 install_dir : rootbindir)
2366 public_programs += exe
2368 exe = executable('systemd-notify',
2369 'src/notify/notify.c',
2370 include_directories : includes,
2371 link_with : [libshared],
2372 install_rpath : rootlibexecdir,
2374 install_dir : rootbindir)
2375 public_programs += exe
2377 executable('systemd-volatile-root',
2378 'src/volatile-root/volatile-root.c',
2379 include_directories : includes,
2380 link_with : [libshared],
2381 install_rpath : rootlibexecdir,
2383 install_dir : rootlibexecdir)
2385 executable('systemd-cgroups-agent',
2386 'src/cgroups-agent/cgroups-agent.c',
2387 include_directories : includes,
2388 link_with : [libshared],
2389 install_rpath : rootlibexecdir,
2391 install_dir : rootlibexecdir)
2393 exe = executable('systemd-id128',
2394 'src/id128/id128.c',
2395 include_directories : includes,
2396 link_with : [libshared],
2397 install_rpath : rootlibexecdir,
2399 public_programs += exe
2401 exe = executable('systemd-path',
2403 include_directories : includes,
2404 link_with : [libshared],
2405 install_rpath : rootlibexecdir,
2407 public_programs += exe
2409 exe = executable('systemd-ask-password',
2410 'src/ask-password/ask-password.c',
2411 include_directories : includes,
2412 link_with : [libshared],
2413 install_rpath : rootlibexecdir,
2415 install_dir : rootbindir)
2416 public_programs += exe
2418 executable('systemd-reply-password',
2419 'src/reply-password/reply-password.c',
2420 include_directories : includes,
2421 link_with : [libshared],
2422 install_rpath : rootlibexecdir,
2424 install_dir : rootlibexecdir)
2426 exe = executable('systemd-tty-ask-password-agent',
2427 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2428 include_directories : includes,
2429 link_with : [libshared],
2430 install_rpath : rootlibexecdir,
2432 install_dir : rootbindir)
2433 public_programs += exe
2435 exe = executable('systemd-cgls',
2437 include_directories : includes,
2438 link_with : [libshared],
2439 install_rpath : rootlibexecdir,
2441 public_programs += exe
2443 exe = executable('systemd-cgtop',
2444 'src/cgtop/cgtop.c',
2445 include_directories : includes,
2446 link_with : [libshared],
2447 install_rpath : rootlibexecdir,
2449 public_programs += exe
2451 executable('systemd-initctl',
2452 'src/initctl/initctl.c',
2453 include_directories : includes,
2454 link_with : [libshared],
2455 install_rpath : rootlibexecdir,
2457 install_dir : rootlibexecdir)
2459 exe = executable('systemd-mount',
2460 'src/mount/mount-tool.c',
2461 include_directories : includes,
2462 link_with : [libshared],
2463 install_rpath : rootlibexecdir,
2465 public_programs += exe
2467 meson.add_install_script(meson_make_symlink,
2468 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2470 exe = executable('systemd-run',
2472 include_directories : includes,
2473 link_with : [libshared],
2474 install_rpath : rootlibexecdir,
2476 public_programs += exe
2478 exe = executable('systemd-stdio-bridge',
2479 'src/stdio-bridge/stdio-bridge.c',
2480 include_directories : includes,
2481 link_with : [libshared],
2482 install_rpath : rootlibexecdir,
2484 public_programs += exe
2486 exe = executable('busctl',
2487 'src/busctl/busctl.c',
2488 'src/busctl/busctl-introspect.c',
2489 'src/busctl/busctl-introspect.h',
2490 include_directories : includes,
2491 link_with : [libshared],
2492 install_rpath : rootlibexecdir,
2494 public_programs += exe
2496 if conf.get('ENABLE_SYSUSERS') == 1
2497 exe = executable('systemd-sysusers',
2498 'src/sysusers/sysusers.c',
2499 include_directories : includes,
2500 link_with : [libshared],
2501 install_rpath : rootlibexecdir,
2503 install_dir : rootbindir)
2504 public_programs += exe
2507 if conf.get('ENABLE_TMPFILES') == 1
2508 exe = executable('systemd-tmpfiles',
2509 'src/tmpfiles/tmpfiles.c',
2510 include_directories : includes,
2511 link_with : [libshared],
2512 dependencies : [libacl],
2513 install_rpath : rootlibexecdir,
2515 install_dir : rootbindir)
2516 public_programs += exe
2518 if want_tests != 'false'
2519 test('test-systemd-tmpfiles',
2520 test_systemd_tmpfiles_py,
2521 # https://github.com/mesonbuild/meson/issues/2681
2522 args : exe.full_path())
2526 if conf.get('ENABLE_HWDB') == 1
2527 exe = executable('systemd-hwdb',
2529 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2530 include_directories : includes,
2531 link_with : [libudev_static],
2532 install_rpath : udev_rpath,
2534 install_dir : rootbindir)
2535 public_programs += exe
2538 if conf.get('ENABLE_QUOTACHECK') == 1
2539 executable('systemd-quotacheck',
2540 'src/quotacheck/quotacheck.c',
2541 include_directories : includes,
2542 link_with : [libshared],
2543 install_rpath : rootlibexecdir,
2545 install_dir : rootlibexecdir)
2548 exe = executable('systemd-socket-proxyd',
2549 'src/socket-proxy/socket-proxyd.c',
2550 include_directories : includes,
2551 link_with : [libshared],
2552 dependencies : [threads],
2553 install_rpath : rootlibexecdir,
2555 install_dir : rootlibexecdir)
2556 public_programs += exe
2558 exe = executable('systemd-udevd',
2559 systemd_udevd_sources,
2560 include_directories : includes,
2561 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2562 link_with : [libudev_core,
2565 dependencies : [threads,
2570 install_rpath : udev_rpath,
2572 install_dir : rootlibexecdir)
2573 public_programs += exe
2575 exe = executable('udevadm',
2577 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2578 include_directories : includes,
2579 link_with : [libudev_core,
2582 dependencies : [threads,
2587 install_rpath : udev_rpath,
2589 install_dir : rootbindir)
2590 public_programs += exe
2592 executable('systemd-shutdown',
2593 systemd_shutdown_sources,
2594 include_directories : includes,
2595 link_with : [libshared],
2596 dependencies : [libmount],
2597 install_rpath : rootlibexecdir,
2599 install_dir : rootlibexecdir)
2601 executable('systemd-update-done',
2602 'src/update-done/update-done.c',
2603 include_directories : includes,
2604 link_with : [libshared],
2605 install_rpath : rootlibexecdir,
2607 install_dir : rootlibexecdir)
2609 executable('systemd-update-utmp',
2610 'src/update-utmp/update-utmp.c',
2611 include_directories : includes,
2612 link_with : [libshared],
2613 dependencies : [libaudit],
2614 install_rpath : rootlibexecdir,
2616 install_dir : rootlibexecdir)
2618 if conf.get('HAVE_KMOD') == 1
2619 executable('systemd-modules-load',
2620 'src/modules-load/modules-load.c',
2621 include_directories : includes,
2622 link_with : [libshared],
2623 dependencies : [libkmod],
2624 install_rpath : rootlibexecdir,
2626 install_dir : rootlibexecdir)
2628 meson.add_install_script('sh', '-c',
2629 mkdir_p.format(modulesloaddir))
2630 meson.add_install_script('sh', '-c',
2631 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2634 exe = executable('systemd-nspawn',
2635 systemd_nspawn_sources,
2636 'src/core/mount-setup.c', # FIXME: use a variable?
2637 'src/core/mount-setup.h',
2638 'src/core/loopback-setup.c',
2639 'src/core/loopback-setup.h',
2640 include_directories : includes,
2641 link_with : [libnspawn_core,
2643 dependencies : [libblkid],
2644 install_rpath : rootlibexecdir,
2646 public_programs += exe
2648 if conf.get('ENABLE_NETWORKD') == 1
2649 executable('systemd-networkd',
2650 systemd_networkd_sources,
2651 include_directories : includes,
2652 link_with : [libnetworkd_core,
2656 dependencies : [threads],
2657 install_rpath : rootlibexecdir,
2659 install_dir : rootlibexecdir)
2661 executable('systemd-networkd-wait-online',
2662 systemd_networkd_wait_online_sources,
2663 include_directories : includes,
2664 link_with : [libnetworkd_core,
2666 install_rpath : rootlibexecdir,
2668 install_dir : rootlibexecdir)
2670 exe = executable('networkctl',
2672 include_directories : includes,
2673 link_with : [libsystemd_network,
2675 install_rpath : rootlibexecdir,
2677 install_dir : rootbindir)
2678 public_programs += exe
2681 executable('systemd-sulogin-shell',
2682 ['src/sulogin-shell/sulogin-shell.c'],
2683 include_directories : includes,
2684 link_with : [libshared],
2685 install_rpath : rootlibexecdir,
2687 install_dir : rootlibexecdir)
2689 ############################################################
2692 'systemd-runtest.env',
2693 output : 'systemd-runtest.env',
2694 command : ['sh', '-c', '{ ' +
2695 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2696 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2698 build_by_default : true)
2700 foreach tuple : tests
2702 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2703 dependencies = tuple[2]
2704 condition = tuple.length() >= 4 ? tuple[3] : ''
2705 type = tuple.length() >= 5 ? tuple[4] : ''
2706 defs = tuple.length() >= 6 ? tuple[5] : []
2707 incs = tuple.length() >= 7 ? tuple[6] : includes
2710 name = sources[0].split('/')[-1].split('.')[0]
2711 if type.startswith('timeout=')
2712 timeout = type.split('=')[1].to_int()
2716 if condition == '' or conf.get(condition) == 1
2720 include_directories : incs,
2721 link_with : link_with,
2722 dependencies : dependencies,
2724 build_by_default : want_tests != 'false',
2725 install_rpath : rootlibexecdir,
2726 install : install_tests,
2727 install_dir : join_paths(testsdir, type))
2730 message('@0@ is a manual test'.format(name))
2731 elif type == 'unsafe' and want_tests != 'unsafe'
2732 message('@0@ is an unsafe test'.format(name))
2733 elif want_tests != 'false'
2739 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2744 'test-libsystemd-sym',
2745 test_libsystemd_sym_c,
2746 include_directories : includes,
2747 link_with : [libsystemd],
2748 build_by_default : want_tests != 'false',
2749 install : install_tests,
2750 install_dir : testsdir)
2751 if want_tests != 'false'
2752 test('test-libsystemd-sym', exe)
2756 'test-libsystemd-static-sym',
2757 test_libsystemd_sym_c,
2758 include_directories : includes,
2759 link_with : [install_libsystemd_static],
2760 dependencies : [threads], # threads is already included in dependencies on the library,
2761 # but does not seem to get propagated. Add here as a work-around.
2762 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2763 install : install_tests and static_libsystemd_pic,
2764 install_dir : testsdir)
2765 if want_tests != 'false' and static_libsystemd_pic
2766 test('test-libsystemd-static-sym', exe)
2772 include_directories : includes,
2773 c_args : '-Wno-deprecated-declarations',
2774 link_with : [libudev],
2775 build_by_default : want_tests != 'false',
2776 install : install_tests,
2777 install_dir : testsdir)
2778 if want_tests != 'false'
2779 test('test-libudev-sym', exe)
2783 'test-libudev-static-sym',
2785 include_directories : includes,
2786 c_args : '-Wno-deprecated-declarations',
2787 link_with : [install_libudev_static],
2788 build_by_default : want_tests != 'false' and static_libudev_pic,
2789 install : install_tests and static_libudev_pic,
2790 install_dir : testsdir)
2791 if want_tests != 'false' and static_libudev_pic
2792 test('test-libudev-static-sym', exe)
2795 ############################################################
2799 if get_option('tests') != 'false'
2800 foreach tuple : fuzzers
2802 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2803 dependencies = tuple[2]
2804 defs = tuple.length() >= 4 ? tuple[3] : []
2805 incs = tuple.length() >= 5 ? tuple[4] : includes
2808 dependencies += fuzzing_engine
2810 sources += 'src/fuzz/fuzz-main.c'
2813 name = sources[0].split('/')[-1].split('.')[0]
2815 fuzzer_exes += executable(
2818 include_directories : [incs, include_directories('src/fuzz')],
2819 link_with : link_with,
2820 dependencies : dependencies,
2826 run_target('fuzzers',
2827 depends : fuzzer_exes,
2830 ############################################################
2832 make_directive_index_py = find_program('tools/make-directive-index.py')
2833 make_man_index_py = find_program('tools/make-man-index.py')
2834 xml_helper_py = find_program('tools/xml_helper.py')
2835 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2839 subdir('sysusers.d')
2840 subdir('tmpfiles.d')
2845 subdir('shell-completion/bash')
2846 subdir('shell-completion/zsh')
2847 subdir('docs/sysvinit')
2848 subdir('docs/var-log')
2850 install_subdir('factory/etc',
2851 install_dir : factorydir)
2853 install_data('xorg/50-systemd-user.sh',
2854 install_dir : xinitrcdir)
2855 install_data('modprobe.d/systemd.conf',
2856 install_dir : modprobedir)
2857 install_data('LICENSE.GPL2',
2861 'docs/CODING_STYLE.md',
2862 'docs/DISTRO_PORTING.md',
2863 'docs/ENVIRONMENT.md',
2865 'docs/TRANSIENT-SETTINGS.md',
2866 'docs/TRANSLATORS.md',
2867 'docs/UIDS-GIDS.md',
2868 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2869 install_dir : docdir)
2871 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2872 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2874 ############################################################
2876 meson_check_help = find_program('tools/meson-check-help.sh')
2878 foreach exec : public_programs
2879 name = exec.full_path().split('/')[-1]
2880 if want_tests != 'false'
2881 test('check-help-' + name,
2883 args : exec.full_path())
2887 ############################################################
2889 # Enable tests for all supported sanitizers
2890 foreach tuple : sanitizers
2891 sanitizer = tuple[0]
2894 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2896 foreach p : fuzz_regression_tests
2897 b = p.split('/')[-2]
2898 c = p.split('/')[-1]
2900 name = '@0@:@1@'.format(b, sanitizer)
2903 if want_tests == 'false'
2904 message('Not compiling @0@ because tests is set to false'.format(name))
2906 exe = custom_target(
2910 command : [env, 'ln', '-fs',
2911 join_paths(build.full_path(), b),
2913 build_by_default : true)
2915 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2920 if want_tests != 'false' and slow_tests
2921 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2923 args : [exe.full_path(),
2924 join_paths(meson.source_root(), p)])
2931 ############################################################
2934 all_files = run_command(
2936 ['--git-dir=@0@/.git'.format(meson.source_root()),
2939 all_files = files(all_files.stdout().split())
2944 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
2947 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
2951 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2954 command : [meson_git_contrib_sh])
2958 git_head = run_command(
2960 ['--git-dir=@0@/.git'.format(meson.source_root()),
2961 'rev-parse', 'HEAD']).stdout().strip()
2962 git_head_short = run_command(
2964 ['--git-dir=@0@/.git'.format(meson.source_root()),
2965 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2969 command : ['git', 'archive',
2970 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
2972 '--prefix', 'systemd-@0@/'.format(git_head),
2976 ############################################################
2978 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2981 depends : [man, libsystemd, libudev],
2982 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2986 command : ['sh', '@0@/tools/make-index-md.sh'.format(meson.source_root()), meson.source_root()])
2988 ############################################################
2991 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2993 'split /usr: @0@'.format(split_usr),
2994 'split bin-sbin: @0@'.format(split_bin),
2995 'prefix directory: @0@'.format(prefixdir),
2996 'rootprefix directory: @0@'.format(rootprefixdir),
2997 'sysconf directory: @0@'.format(sysconfdir),
2998 'include directory: @0@'.format(includedir),
2999 'lib directory: @0@'.format(libdir),
3000 'rootlib directory: @0@'.format(rootlibdir),
3001 'SysV init scripts: @0@'.format(sysvinit_path),
3002 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3003 'PAM modules directory: @0@'.format(pamlibdir),
3004 'PAM configuration directory: @0@'.format(pamconfdir),
3005 'RPM macros directory: @0@'.format(rpmmacrosdir),
3006 'modprobe.d directory: @0@'.format(modprobedir),
3007 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3008 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3009 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3010 'bash completions directory: @0@'.format(bashcompletiondir),
3011 'zsh completions directory: @0@'.format(zshcompletiondir),
3012 'extra start script: @0@'.format(get_option('rc-local')),
3013 'extra stop script: @0@'.format(get_option('halt-local')),
3014 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3015 get_option('debug-tty')),
3016 'TTY GID: @0@'.format(tty_gid),
3017 'users GID: @0@'.format(substs.get('USERS_GID')),
3018 'maximum system UID: @0@'.format(system_uid_max),
3019 'maximum system GID: @0@'.format(system_gid_max),
3020 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3021 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3022 'minimum container UID base: @0@'.format(container_uid_base_min),
3023 'maximum container UID base: @0@'.format(container_uid_base_max),
3024 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3025 'render group access mode: @0@'.format(get_option('group-render-mode')),
3026 'certificate root directory: @0@'.format(get_option('certificate-root')),
3027 'support URL: @0@'.format(support_url),
3028 'nobody user name: @0@'.format(nobody_user),
3029 'nobody group name: @0@'.format(nobody_group),
3030 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3031 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3033 'default DNSSEC mode: @0@'.format(default_dnssec),
3034 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3035 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3036 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
3038 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3039 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3041 'default DNS servers: @0@'.format(alt_dns_servers),
3042 'default NTP servers: @0@'.format(alt_ntp_servers)]
3044 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3045 '@@0@'.format(time_epoch)).stdout().strip()
3047 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3050 'static libsystemd: @0@'.format(static_libsystemd),
3051 'static libudev: @0@'.format(static_libudev)]
3054 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3055 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3056 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3058 if conf.get('ENABLE_EFI') == 1
3059 status += 'efi arch: @0@'.format(efi_arch)
3063 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3064 'EFI CC @0@'.format(efi_cc),
3065 'EFI lib directory: @0@'.format(efi_libdir),
3066 'EFI lds directory: @0@'.format(efi_ldsdir),
3067 'EFI include directory: @0@'.format(efi_incdir)]
3119 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3120 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3123 ['legacy pkla', install_polkit_pkla],
3125 ['gnu-efi', have_gnu_efi],
3138 ['man pages', want_man],
3139 ['html pages', want_html],
3140 ['man page indices', want_man and have_lxml],
3145 ['adm group', get_option('adm-group')],
3146 ['wheel group', get_option('wheel-group')],
3149 ['debug mmap cache'],
3152 ['valgrind', conf.get('VALGRIND') == 1],
3153 ['trace logging', conf.get('LOG_TRACE') == 1],
3154 ['link-udev-shared', get_option('link-udev-shared')],
3155 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3158 if tuple.length() >= 2
3161 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3162 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3163 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3174 'enabled features: @0@'.format(', '.join(found)),
3176 'disabled features: @0@'.format(', '.join(missing)),
3178 message('\n '.join(status))
3180 if rootprefixdir != rootprefix_default
3182 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3183 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3184 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))