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_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_UID_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')
1393 subdir('src/systemd')
1395 subdir('src/libsystemd')
1396 subdir('src/libsystemd-network')
1397 subdir('src/journal')
1400 libjournal_core = static_library(
1402 libjournal_core_sources,
1404 include_directories : includes,
1407 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1408 libsystemd = shared_library(
1411 version : libsystemd_version,
1412 include_directories : includes,
1413 link_args : ['-shared',
1414 '-Wl,--version-script=' + libsystemd_sym_path],
1415 link_with : [libbasic,
1417 link_whole : [libsystemd_static,
1419 dependencies : [threads,
1423 link_depends : libsystemd_sym,
1425 install_dir : rootlibdir)
1427 static_libsystemd = get_option('static-libsystemd')
1428 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1430 install_libsystemd_static = static_library(
1433 journal_client_sources,
1435 basic_gcrypt_sources,
1437 include_directories : includes,
1438 build_by_default : static_libsystemd != 'false',
1439 install : static_libsystemd != 'false',
1440 install_dir : rootlibdir,
1441 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1442 dependencies : [threads,
1451 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1453 ############################################################
1455 # binaries that have --help and are intended for use by humans,
1456 # usually, but not always, installed in /bin.
1457 public_programs = []
1459 subdir('src/libudev')
1460 subdir('src/shared')
1463 subdir('src/network')
1465 subdir('src/analyze')
1466 subdir('src/journal-remote')
1467 subdir('src/coredump')
1468 subdir('src/hostname')
1469 subdir('src/import')
1470 subdir('src/kernel-install')
1471 subdir('src/locale')
1472 subdir('src/machine')
1473 subdir('src/portable')
1474 subdir('src/nspawn')
1475 subdir('src/resolve')
1476 subdir('src/timedate')
1477 subdir('src/timesync')
1478 subdir('src/vconsole')
1479 subdir('src/boot/efi')
1486 ############################################################
1488 # only static linking apart from libdl, to make sure that the
1489 # module is linked to all libraries that it uses.
1490 test_dlopen = executable(
1494 include_directories : includes,
1495 link_with : [libbasic],
1496 dependencies : [libdl],
1497 build_by_default : want_tests != 'false')
1499 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1500 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1501 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1502 ['resolve', 'ENABLE_NSS_RESOLVE']]
1504 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1508 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1509 version_script_arg = join_paths(meson.source_root(), sym)
1511 nss = shared_library(
1513 'src/nss-@0@/nss-@0@.c'.format(module),
1516 include_directories : includes,
1517 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1518 link_args : ['-Wl,-z,nodelete',
1520 '-Wl,--version-script=' + version_script_arg,
1522 link_with : [libsystemd_static,
1524 dependencies : [threads,
1528 install_dir : rootlibdir)
1530 # We cannot use shared_module because it does not support version suffix.
1531 # Unfortunately shared_library insists on creating the symlink…
1532 meson.add_install_script('sh', '-c',
1533 'rm $DESTDIR@0@/libnss_@1@.so'
1534 .format(rootlibdir, module))
1536 if want_tests != 'false'
1537 test('dlopen-nss_' + module,
1539 # path to dlopen must include a slash
1540 args : nss.full_path())
1545 ############################################################
1547 executable('systemd',
1549 include_directories : includes,
1550 link_with : [libcore,
1552 dependencies : [threads,
1558 install_rpath : rootlibexecdir,
1560 install_dir : rootlibexecdir)
1562 meson.add_install_script(meson_make_symlink,
1563 join_paths(rootlibexecdir, 'systemd'),
1564 join_paths(rootsbindir, 'init'))
1566 exe = executable('systemd-analyze',
1567 systemd_analyze_sources,
1568 include_directories : includes,
1569 link_with : [libcore,
1571 dependencies : [threads,
1577 install_rpath : rootlibexecdir,
1579 public_programs += exe
1581 executable('systemd-journald',
1582 systemd_journald_sources,
1583 include_directories : includes,
1584 link_with : [libjournal_core,
1586 dependencies : [threads,
1590 install_rpath : rootlibexecdir,
1592 install_dir : rootlibexecdir)
1594 exe = executable('systemd-cat',
1595 systemd_cat_sources,
1596 include_directories : includes,
1597 link_with : [libjournal_core,
1599 dependencies : [threads],
1600 install_rpath : rootlibexecdir,
1602 public_programs += exe
1604 exe = executable('journalctl',
1606 include_directories : includes,
1607 link_with : [libshared],
1608 dependencies : [threads,
1613 install_rpath : rootlibexecdir,
1615 install_dir : rootbindir)
1616 public_programs += exe
1618 executable('systemd-getty-generator',
1619 'src/getty-generator/getty-generator.c',
1620 include_directories : includes,
1621 link_with : [libshared],
1622 install_rpath : rootlibexecdir,
1624 install_dir : systemgeneratordir)
1626 executable('systemd-debug-generator',
1627 'src/debug-generator/debug-generator.c',
1628 include_directories : includes,
1629 link_with : [libshared],
1630 install_rpath : rootlibexecdir,
1632 install_dir : systemgeneratordir)
1634 executable('systemd-fstab-generator',
1635 'src/fstab-generator/fstab-generator.c',
1636 'src/core/mount-setup.c',
1637 include_directories : includes,
1638 link_with : [libshared],
1639 install_rpath : rootlibexecdir,
1641 install_dir : systemgeneratordir)
1643 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1644 executable('30-systemd-environment-d-generator',
1645 'src/environment-d-generator/environment-d-generator.c',
1646 include_directories : includes,
1647 link_with : [libshared],
1648 install_rpath : rootlibexecdir,
1650 install_dir : userenvgeneratordir)
1652 meson.add_install_script(meson_make_symlink,
1653 join_paths(sysconfdir, 'environment'),
1654 join_paths(environmentdir, '99-environment.conf'))
1657 if conf.get('ENABLE_HIBERNATE') == 1
1658 executable('systemd-hibernate-resume-generator',
1659 'src/hibernate-resume/hibernate-resume-generator.c',
1660 include_directories : includes,
1661 link_with : [libshared],
1662 install_rpath : rootlibexecdir,
1664 install_dir : systemgeneratordir)
1666 executable('systemd-hibernate-resume',
1667 'src/hibernate-resume/hibernate-resume.c',
1668 include_directories : includes,
1669 link_with : [libshared],
1670 install_rpath : rootlibexecdir,
1672 install_dir : rootlibexecdir)
1675 if conf.get('HAVE_BLKID') == 1
1676 executable('systemd-gpt-auto-generator',
1677 'src/gpt-auto-generator/gpt-auto-generator.c',
1678 'src/shared/blkid-util.h',
1679 include_directories : includes,
1680 link_with : [libshared],
1681 dependencies : libblkid,
1682 install_rpath : rootlibexecdir,
1684 install_dir : systemgeneratordir)
1686 exe = executable('systemd-dissect',
1687 'src/dissect/dissect.c',
1688 include_directories : includes,
1689 link_with : [libshared],
1690 install_rpath : rootlibexecdir,
1692 install_dir : rootlibexecdir)
1693 public_programs += exe
1696 if conf.get('ENABLE_RESOLVE') == 1
1697 executable('systemd-resolved',
1698 systemd_resolved_sources,
1699 include_directories : includes,
1700 link_with : [libshared,
1702 libsystemd_resolve_core],
1703 dependencies : systemd_resolved_dependencies,
1704 install_rpath : rootlibexecdir,
1706 install_dir : rootlibexecdir)
1708 exe = executable('resolvectl',
1710 include_directories : includes,
1711 link_with : [libshared,
1713 libsystemd_resolve_core],
1714 dependencies : [threads,
1718 install_rpath : rootlibexecdir,
1720 public_programs += exe
1722 meson.add_install_script(meson_make_symlink,
1723 join_paths(bindir, 'resolvectl'),
1724 join_paths(rootsbindir, 'resolvconf'))
1726 meson.add_install_script(meson_make_symlink,
1727 join_paths(bindir, 'resolvectl'),
1728 join_paths(bindir, 'systemd-resolve'))
1731 if conf.get('ENABLE_LOGIND') == 1
1732 executable('systemd-logind',
1733 systemd_logind_sources,
1734 include_directories : includes,
1735 link_with : [liblogind_core,
1737 dependencies : [threads,
1739 install_rpath : rootlibexecdir,
1741 install_dir : rootlibexecdir)
1743 exe = executable('loginctl',
1745 include_directories : includes,
1746 link_with : [libshared],
1747 dependencies : [threads,
1750 install_rpath : rootlibexecdir,
1752 install_dir : rootbindir)
1753 public_programs += exe
1755 exe = executable('systemd-inhibit',
1756 'src/login/inhibit.c',
1757 include_directories : includes,
1758 link_with : [libshared],
1759 install_rpath : rootlibexecdir,
1761 install_dir : rootbindir)
1762 public_programs += exe
1764 if conf.get('HAVE_PAM') == 1
1765 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
1766 pam_systemd = shared_library(
1770 include_directories : includes,
1771 link_args : ['-shared',
1772 '-Wl,--version-script=' + version_script_arg],
1773 link_with : [libsystemd_static,
1775 dependencies : [threads,
1778 link_depends : pam_systemd_sym,
1780 install_dir : pamlibdir)
1782 if want_tests != 'false'
1783 test('dlopen-pam_systemd',
1785 # path to dlopen must include a slash
1786 args : pam_systemd.full_path())
1790 executable('systemd-user-runtime-dir',
1791 user_runtime_dir_sources,
1792 include_directories : includes,
1793 link_with : [libshared],
1794 install_rpath : rootlibexecdir,
1796 install_dir : rootlibexecdir)
1799 if conf.get('HAVE_PAM') == 1
1800 executable('systemd-user-sessions',
1801 'src/user-sessions/user-sessions.c',
1802 include_directories : includes,
1803 link_with : [libshared],
1804 install_rpath : rootlibexecdir,
1806 install_dir : rootlibexecdir)
1809 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1810 exe = executable('bootctl',
1811 'src/boot/bootctl.c',
1812 include_directories : includes,
1813 link_with : [libshared],
1814 dependencies : [libblkid],
1815 install_rpath : rootlibexecdir,
1817 public_programs += exe
1819 executable('systemd-bless-boot',
1820 'src/boot/bless-boot.c',
1821 include_directories : includes,
1822 link_with : [libshared],
1823 dependencies : [libblkid],
1824 install_rpath : rootlibexecdir,
1826 install_dir : rootlibexecdir)
1828 executable('systemd-bless-boot-generator',
1829 'src/boot/bless-boot-generator.c',
1830 include_directories : includes,
1831 link_with : [libshared],
1832 install_rpath : rootlibexecdir,
1834 install_dir : systemgeneratordir)
1837 executable('systemd-boot-check-no-failures',
1838 'src/boot/boot-check-no-failures.c',
1839 include_directories : includes,
1840 link_with : [libshared],
1841 dependencies : [libblkid],
1842 install_rpath : rootlibexecdir,
1844 install_dir : rootlibexecdir)
1846 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1847 include_directories : includes,
1848 link_with : [libshared],
1849 dependencies : [threads],
1850 install_rpath : rootlibexecdir,
1852 public_programs += exe
1855 if get_option('link-systemctl-shared')
1856 systemctl_link_with = [libshared]
1858 systemctl_link_with = [libsystemd_static,
1864 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1865 include_directories : includes,
1866 link_with : systemctl_link_with,
1867 dependencies : [threads,
1872 install_rpath : rootlibexecdir,
1874 install_dir : rootbindir)
1875 public_programs += exe
1877 if conf.get('ENABLE_PORTABLED') == 1
1878 executable('systemd-portabled',
1879 systemd_portabled_sources,
1880 include_directories : includes,
1881 link_with : [libshared],
1882 dependencies : [threads],
1883 install_rpath : rootlibexecdir,
1885 install_dir : rootlibexecdir)
1887 exe = executable('portablectl', 'src/portable/portablectl.c',
1888 include_directories : includes,
1889 link_with : [libshared],
1890 dependencies : [threads],
1891 install_rpath : rootlibexecdir,
1893 install_dir : rootbindir)
1894 public_programs += exe
1897 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1898 meson.add_install_script(meson_make_symlink,
1899 join_paths(rootbindir, 'systemctl'),
1900 join_paths(rootsbindir, alias))
1903 if conf.get('ENABLE_BACKLIGHT') == 1
1904 executable('systemd-backlight',
1905 'src/backlight/backlight.c',
1906 include_directories : includes,
1907 link_with : [libshared],
1908 install_rpath : rootlibexecdir,
1910 install_dir : rootlibexecdir)
1913 if conf.get('ENABLE_RFKILL') == 1
1914 executable('systemd-rfkill',
1915 'src/rfkill/rfkill.c',
1916 include_directories : includes,
1917 link_with : [libshared],
1918 install_rpath : rootlibexecdir,
1920 install_dir : rootlibexecdir)
1923 executable('systemd-system-update-generator',
1924 'src/system-update-generator/system-update-generator.c',
1925 include_directories : includes,
1926 link_with : [libshared],
1927 install_rpath : rootlibexecdir,
1929 install_dir : systemgeneratordir)
1931 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1932 executable('systemd-cryptsetup',
1933 'src/cryptsetup/cryptsetup.c',
1934 include_directories : includes,
1935 link_with : [libshared],
1936 dependencies : [libcryptsetup],
1937 install_rpath : rootlibexecdir,
1939 install_dir : rootlibexecdir)
1941 executable('systemd-cryptsetup-generator',
1942 'src/cryptsetup/cryptsetup-generator.c',
1943 include_directories : includes,
1944 link_with : [libshared],
1945 dependencies : [libcryptsetup],
1946 install_rpath : rootlibexecdir,
1948 install_dir : systemgeneratordir)
1950 executable('systemd-veritysetup',
1951 'src/veritysetup/veritysetup.c',
1952 include_directories : includes,
1953 link_with : [libshared],
1954 dependencies : [libcryptsetup],
1955 install_rpath : rootlibexecdir,
1957 install_dir : rootlibexecdir)
1959 executable('systemd-veritysetup-generator',
1960 'src/veritysetup/veritysetup-generator.c',
1961 include_directories : includes,
1962 link_with : [libshared],
1963 dependencies : [libcryptsetup],
1964 install_rpath : rootlibexecdir,
1966 install_dir : systemgeneratordir)
1969 if conf.get('HAVE_SYSV_COMPAT') == 1
1970 executable('systemd-sysv-generator',
1971 'src/sysv-generator/sysv-generator.c',
1972 include_directories : includes,
1973 link_with : [libshared],
1974 install_rpath : rootlibexecdir,
1976 install_dir : systemgeneratordir)
1978 executable('systemd-rc-local-generator',
1979 'src/rc-local-generator/rc-local-generator.c',
1980 include_directories : includes,
1981 link_with : [libshared],
1982 install_rpath : rootlibexecdir,
1984 install_dir : systemgeneratordir)
1987 if conf.get('ENABLE_HOSTNAMED') == 1
1988 executable('systemd-hostnamed',
1989 'src/hostname/hostnamed.c',
1990 include_directories : includes,
1991 link_with : [libshared],
1992 install_rpath : rootlibexecdir,
1994 install_dir : rootlibexecdir)
1996 exe = executable('hostnamectl',
1997 'src/hostname/hostnamectl.c',
1998 include_directories : includes,
1999 link_with : [libshared],
2000 install_rpath : rootlibexecdir,
2002 public_programs += exe
2005 if conf.get('ENABLE_LOCALED') == 1
2006 if conf.get('HAVE_XKBCOMMON') == 1
2007 # logind will load libxkbcommon.so dynamically on its own
2013 executable('systemd-localed',
2014 systemd_localed_sources,
2015 include_directories : includes,
2016 link_with : [libshared],
2017 dependencies : deps,
2018 install_rpath : rootlibexecdir,
2020 install_dir : rootlibexecdir)
2022 exe = executable('localectl',
2024 include_directories : includes,
2025 link_with : [libshared],
2026 install_rpath : rootlibexecdir,
2028 public_programs += exe
2031 if conf.get('ENABLE_TIMEDATED') == 1
2032 executable('systemd-timedated',
2033 'src/timedate/timedated.c',
2034 include_directories : includes,
2035 link_with : [libshared],
2036 install_rpath : rootlibexecdir,
2038 install_dir : rootlibexecdir)
2041 if conf.get('ENABLE_TIMEDATECTL') == 1
2042 exe = executable('timedatectl',
2043 'src/timedate/timedatectl.c',
2044 include_directories : includes,
2045 install_rpath : rootlibexecdir,
2046 link_with : [libshared],
2047 dependencies : [libm],
2049 public_programs += exe
2052 if conf.get('ENABLE_TIMESYNCD') == 1
2053 executable('systemd-timesyncd',
2054 systemd_timesyncd_sources,
2055 include_directories : includes,
2056 link_with : [libshared],
2057 dependencies : [threads,
2059 install_rpath : rootlibexecdir,
2061 install_dir : rootlibexecdir)
2063 executable('systemd-time-wait-sync',
2064 'src/time-wait-sync/time-wait-sync.c',
2065 include_directories : includes,
2066 link_with : [libshared],
2067 install_rpath : rootlibexecdir,
2069 install_dir : rootlibexecdir)
2072 if conf.get('ENABLE_MACHINED') == 1
2073 executable('systemd-machined',
2074 systemd_machined_sources,
2075 include_directories : includes,
2076 link_with : [libmachine_core,
2078 install_rpath : rootlibexecdir,
2080 install_dir : rootlibexecdir)
2082 exe = executable('machinectl',
2083 'src/machine/machinectl.c',
2084 include_directories : includes,
2085 link_with : [libshared],
2086 dependencies : [threads,
2089 install_rpath : rootlibexecdir,
2091 install_dir : rootbindir)
2092 public_programs += exe
2095 if conf.get('ENABLE_IMPORTD') == 1
2096 executable('systemd-importd',
2097 systemd_importd_sources,
2098 include_directories : includes,
2099 link_with : [libshared],
2100 dependencies : [threads],
2101 install_rpath : rootlibexecdir,
2103 install_dir : rootlibexecdir)
2105 systemd_pull = executable('systemd-pull',
2106 systemd_pull_sources,
2107 include_directories : includes,
2108 link_with : [libshared],
2109 dependencies : [libcurl,
2114 install_rpath : rootlibexecdir,
2116 install_dir : rootlibexecdir)
2118 systemd_import = executable('systemd-import',
2119 systemd_import_sources,
2120 include_directories : includes,
2121 link_with : [libshared],
2122 dependencies : [libcurl,
2126 install_rpath : rootlibexecdir,
2128 install_dir : rootlibexecdir)
2130 systemd_export = executable('systemd-export',
2131 systemd_export_sources,
2132 include_directories : includes,
2133 link_with : [libshared],
2134 dependencies : [libcurl,
2138 install_rpath : rootlibexecdir,
2140 install_dir : rootlibexecdir)
2141 public_programs += [systemd_pull, systemd_import, systemd_export]
2144 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2145 exe = executable('systemd-journal-upload',
2146 systemd_journal_upload_sources,
2147 include_directories : includes,
2148 link_with : [libshared],
2149 dependencies : [threads,
2154 install_rpath : rootlibexecdir,
2156 install_dir : rootlibexecdir)
2157 public_programs += exe
2160 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2161 s_j_remote = executable('systemd-journal-remote',
2162 systemd_journal_remote_sources,
2163 include_directories : includes,
2164 link_with : [libshared,
2165 libsystemd_journal_remote],
2166 dependencies : [threads,
2171 install_rpath : rootlibexecdir,
2173 install_dir : rootlibexecdir)
2175 s_j_gatewayd = executable('systemd-journal-gatewayd',
2176 systemd_journal_gatewayd_sources,
2177 include_directories : includes,
2178 link_with : [libshared],
2179 dependencies : [threads,
2184 install_rpath : rootlibexecdir,
2186 install_dir : rootlibexecdir)
2187 public_programs += [s_j_remote, s_j_gatewayd]
2190 if conf.get('ENABLE_COREDUMP') == 1
2191 executable('systemd-coredump',
2192 systemd_coredump_sources,
2193 include_directories : includes,
2194 link_with : [libshared],
2195 dependencies : [threads,
2200 install_rpath : rootlibexecdir,
2202 install_dir : rootlibexecdir)
2204 exe = executable('coredumpctl',
2205 coredumpctl_sources,
2206 include_directories : includes,
2207 link_with : [libshared],
2208 dependencies : [threads,
2211 install_rpath : rootlibexecdir,
2213 public_programs += exe
2216 if conf.get('ENABLE_BINFMT') == 1
2217 exe = executable('systemd-binfmt',
2218 'src/binfmt/binfmt.c',
2219 include_directories : includes,
2220 link_with : [libshared],
2221 install_rpath : rootlibexecdir,
2223 install_dir : rootlibexecdir)
2224 public_programs += exe
2226 meson.add_install_script('sh', '-c',
2227 mkdir_p.format(binfmtdir))
2228 meson.add_install_script('sh', '-c',
2229 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2232 if conf.get('ENABLE_VCONSOLE') == 1
2233 executable('systemd-vconsole-setup',
2234 'src/vconsole/vconsole-setup.c',
2235 include_directories : includes,
2236 link_with : [libshared],
2237 install_rpath : rootlibexecdir,
2239 install_dir : rootlibexecdir)
2242 if conf.get('ENABLE_RANDOMSEED') == 1
2243 executable('systemd-random-seed',
2244 'src/random-seed/random-seed.c',
2245 include_directories : includes,
2246 link_with : [libshared],
2247 install_rpath : rootlibexecdir,
2249 install_dir : rootlibexecdir)
2252 if conf.get('ENABLE_FIRSTBOOT') == 1
2253 executable('systemd-firstboot',
2254 'src/firstboot/firstboot.c',
2255 include_directories : includes,
2256 link_with : [libshared],
2257 dependencies : [libcrypt],
2258 install_rpath : rootlibexecdir,
2260 install_dir : rootbindir)
2263 executable('systemd-remount-fs',
2264 'src/remount-fs/remount-fs.c',
2265 'src/core/mount-setup.c',
2266 'src/core/mount-setup.h',
2267 include_directories : includes,
2268 link_with : [libshared],
2269 install_rpath : rootlibexecdir,
2271 install_dir : rootlibexecdir)
2273 executable('systemd-machine-id-setup',
2274 'src/machine-id-setup/machine-id-setup-main.c',
2275 'src/core/machine-id-setup.c',
2276 'src/core/machine-id-setup.h',
2277 include_directories : includes,
2278 link_with : [libshared],
2279 install_rpath : rootlibexecdir,
2281 install_dir : rootbindir)
2283 executable('systemd-fsck',
2285 include_directories : includes,
2286 link_with : [libshared],
2287 install_rpath : rootlibexecdir,
2289 install_dir : rootlibexecdir)
2291 executable('systemd-growfs',
2292 'src/partition/growfs.c',
2293 include_directories : includes,
2294 link_with : [libshared],
2295 dependencies : [libcryptsetup],
2296 install_rpath : rootlibexecdir,
2298 install_dir : rootlibexecdir)
2300 executable('systemd-makefs',
2301 'src/partition/makefs.c',
2302 include_directories : includes,
2303 link_with : [libshared],
2304 install_rpath : rootlibexecdir,
2306 install_dir : rootlibexecdir)
2308 executable('systemd-sleep',
2309 'src/sleep/sleep.c',
2310 include_directories : includes,
2311 link_with : [libshared],
2312 install_rpath : rootlibexecdir,
2314 install_dir : rootlibexecdir)
2316 exe = executable('systemd-sysctl',
2317 'src/sysctl/sysctl.c',
2318 include_directories : includes,
2319 link_with : [libshared],
2320 install_rpath : rootlibexecdir,
2322 install_dir : rootlibexecdir)
2323 public_programs += exe
2325 executable('systemd-ac-power',
2326 'src/ac-power/ac-power.c',
2327 include_directories : includes,
2328 link_with : [libshared],
2329 install_rpath : rootlibexecdir,
2331 install_dir : rootlibexecdir)
2333 exe = executable('systemd-detect-virt',
2334 'src/detect-virt/detect-virt.c',
2335 include_directories : includes,
2336 link_with : [libshared],
2337 install_rpath : rootlibexecdir,
2339 public_programs += exe
2341 exe = executable('systemd-delta',
2342 'src/delta/delta.c',
2343 include_directories : includes,
2344 link_with : [libshared],
2345 install_rpath : rootlibexecdir,
2347 public_programs += exe
2349 exe = executable('systemd-escape',
2350 'src/escape/escape.c',
2351 include_directories : includes,
2352 link_with : [libshared],
2353 install_rpath : rootlibexecdir,
2355 install_dir : rootbindir)
2356 public_programs += exe
2358 exe = executable('systemd-notify',
2359 'src/notify/notify.c',
2360 include_directories : includes,
2361 link_with : [libshared],
2362 install_rpath : rootlibexecdir,
2364 install_dir : rootbindir)
2365 public_programs += exe
2367 executable('systemd-volatile-root',
2368 'src/volatile-root/volatile-root.c',
2369 include_directories : includes,
2370 link_with : [libshared],
2371 install_rpath : rootlibexecdir,
2373 install_dir : rootlibexecdir)
2375 executable('systemd-cgroups-agent',
2376 'src/cgroups-agent/cgroups-agent.c',
2377 include_directories : includes,
2378 link_with : [libshared],
2379 install_rpath : rootlibexecdir,
2381 install_dir : rootlibexecdir)
2383 exe = executable('systemd-id128',
2384 'src/id128/id128.c',
2385 include_directories : includes,
2386 link_with : [libshared],
2387 install_rpath : rootlibexecdir,
2389 public_programs += exe
2391 exe = executable('systemd-path',
2393 include_directories : includes,
2394 link_with : [libshared],
2395 install_rpath : rootlibexecdir,
2397 public_programs += exe
2399 exe = executable('systemd-ask-password',
2400 'src/ask-password/ask-password.c',
2401 include_directories : includes,
2402 link_with : [libshared],
2403 install_rpath : rootlibexecdir,
2405 install_dir : rootbindir)
2406 public_programs += exe
2408 executable('systemd-reply-password',
2409 'src/reply-password/reply-password.c',
2410 include_directories : includes,
2411 link_with : [libshared],
2412 install_rpath : rootlibexecdir,
2414 install_dir : rootlibexecdir)
2416 exe = executable('systemd-tty-ask-password-agent',
2417 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2418 include_directories : includes,
2419 link_with : [libshared],
2420 install_rpath : rootlibexecdir,
2422 install_dir : rootbindir)
2423 public_programs += exe
2425 exe = executable('systemd-cgls',
2427 include_directories : includes,
2428 link_with : [libshared],
2429 install_rpath : rootlibexecdir,
2431 public_programs += exe
2433 exe = executable('systemd-cgtop',
2434 'src/cgtop/cgtop.c',
2435 include_directories : includes,
2436 link_with : [libshared],
2437 install_rpath : rootlibexecdir,
2439 public_programs += exe
2441 executable('systemd-initctl',
2442 'src/initctl/initctl.c',
2443 include_directories : includes,
2444 link_with : [libshared],
2445 install_rpath : rootlibexecdir,
2447 install_dir : rootlibexecdir)
2449 exe = executable('systemd-mount',
2450 'src/mount/mount-tool.c',
2451 include_directories : includes,
2452 link_with : [libshared],
2453 install_rpath : rootlibexecdir,
2455 public_programs += exe
2457 meson.add_install_script(meson_make_symlink,
2458 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2460 exe = executable('systemd-run',
2462 include_directories : includes,
2463 link_with : [libshared],
2464 install_rpath : rootlibexecdir,
2466 public_programs += exe
2468 exe = executable('systemd-stdio-bridge',
2469 'src/stdio-bridge/stdio-bridge.c',
2470 include_directories : includes,
2471 link_with : [libshared],
2472 install_rpath : rootlibexecdir,
2474 public_programs += exe
2476 exe = executable('busctl',
2477 'src/busctl/busctl.c',
2478 'src/busctl/busctl-introspect.c',
2479 'src/busctl/busctl-introspect.h',
2480 include_directories : includes,
2481 link_with : [libshared],
2482 install_rpath : rootlibexecdir,
2484 public_programs += exe
2486 if conf.get('ENABLE_SYSUSERS') == 1
2487 exe = executable('systemd-sysusers',
2488 'src/sysusers/sysusers.c',
2489 include_directories : includes,
2490 link_with : [libshared],
2491 install_rpath : rootlibexecdir,
2493 install_dir : rootbindir)
2494 public_programs += exe
2497 if conf.get('ENABLE_TMPFILES') == 1
2498 exe = executable('systemd-tmpfiles',
2499 'src/tmpfiles/tmpfiles.c',
2500 include_directories : includes,
2501 link_with : [libshared],
2502 dependencies : [libacl],
2503 install_rpath : rootlibexecdir,
2505 install_dir : rootbindir)
2506 public_programs += exe
2508 if want_tests != 'false'
2509 test('test-systemd-tmpfiles',
2510 test_systemd_tmpfiles_py,
2511 # https://github.com/mesonbuild/meson/issues/2681
2512 args : exe.full_path())
2516 if conf.get('ENABLE_HWDB') == 1
2517 exe = executable('systemd-hwdb',
2519 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2520 include_directories : includes,
2521 link_with : [libudev_static],
2522 install_rpath : udev_rpath,
2524 install_dir : rootbindir)
2525 public_programs += exe
2528 if conf.get('ENABLE_QUOTACHECK') == 1
2529 executable('systemd-quotacheck',
2530 'src/quotacheck/quotacheck.c',
2531 include_directories : includes,
2532 link_with : [libshared],
2533 install_rpath : rootlibexecdir,
2535 install_dir : rootlibexecdir)
2538 exe = executable('systemd-socket-proxyd',
2539 'src/socket-proxy/socket-proxyd.c',
2540 include_directories : includes,
2541 link_with : [libshared],
2542 dependencies : [threads],
2543 install_rpath : rootlibexecdir,
2545 install_dir : rootlibexecdir)
2546 public_programs += exe
2548 exe = executable('systemd-udevd',
2549 systemd_udevd_sources,
2550 include_directories : includes,
2551 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2552 link_with : [libudev_core,
2555 dependencies : [threads,
2560 install_rpath : udev_rpath,
2562 install_dir : rootlibexecdir)
2563 public_programs += exe
2565 exe = executable('udevadm',
2567 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2568 include_directories : includes,
2569 link_with : [libudev_core,
2572 dependencies : [threads,
2577 install_rpath : udev_rpath,
2579 install_dir : rootbindir)
2580 public_programs += exe
2582 executable('systemd-shutdown',
2583 systemd_shutdown_sources,
2584 include_directories : includes,
2585 link_with : [libshared],
2586 dependencies : [libmount],
2587 install_rpath : rootlibexecdir,
2589 install_dir : rootlibexecdir)
2591 executable('systemd-update-done',
2592 'src/update-done/update-done.c',
2593 include_directories : includes,
2594 link_with : [libshared],
2595 install_rpath : rootlibexecdir,
2597 install_dir : rootlibexecdir)
2599 executable('systemd-update-utmp',
2600 'src/update-utmp/update-utmp.c',
2601 include_directories : includes,
2602 link_with : [libshared],
2603 dependencies : [libaudit],
2604 install_rpath : rootlibexecdir,
2606 install_dir : rootlibexecdir)
2608 if conf.get('HAVE_KMOD') == 1
2609 executable('systemd-modules-load',
2610 'src/modules-load/modules-load.c',
2611 include_directories : includes,
2612 link_with : [libshared],
2613 dependencies : [libkmod],
2614 install_rpath : rootlibexecdir,
2616 install_dir : rootlibexecdir)
2618 meson.add_install_script('sh', '-c',
2619 mkdir_p.format(modulesloaddir))
2620 meson.add_install_script('sh', '-c',
2621 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2624 exe = executable('systemd-nspawn',
2625 systemd_nspawn_sources,
2626 'src/core/mount-setup.c', # FIXME: use a variable?
2627 'src/core/mount-setup.h',
2628 'src/core/loopback-setup.c',
2629 'src/core/loopback-setup.h',
2630 include_directories : includes,
2631 link_with : [libnspawn_core,
2633 dependencies : [libblkid],
2634 install_rpath : rootlibexecdir,
2636 public_programs += exe
2638 if conf.get('ENABLE_NETWORKD') == 1
2639 executable('systemd-networkd',
2640 systemd_networkd_sources,
2641 include_directories : includes,
2642 link_with : [libnetworkd_core,
2646 dependencies : [threads],
2647 install_rpath : rootlibexecdir,
2649 install_dir : rootlibexecdir)
2651 executable('systemd-networkd-wait-online',
2652 systemd_networkd_wait_online_sources,
2653 include_directories : includes,
2654 link_with : [libnetworkd_core,
2656 install_rpath : rootlibexecdir,
2658 install_dir : rootlibexecdir)
2660 exe = executable('networkctl',
2662 include_directories : includes,
2663 link_with : [libsystemd_network,
2665 install_rpath : rootlibexecdir,
2667 install_dir : rootbindir)
2668 public_programs += exe
2671 executable('systemd-sulogin-shell',
2672 ['src/sulogin-shell/sulogin-shell.c'],
2673 include_directories : includes,
2674 link_with : [libshared],
2675 install_rpath : rootlibexecdir,
2677 install_dir : rootlibexecdir)
2679 ############################################################
2682 'systemd-runtest.env',
2683 output : 'systemd-runtest.env',
2684 command : ['sh', '-c', '{ ' +
2685 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2686 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2688 build_by_default : true)
2690 foreach tuple : tests
2692 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2693 dependencies = tuple[2]
2694 condition = tuple.length() >= 4 ? tuple[3] : ''
2695 type = tuple.length() >= 5 ? tuple[4] : ''
2696 defs = tuple.length() >= 6 ? tuple[5] : []
2697 incs = tuple.length() >= 7 ? tuple[6] : includes
2700 name = sources[0].split('/')[-1].split('.')[0]
2701 if type.startswith('timeout=')
2702 timeout = type.split('=')[1].to_int()
2706 if condition == '' or conf.get(condition) == 1
2710 include_directories : incs,
2711 link_with : link_with,
2712 dependencies : dependencies,
2714 build_by_default : want_tests != 'false',
2715 install_rpath : rootlibexecdir,
2716 install : install_tests,
2717 install_dir : join_paths(testsdir, type))
2720 message('@0@ is a manual test'.format(name))
2721 elif type == 'unsafe' and want_tests != 'unsafe'
2722 message('@0@ is an unsafe test'.format(name))
2723 elif want_tests != 'false'
2729 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2734 'test-libsystemd-sym',
2735 test_libsystemd_sym_c,
2736 include_directories : includes,
2737 link_with : [libsystemd],
2738 build_by_default : want_tests != 'false',
2739 install : install_tests,
2740 install_dir : testsdir)
2741 if want_tests != 'false'
2742 test('test-libsystemd-sym', exe)
2746 'test-libsystemd-static-sym',
2747 test_libsystemd_sym_c,
2748 include_directories : includes,
2749 link_with : [install_libsystemd_static],
2750 dependencies : [threads], # threads is already included in dependencies on the library,
2751 # but does not seem to get propagated. Add here as a work-around.
2752 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2753 install : install_tests and static_libsystemd_pic,
2754 install_dir : testsdir)
2755 if want_tests != 'false' and static_libsystemd_pic
2756 test('test-libsystemd-static-sym', exe)
2762 include_directories : includes,
2763 c_args : '-Wno-deprecated-declarations',
2764 link_with : [libudev],
2765 build_by_default : want_tests != 'false',
2766 install : install_tests,
2767 install_dir : testsdir)
2768 if want_tests != 'false'
2769 test('test-libudev-sym', exe)
2773 'test-libudev-static-sym',
2775 include_directories : includes,
2776 c_args : '-Wno-deprecated-declarations',
2777 link_with : [install_libudev_static],
2778 build_by_default : want_tests != 'false' and static_libudev_pic,
2779 install : install_tests and static_libudev_pic,
2780 install_dir : testsdir)
2781 if want_tests != 'false' and static_libudev_pic
2782 test('test-libudev-static-sym', exe)
2785 ############################################################
2789 if get_option('tests') != 'false'
2790 foreach tuple : fuzzers
2792 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2793 dependencies = tuple[2]
2794 defs = tuple.length() >= 4 ? tuple[3] : []
2795 incs = tuple.length() >= 5 ? tuple[4] : includes
2798 dependencies += fuzzing_engine
2800 sources += 'src/fuzz/fuzz-main.c'
2803 name = sources[0].split('/')[-1].split('.')[0]
2805 fuzzer_exes += executable(
2808 include_directories : [incs, include_directories('src/fuzz')],
2809 link_with : link_with,
2810 dependencies : dependencies,
2816 run_target('fuzzers',
2817 depends : fuzzer_exes,
2820 ############################################################
2822 make_directive_index_py = find_program('tools/make-directive-index.py')
2823 make_man_index_py = find_program('tools/make-man-index.py')
2824 xml_helper_py = find_program('tools/xml_helper.py')
2825 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2829 subdir('sysusers.d')
2830 subdir('tmpfiles.d')
2835 subdir('shell-completion/bash')
2836 subdir('shell-completion/zsh')
2837 subdir('docs/sysvinit')
2838 subdir('docs/var-log')
2840 install_subdir('factory/etc',
2841 install_dir : factorydir)
2843 install_data('xorg/50-systemd-user.sh',
2844 install_dir : xinitrcdir)
2845 install_data('modprobe.d/systemd.conf',
2846 install_dir : modprobedir)
2847 install_data('LICENSE.GPL2',
2851 'docs/CODING_STYLE.md',
2852 'docs/DISTRO_PORTING.md',
2853 'docs/ENVIRONMENT.md',
2855 'docs/TRANSIENT-SETTINGS.md',
2856 'docs/TRANSLATORS.md',
2857 'docs/UIDS-GIDS.md',
2858 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2859 install_dir : docdir)
2861 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2862 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2864 ############################################################
2866 meson_check_help = find_program('tools/meson-check-help.sh')
2868 foreach exec : public_programs
2869 name = exec.full_path().split('/')[-1]
2870 if want_tests != 'false'
2871 test('check-help-' + name,
2873 args : exec.full_path())
2877 ############################################################
2879 # Enable tests for all supported sanitizers
2880 foreach tuple : sanitizers
2881 sanitizer = tuple[0]
2884 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2886 foreach p : fuzz_regression_tests
2887 b = p.split('/')[-2]
2888 c = p.split('/')[-1]
2890 name = '@0@:@1@'.format(b, sanitizer)
2893 if want_tests == 'false'
2894 message('Not compiling @0@ because tests is set to false'.format(name))
2896 exe = custom_target(
2900 command : [env, 'ln', '-fs',
2901 join_paths(build.full_path(), b),
2903 build_by_default : true)
2905 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2910 if want_tests != 'false' and slow_tests
2911 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2913 args : [exe.full_path(),
2914 join_paths(meson.source_root(), p)])
2921 ############################################################
2924 all_files = run_command(
2926 ['--git-dir=@0@/.git'.format(meson.source_root()),
2929 all_files = files(all_files.stdout().split())
2934 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
2937 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
2941 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2944 command : [meson_git_contrib_sh])
2948 git_head = run_command(
2950 ['--git-dir=@0@/.git'.format(meson.source_root()),
2951 'rev-parse', 'HEAD']).stdout().strip()
2952 git_head_short = run_command(
2954 ['--git-dir=@0@/.git'.format(meson.source_root()),
2955 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2959 command : ['git', 'archive',
2960 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
2962 '--prefix', 'systemd-@0@/'.format(git_head),
2966 ############################################################
2968 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2971 depends : [man, libsystemd, libudev],
2972 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2976 command : ['sh', '@0@/tools/make-index-md.sh'.format(meson.source_root()), meson.source_root()])
2978 ############################################################
2981 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2983 'split /usr: @0@'.format(split_usr),
2984 'split bin-sbin: @0@'.format(split_bin),
2985 'prefix directory: @0@'.format(prefixdir),
2986 'rootprefix directory: @0@'.format(rootprefixdir),
2987 'sysconf directory: @0@'.format(sysconfdir),
2988 'include directory: @0@'.format(includedir),
2989 'lib directory: @0@'.format(libdir),
2990 'rootlib directory: @0@'.format(rootlibdir),
2991 'SysV init scripts: @0@'.format(sysvinit_path),
2992 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2993 'PAM modules directory: @0@'.format(pamlibdir),
2994 'PAM configuration directory: @0@'.format(pamconfdir),
2995 'RPM macros directory: @0@'.format(rpmmacrosdir),
2996 'modprobe.d directory: @0@'.format(modprobedir),
2997 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2998 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2999 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3000 'bash completions directory: @0@'.format(bashcompletiondir),
3001 'zsh completions directory: @0@'.format(zshcompletiondir),
3002 'extra start script: @0@'.format(get_option('rc-local')),
3003 'extra stop script: @0@'.format(get_option('halt-local')),
3004 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3005 get_option('debug-tty')),
3006 'TTY GID: @0@'.format(tty_gid),
3007 'users GID: @0@'.format(substs.get('USERS_GID')),
3008 'maximum system UID: @0@'.format(system_uid_max),
3009 'maximum system GID: @0@'.format(system_gid_max),
3010 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3011 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3012 'minimum container UID base: @0@'.format(container_uid_base_min),
3013 'maximum container UID base: @0@'.format(container_uid_base_max),
3014 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3015 'render group access mode: @0@'.format(get_option('group-render-mode')),
3016 'certificate root directory: @0@'.format(get_option('certificate-root')),
3017 'support URL: @0@'.format(support_url),
3018 'nobody user name: @0@'.format(nobody_user),
3019 'nobody group name: @0@'.format(nobody_group),
3020 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3021 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3023 'default DNSSEC mode: @0@'.format(default_dnssec),
3024 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3025 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3026 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
3028 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3029 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3031 'default DNS servers: @0@'.format(alt_dns_servers),
3032 'default NTP servers: @0@'.format(alt_ntp_servers)]
3034 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3035 '@@0@'.format(time_epoch)).stdout().strip()
3037 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3040 'static libsystemd: @0@'.format(static_libsystemd),
3041 'static libudev: @0@'.format(static_libudev)]
3044 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3045 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3046 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3048 if conf.get('ENABLE_EFI') == 1
3049 status += 'efi arch: @0@'.format(efi_arch)
3053 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3054 'EFI CC @0@'.format(efi_cc),
3055 'EFI lib directory: @0@'.format(efi_libdir),
3056 'EFI lds directory: @0@'.format(efi_ldsdir),
3057 'EFI include directory: @0@'.format(efi_incdir)]
3109 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3110 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3113 ['legacy pkla', install_polkit_pkla],
3115 ['gnu-efi', have_gnu_efi],
3128 ['man pages', want_man],
3129 ['html pages', want_html],
3130 ['man page indices', want_man and have_lxml],
3135 ['adm group', get_option('adm-group')],
3136 ['wheel group', get_option('wheel-group')],
3139 ['debug mmap cache'],
3142 ['valgrind', conf.get('VALGRIND') == 1],
3143 ['trace logging', conf.get('LOG_TRACE') == 1],
3144 ['link-udev-shared', get_option('link-udev-shared')],
3145 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3148 if tuple.length() >= 2
3151 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3152 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3153 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3164 'enabled features: @0@'.format(', '.join(found)),
3166 'disabled features: @0@'.format(', '.join(missing)),
3168 message('\n '.join(status))
3170 if rootprefixdir != rootprefix_default
3172 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3173 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3174 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))