1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
12 meson_version : '>= 0.46',
15 libsystemd_version = '0.23.0'
16 libudev_version = '1.6.11'
18 # We need the same data in two different formats, ugh!
19 # Also, for hysterical reasons, we use different variable
20 # names, sometimes. Not all variables are included in every
22 conf = configuration_data()
23 conf.set_quoted('PACKAGE_STRING', meson.project_name() + ' ' + meson.project_version())
24 conf.set_quoted('PACKAGE_VERSION', meson.project_version())
26 substs = configuration_data()
27 substs.set('PACKAGE_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
28 substs.set('PACKAGE_VERSION', meson.project_version())
30 want_ossfuzz = get_option('oss-fuzz')
31 want_libfuzzer = get_option('llvm-fuzz')
32 if want_ossfuzz and want_libfuzzer
33 error('only one of oss-fuzz and llvm-fuzz can be specified')
35 fuzzer_build = want_ossfuzz or want_libfuzzer
37 #####################################################################
39 # Try to install the git pre-commit hook
40 git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
41 if git_hook.returncode() == 0
42 message(git_hook.stdout().strip())
45 #####################################################################
47 if get_option('split-usr') == 'auto'
48 split_usr = run_command('test', '-L', '/bin').returncode() != 0
50 split_usr = get_option('split-usr') == 'true'
52 conf.set10('HAVE_SPLIT_USR', split_usr,
53 description : '/usr/bin and /bin directories are separate')
55 if get_option('split-bin') == 'auto'
56 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
58 split_bin = get_option('split-bin') == 'true'
60 conf.set10('HAVE_SPLIT_BIN', split_bin,
61 description : 'bin and sbin directories are separate')
63 rootprefixdir = get_option('rootprefix')
64 # Unusual rootprefixdir values are used by some distros
65 # (see https://github.com/systemd/systemd/pull/7461).
66 rootprefix_default = split_usr ? '/' : '/usr'
67 if rootprefixdir == ''
68 rootprefixdir = rootprefix_default
71 sysvinit_path = get_option('sysvinit-path')
72 sysvrcnd_path = get_option('sysvrcnd-path')
73 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
74 description : 'SysV init scripts and rcN.d links are supported')
76 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
77 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
78 conf.set('HIGH_RLIMIT_NOFILE', 256*1024)
80 # join_paths ignore the preceding arguments if an absolute component is
81 # encountered, so this should canonicalize various paths when they are
82 # absolute or relative.
83 prefixdir = get_option('prefix')
84 if not prefixdir.startswith('/')
85 error('Prefix is not absolute: "@0@"'.format(prefixdir))
87 bindir = join_paths(prefixdir, get_option('bindir'))
88 libdir = join_paths(prefixdir, get_option('libdir'))
89 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
90 includedir = join_paths(prefixdir, get_option('includedir'))
91 datadir = join_paths(prefixdir, get_option('datadir'))
92 localstatedir = join_paths('/', get_option('localstatedir'))
94 rootbindir = join_paths(rootprefixdir, 'bin')
95 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
96 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
98 rootlibdir = get_option('rootlibdir')
100 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
103 # Dirs of external packages
104 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
105 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
106 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
107 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
108 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
109 varlogdir = join_paths(localstatedir, 'log')
110 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
111 rpmmacrosdir = get_option('rpmmacrosdir')
112 if rpmmacrosdir != 'no'
113 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
115 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
118 pkgdatadir = join_paths(datadir, 'systemd')
119 environmentdir = join_paths(prefixdir, 'lib/environment.d')
120 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
121 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
122 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
123 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
124 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
125 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
126 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
127 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
128 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
129 pkgincludedir = join_paths(includedir, 'systemd')
130 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
131 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
132 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
133 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
134 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
135 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
136 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
137 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
138 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
139 udevhomedir = udevlibexecdir
140 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
141 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
142 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
143 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
144 factorydir = join_paths(datadir, 'factory')
145 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
146 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
147 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
148 catalogstatedir = join_paths(systemdstatedir, 'catalog')
149 randomseeddir = join_paths(localstatedir, 'lib/systemd')
150 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
152 docdir = get_option('docdir')
154 docdir = join_paths(datadir, 'doc/systemd')
157 dbuspolicydir = get_option('dbuspolicydir')
158 if dbuspolicydir == ''
159 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
162 dbussessionservicedir = get_option('dbussessionservicedir')
163 if dbussessionservicedir == ''
164 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
167 dbussystemservicedir = get_option('dbussystemservicedir')
168 if dbussystemservicedir == ''
169 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
172 pamlibdir = get_option('pamlibdir')
174 pamlibdir = join_paths(rootlibdir, 'security')
177 pamconfdir = get_option('pamconfdir')
179 pamconfdir = join_paths(sysconfdir, 'pam.d')
182 memory_accounting_default = get_option('memory-accounting-default')
184 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
185 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
186 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
187 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
188 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
189 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
190 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
192 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
194 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
195 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
196 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
197 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
198 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
199 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
200 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
201 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
202 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
203 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
204 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
205 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
206 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
207 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
208 conf.set_quoted('ROOTPREFIX', rootprefixdir)
209 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
210 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
211 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
212 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
213 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
214 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
215 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
216 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
217 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
218 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
219 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
220 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
221 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
222 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
223 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
224 conf.set_quoted('LIBDIR', libdir)
225 conf.set_quoted('ROOTLIBDIR', rootlibdir)
226 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
227 conf.set_quoted('BOOTLIBDIR', bootlibdir)
228 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
229 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
230 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
231 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
232 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
233 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
234 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
235 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
237 substs.set('prefix', prefixdir)
238 substs.set('exec_prefix', prefixdir)
239 substs.set('libdir', libdir)
240 substs.set('rootlibdir', rootlibdir)
241 substs.set('includedir', includedir)
242 substs.set('pkgsysconfdir', pkgsysconfdir)
243 substs.set('bindir', bindir)
244 substs.set('rootbindir', rootbindir)
245 substs.set('rootlibexecdir', rootlibexecdir)
246 substs.set('systemunitdir', systemunitdir)
247 substs.set('userunitdir', userunitdir)
248 substs.set('systempresetdir', systempresetdir)
249 substs.set('userpresetdir', userpresetdir)
250 substs.set('udevhwdbdir', udevhwdbdir)
251 substs.set('udevrulesdir', udevrulesdir)
252 substs.set('udevlibexecdir', udevlibexecdir)
253 substs.set('environmentdir', environmentdir)
254 substs.set('catalogdir', catalogdir)
255 substs.set('tmpfilesdir', tmpfilesdir)
256 substs.set('sysusersdir', sysusersdir)
257 substs.set('sysctldir', sysctldir)
258 substs.set('binfmtdir', binfmtdir)
259 substs.set('modulesloaddir', modulesloaddir)
260 substs.set('modprobedir', modprobedir)
261 substs.set('systemgeneratordir', systemgeneratordir)
262 substs.set('usergeneratordir', usergeneratordir)
263 substs.set('systemenvgeneratordir', systemenvgeneratordir)
264 substs.set('userenvgeneratordir', userenvgeneratordir)
265 substs.set('systemshutdowndir', systemshutdowndir)
266 substs.set('systemsleepdir', systemsleepdir)
267 substs.set('VARLOGDIR', varlogdir)
268 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
269 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
270 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
271 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
272 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
273 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
274 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
275 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
276 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
278 #####################################################################
280 cc = meson.get_compiler('c')
281 pkgconfig = import('pkgconfig')
282 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
283 meson_build_sh = find_program('tools/meson-build.sh')
285 want_tests = get_option('tests')
286 slow_tests = want_tests != 'false' and get_option('slow-tests')
287 install_tests = get_option('install-tests')
289 cxx = find_program('c++', required : fuzzer_build)
291 # Used only for tests
293 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
299 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
301 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
304 possible_cc_flags = [
308 '-Wmissing-include-dirs',
309 '-Wold-style-definition',
313 '-Wsuggest-attribute=noreturn',
314 '-Werror=missing-prototypes',
315 '-Werror=implicit-function-declaration',
316 '-Werror=missing-declarations',
317 '-Werror=return-type',
318 '-Werror=incompatible-pointer-types',
320 '-Wstrict-prototypes',
322 '-Wmissing-noreturn',
323 '-Wimplicit-fallthrough=5',
326 '-Wstrict-aliasing=2',
329 '-Werror=shift-count-overflow',
330 '-Werror=shift-overflow=2',
334 # negative arguments are correctly detected starting with meson 0.46.
335 '-Wno-unused-parameter',
336 '-Wno-missing-field-initializers',
337 '-Wno-unused-result',
338 '-Wno-format-signedness',
340 # work-around for gcc 7.1 turning this on on its own.
341 '-Wno-error=nonnull',
343 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
344 # optimizations enabled, producing essentially false positives.
345 '-Wno-maybe-uninitialized',
349 '-fdiagnostics-show-option',
350 '-fno-strict-aliasing',
351 '-fvisibility=hidden',
353 '-fstack-protector-strong',
354 '--param=ssp-buffer-size=4',
357 # --as-needed and --no-undefined are provided by meson by default,
358 # run mesonconf to see what is enabled
359 possible_link_flags = [
364 # the oss-fuzz fuzzers are not built with -fPIE, so don't
365 # enable it when we are linking against them
367 possible_cc_flags += '-fPIE'
368 possible_link_flags += '-pie'
371 if cc.get_id() == 'clang'
372 possible_cc_flags += [
373 '-Wno-typedef-redefinition',
374 '-Wno-gnu-variable-sized-type-not-at-end',
378 if get_option('buildtype') != 'debug'
379 possible_cc_flags += [
380 '-ffunction-sections',
384 possible_link_flags += '-Wl,--gc-sections'
387 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
388 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
392 #include <inttypes.h>
393 typedef uint64_t usec_t;
394 usec_t now(clockid_t clock);
399 ''', name : '-Werror=shadow with local shadowing')
400 add_project_arguments('-Werror=shadow', language : 'c')
403 cpp = ' '.join(cc.cmd_array()) + ' -E'
405 #####################################################################
406 # compilation result tests
408 conf.set('_GNU_SOURCE', true)
409 conf.set('__SANE_USERSPACE_TYPES__', true)
411 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
412 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
413 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
414 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
415 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
416 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
417 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
421 #include <linux/ethtool.h>
422 #include <linux/fib_rules.h>
423 #include <sys/stat.h>
426 foreach decl : ['char16_t',
428 'struct ethtool_link_settings',
429 'struct fib_rule_uid_range',
433 # We get -1 if the size cannot be determined
434 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
436 if decl == 'struct statx'
438 want_linux_stat_h = false
440 have = cc.sizeof(decl,
441 prefix : decl_headers + '#include <linux/stat.h>',
442 args : '-D_GNU_SOURCE') > 0
443 want_linux_stat_h = have
447 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
450 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
452 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
453 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
454 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
455 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
456 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
457 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
458 ['IFLA_BOND_AD_ACTOR_SYSTEM', 'linux/if_link.h'],
459 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
460 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
461 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
462 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
463 # if_tunnel.h is buggy and cannot be included on its own
464 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
465 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
466 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
467 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
468 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
469 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
470 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
471 ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
472 ['NDA_IFINDEX', 'linux/neighbour.h'],
473 ['IFA_FLAGS', 'linux/if_addr.h'],
474 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
475 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
476 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
477 ['FOU_ATTR_REMCSUM_NOPARTIAL', 'linux/fou.h'],
478 ['FOU_CMD_GET', 'linux/fou.h'],
479 ['ETHTOOL_LINK_MODE_10baseT_Half_BIT', 'linux/ethtool.h'],
480 ['ETHTOOL_LINK_MODE_25000baseCR_Full_BIT', 'linux/ethtool.h'],
481 ['ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT', 'linux/ethtool.h'],
482 ['ETHTOOL_LINK_MODE_1000baseX_Full_BIT', 'linux/ethtool.h'],
483 ['ETHTOOL_LINK_MODE_2500baseT_Full_BIT', 'linux/ethtool.h'],
484 ['ETHTOOL_LINK_MODE_FEC_NONE_BIT', 'linux/ethtool.h'],
486 prefix = decl.length() > 2 ? decl[2] : ''
487 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
488 conf.set10('HAVE_' + decl[0], have)
491 foreach ident : ['secure_getenv', '__secure_getenv']
492 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
496 ['memfd_create', '''#include <sys/mman.h>'''],
497 ['gettid', '''#include <sys/types.h>
498 #include <unistd.h>'''],
499 ['pivot_root', '''#include <stdlib.h>
500 #include <unistd.h>'''], # no known header declares pivot_root
501 ['name_to_handle_at', '''#include <sys/types.h>
502 #include <sys/stat.h>
503 #include <fcntl.h>'''],
504 ['setns', '''#include <sched.h>'''],
505 ['renameat2', '''#include <stdio.h>
506 #include <fcntl.h>'''],
507 ['kcmp', '''#include <linux/kcmp.h>'''],
508 ['keyctl', '''#include <sys/types.h>
509 #include <keyutils.h>'''],
510 ['copy_file_range', '''#include <sys/syscall.h>
511 #include <unistd.h>'''],
512 ['bpf', '''#include <sys/syscall.h>
513 #include <unistd.h>'''],
514 ['statx', '''#include <sys/types.h>
515 #include <sys/stat.h>
516 #include <unistd.h>'''],
517 ['explicit_bzero' , '''#include <string.h>'''],
518 ['reallocarray', '''#include <malloc.h>'''],
521 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
522 conf.set10('HAVE_' + ident[0].to_upper(), have)
525 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
526 conf.set10('USE_SYS_RANDOM_H', true)
527 conf.set10('HAVE_GETRANDOM', true)
529 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
530 conf.set10('USE_SYS_RANDOM_H', false)
531 conf.set10('HAVE_GETRANDOM', have)
534 #####################################################################
536 sed = find_program('sed')
537 awk = find_program('awk')
538 m4 = find_program('m4')
539 stat = find_program('stat')
540 git = find_program('git', required : false)
541 env = find_program('env')
542 perl = find_program('perl', required : false)
544 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
545 mkdir_p = 'mkdir -p $DESTDIR/@0@'
546 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
547 splash_bmp = files('test/splash.bmp')
549 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
550 # /usr/sbin, /sbin, and fall back to the default from middle column.
551 progs = [['quotaon', '/usr/sbin/quotaon' ],
552 ['quotacheck', '/usr/sbin/quotacheck' ],
553 ['kmod', '/usr/bin/kmod' ],
554 ['kexec', '/usr/sbin/kexec' ],
555 ['sulogin', '/usr/sbin/sulogin' ],
556 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
557 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
558 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
559 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
562 path = get_option(prog[0] + '-path')
564 message('Using @1@ for @0@'.format(prog[0], path))
566 exe = find_program(prog[0],
567 '/usr/sbin/' + prog[0],
570 path = exe.found() ? exe.path() : prog[1]
572 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
573 conf.set_quoted(name, path)
574 substs.set(name, path)
577 conf.set_quoted('TELINIT', get_option('telinit-path'))
579 if run_command('ln', '--relative', '--help').returncode() != 0
580 error('ln does not support --relative (added in coreutils 8.16)')
583 ############################################################
585 gperf = find_program('gperf')
587 gperf_test_format = '''
589 const char * in_word_set(const char *, @0@);
592 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
593 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
594 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
595 if cc.compiles(gperf_test)
596 gperf_len_type = 'size_t'
598 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
599 if cc.compiles(gperf_test)
600 gperf_len_type = 'unsigned'
602 error('unable to determine gperf len type')
605 message('gperf len type is @0@'.format(gperf_len_type))
606 conf.set('GPERF_LEN_TYPE', gperf_len_type,
607 description : 'The type of gperf "len" parameter')
609 ############################################################
611 if not cc.has_header('sys/capability.h')
612 error('POSIX caps headers not found')
614 foreach header : ['crypt.h',
618 'linux/vm_sockets.h',
620 'valgrind/memcheck.h',
621 'valgrind/valgrind.h',
624 conf.set10('HAVE_' + header.underscorify().to_upper(),
625 cc.has_header(header))
628 ############################################################
630 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
631 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
632 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
634 default_hierarchy = get_option('default-hierarchy')
635 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
636 description : 'default cgroup hierarchy as string')
637 if default_hierarchy == 'legacy'
638 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
639 elif default_hierarchy == 'hybrid'
640 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
642 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
645 time_epoch = get_option('time-epoch')
648 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
650 conf.set('TIME_EPOCH', time_epoch)
652 system_uid_max = get_option('system-uid-max')
653 if system_uid_max == -1
654 system_uid_max = run_command(
656 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
657 '/etc/login.defs').stdout().strip()
658 if system_uid_max == ''
661 system_uid_max = system_uid_max.to_int()
664 conf.set('SYSTEM_UID_MAX', system_uid_max)
665 substs.set('systemuidmax', system_uid_max)
667 system_gid_max = get_option('system-gid-max')
668 if system_gid_max == -1
669 system_gid_max = run_command(
671 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
672 '/etc/login.defs').stdout().strip()
673 if system_gid_max == ''
676 system_gid_max = system_gid_max.to_int()
679 conf.set('SYSTEM_GID_MAX', system_gid_max)
680 substs.set('systemgidmax', system_gid_max)
682 dynamic_uid_min = get_option('dynamic-uid-min')
683 dynamic_uid_max = get_option('dynamic-uid-max')
684 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
685 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
686 substs.set('dynamicuidmin', dynamic_uid_min)
687 substs.set('dynamicuidmax', dynamic_uid_max)
689 container_uid_base_min = get_option('container-uid-base-min')
690 container_uid_base_max = get_option('container-uid-base-max')
691 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
692 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
693 substs.set('containeruidbasemin', container_uid_base_min)
694 substs.set('containeruidbasemax', container_uid_base_max)
696 nobody_user = get_option('nobody-user')
697 nobody_group = get_option('nobody-group')
699 if not meson.is_cross_build()
700 getent_result = run_command('getent', 'passwd', '65534')
701 if getent_result.returncode() == 0
702 name = getent_result.stdout().split(':')[0]
703 if name != nobody_user
705 'The local user with the UID 65534 does not match the configured user name "@0@" of the nobody user (its name is @1@).\n'.format(nobody_user, name) +
706 'Your build will result in an user table setup that is incompatible with the local system.')
709 id_result = run_command('id', '-u', nobody_user)
710 if id_result.returncode() == 0
711 id = id_result.stdout().to_int()
714 'The local user with the configured user name "@0@" of the nobody user does not have UID 65534 (it has @1@).\n'.format(nobody_user, id) +
715 'Your build will result in an user table setup that is incompatible with the local system.')
719 getent_result = run_command('getent', 'group', '65534')
720 if getent_result.returncode() == 0
721 name = getent_result.stdout().split(':')[0]
722 if name != nobody_group
724 'The local group with the GID 65534 does not match the configured group name "@0@" of the nobody group (its name is @1@).\n'.format(nobody_group, name) +
725 'Your build will result in an group table setup that is incompatible with the local system.')
728 id_result = run_command('id', '-g', nobody_group)
729 if id_result.returncode() == 0
730 id = id_result.stdout().to_int()
733 'The local group with the configured group name "@0@" of the nobody group does not have UID 65534 (it has @1@).\n'.format(nobody_group, id) +
734 'Your build will result in an group table setup that is incompatible with the local system.')
738 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
740 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
741 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
744 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
745 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
746 substs.set('NOBODY_USER_NAME', nobody_user)
747 substs.set('NOBODY_GROUP_NAME', nobody_group)
749 tty_gid = get_option('tty-gid')
750 conf.set('TTY_GID', tty_gid)
751 substs.set('TTY_GID', tty_gid)
753 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
754 users_gid = get_option('users-gid')
755 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
757 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
758 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
760 dev_kvm_mode = get_option('dev-kvm-mode')
761 substs.set('DEV_KVM_MODE', dev_kvm_mode)
762 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
763 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
765 kill_user_processes = get_option('default-kill-user-processes')
766 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
767 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
768 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
770 dns_servers = get_option('dns-servers')
771 conf.set_quoted('DNS_SERVERS', dns_servers)
772 substs.set('DNS_SERVERS', dns_servers)
774 ntp_servers = get_option('ntp-servers')
775 conf.set_quoted('NTP_SERVERS', ntp_servers)
776 substs.set('NTP_SERVERS', ntp_servers)
778 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
780 substs.set('SUSHELL', get_option('debug-shell'))
781 substs.set('DEBUGTTY', get_option('debug-tty'))
783 enable_debug_hashmap = false
784 enable_debug_mmap_cache = false
785 enable_debug_siphash = false
786 enable_debug_udev = false
787 foreach name : get_option('debug-extra')
789 enable_debug_hashmap = true
790 elif name == 'mmap-cache'
791 enable_debug_mmap_cache = true
792 elif name == 'siphash'
793 enable_debug_siphash = true
795 enable_debug_udev = true
797 message('unknown debug option "@0@", ignoring'.format(name))
800 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
801 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
802 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
803 conf.set10('ENABLE_DEBUG_UDEV', enable_debug_udev)
805 conf.set10('VALGRIND', get_option('valgrind'))
806 conf.set10('LOG_TRACE', get_option('log-trace'))
808 #####################################################################
810 threads = dependency('threads')
811 librt = cc.find_library('rt')
812 libm = cc.find_library('m')
813 libdl = cc.find_library('dl')
814 libcrypt = cc.find_library('crypt')
816 libcap = dependency('libcap', required : false)
817 if not libcap.found()
818 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
819 libcap = cc.find_library('cap')
822 libmount = dependency('mount',
823 version : fuzzer_build ? '>= 0' : '>= 2.30')
825 want_seccomp = get_option('seccomp')
826 if want_seccomp != 'false' and not fuzzer_build
827 libseccomp = dependency('libseccomp',
828 version : '>= 2.3.1',
829 required : want_seccomp == 'true')
830 have = libseccomp.found()
835 conf.set10('HAVE_SECCOMP', have)
837 want_selinux = get_option('selinux')
838 if want_selinux != 'false' and not fuzzer_build
839 libselinux = dependency('libselinux',
840 version : '>= 2.1.9',
841 required : want_selinux == 'true')
842 have = libselinux.found()
847 conf.set10('HAVE_SELINUX', have)
849 want_apparmor = get_option('apparmor')
850 if want_apparmor != 'false' and not fuzzer_build
851 libapparmor = dependency('libapparmor',
852 required : want_apparmor == 'true')
853 have = libapparmor.found()
858 conf.set10('HAVE_APPARMOR', have)
860 smack_run_label = get_option('smack-run-label')
861 if smack_run_label != ''
862 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
865 want_polkit = get_option('polkit')
866 install_polkit = false
867 install_polkit_pkla = false
868 if want_polkit != 'false' and not fuzzer_build
869 install_polkit = true
871 libpolkit = dependency('polkit-gobject-1',
873 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
874 message('Old polkit detected, will install pkla files')
875 install_polkit_pkla = true
878 conf.set10('ENABLE_POLKIT', install_polkit)
880 want_acl = get_option('acl')
881 if want_acl != 'false' and not fuzzer_build
882 libacl = cc.find_library('acl', required : want_acl == 'true')
883 have = libacl.found()
888 conf.set10('HAVE_ACL', have)
890 want_audit = get_option('audit')
891 if want_audit != 'false' and not fuzzer_build
892 libaudit = dependency('audit', required : want_audit == 'true')
893 have = libaudit.found()
898 conf.set10('HAVE_AUDIT', have)
900 want_blkid = get_option('blkid')
901 if want_blkid != 'false' and not fuzzer_build
902 libblkid = dependency('blkid', required : want_blkid == 'true')
903 have = libblkid.found()
908 conf.set10('HAVE_BLKID', have)
910 want_kmod = get_option('kmod')
911 if want_kmod != 'false' and not fuzzer_build
912 libkmod = dependency('libkmod',
914 required : want_kmod == 'true')
915 have = libkmod.found()
920 conf.set10('HAVE_KMOD', have)
922 want_pam = get_option('pam')
923 if want_pam != 'false' and not fuzzer_build
924 libpam = cc.find_library('pam', required : want_pam == 'true')
925 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
926 have = libpam.found() and libpam_misc.found()
932 conf.set10('HAVE_PAM', have)
934 want_microhttpd = get_option('microhttpd')
935 if want_microhttpd != 'false' and not fuzzer_build
936 libmicrohttpd = dependency('libmicrohttpd',
937 version : '>= 0.9.33',
938 required : want_microhttpd == 'true')
939 have = libmicrohttpd.found()
944 conf.set10('HAVE_MICROHTTPD', have)
946 want_libcryptsetup = get_option('libcryptsetup')
947 if want_libcryptsetup != 'false' and not fuzzer_build
948 libcryptsetup = dependency('libcryptsetup',
949 version : '>= 1.6.0',
950 required : want_libcryptsetup == 'true')
951 have = libcryptsetup.found()
952 have_sector = cc.has_member(
953 'struct crypt_params_plain',
955 prefix : '#include <libcryptsetup.h>')
961 conf.set10('HAVE_LIBCRYPTSETUP', have)
962 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
964 want_libcurl = get_option('libcurl')
965 if want_libcurl != 'false' and not fuzzer_build
966 libcurl = dependency('libcurl',
967 version : '>= 7.32.0',
968 required : want_libcurl == 'true')
969 have = libcurl.found()
974 conf.set10('HAVE_LIBCURL', have)
976 want_libidn = get_option('libidn')
977 want_libidn2 = get_option('libidn2')
978 if want_libidn == 'true' and want_libidn2 == 'true'
979 error('libidn and libidn2 cannot be requested simultaneously')
982 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
983 libidn = dependency('libidn',
984 required : want_libidn == 'true')
985 have = libidn.found()
990 conf.set10('HAVE_LIBIDN', have)
991 if not have and want_libidn2 != 'false' and not fuzzer_build
992 # libidn is used for both libidn and libidn2 objects
993 libidn = dependency('libidn2',
994 required : want_libidn2 == 'true')
995 have = libidn.found()
999 conf.set10('HAVE_LIBIDN2', have)
1001 want_libiptc = get_option('libiptc')
1002 if want_libiptc != 'false' and not fuzzer_build
1003 libiptc = dependency('libiptc',
1004 required : want_libiptc == 'true')
1005 have = libiptc.found()
1010 conf.set10('HAVE_LIBIPTC', have)
1012 want_qrencode = get_option('qrencode')
1013 if want_qrencode != 'false' and not fuzzer_build
1014 libqrencode = dependency('libqrencode',
1015 required : want_qrencode == 'true')
1016 have = libqrencode.found()
1021 conf.set10('HAVE_QRENCODE', have)
1023 want_gcrypt = get_option('gcrypt')
1024 if want_gcrypt != 'false' and not fuzzer_build
1025 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1026 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1027 have = libgcrypt.found() and libgpg_error.found()
1032 # link to neither of the libs if one is not found
1036 conf.set10('HAVE_GCRYPT', have)
1038 want_gnutls = get_option('gnutls')
1039 if want_gnutls != 'false' and not fuzzer_build
1040 libgnutls = dependency('gnutls',
1041 version : '>= 3.1.4',
1042 required : want_gnutls == 'true')
1043 have = libgnutls.found()
1048 conf.set10('HAVE_GNUTLS', have)
1050 want_openssl = get_option('openssl')
1051 if want_openssl != 'false' and not fuzzer_build
1052 libopenssl = dependency('openssl',
1053 version : '>= 1.1.0',
1054 required : want_openssl == 'true')
1055 have = libopenssl.found()
1060 conf.set10('HAVE_OPENSSL', have)
1062 want_elfutils = get_option('elfutils')
1063 if want_elfutils != 'false' and not fuzzer_build
1064 libdw = dependency('libdw',
1065 required : want_elfutils == 'true')
1066 have = libdw.found()
1071 conf.set10('HAVE_ELFUTILS', have)
1073 want_zlib = get_option('zlib')
1074 if want_zlib != 'false' and not fuzzer_build
1075 libz = dependency('zlib',
1076 required : want_zlib == 'true')
1082 conf.set10('HAVE_ZLIB', have)
1084 want_bzip2 = get_option('bzip2')
1085 if want_bzip2 != 'false' and not fuzzer_build
1086 libbzip2 = cc.find_library('bz2',
1087 required : want_bzip2 == 'true')
1088 have = libbzip2.found()
1093 conf.set10('HAVE_BZIP2', have)
1095 want_xz = get_option('xz')
1096 if want_xz != 'false' and not fuzzer_build
1097 libxz = dependency('liblzma',
1098 required : want_xz == 'true')
1099 have = libxz.found()
1104 conf.set10('HAVE_XZ', have)
1106 want_lz4 = get_option('lz4')
1107 if want_lz4 != 'false' and not fuzzer_build
1108 liblz4 = dependency('liblz4',
1109 version : '>= 1.3.0',
1110 required : want_lz4 == 'true')
1111 have = liblz4.found()
1116 conf.set10('HAVE_LZ4', have)
1118 want_xkbcommon = get_option('xkbcommon')
1119 if want_xkbcommon != 'false' and not fuzzer_build
1120 libxkbcommon = dependency('xkbcommon',
1121 version : '>= 0.3.0',
1122 required : want_xkbcommon == 'true')
1123 have = libxkbcommon.found()
1128 conf.set10('HAVE_XKBCOMMON', have)
1130 want_pcre2 = get_option('pcre2')
1131 if want_pcre2 != 'false'
1132 libpcre2 = dependency('libpcre2-8',
1133 required : want_pcre2 == 'true')
1134 have = libpcre2.found()
1139 conf.set10('HAVE_PCRE2', have)
1141 want_glib = get_option('glib')
1142 if want_glib != 'false' and not fuzzer_build
1143 libglib = dependency('glib-2.0',
1144 version : '>= 2.22.0',
1145 required : want_glib == 'true')
1146 libgobject = dependency('gobject-2.0',
1147 version : '>= 2.22.0',
1148 required : want_glib == 'true')
1149 libgio = dependency('gio-2.0',
1150 required : want_glib == 'true')
1151 have = libglib.found() and libgobject.found() and libgio.found()
1158 conf.set10('HAVE_GLIB', have)
1160 want_dbus = get_option('dbus')
1161 if want_dbus != 'false' and not fuzzer_build
1162 libdbus = dependency('dbus-1',
1163 version : '>= 1.3.2',
1164 required : want_dbus == 'true')
1165 have = libdbus.found()
1170 conf.set10('HAVE_DBUS', have)
1172 default_dnssec = get_option('default-dnssec')
1174 default_dnssec = 'no'
1176 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1177 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1178 default_dnssec = 'no'
1180 conf.set('DEFAULT_DNSSEC_MODE',
1181 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1182 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1184 dns_over_tls = get_option('dns-over-tls')
1185 if dns_over_tls != 'false'
1186 if dns_over_tls == 'openssl'
1189 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1190 if dns_over_tls == 'gnutls' and not have_gnutls
1191 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1194 if dns_over_tls == 'gnutls' or have_gnutls
1195 have_openssl = false
1197 have_openssl = conf.get('HAVE_OPENSSL') == 1
1198 if dns_over_tls != 'auto' and not have_openssl
1199 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1200 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1203 have = have_gnutls or have_openssl
1207 have_openssl = false
1209 conf.set10('ENABLE_DNS_OVER_TLS', have)
1210 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1211 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1213 default_dns_over_tls = get_option('default-dns-over-tls')
1215 default_dns_over_tls = 'no'
1217 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1218 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1219 default_dns_over_tls = 'no'
1221 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1222 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1223 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1225 want_importd = get_option('importd')
1226 if want_importd != 'false'
1227 have = (conf.get('HAVE_LIBCURL') == 1 and
1228 conf.get('HAVE_ZLIB') == 1 and
1229 conf.get('HAVE_XZ') == 1 and
1230 conf.get('HAVE_GCRYPT') == 1)
1231 if want_importd == 'true' and not have
1232 error('importd support was requested, but dependencies are not available')
1237 conf.set10('ENABLE_IMPORTD', have)
1239 want_remote = get_option('remote')
1240 if want_remote != 'false'
1241 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1242 conf.get('HAVE_LIBCURL') == 1]
1243 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1244 # it's possible to build one without the other. Complain only if
1245 # support was explictly requested. The auxiliary files like sysusers
1246 # config should be installed when any of the programs are built.
1247 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1248 error('remote support was requested, but dependencies are not available')
1250 have = have_deps[0] or have_deps[1]
1254 conf.set10('ENABLE_REMOTE', have)
1256 foreach term : ['utmp',
1288 have = get_option(term)
1289 name = 'ENABLE_' + term.underscorify().to_upper()
1290 conf.set10(name, have)
1293 foreach tuple : [['nss-mymachines', 'machined'],
1294 ['nss-resolve', 'resolve']]
1295 want = get_option(tuple[0])
1297 have = get_option(tuple[1])
1298 if want == 'true' and not have
1299 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1304 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1305 conf.set10(name, have)
1309 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1310 'ENABLE_NSS_MYMACHINES',
1311 'ENABLE_NSS_RESOLVE',
1312 'ENABLE_NSS_SYSTEMD']
1313 if conf.get(term) == 1
1317 conf.set10('ENABLE_NSS', enable_nss)
1319 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1324 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1326 #####################################################################
1328 if get_option('efi')
1329 efi_arch = host_machine.cpu_family()
1331 if efi_arch == 'x86'
1332 EFI_MACHINE_TYPE_NAME = 'ia32'
1333 gnu_efi_arch = 'ia32'
1334 elif efi_arch == 'x86_64'
1335 EFI_MACHINE_TYPE_NAME = 'x64'
1336 gnu_efi_arch = 'x86_64'
1337 elif efi_arch == 'arm'
1338 EFI_MACHINE_TYPE_NAME = 'arm'
1339 gnu_efi_arch = 'arm'
1340 elif efi_arch == 'aarch64'
1341 EFI_MACHINE_TYPE_NAME = 'aa64'
1342 gnu_efi_arch = 'aarch64'
1344 EFI_MACHINE_TYPE_NAME = ''
1349 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1351 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1355 conf.set10('ENABLE_EFI', have)
1357 #####################################################################
1359 config_h = configure_file(
1360 output : 'config.h',
1361 configuration : conf)
1363 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1365 includes = include_directories('src/basic',
1369 'src/journal-remote',
1373 'src/time-wait-sync',
1378 'src/libsystemd/sd-bus',
1379 'src/libsystemd/sd-device',
1380 'src/libsystemd/sd-event',
1381 'src/libsystemd/sd-hwdb',
1382 'src/libsystemd/sd-id128',
1383 'src/libsystemd/sd-netlink',
1384 'src/libsystemd/sd-network',
1385 'src/libsystemd-network',
1388 add_project_arguments('-include', 'config.h', language : 'c')
1392 subdir('src/systemd')
1394 subdir('src/libsystemd')
1395 subdir('src/libsystemd-network')
1396 subdir('src/journal')
1399 libjournal_core = static_library(
1401 libjournal_core_sources,
1403 include_directories : includes,
1406 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1407 libsystemd = shared_library(
1410 version : libsystemd_version,
1411 include_directories : includes,
1412 link_args : ['-shared',
1413 '-Wl,--version-script=' + libsystemd_sym_path],
1414 link_with : [libbasic,
1416 link_whole : [libsystemd_static,
1418 dependencies : [threads,
1422 link_depends : libsystemd_sym,
1424 install_dir : rootlibdir)
1426 static_libsystemd = get_option('static-libsystemd')
1427 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1429 install_libsystemd_static = static_library(
1432 journal_client_sources,
1434 basic_gcrypt_sources,
1436 include_directories : includes,
1437 build_by_default : static_libsystemd != 'false',
1438 install : static_libsystemd != 'false',
1439 install_dir : rootlibdir,
1440 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1441 dependencies : [threads,
1450 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1452 ############################################################
1454 # binaries that have --help and are intended for use by humans,
1455 # usually, but not always, installed in /bin.
1456 public_programs = []
1458 subdir('src/libudev')
1459 subdir('src/shared')
1462 subdir('src/network')
1464 subdir('src/analyze')
1465 subdir('src/journal-remote')
1466 subdir('src/coredump')
1467 subdir('src/hostname')
1468 subdir('src/import')
1469 subdir('src/kernel-install')
1470 subdir('src/locale')
1471 subdir('src/machine')
1472 subdir('src/portable')
1473 subdir('src/nspawn')
1474 subdir('src/resolve')
1475 subdir('src/timedate')
1476 subdir('src/timesync')
1477 subdir('src/vconsole')
1478 subdir('src/boot/efi')
1485 ############################################################
1487 # only static linking apart from libdl, to make sure that the
1488 # module is linked to all libraries that it uses.
1489 test_dlopen = executable(
1493 include_directories : includes,
1494 link_with : [libbasic],
1495 dependencies : [libdl],
1496 build_by_default : want_tests != 'false')
1498 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1499 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1500 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1501 ['resolve', 'ENABLE_NSS_RESOLVE']]
1503 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1507 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1508 version_script_arg = join_paths(meson.source_root(), sym)
1510 nss = shared_library(
1512 'src/nss-@0@/nss-@0@.c'.format(module),
1515 include_directories : includes,
1516 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1517 link_args : ['-Wl,-z,nodelete',
1519 '-Wl,--version-script=' + version_script_arg,
1521 link_with : [libsystemd_static,
1523 dependencies : [threads,
1527 install_dir : rootlibdir)
1529 # We cannot use shared_module because it does not support version suffix.
1530 # Unfortunately shared_library insists on creating the symlink…
1531 meson.add_install_script('sh', '-c',
1532 'rm $DESTDIR@0@/libnss_@1@.so'
1533 .format(rootlibdir, module))
1535 if want_tests != 'false'
1536 test('dlopen-nss_' + module,
1538 # path to dlopen must include a slash
1539 args : nss.full_path())
1544 ############################################################
1546 executable('systemd',
1548 include_directories : includes,
1549 link_with : [libcore,
1551 dependencies : [threads,
1557 install_rpath : rootlibexecdir,
1559 install_dir : rootlibexecdir)
1561 meson.add_install_script(meson_make_symlink,
1562 join_paths(rootlibexecdir, 'systemd'),
1563 join_paths(rootsbindir, 'init'))
1565 exe = executable('systemd-analyze',
1566 systemd_analyze_sources,
1567 include_directories : includes,
1568 link_with : [libcore,
1570 dependencies : [threads,
1576 install_rpath : rootlibexecdir,
1578 public_programs += exe
1580 executable('systemd-journald',
1581 systemd_journald_sources,
1582 include_directories : includes,
1583 link_with : [libjournal_core,
1585 dependencies : [threads,
1589 install_rpath : rootlibexecdir,
1591 install_dir : rootlibexecdir)
1593 exe = executable('systemd-cat',
1594 systemd_cat_sources,
1595 include_directories : includes,
1596 link_with : [libjournal_core,
1598 dependencies : [threads],
1599 install_rpath : rootlibexecdir,
1601 public_programs += exe
1603 exe = executable('journalctl',
1605 include_directories : includes,
1606 link_with : [libshared],
1607 dependencies : [threads,
1612 install_rpath : rootlibexecdir,
1614 install_dir : rootbindir)
1615 public_programs += exe
1617 executable('systemd-getty-generator',
1618 'src/getty-generator/getty-generator.c',
1619 include_directories : includes,
1620 link_with : [libshared],
1621 install_rpath : rootlibexecdir,
1623 install_dir : systemgeneratordir)
1625 executable('systemd-debug-generator',
1626 'src/debug-generator/debug-generator.c',
1627 include_directories : includes,
1628 link_with : [libshared],
1629 install_rpath : rootlibexecdir,
1631 install_dir : systemgeneratordir)
1633 executable('systemd-fstab-generator',
1634 'src/fstab-generator/fstab-generator.c',
1635 'src/core/mount-setup.c',
1636 include_directories : includes,
1637 link_with : [libshared],
1638 install_rpath : rootlibexecdir,
1640 install_dir : systemgeneratordir)
1642 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1643 executable('30-systemd-environment-d-generator',
1644 'src/environment-d-generator/environment-d-generator.c',
1645 include_directories : includes,
1646 link_with : [libshared],
1647 install_rpath : rootlibexecdir,
1649 install_dir : userenvgeneratordir)
1651 meson.add_install_script(meson_make_symlink,
1652 join_paths(sysconfdir, 'environment'),
1653 join_paths(environmentdir, '99-environment.conf'))
1656 if conf.get('ENABLE_HIBERNATE') == 1
1657 executable('systemd-hibernate-resume-generator',
1658 'src/hibernate-resume/hibernate-resume-generator.c',
1659 include_directories : includes,
1660 link_with : [libshared],
1661 install_rpath : rootlibexecdir,
1663 install_dir : systemgeneratordir)
1665 executable('systemd-hibernate-resume',
1666 'src/hibernate-resume/hibernate-resume.c',
1667 include_directories : includes,
1668 link_with : [libshared],
1669 install_rpath : rootlibexecdir,
1671 install_dir : rootlibexecdir)
1674 if conf.get('HAVE_BLKID') == 1
1675 executable('systemd-gpt-auto-generator',
1676 'src/gpt-auto-generator/gpt-auto-generator.c',
1677 'src/shared/blkid-util.h',
1678 include_directories : includes,
1679 link_with : [libshared],
1680 dependencies : libblkid,
1681 install_rpath : rootlibexecdir,
1683 install_dir : systemgeneratordir)
1685 exe = executable('systemd-dissect',
1686 'src/dissect/dissect.c',
1687 include_directories : includes,
1688 link_with : [libshared],
1689 install_rpath : rootlibexecdir,
1691 install_dir : rootlibexecdir)
1692 public_programs += exe
1695 if conf.get('ENABLE_RESOLVE') == 1
1696 executable('systemd-resolved',
1697 systemd_resolved_sources,
1698 include_directories : includes,
1699 link_with : [libshared,
1701 libsystemd_resolve_core],
1702 dependencies : systemd_resolved_dependencies,
1703 install_rpath : rootlibexecdir,
1705 install_dir : rootlibexecdir)
1707 exe = executable('resolvectl',
1709 include_directories : includes,
1710 link_with : [libshared,
1712 libsystemd_resolve_core],
1713 dependencies : [threads,
1717 install_rpath : rootlibexecdir,
1719 public_programs += exe
1721 meson.add_install_script(meson_make_symlink,
1722 join_paths(bindir, 'resolvectl'),
1723 join_paths(rootsbindir, 'resolvconf'))
1725 meson.add_install_script(meson_make_symlink,
1726 join_paths(bindir, 'resolvectl'),
1727 join_paths(bindir, 'systemd-resolve'))
1730 if conf.get('ENABLE_LOGIND') == 1
1731 executable('systemd-logind',
1732 systemd_logind_sources,
1733 include_directories : includes,
1734 link_with : [liblogind_core,
1736 dependencies : [threads,
1738 install_rpath : rootlibexecdir,
1740 install_dir : rootlibexecdir)
1742 exe = executable('loginctl',
1744 include_directories : includes,
1745 link_with : [libshared],
1746 dependencies : [threads,
1749 install_rpath : rootlibexecdir,
1751 install_dir : rootbindir)
1752 public_programs += exe
1754 exe = executable('systemd-inhibit',
1755 'src/login/inhibit.c',
1756 include_directories : includes,
1757 link_with : [libshared],
1758 install_rpath : rootlibexecdir,
1760 install_dir : rootbindir)
1761 public_programs += exe
1763 if conf.get('HAVE_PAM') == 1
1764 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
1765 pam_systemd = shared_library(
1769 include_directories : includes,
1770 link_args : ['-shared',
1771 '-Wl,--version-script=' + version_script_arg],
1772 link_with : [libsystemd_static,
1774 dependencies : [threads,
1777 link_depends : pam_systemd_sym,
1779 install_dir : pamlibdir)
1781 if want_tests != 'false'
1782 test('dlopen-pam_systemd',
1784 # path to dlopen must include a slash
1785 args : pam_systemd.full_path())
1789 executable('systemd-user-runtime-dir',
1790 user_runtime_dir_sources,
1791 include_directories : includes,
1792 link_with : [libshared],
1793 install_rpath : rootlibexecdir,
1795 install_dir : rootlibexecdir)
1798 if conf.get('HAVE_PAM') == 1
1799 executable('systemd-user-sessions',
1800 'src/user-sessions/user-sessions.c',
1801 include_directories : includes,
1802 link_with : [libshared],
1803 install_rpath : rootlibexecdir,
1805 install_dir : rootlibexecdir)
1808 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1809 exe = executable('bootctl',
1810 'src/boot/bootctl.c',
1811 include_directories : includes,
1812 link_with : [libshared],
1813 dependencies : [libblkid],
1814 install_rpath : rootlibexecdir,
1816 public_programs += exe
1818 executable('systemd-bless-boot',
1819 'src/boot/bless-boot.c',
1820 include_directories : includes,
1821 link_with : [libshared],
1822 dependencies : [libblkid],
1823 install_rpath : rootlibexecdir,
1825 install_dir : rootlibexecdir)
1827 executable('systemd-bless-boot-generator',
1828 'src/boot/bless-boot-generator.c',
1829 include_directories : includes,
1830 link_with : [libshared],
1831 install_rpath : rootlibexecdir,
1833 install_dir : systemgeneratordir)
1836 executable('systemd-boot-check-no-failures',
1837 'src/boot/boot-check-no-failures.c',
1838 include_directories : includes,
1839 link_with : [libshared],
1840 dependencies : [libblkid],
1841 install_rpath : rootlibexecdir,
1843 install_dir : rootlibexecdir)
1845 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1846 include_directories : includes,
1847 link_with : [libshared],
1848 dependencies : [threads],
1849 install_rpath : rootlibexecdir,
1851 public_programs += exe
1854 if get_option('link-systemctl-shared')
1855 systemctl_link_with = [libshared]
1857 systemctl_link_with = [libsystemd_static,
1863 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1864 include_directories : includes,
1865 link_with : systemctl_link_with,
1866 dependencies : [threads,
1871 install_rpath : rootlibexecdir,
1873 install_dir : rootbindir)
1874 public_programs += exe
1876 if conf.get('ENABLE_PORTABLED') == 1
1877 executable('systemd-portabled',
1878 systemd_portabled_sources,
1879 include_directories : includes,
1880 link_with : [libshared],
1881 dependencies : [threads],
1882 install_rpath : rootlibexecdir,
1884 install_dir : rootlibexecdir)
1886 exe = executable('portablectl', 'src/portable/portablectl.c',
1887 include_directories : includes,
1888 link_with : [libshared],
1889 dependencies : [threads],
1890 install_rpath : rootlibexecdir,
1892 install_dir : rootbindir)
1893 public_programs += exe
1896 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1897 meson.add_install_script(meson_make_symlink,
1898 join_paths(rootbindir, 'systemctl'),
1899 join_paths(rootsbindir, alias))
1902 if conf.get('ENABLE_BACKLIGHT') == 1
1903 executable('systemd-backlight',
1904 'src/backlight/backlight.c',
1905 include_directories : includes,
1906 link_with : [libshared],
1907 install_rpath : rootlibexecdir,
1909 install_dir : rootlibexecdir)
1912 if conf.get('ENABLE_RFKILL') == 1
1913 executable('systemd-rfkill',
1914 'src/rfkill/rfkill.c',
1915 include_directories : includes,
1916 link_with : [libshared],
1917 install_rpath : rootlibexecdir,
1919 install_dir : rootlibexecdir)
1922 executable('systemd-system-update-generator',
1923 'src/system-update-generator/system-update-generator.c',
1924 include_directories : includes,
1925 link_with : [libshared],
1926 install_rpath : rootlibexecdir,
1928 install_dir : systemgeneratordir)
1930 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1931 executable('systemd-cryptsetup',
1932 'src/cryptsetup/cryptsetup.c',
1933 include_directories : includes,
1934 link_with : [libshared],
1935 dependencies : [libcryptsetup],
1936 install_rpath : rootlibexecdir,
1938 install_dir : rootlibexecdir)
1940 executable('systemd-cryptsetup-generator',
1941 'src/cryptsetup/cryptsetup-generator.c',
1942 include_directories : includes,
1943 link_with : [libshared],
1944 dependencies : [libcryptsetup],
1945 install_rpath : rootlibexecdir,
1947 install_dir : systemgeneratordir)
1949 executable('systemd-veritysetup',
1950 'src/veritysetup/veritysetup.c',
1951 include_directories : includes,
1952 link_with : [libshared],
1953 dependencies : [libcryptsetup],
1954 install_rpath : rootlibexecdir,
1956 install_dir : rootlibexecdir)
1958 executable('systemd-veritysetup-generator',
1959 'src/veritysetup/veritysetup-generator.c',
1960 include_directories : includes,
1961 link_with : [libshared],
1962 dependencies : [libcryptsetup],
1963 install_rpath : rootlibexecdir,
1965 install_dir : systemgeneratordir)
1968 if conf.get('HAVE_SYSV_COMPAT') == 1
1969 executable('systemd-sysv-generator',
1970 'src/sysv-generator/sysv-generator.c',
1971 include_directories : includes,
1972 link_with : [libshared],
1973 install_rpath : rootlibexecdir,
1975 install_dir : systemgeneratordir)
1977 executable('systemd-rc-local-generator',
1978 'src/rc-local-generator/rc-local-generator.c',
1979 include_directories : includes,
1980 link_with : [libshared],
1981 install_rpath : rootlibexecdir,
1983 install_dir : systemgeneratordir)
1986 if conf.get('ENABLE_HOSTNAMED') == 1
1987 executable('systemd-hostnamed',
1988 'src/hostname/hostnamed.c',
1989 include_directories : includes,
1990 link_with : [libshared],
1991 install_rpath : rootlibexecdir,
1993 install_dir : rootlibexecdir)
1995 exe = executable('hostnamectl',
1996 'src/hostname/hostnamectl.c',
1997 include_directories : includes,
1998 link_with : [libshared],
1999 install_rpath : rootlibexecdir,
2001 public_programs += exe
2004 if conf.get('ENABLE_LOCALED') == 1
2005 if conf.get('HAVE_XKBCOMMON') == 1
2006 # logind will load libxkbcommon.so dynamically on its own
2012 executable('systemd-localed',
2013 systemd_localed_sources,
2014 include_directories : includes,
2015 link_with : [libshared],
2016 dependencies : deps,
2017 install_rpath : rootlibexecdir,
2019 install_dir : rootlibexecdir)
2021 exe = executable('localectl',
2023 include_directories : includes,
2024 link_with : [libshared],
2025 install_rpath : rootlibexecdir,
2027 public_programs += exe
2030 if conf.get('ENABLE_TIMEDATED') == 1
2031 executable('systemd-timedated',
2032 'src/timedate/timedated.c',
2033 include_directories : includes,
2034 link_with : [libshared],
2035 install_rpath : rootlibexecdir,
2037 install_dir : rootlibexecdir)
2040 if conf.get('ENABLE_TIMEDATECTL') == 1
2041 exe = executable('timedatectl',
2042 'src/timedate/timedatectl.c',
2043 include_directories : includes,
2044 install_rpath : rootlibexecdir,
2045 link_with : [libshared],
2046 dependencies : [libm],
2048 public_programs += exe
2051 if conf.get('ENABLE_TIMESYNCD') == 1
2052 executable('systemd-timesyncd',
2053 systemd_timesyncd_sources,
2054 include_directories : includes,
2055 link_with : [libshared],
2056 dependencies : [threads,
2058 install_rpath : rootlibexecdir,
2060 install_dir : rootlibexecdir)
2062 executable('systemd-time-wait-sync',
2063 'src/time-wait-sync/time-wait-sync.c',
2064 include_directories : includes,
2065 link_with : [libshared],
2066 install_rpath : rootlibexecdir,
2068 install_dir : rootlibexecdir)
2071 if conf.get('ENABLE_MACHINED') == 1
2072 executable('systemd-machined',
2073 systemd_machined_sources,
2074 include_directories : includes,
2075 link_with : [libmachine_core,
2077 install_rpath : rootlibexecdir,
2079 install_dir : rootlibexecdir)
2081 exe = executable('machinectl',
2082 'src/machine/machinectl.c',
2083 include_directories : includes,
2084 link_with : [libshared],
2085 dependencies : [threads,
2088 install_rpath : rootlibexecdir,
2090 install_dir : rootbindir)
2091 public_programs += exe
2094 if conf.get('ENABLE_IMPORTD') == 1
2095 executable('systemd-importd',
2096 systemd_importd_sources,
2097 include_directories : includes,
2098 link_with : [libshared],
2099 dependencies : [threads],
2100 install_rpath : rootlibexecdir,
2102 install_dir : rootlibexecdir)
2104 systemd_pull = executable('systemd-pull',
2105 systemd_pull_sources,
2106 include_directories : includes,
2107 link_with : [libshared],
2108 dependencies : [libcurl,
2113 install_rpath : rootlibexecdir,
2115 install_dir : rootlibexecdir)
2117 systemd_import = executable('systemd-import',
2118 systemd_import_sources,
2119 include_directories : includes,
2120 link_with : [libshared],
2121 dependencies : [libcurl,
2125 install_rpath : rootlibexecdir,
2127 install_dir : rootlibexecdir)
2129 systemd_export = executable('systemd-export',
2130 systemd_export_sources,
2131 include_directories : includes,
2132 link_with : [libshared],
2133 dependencies : [libcurl,
2137 install_rpath : rootlibexecdir,
2139 install_dir : rootlibexecdir)
2140 public_programs += [systemd_pull, systemd_import, systemd_export]
2143 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2144 exe = executable('systemd-journal-upload',
2145 systemd_journal_upload_sources,
2146 include_directories : includes,
2147 link_with : [libshared],
2148 dependencies : [threads,
2153 install_rpath : rootlibexecdir,
2155 install_dir : rootlibexecdir)
2156 public_programs += exe
2159 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2160 s_j_remote = executable('systemd-journal-remote',
2161 systemd_journal_remote_sources,
2162 include_directories : includes,
2163 link_with : [libshared,
2164 libsystemd_journal_remote],
2165 dependencies : [threads,
2170 install_rpath : rootlibexecdir,
2172 install_dir : rootlibexecdir)
2174 s_j_gatewayd = executable('systemd-journal-gatewayd',
2175 systemd_journal_gatewayd_sources,
2176 include_directories : includes,
2177 link_with : [libshared],
2178 dependencies : [threads,
2183 install_rpath : rootlibexecdir,
2185 install_dir : rootlibexecdir)
2186 public_programs += [s_j_remote, s_j_gatewayd]
2189 if conf.get('ENABLE_COREDUMP') == 1
2190 executable('systemd-coredump',
2191 systemd_coredump_sources,
2192 include_directories : includes,
2193 link_with : [libshared],
2194 dependencies : [threads,
2199 install_rpath : rootlibexecdir,
2201 install_dir : rootlibexecdir)
2203 exe = executable('coredumpctl',
2204 coredumpctl_sources,
2205 include_directories : includes,
2206 link_with : [libshared],
2207 dependencies : [threads,
2210 install_rpath : rootlibexecdir,
2212 public_programs += exe
2215 if conf.get('ENABLE_BINFMT') == 1
2216 exe = executable('systemd-binfmt',
2217 'src/binfmt/binfmt.c',
2218 include_directories : includes,
2219 link_with : [libshared],
2220 install_rpath : rootlibexecdir,
2222 install_dir : rootlibexecdir)
2223 public_programs += exe
2225 meson.add_install_script('sh', '-c',
2226 mkdir_p.format(binfmtdir))
2227 meson.add_install_script('sh', '-c',
2228 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2231 if conf.get('ENABLE_VCONSOLE') == 1
2232 executable('systemd-vconsole-setup',
2233 'src/vconsole/vconsole-setup.c',
2234 include_directories : includes,
2235 link_with : [libshared],
2236 install_rpath : rootlibexecdir,
2238 install_dir : rootlibexecdir)
2241 if conf.get('ENABLE_RANDOMSEED') == 1
2242 executable('systemd-random-seed',
2243 'src/random-seed/random-seed.c',
2244 include_directories : includes,
2245 link_with : [libshared],
2246 install_rpath : rootlibexecdir,
2248 install_dir : rootlibexecdir)
2251 if conf.get('ENABLE_FIRSTBOOT') == 1
2252 executable('systemd-firstboot',
2253 'src/firstboot/firstboot.c',
2254 include_directories : includes,
2255 link_with : [libshared],
2256 dependencies : [libcrypt],
2257 install_rpath : rootlibexecdir,
2259 install_dir : rootbindir)
2262 executable('systemd-remount-fs',
2263 'src/remount-fs/remount-fs.c',
2264 'src/core/mount-setup.c',
2265 'src/core/mount-setup.h',
2266 include_directories : includes,
2267 link_with : [libshared],
2268 install_rpath : rootlibexecdir,
2270 install_dir : rootlibexecdir)
2272 executable('systemd-machine-id-setup',
2273 'src/machine-id-setup/machine-id-setup-main.c',
2274 'src/core/machine-id-setup.c',
2275 'src/core/machine-id-setup.h',
2276 include_directories : includes,
2277 link_with : [libshared],
2278 install_rpath : rootlibexecdir,
2280 install_dir : rootbindir)
2282 executable('systemd-fsck',
2284 include_directories : includes,
2285 link_with : [libshared],
2286 install_rpath : rootlibexecdir,
2288 install_dir : rootlibexecdir)
2290 executable('systemd-growfs',
2291 'src/partition/growfs.c',
2292 include_directories : includes,
2293 link_with : [libshared],
2294 dependencies : [libcryptsetup],
2295 install_rpath : rootlibexecdir,
2297 install_dir : rootlibexecdir)
2299 executable('systemd-makefs',
2300 'src/partition/makefs.c',
2301 include_directories : includes,
2302 link_with : [libshared],
2303 install_rpath : rootlibexecdir,
2305 install_dir : rootlibexecdir)
2307 executable('systemd-sleep',
2308 'src/sleep/sleep.c',
2309 include_directories : includes,
2310 link_with : [libshared],
2311 install_rpath : rootlibexecdir,
2313 install_dir : rootlibexecdir)
2315 exe = executable('systemd-sysctl',
2316 'src/sysctl/sysctl.c',
2317 include_directories : includes,
2318 link_with : [libshared],
2319 install_rpath : rootlibexecdir,
2321 install_dir : rootlibexecdir)
2322 public_programs += exe
2324 executable('systemd-ac-power',
2325 'src/ac-power/ac-power.c',
2326 include_directories : includes,
2327 link_with : [libshared],
2328 install_rpath : rootlibexecdir,
2330 install_dir : rootlibexecdir)
2332 exe = executable('systemd-detect-virt',
2333 'src/detect-virt/detect-virt.c',
2334 include_directories : includes,
2335 link_with : [libshared],
2336 install_rpath : rootlibexecdir,
2338 public_programs += exe
2340 exe = executable('systemd-delta',
2341 'src/delta/delta.c',
2342 include_directories : includes,
2343 link_with : [libshared],
2344 install_rpath : rootlibexecdir,
2346 public_programs += exe
2348 exe = executable('systemd-escape',
2349 'src/escape/escape.c',
2350 include_directories : includes,
2351 link_with : [libshared],
2352 install_rpath : rootlibexecdir,
2354 install_dir : rootbindir)
2355 public_programs += exe
2357 exe = executable('systemd-notify',
2358 'src/notify/notify.c',
2359 include_directories : includes,
2360 link_with : [libshared],
2361 install_rpath : rootlibexecdir,
2363 install_dir : rootbindir)
2364 public_programs += exe
2366 executable('systemd-volatile-root',
2367 'src/volatile-root/volatile-root.c',
2368 include_directories : includes,
2369 link_with : [libshared],
2370 install_rpath : rootlibexecdir,
2372 install_dir : rootlibexecdir)
2374 executable('systemd-cgroups-agent',
2375 'src/cgroups-agent/cgroups-agent.c',
2376 include_directories : includes,
2377 link_with : [libshared],
2378 install_rpath : rootlibexecdir,
2380 install_dir : rootlibexecdir)
2382 exe = executable('systemd-id128',
2383 'src/id128/id128.c',
2384 include_directories : includes,
2385 link_with : [libshared],
2386 install_rpath : rootlibexecdir,
2388 public_programs += exe
2390 exe = executable('systemd-path',
2392 include_directories : includes,
2393 link_with : [libshared],
2394 install_rpath : rootlibexecdir,
2396 public_programs += exe
2398 exe = executable('systemd-ask-password',
2399 'src/ask-password/ask-password.c',
2400 include_directories : includes,
2401 link_with : [libshared],
2402 install_rpath : rootlibexecdir,
2404 install_dir : rootbindir)
2405 public_programs += exe
2407 executable('systemd-reply-password',
2408 'src/reply-password/reply-password.c',
2409 include_directories : includes,
2410 link_with : [libshared],
2411 install_rpath : rootlibexecdir,
2413 install_dir : rootlibexecdir)
2415 exe = executable('systemd-tty-ask-password-agent',
2416 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2417 include_directories : includes,
2418 link_with : [libshared],
2419 install_rpath : rootlibexecdir,
2421 install_dir : rootbindir)
2422 public_programs += exe
2424 exe = executable('systemd-cgls',
2426 include_directories : includes,
2427 link_with : [libshared],
2428 install_rpath : rootlibexecdir,
2430 public_programs += exe
2432 exe = executable('systemd-cgtop',
2433 'src/cgtop/cgtop.c',
2434 include_directories : includes,
2435 link_with : [libshared],
2436 install_rpath : rootlibexecdir,
2438 public_programs += exe
2440 executable('systemd-initctl',
2441 'src/initctl/initctl.c',
2442 include_directories : includes,
2443 link_with : [libshared],
2444 install_rpath : rootlibexecdir,
2446 install_dir : rootlibexecdir)
2448 exe = executable('systemd-mount',
2449 'src/mount/mount-tool.c',
2450 include_directories : includes,
2451 link_with : [libshared],
2452 install_rpath : rootlibexecdir,
2454 public_programs += exe
2456 meson.add_install_script(meson_make_symlink,
2457 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2459 exe = executable('systemd-run',
2461 include_directories : includes,
2462 link_with : [libshared],
2463 install_rpath : rootlibexecdir,
2465 public_programs += exe
2467 exe = executable('systemd-stdio-bridge',
2468 'src/stdio-bridge/stdio-bridge.c',
2469 include_directories : includes,
2470 link_with : [libshared],
2471 install_rpath : rootlibexecdir,
2473 public_programs += exe
2475 exe = executable('busctl',
2476 'src/busctl/busctl.c',
2477 'src/busctl/busctl-introspect.c',
2478 'src/busctl/busctl-introspect.h',
2479 include_directories : includes,
2480 link_with : [libshared],
2481 install_rpath : rootlibexecdir,
2483 public_programs += exe
2485 if conf.get('ENABLE_SYSUSERS') == 1
2486 exe = executable('systemd-sysusers',
2487 'src/sysusers/sysusers.c',
2488 include_directories : includes,
2489 link_with : [libshared],
2490 install_rpath : rootlibexecdir,
2492 install_dir : rootbindir)
2493 public_programs += exe
2496 if conf.get('ENABLE_TMPFILES') == 1
2497 exe = executable('systemd-tmpfiles',
2498 'src/tmpfiles/tmpfiles.c',
2499 include_directories : includes,
2500 link_with : [libshared],
2501 dependencies : [libacl],
2502 install_rpath : rootlibexecdir,
2504 install_dir : rootbindir)
2505 public_programs += exe
2507 if want_tests != 'false'
2508 test('test-systemd-tmpfiles',
2509 test_systemd_tmpfiles_py,
2510 # https://github.com/mesonbuild/meson/issues/2681
2511 args : exe.full_path())
2515 if conf.get('ENABLE_HWDB') == 1
2516 exe = executable('systemd-hwdb',
2518 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2519 include_directories : includes,
2520 link_with : [libudev_static],
2521 install_rpath : udev_rpath,
2523 install_dir : rootbindir)
2524 public_programs += exe
2527 if conf.get('ENABLE_QUOTACHECK') == 1
2528 executable('systemd-quotacheck',
2529 'src/quotacheck/quotacheck.c',
2530 include_directories : includes,
2531 link_with : [libshared],
2532 install_rpath : rootlibexecdir,
2534 install_dir : rootlibexecdir)
2537 exe = executable('systemd-socket-proxyd',
2538 'src/socket-proxy/socket-proxyd.c',
2539 include_directories : includes,
2540 link_with : [libshared],
2541 dependencies : [threads],
2542 install_rpath : rootlibexecdir,
2544 install_dir : rootlibexecdir)
2545 public_programs += exe
2547 exe = executable('systemd-udevd',
2548 systemd_udevd_sources,
2549 include_directories : includes,
2550 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2551 link_with : [libudev_core,
2554 dependencies : [threads,
2559 install_rpath : udev_rpath,
2561 install_dir : rootlibexecdir)
2562 public_programs += exe
2564 exe = executable('udevadm',
2566 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2567 include_directories : includes,
2568 link_with : [libudev_core,
2571 dependencies : [threads,
2576 install_rpath : udev_rpath,
2578 install_dir : rootbindir)
2579 public_programs += exe
2581 executable('systemd-shutdown',
2582 systemd_shutdown_sources,
2583 include_directories : includes,
2584 link_with : [libshared],
2585 dependencies : [libmount],
2586 install_rpath : rootlibexecdir,
2588 install_dir : rootlibexecdir)
2590 executable('systemd-update-done',
2591 'src/update-done/update-done.c',
2592 include_directories : includes,
2593 link_with : [libshared],
2594 install_rpath : rootlibexecdir,
2596 install_dir : rootlibexecdir)
2598 executable('systemd-update-utmp',
2599 'src/update-utmp/update-utmp.c',
2600 include_directories : includes,
2601 link_with : [libshared],
2602 dependencies : [libaudit],
2603 install_rpath : rootlibexecdir,
2605 install_dir : rootlibexecdir)
2607 if conf.get('HAVE_KMOD') == 1
2608 executable('systemd-modules-load',
2609 'src/modules-load/modules-load.c',
2610 include_directories : includes,
2611 link_with : [libshared],
2612 dependencies : [libkmod],
2613 install_rpath : rootlibexecdir,
2615 install_dir : rootlibexecdir)
2617 meson.add_install_script('sh', '-c',
2618 mkdir_p.format(modulesloaddir))
2619 meson.add_install_script('sh', '-c',
2620 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2623 exe = executable('systemd-nspawn',
2624 systemd_nspawn_sources,
2625 'src/core/mount-setup.c', # FIXME: use a variable?
2626 'src/core/mount-setup.h',
2627 'src/core/loopback-setup.c',
2628 'src/core/loopback-setup.h',
2629 include_directories : includes,
2630 link_with : [libnspawn_core,
2632 dependencies : [libblkid],
2633 install_rpath : rootlibexecdir,
2635 public_programs += exe
2637 if conf.get('ENABLE_NETWORKD') == 1
2638 executable('systemd-networkd',
2639 systemd_networkd_sources,
2640 include_directories : includes,
2641 link_with : [libnetworkd_core,
2645 dependencies : [threads],
2646 install_rpath : rootlibexecdir,
2648 install_dir : rootlibexecdir)
2650 executable('systemd-networkd-wait-online',
2651 systemd_networkd_wait_online_sources,
2652 include_directories : includes,
2653 link_with : [libnetworkd_core,
2655 install_rpath : rootlibexecdir,
2657 install_dir : rootlibexecdir)
2659 exe = executable('networkctl',
2661 include_directories : includes,
2662 link_with : [libsystemd_network,
2664 install_rpath : rootlibexecdir,
2666 install_dir : rootbindir)
2667 public_programs += exe
2670 executable('systemd-sulogin-shell',
2671 ['src/sulogin-shell/sulogin-shell.c'],
2672 include_directories : includes,
2673 link_with : [libshared],
2674 install_rpath : rootlibexecdir,
2676 install_dir : rootlibexecdir)
2678 ############################################################
2681 'systemd-runtest.env',
2682 output : 'systemd-runtest.env',
2683 command : ['sh', '-c', '{ ' +
2684 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2685 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2687 build_by_default : true)
2689 foreach tuple : tests
2691 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2692 dependencies = tuple[2]
2693 condition = tuple.length() >= 4 ? tuple[3] : ''
2694 type = tuple.length() >= 5 ? tuple[4] : ''
2695 defs = tuple.length() >= 6 ? tuple[5] : []
2696 incs = tuple.length() >= 7 ? tuple[6] : includes
2699 name = sources[0].split('/')[-1].split('.')[0]
2700 if type.startswith('timeout=')
2701 timeout = type.split('=')[1].to_int()
2705 if condition == '' or conf.get(condition) == 1
2709 include_directories : incs,
2710 link_with : link_with,
2711 dependencies : dependencies,
2713 build_by_default : want_tests != 'false',
2714 install_rpath : rootlibexecdir,
2715 install : install_tests,
2716 install_dir : join_paths(testsdir, type))
2719 message('@0@ is a manual test'.format(name))
2720 elif type == 'unsafe' and want_tests != 'unsafe'
2721 message('@0@ is an unsafe test'.format(name))
2722 elif want_tests != 'false'
2728 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2733 'test-libsystemd-sym',
2734 test_libsystemd_sym_c,
2735 include_directories : includes,
2736 link_with : [libsystemd],
2737 build_by_default : want_tests != 'false',
2738 install : install_tests,
2739 install_dir : testsdir)
2740 if want_tests != 'false'
2741 test('test-libsystemd-sym', exe)
2745 'test-libsystemd-static-sym',
2746 test_libsystemd_sym_c,
2747 include_directories : includes,
2748 link_with : [install_libsystemd_static],
2749 dependencies : [threads], # threads is already included in dependencies on the library,
2750 # but does not seem to get propagated. Add here as a work-around.
2751 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2752 install : install_tests and static_libsystemd_pic,
2753 install_dir : testsdir)
2754 if want_tests != 'false' and static_libsystemd_pic
2755 test('test-libsystemd-static-sym', exe)
2761 include_directories : includes,
2762 c_args : '-Wno-deprecated-declarations',
2763 link_with : [libudev],
2764 build_by_default : want_tests != 'false',
2765 install : install_tests,
2766 install_dir : testsdir)
2767 if want_tests != 'false'
2768 test('test-libudev-sym', exe)
2772 'test-libudev-static-sym',
2774 include_directories : includes,
2775 c_args : '-Wno-deprecated-declarations',
2776 link_with : [install_libudev_static],
2777 build_by_default : want_tests != 'false' and static_libudev_pic,
2778 install : install_tests and static_libudev_pic,
2779 install_dir : testsdir)
2780 if want_tests != 'false' and static_libudev_pic
2781 test('test-libudev-static-sym', exe)
2784 ############################################################
2788 if get_option('tests') != 'false'
2789 foreach tuple : fuzzers
2791 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2792 dependencies = tuple[2]
2793 defs = tuple.length() >= 4 ? tuple[3] : []
2794 incs = tuple.length() >= 5 ? tuple[4] : includes
2797 dependencies += fuzzing_engine
2799 sources += 'src/fuzz/fuzz-main.c'
2802 name = sources[0].split('/')[-1].split('.')[0]
2804 fuzzer_exes += executable(
2807 include_directories : [incs, include_directories('src/fuzz')],
2808 link_with : link_with,
2809 dependencies : dependencies,
2815 run_target('fuzzers',
2816 depends : fuzzer_exes,
2819 ############################################################
2821 make_directive_index_py = find_program('tools/make-directive-index.py')
2822 make_man_index_py = find_program('tools/make-man-index.py')
2823 xml_helper_py = find_program('tools/xml_helper.py')
2824 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2828 subdir('sysusers.d')
2829 subdir('tmpfiles.d')
2834 subdir('shell-completion/bash')
2835 subdir('shell-completion/zsh')
2836 subdir('docs/sysvinit')
2837 subdir('docs/var-log')
2839 install_subdir('factory/etc',
2840 install_dir : factorydir)
2842 install_data('xorg/50-systemd-user.sh',
2843 install_dir : xinitrcdir)
2844 install_data('modprobe.d/systemd.conf',
2845 install_dir : modprobedir)
2846 install_data('LICENSE.GPL2',
2850 'docs/CODING_STYLE.md',
2851 'docs/DISTRO_PORTING.md',
2852 'docs/ENVIRONMENT.md',
2854 'docs/TRANSIENT-SETTINGS.md',
2855 'docs/TRANSLATORS.md',
2856 'docs/UIDS-GIDS.md',
2857 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2858 install_dir : docdir)
2860 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2861 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2863 ############################################################
2865 meson_check_help = find_program('tools/meson-check-help.sh')
2867 foreach exec : public_programs
2868 name = exec.full_path().split('/')[-1]
2869 if want_tests != 'false'
2870 test('check-help-' + name,
2872 args : exec.full_path())
2876 ############################################################
2878 # Enable tests for all supported sanitizers
2879 foreach tuple : sanitizers
2880 sanitizer = tuple[0]
2883 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2885 foreach p : fuzz_regression_tests
2886 b = p.split('/')[-2]
2887 c = p.split('/')[-1]
2889 name = '@0@:@1@'.format(b, sanitizer)
2892 if want_tests == 'false'
2893 message('Not compiling @0@ because tests is set to false'.format(name))
2895 exe = custom_target(
2899 command : [env, 'ln', '-fs',
2900 join_paths(build.full_path(), b),
2902 build_by_default : true)
2904 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2909 if want_tests != 'false' and slow_tests
2910 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2912 args : [exe.full_path(),
2913 join_paths(meson.source_root(), p)])
2920 ############################################################
2923 all_files = run_command(
2925 ['--git-dir=@0@/.git'.format(meson.source_root()),
2928 all_files = files(all_files.stdout().split())
2933 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
2936 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
2940 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2943 command : [meson_git_contrib_sh])
2947 git_head = run_command(
2949 ['--git-dir=@0@/.git'.format(meson.source_root()),
2950 'rev-parse', 'HEAD']).stdout().strip()
2951 git_head_short = run_command(
2953 ['--git-dir=@0@/.git'.format(meson.source_root()),
2954 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2958 command : ['git', 'archive',
2959 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
2961 '--prefix', 'systemd-@0@/'.format(git_head),
2965 ############################################################
2967 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2970 depends : [man, libsystemd, libudev],
2971 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2975 command : ['sh', '@0@/tools/make-index-md.sh'.format(meson.source_root()), meson.source_root()])
2977 ############################################################
2980 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2982 'split /usr: @0@'.format(split_usr),
2983 'split bin-sbin: @0@'.format(split_bin),
2984 'prefix directory: @0@'.format(prefixdir),
2985 'rootprefix directory: @0@'.format(rootprefixdir),
2986 'sysconf directory: @0@'.format(sysconfdir),
2987 'include directory: @0@'.format(includedir),
2988 'lib directory: @0@'.format(libdir),
2989 'rootlib directory: @0@'.format(rootlibdir),
2990 'SysV init scripts: @0@'.format(sysvinit_path),
2991 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2992 'PAM modules directory: @0@'.format(pamlibdir),
2993 'PAM configuration directory: @0@'.format(pamconfdir),
2994 'RPM macros directory: @0@'.format(rpmmacrosdir),
2995 'modprobe.d directory: @0@'.format(modprobedir),
2996 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2997 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2998 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2999 'bash completions directory: @0@'.format(bashcompletiondir),
3000 'zsh completions directory: @0@'.format(zshcompletiondir),
3001 'extra start script: @0@'.format(get_option('rc-local')),
3002 'extra stop script: @0@'.format(get_option('halt-local')),
3003 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3004 get_option('debug-tty')),
3005 'TTY GID: @0@'.format(tty_gid),
3006 'users GID: @0@'.format(substs.get('USERS_GID')),
3007 'maximum system UID: @0@'.format(system_uid_max),
3008 'maximum system GID: @0@'.format(system_gid_max),
3009 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3010 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3011 'minimum container UID base: @0@'.format(container_uid_base_min),
3012 'maximum container UID base: @0@'.format(container_uid_base_max),
3013 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3014 'render group access mode: @0@'.format(get_option('group-render-mode')),
3015 'certificate root directory: @0@'.format(get_option('certificate-root')),
3016 'support URL: @0@'.format(support_url),
3017 'nobody user name: @0@'.format(nobody_user),
3018 'nobody group name: @0@'.format(nobody_group),
3019 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3020 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3022 'default DNSSEC mode: @0@'.format(default_dnssec),
3023 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3024 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3025 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
3027 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3028 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3030 'default DNS servers: @0@'.format(alt_dns_servers),
3031 'default NTP servers: @0@'.format(alt_ntp_servers)]
3033 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3034 '@@0@'.format(time_epoch)).stdout().strip()
3036 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3039 'static libsystemd: @0@'.format(static_libsystemd),
3040 'static libudev: @0@'.format(static_libudev)]
3043 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3044 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3045 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3047 if conf.get('ENABLE_EFI') == 1
3048 status += 'efi arch: @0@'.format(efi_arch)
3052 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3053 'EFI CC @0@'.format(efi_cc),
3054 'EFI lib directory: @0@'.format(efi_libdir),
3055 'EFI lds directory: @0@'.format(efi_ldsdir),
3056 'EFI include directory: @0@'.format(efi_incdir)]
3108 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3109 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3112 ['legacy pkla', install_polkit_pkla],
3114 ['gnu-efi', have_gnu_efi],
3127 ['man pages', want_man],
3128 ['html pages', want_html],
3129 ['man page indices', want_man and have_lxml],
3134 ['adm group', get_option('adm-group')],
3135 ['wheel group', get_option('wheel-group')],
3138 ['debug mmap cache'],
3141 ['valgrind', conf.get('VALGRIND') == 1],
3142 ['trace logging', conf.get('LOG_TRACE') == 1],
3143 ['link-udev-shared', get_option('link-udev-shared')],
3144 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3147 if tuple.length() >= 2
3150 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3151 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3152 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3163 'enabled features: @0@'.format(', '.join(found)),
3165 'disabled features: @0@'.format(', '.join(missing)),
3167 message('\n '.join(status))
3169 if rootprefixdir != rootprefix_default
3171 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3172 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3173 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))