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')
1391 generate_gperfs = find_program('tools/generate-gperfs.py')
1395 subdir('src/systemd')
1397 subdir('src/libsystemd')
1398 subdir('src/libsystemd-network')
1399 subdir('src/journal')
1402 libjournal_core = static_library(
1404 libjournal_core_sources,
1406 include_directories : includes,
1409 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1410 libsystemd = shared_library(
1413 version : libsystemd_version,
1414 include_directories : includes,
1415 link_args : ['-shared',
1416 '-Wl,--version-script=' + libsystemd_sym_path],
1417 link_with : [libbasic,
1419 link_whole : [libsystemd_static,
1421 dependencies : [threads,
1425 link_depends : libsystemd_sym,
1427 install_dir : rootlibdir)
1429 static_libsystemd = get_option('static-libsystemd')
1430 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1432 install_libsystemd_static = static_library(
1435 journal_client_sources,
1437 basic_gcrypt_sources,
1439 include_directories : includes,
1440 build_by_default : static_libsystemd != 'false',
1441 install : static_libsystemd != 'false',
1442 install_dir : rootlibdir,
1443 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1444 dependencies : [threads,
1453 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1455 ############################################################
1457 # binaries that have --help and are intended for use by humans,
1458 # usually, but not always, installed in /bin.
1459 public_programs = []
1461 subdir('src/libudev')
1462 subdir('src/shared')
1465 subdir('src/network')
1467 subdir('src/analyze')
1468 subdir('src/journal-remote')
1469 subdir('src/coredump')
1470 subdir('src/hostname')
1471 subdir('src/import')
1472 subdir('src/kernel-install')
1473 subdir('src/locale')
1474 subdir('src/machine')
1475 subdir('src/portable')
1476 subdir('src/nspawn')
1477 subdir('src/resolve')
1478 subdir('src/timedate')
1479 subdir('src/timesync')
1480 subdir('src/vconsole')
1481 subdir('src/boot/efi')
1488 ############################################################
1490 # only static linking apart from libdl, to make sure that the
1491 # module is linked to all libraries that it uses.
1492 test_dlopen = executable(
1496 include_directories : includes,
1497 link_with : [libbasic],
1498 dependencies : [libdl],
1499 build_by_default : want_tests != 'false')
1501 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1502 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1503 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1504 ['resolve', 'ENABLE_NSS_RESOLVE']]
1506 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1510 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1511 version_script_arg = join_paths(meson.source_root(), sym)
1513 nss = shared_library(
1515 'src/nss-@0@/nss-@0@.c'.format(module),
1518 include_directories : includes,
1519 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1520 link_args : ['-Wl,-z,nodelete',
1522 '-Wl,--version-script=' + version_script_arg,
1524 link_with : [libsystemd_static,
1526 dependencies : [threads,
1530 install_dir : rootlibdir)
1532 # We cannot use shared_module because it does not support version suffix.
1533 # Unfortunately shared_library insists on creating the symlink…
1534 meson.add_install_script('sh', '-c',
1535 'rm $DESTDIR@0@/libnss_@1@.so'
1536 .format(rootlibdir, module))
1538 if want_tests != 'false'
1539 test('dlopen-nss_' + module,
1541 # path to dlopen must include a slash
1542 args : nss.full_path())
1547 ############################################################
1549 executable('systemd',
1551 include_directories : includes,
1552 link_with : [libcore,
1554 dependencies : [threads,
1560 install_rpath : rootlibexecdir,
1562 install_dir : rootlibexecdir)
1564 meson.add_install_script(meson_make_symlink,
1565 join_paths(rootlibexecdir, 'systemd'),
1566 join_paths(rootsbindir, 'init'))
1568 exe = executable('systemd-analyze',
1569 systemd_analyze_sources,
1570 include_directories : includes,
1571 link_with : [libcore,
1573 dependencies : [threads,
1579 install_rpath : rootlibexecdir,
1581 public_programs += exe
1583 executable('systemd-journald',
1584 systemd_journald_sources,
1585 include_directories : includes,
1586 link_with : [libjournal_core,
1588 dependencies : [threads,
1592 install_rpath : rootlibexecdir,
1594 install_dir : rootlibexecdir)
1596 exe = executable('systemd-cat',
1597 systemd_cat_sources,
1598 include_directories : includes,
1599 link_with : [libjournal_core,
1601 dependencies : [threads],
1602 install_rpath : rootlibexecdir,
1604 public_programs += exe
1606 exe = executable('journalctl',
1608 include_directories : includes,
1609 link_with : [libshared],
1610 dependencies : [threads,
1615 install_rpath : rootlibexecdir,
1617 install_dir : rootbindir)
1618 public_programs += exe
1620 executable('systemd-getty-generator',
1621 'src/getty-generator/getty-generator.c',
1622 include_directories : includes,
1623 link_with : [libshared],
1624 install_rpath : rootlibexecdir,
1626 install_dir : systemgeneratordir)
1628 executable('systemd-debug-generator',
1629 'src/debug-generator/debug-generator.c',
1630 include_directories : includes,
1631 link_with : [libshared],
1632 install_rpath : rootlibexecdir,
1634 install_dir : systemgeneratordir)
1636 executable('systemd-fstab-generator',
1637 'src/fstab-generator/fstab-generator.c',
1638 'src/core/mount-setup.c',
1639 include_directories : includes,
1640 link_with : [libshared],
1641 install_rpath : rootlibexecdir,
1643 install_dir : systemgeneratordir)
1645 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1646 executable('30-systemd-environment-d-generator',
1647 'src/environment-d-generator/environment-d-generator.c',
1648 include_directories : includes,
1649 link_with : [libshared],
1650 install_rpath : rootlibexecdir,
1652 install_dir : userenvgeneratordir)
1654 meson.add_install_script(meson_make_symlink,
1655 join_paths(sysconfdir, 'environment'),
1656 join_paths(environmentdir, '99-environment.conf'))
1659 if conf.get('ENABLE_HIBERNATE') == 1
1660 executable('systemd-hibernate-resume-generator',
1661 'src/hibernate-resume/hibernate-resume-generator.c',
1662 include_directories : includes,
1663 link_with : [libshared],
1664 install_rpath : rootlibexecdir,
1666 install_dir : systemgeneratordir)
1668 executable('systemd-hibernate-resume',
1669 'src/hibernate-resume/hibernate-resume.c',
1670 include_directories : includes,
1671 link_with : [libshared],
1672 install_rpath : rootlibexecdir,
1674 install_dir : rootlibexecdir)
1677 if conf.get('HAVE_BLKID') == 1
1678 executable('systemd-gpt-auto-generator',
1679 'src/gpt-auto-generator/gpt-auto-generator.c',
1680 'src/shared/blkid-util.h',
1681 include_directories : includes,
1682 link_with : [libshared],
1683 dependencies : libblkid,
1684 install_rpath : rootlibexecdir,
1686 install_dir : systemgeneratordir)
1688 exe = executable('systemd-dissect',
1689 'src/dissect/dissect.c',
1690 include_directories : includes,
1691 link_with : [libshared],
1692 install_rpath : rootlibexecdir,
1694 install_dir : rootlibexecdir)
1695 public_programs += exe
1698 if conf.get('ENABLE_RESOLVE') == 1
1699 executable('systemd-resolved',
1700 systemd_resolved_sources,
1701 include_directories : includes,
1702 link_with : [libshared,
1704 libsystemd_resolve_core],
1705 dependencies : systemd_resolved_dependencies,
1706 install_rpath : rootlibexecdir,
1708 install_dir : rootlibexecdir)
1710 exe = executable('resolvectl',
1712 include_directories : includes,
1713 link_with : [libshared,
1715 libsystemd_resolve_core],
1716 dependencies : [threads,
1720 install_rpath : rootlibexecdir,
1722 public_programs += exe
1724 meson.add_install_script(meson_make_symlink,
1725 join_paths(bindir, 'resolvectl'),
1726 join_paths(rootsbindir, 'resolvconf'))
1728 meson.add_install_script(meson_make_symlink,
1729 join_paths(bindir, 'resolvectl'),
1730 join_paths(bindir, 'systemd-resolve'))
1733 if conf.get('ENABLE_LOGIND') == 1
1734 executable('systemd-logind',
1735 systemd_logind_sources,
1736 include_directories : includes,
1737 link_with : [liblogind_core,
1739 dependencies : [threads,
1741 install_rpath : rootlibexecdir,
1743 install_dir : rootlibexecdir)
1745 exe = executable('loginctl',
1747 include_directories : includes,
1748 link_with : [libshared],
1749 dependencies : [threads,
1752 install_rpath : rootlibexecdir,
1754 install_dir : rootbindir)
1755 public_programs += exe
1757 exe = executable('systemd-inhibit',
1758 'src/login/inhibit.c',
1759 include_directories : includes,
1760 link_with : [libshared],
1761 install_rpath : rootlibexecdir,
1763 install_dir : rootbindir)
1764 public_programs += exe
1766 if conf.get('HAVE_PAM') == 1
1767 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
1768 pam_systemd = shared_library(
1772 include_directories : includes,
1773 link_args : ['-shared',
1774 '-Wl,--version-script=' + version_script_arg],
1775 link_with : [libsystemd_static,
1777 dependencies : [threads,
1780 link_depends : pam_systemd_sym,
1782 install_dir : pamlibdir)
1784 if want_tests != 'false'
1785 test('dlopen-pam_systemd',
1787 # path to dlopen must include a slash
1788 args : pam_systemd.full_path())
1792 executable('systemd-user-runtime-dir',
1793 user_runtime_dir_sources,
1794 include_directories : includes,
1795 link_with : [libshared],
1796 install_rpath : rootlibexecdir,
1798 install_dir : rootlibexecdir)
1801 if conf.get('HAVE_PAM') == 1
1802 executable('systemd-user-sessions',
1803 'src/user-sessions/user-sessions.c',
1804 include_directories : includes,
1805 link_with : [libshared],
1806 install_rpath : rootlibexecdir,
1808 install_dir : rootlibexecdir)
1811 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1812 exe = executable('bootctl',
1813 'src/boot/bootctl.c',
1814 include_directories : includes,
1815 link_with : [libshared],
1816 dependencies : [libblkid],
1817 install_rpath : rootlibexecdir,
1819 public_programs += exe
1821 executable('systemd-bless-boot',
1822 'src/boot/bless-boot.c',
1823 include_directories : includes,
1824 link_with : [libshared],
1825 dependencies : [libblkid],
1826 install_rpath : rootlibexecdir,
1828 install_dir : rootlibexecdir)
1830 executable('systemd-bless-boot-generator',
1831 'src/boot/bless-boot-generator.c',
1832 include_directories : includes,
1833 link_with : [libshared],
1834 install_rpath : rootlibexecdir,
1836 install_dir : systemgeneratordir)
1839 executable('systemd-boot-check-no-failures',
1840 'src/boot/boot-check-no-failures.c',
1841 include_directories : includes,
1842 link_with : [libshared],
1843 dependencies : [libblkid],
1844 install_rpath : rootlibexecdir,
1846 install_dir : rootlibexecdir)
1848 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1849 include_directories : includes,
1850 link_with : [libshared],
1851 dependencies : [threads],
1852 install_rpath : rootlibexecdir,
1854 public_programs += exe
1857 if get_option('link-systemctl-shared')
1858 systemctl_link_with = [libshared]
1860 systemctl_link_with = [libsystemd_static,
1866 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1867 include_directories : includes,
1868 link_with : systemctl_link_with,
1869 dependencies : [threads,
1874 install_rpath : rootlibexecdir,
1876 install_dir : rootbindir)
1877 public_programs += exe
1879 if conf.get('ENABLE_PORTABLED') == 1
1880 executable('systemd-portabled',
1881 systemd_portabled_sources,
1882 include_directories : includes,
1883 link_with : [libshared],
1884 dependencies : [threads],
1885 install_rpath : rootlibexecdir,
1887 install_dir : rootlibexecdir)
1889 exe = executable('portablectl', 'src/portable/portablectl.c',
1890 include_directories : includes,
1891 link_with : [libshared],
1892 dependencies : [threads],
1893 install_rpath : rootlibexecdir,
1895 install_dir : rootbindir)
1896 public_programs += exe
1899 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1900 meson.add_install_script(meson_make_symlink,
1901 join_paths(rootbindir, 'systemctl'),
1902 join_paths(rootsbindir, alias))
1905 if conf.get('ENABLE_BACKLIGHT') == 1
1906 executable('systemd-backlight',
1907 'src/backlight/backlight.c',
1908 include_directories : includes,
1909 link_with : [libshared],
1910 install_rpath : rootlibexecdir,
1912 install_dir : rootlibexecdir)
1915 if conf.get('ENABLE_RFKILL') == 1
1916 executable('systemd-rfkill',
1917 'src/rfkill/rfkill.c',
1918 include_directories : includes,
1919 link_with : [libshared],
1920 install_rpath : rootlibexecdir,
1922 install_dir : rootlibexecdir)
1925 executable('systemd-system-update-generator',
1926 'src/system-update-generator/system-update-generator.c',
1927 include_directories : includes,
1928 link_with : [libshared],
1929 install_rpath : rootlibexecdir,
1931 install_dir : systemgeneratordir)
1933 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1934 executable('systemd-cryptsetup',
1935 'src/cryptsetup/cryptsetup.c',
1936 include_directories : includes,
1937 link_with : [libshared],
1938 dependencies : [libcryptsetup],
1939 install_rpath : rootlibexecdir,
1941 install_dir : rootlibexecdir)
1943 executable('systemd-cryptsetup-generator',
1944 'src/cryptsetup/cryptsetup-generator.c',
1945 include_directories : includes,
1946 link_with : [libshared],
1947 dependencies : [libcryptsetup],
1948 install_rpath : rootlibexecdir,
1950 install_dir : systemgeneratordir)
1952 executable('systemd-veritysetup',
1953 'src/veritysetup/veritysetup.c',
1954 include_directories : includes,
1955 link_with : [libshared],
1956 dependencies : [libcryptsetup],
1957 install_rpath : rootlibexecdir,
1959 install_dir : rootlibexecdir)
1961 executable('systemd-veritysetup-generator',
1962 'src/veritysetup/veritysetup-generator.c',
1963 include_directories : includes,
1964 link_with : [libshared],
1965 dependencies : [libcryptsetup],
1966 install_rpath : rootlibexecdir,
1968 install_dir : systemgeneratordir)
1971 if conf.get('HAVE_SYSV_COMPAT') == 1
1972 executable('systemd-sysv-generator',
1973 'src/sysv-generator/sysv-generator.c',
1974 include_directories : includes,
1975 link_with : [libshared],
1976 install_rpath : rootlibexecdir,
1978 install_dir : systemgeneratordir)
1980 executable('systemd-rc-local-generator',
1981 'src/rc-local-generator/rc-local-generator.c',
1982 include_directories : includes,
1983 link_with : [libshared],
1984 install_rpath : rootlibexecdir,
1986 install_dir : systemgeneratordir)
1989 if conf.get('ENABLE_HOSTNAMED') == 1
1990 executable('systemd-hostnamed',
1991 'src/hostname/hostnamed.c',
1992 include_directories : includes,
1993 link_with : [libshared],
1994 install_rpath : rootlibexecdir,
1996 install_dir : rootlibexecdir)
1998 exe = executable('hostnamectl',
1999 'src/hostname/hostnamectl.c',
2000 include_directories : includes,
2001 link_with : [libshared],
2002 install_rpath : rootlibexecdir,
2004 public_programs += exe
2007 if conf.get('ENABLE_LOCALED') == 1
2008 if conf.get('HAVE_XKBCOMMON') == 1
2009 # logind will load libxkbcommon.so dynamically on its own
2015 executable('systemd-localed',
2016 systemd_localed_sources,
2017 include_directories : includes,
2018 link_with : [libshared],
2019 dependencies : deps,
2020 install_rpath : rootlibexecdir,
2022 install_dir : rootlibexecdir)
2024 exe = executable('localectl',
2026 include_directories : includes,
2027 link_with : [libshared],
2028 install_rpath : rootlibexecdir,
2030 public_programs += exe
2033 if conf.get('ENABLE_TIMEDATED') == 1
2034 executable('systemd-timedated',
2035 'src/timedate/timedated.c',
2036 include_directories : includes,
2037 link_with : [libshared],
2038 install_rpath : rootlibexecdir,
2040 install_dir : rootlibexecdir)
2043 if conf.get('ENABLE_TIMEDATECTL') == 1
2044 exe = executable('timedatectl',
2045 'src/timedate/timedatectl.c',
2046 include_directories : includes,
2047 install_rpath : rootlibexecdir,
2048 link_with : [libshared],
2049 dependencies : [libm],
2051 public_programs += exe
2054 if conf.get('ENABLE_TIMESYNCD') == 1
2055 executable('systemd-timesyncd',
2056 systemd_timesyncd_sources,
2057 include_directories : includes,
2058 link_with : [libshared],
2059 dependencies : [threads,
2061 install_rpath : rootlibexecdir,
2063 install_dir : rootlibexecdir)
2065 executable('systemd-time-wait-sync',
2066 'src/time-wait-sync/time-wait-sync.c',
2067 include_directories : includes,
2068 link_with : [libshared],
2069 install_rpath : rootlibexecdir,
2071 install_dir : rootlibexecdir)
2074 if conf.get('ENABLE_MACHINED') == 1
2075 executable('systemd-machined',
2076 systemd_machined_sources,
2077 include_directories : includes,
2078 link_with : [libmachine_core,
2080 install_rpath : rootlibexecdir,
2082 install_dir : rootlibexecdir)
2084 exe = executable('machinectl',
2085 'src/machine/machinectl.c',
2086 include_directories : includes,
2087 link_with : [libshared],
2088 dependencies : [threads,
2091 install_rpath : rootlibexecdir,
2093 install_dir : rootbindir)
2094 public_programs += exe
2097 if conf.get('ENABLE_IMPORTD') == 1
2098 executable('systemd-importd',
2099 systemd_importd_sources,
2100 include_directories : includes,
2101 link_with : [libshared],
2102 dependencies : [threads],
2103 install_rpath : rootlibexecdir,
2105 install_dir : rootlibexecdir)
2107 systemd_pull = executable('systemd-pull',
2108 systemd_pull_sources,
2109 include_directories : includes,
2110 link_with : [libshared],
2111 dependencies : [libcurl,
2116 install_rpath : rootlibexecdir,
2118 install_dir : rootlibexecdir)
2120 systemd_import = executable('systemd-import',
2121 systemd_import_sources,
2122 include_directories : includes,
2123 link_with : [libshared],
2124 dependencies : [libcurl,
2128 install_rpath : rootlibexecdir,
2130 install_dir : rootlibexecdir)
2132 systemd_export = executable('systemd-export',
2133 systemd_export_sources,
2134 include_directories : includes,
2135 link_with : [libshared],
2136 dependencies : [libcurl,
2140 install_rpath : rootlibexecdir,
2142 install_dir : rootlibexecdir)
2143 public_programs += [systemd_pull, systemd_import, systemd_export]
2146 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2147 exe = executable('systemd-journal-upload',
2148 systemd_journal_upload_sources,
2149 include_directories : includes,
2150 link_with : [libshared],
2151 dependencies : [threads,
2156 install_rpath : rootlibexecdir,
2158 install_dir : rootlibexecdir)
2159 public_programs += exe
2162 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2163 s_j_remote = executable('systemd-journal-remote',
2164 systemd_journal_remote_sources,
2165 include_directories : includes,
2166 link_with : [libshared,
2167 libsystemd_journal_remote],
2168 dependencies : [threads,
2173 install_rpath : rootlibexecdir,
2175 install_dir : rootlibexecdir)
2177 s_j_gatewayd = executable('systemd-journal-gatewayd',
2178 systemd_journal_gatewayd_sources,
2179 include_directories : includes,
2180 link_with : [libshared],
2181 dependencies : [threads,
2186 install_rpath : rootlibexecdir,
2188 install_dir : rootlibexecdir)
2189 public_programs += [s_j_remote, s_j_gatewayd]
2192 if conf.get('ENABLE_COREDUMP') == 1
2193 executable('systemd-coredump',
2194 systemd_coredump_sources,
2195 include_directories : includes,
2196 link_with : [libshared],
2197 dependencies : [threads,
2202 install_rpath : rootlibexecdir,
2204 install_dir : rootlibexecdir)
2206 exe = executable('coredumpctl',
2207 coredumpctl_sources,
2208 include_directories : includes,
2209 link_with : [libshared],
2210 dependencies : [threads,
2213 install_rpath : rootlibexecdir,
2215 public_programs += exe
2218 if conf.get('ENABLE_BINFMT') == 1
2219 exe = executable('systemd-binfmt',
2220 'src/binfmt/binfmt.c',
2221 include_directories : includes,
2222 link_with : [libshared],
2223 install_rpath : rootlibexecdir,
2225 install_dir : rootlibexecdir)
2226 public_programs += exe
2228 meson.add_install_script('sh', '-c',
2229 mkdir_p.format(binfmtdir))
2230 meson.add_install_script('sh', '-c',
2231 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2234 if conf.get('ENABLE_VCONSOLE') == 1
2235 executable('systemd-vconsole-setup',
2236 'src/vconsole/vconsole-setup.c',
2237 include_directories : includes,
2238 link_with : [libshared],
2239 install_rpath : rootlibexecdir,
2241 install_dir : rootlibexecdir)
2244 if conf.get('ENABLE_RANDOMSEED') == 1
2245 executable('systemd-random-seed',
2246 'src/random-seed/random-seed.c',
2247 include_directories : includes,
2248 link_with : [libshared],
2249 install_rpath : rootlibexecdir,
2251 install_dir : rootlibexecdir)
2254 if conf.get('ENABLE_FIRSTBOOT') == 1
2255 executable('systemd-firstboot',
2256 'src/firstboot/firstboot.c',
2257 include_directories : includes,
2258 link_with : [libshared],
2259 dependencies : [libcrypt],
2260 install_rpath : rootlibexecdir,
2262 install_dir : rootbindir)
2265 executable('systemd-remount-fs',
2266 'src/remount-fs/remount-fs.c',
2267 'src/core/mount-setup.c',
2268 'src/core/mount-setup.h',
2269 include_directories : includes,
2270 link_with : [libshared],
2271 install_rpath : rootlibexecdir,
2273 install_dir : rootlibexecdir)
2275 executable('systemd-machine-id-setup',
2276 'src/machine-id-setup/machine-id-setup-main.c',
2277 'src/core/machine-id-setup.c',
2278 'src/core/machine-id-setup.h',
2279 include_directories : includes,
2280 link_with : [libshared],
2281 install_rpath : rootlibexecdir,
2283 install_dir : rootbindir)
2285 executable('systemd-fsck',
2287 include_directories : includes,
2288 link_with : [libshared],
2289 install_rpath : rootlibexecdir,
2291 install_dir : rootlibexecdir)
2293 executable('systemd-growfs',
2294 'src/partition/growfs.c',
2295 include_directories : includes,
2296 link_with : [libshared],
2297 dependencies : [libcryptsetup],
2298 install_rpath : rootlibexecdir,
2300 install_dir : rootlibexecdir)
2302 executable('systemd-makefs',
2303 'src/partition/makefs.c',
2304 include_directories : includes,
2305 link_with : [libshared],
2306 install_rpath : rootlibexecdir,
2308 install_dir : rootlibexecdir)
2310 executable('systemd-sleep',
2311 'src/sleep/sleep.c',
2312 include_directories : includes,
2313 link_with : [libshared],
2314 install_rpath : rootlibexecdir,
2316 install_dir : rootlibexecdir)
2318 exe = executable('systemd-sysctl',
2319 'src/sysctl/sysctl.c',
2320 include_directories : includes,
2321 link_with : [libshared],
2322 install_rpath : rootlibexecdir,
2324 install_dir : rootlibexecdir)
2325 public_programs += exe
2327 executable('systemd-ac-power',
2328 'src/ac-power/ac-power.c',
2329 include_directories : includes,
2330 link_with : [libshared],
2331 install_rpath : rootlibexecdir,
2333 install_dir : rootlibexecdir)
2335 exe = executable('systemd-detect-virt',
2336 'src/detect-virt/detect-virt.c',
2337 include_directories : includes,
2338 link_with : [libshared],
2339 install_rpath : rootlibexecdir,
2341 public_programs += exe
2343 exe = executable('systemd-delta',
2344 'src/delta/delta.c',
2345 include_directories : includes,
2346 link_with : [libshared],
2347 install_rpath : rootlibexecdir,
2349 public_programs += exe
2351 exe = executable('systemd-escape',
2352 'src/escape/escape.c',
2353 include_directories : includes,
2354 link_with : [libshared],
2355 install_rpath : rootlibexecdir,
2357 install_dir : rootbindir)
2358 public_programs += exe
2360 exe = executable('systemd-notify',
2361 'src/notify/notify.c',
2362 include_directories : includes,
2363 link_with : [libshared],
2364 install_rpath : rootlibexecdir,
2366 install_dir : rootbindir)
2367 public_programs += exe
2369 executable('systemd-volatile-root',
2370 'src/volatile-root/volatile-root.c',
2371 include_directories : includes,
2372 link_with : [libshared],
2373 install_rpath : rootlibexecdir,
2375 install_dir : rootlibexecdir)
2377 executable('systemd-cgroups-agent',
2378 'src/cgroups-agent/cgroups-agent.c',
2379 include_directories : includes,
2380 link_with : [libshared],
2381 install_rpath : rootlibexecdir,
2383 install_dir : rootlibexecdir)
2385 exe = executable('systemd-id128',
2386 'src/id128/id128.c',
2387 include_directories : includes,
2388 link_with : [libshared],
2389 install_rpath : rootlibexecdir,
2391 public_programs += exe
2393 exe = executable('systemd-path',
2395 include_directories : includes,
2396 link_with : [libshared],
2397 install_rpath : rootlibexecdir,
2399 public_programs += exe
2401 exe = executable('systemd-ask-password',
2402 'src/ask-password/ask-password.c',
2403 include_directories : includes,
2404 link_with : [libshared],
2405 install_rpath : rootlibexecdir,
2407 install_dir : rootbindir)
2408 public_programs += exe
2410 executable('systemd-reply-password',
2411 'src/reply-password/reply-password.c',
2412 include_directories : includes,
2413 link_with : [libshared],
2414 install_rpath : rootlibexecdir,
2416 install_dir : rootlibexecdir)
2418 exe = executable('systemd-tty-ask-password-agent',
2419 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2420 include_directories : includes,
2421 link_with : [libshared],
2422 install_rpath : rootlibexecdir,
2424 install_dir : rootbindir)
2425 public_programs += exe
2427 exe = executable('systemd-cgls',
2429 include_directories : includes,
2430 link_with : [libshared],
2431 install_rpath : rootlibexecdir,
2433 public_programs += exe
2435 exe = executable('systemd-cgtop',
2436 'src/cgtop/cgtop.c',
2437 include_directories : includes,
2438 link_with : [libshared],
2439 install_rpath : rootlibexecdir,
2441 public_programs += exe
2443 executable('systemd-initctl',
2444 'src/initctl/initctl.c',
2445 include_directories : includes,
2446 link_with : [libshared],
2447 install_rpath : rootlibexecdir,
2449 install_dir : rootlibexecdir)
2451 exe = executable('systemd-mount',
2452 'src/mount/mount-tool.c',
2453 include_directories : includes,
2454 link_with : [libshared],
2455 install_rpath : rootlibexecdir,
2457 public_programs += exe
2459 meson.add_install_script(meson_make_symlink,
2460 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2462 exe = executable('systemd-run',
2464 include_directories : includes,
2465 link_with : [libshared],
2466 install_rpath : rootlibexecdir,
2468 public_programs += exe
2470 exe = executable('systemd-stdio-bridge',
2471 'src/stdio-bridge/stdio-bridge.c',
2472 include_directories : includes,
2473 link_with : [libshared],
2474 install_rpath : rootlibexecdir,
2476 public_programs += exe
2478 exe = executable('busctl',
2479 'src/busctl/busctl.c',
2480 'src/busctl/busctl-introspect.c',
2481 'src/busctl/busctl-introspect.h',
2482 include_directories : includes,
2483 link_with : [libshared],
2484 install_rpath : rootlibexecdir,
2486 public_programs += exe
2488 if conf.get('ENABLE_SYSUSERS') == 1
2489 exe = executable('systemd-sysusers',
2490 'src/sysusers/sysusers.c',
2491 include_directories : includes,
2492 link_with : [libshared],
2493 install_rpath : rootlibexecdir,
2495 install_dir : rootbindir)
2496 public_programs += exe
2499 if conf.get('ENABLE_TMPFILES') == 1
2500 exe = executable('systemd-tmpfiles',
2501 'src/tmpfiles/tmpfiles.c',
2502 include_directories : includes,
2503 link_with : [libshared],
2504 dependencies : [libacl],
2505 install_rpath : rootlibexecdir,
2507 install_dir : rootbindir)
2508 public_programs += exe
2510 if want_tests != 'false'
2511 test('test-systemd-tmpfiles',
2512 test_systemd_tmpfiles_py,
2513 # https://github.com/mesonbuild/meson/issues/2681
2514 args : exe.full_path())
2518 if conf.get('ENABLE_HWDB') == 1
2519 exe = executable('systemd-hwdb',
2521 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2522 include_directories : includes,
2523 link_with : [libudev_static],
2524 install_rpath : udev_rpath,
2526 install_dir : rootbindir)
2527 public_programs += exe
2530 if conf.get('ENABLE_QUOTACHECK') == 1
2531 executable('systemd-quotacheck',
2532 'src/quotacheck/quotacheck.c',
2533 include_directories : includes,
2534 link_with : [libshared],
2535 install_rpath : rootlibexecdir,
2537 install_dir : rootlibexecdir)
2540 exe = executable('systemd-socket-proxyd',
2541 'src/socket-proxy/socket-proxyd.c',
2542 include_directories : includes,
2543 link_with : [libshared],
2544 dependencies : [threads],
2545 install_rpath : rootlibexecdir,
2547 install_dir : rootlibexecdir)
2548 public_programs += exe
2550 exe = executable('systemd-udevd',
2551 systemd_udevd_sources,
2552 include_directories : includes,
2553 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2554 link_with : [libudev_core,
2557 dependencies : [threads,
2562 install_rpath : udev_rpath,
2564 install_dir : rootlibexecdir)
2565 public_programs += exe
2567 exe = executable('udevadm',
2569 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2570 include_directories : includes,
2571 link_with : [libudev_core,
2574 dependencies : [threads,
2579 install_rpath : udev_rpath,
2581 install_dir : rootbindir)
2582 public_programs += exe
2584 executable('systemd-shutdown',
2585 systemd_shutdown_sources,
2586 include_directories : includes,
2587 link_with : [libshared],
2588 dependencies : [libmount],
2589 install_rpath : rootlibexecdir,
2591 install_dir : rootlibexecdir)
2593 executable('systemd-update-done',
2594 'src/update-done/update-done.c',
2595 include_directories : includes,
2596 link_with : [libshared],
2597 install_rpath : rootlibexecdir,
2599 install_dir : rootlibexecdir)
2601 executable('systemd-update-utmp',
2602 'src/update-utmp/update-utmp.c',
2603 include_directories : includes,
2604 link_with : [libshared],
2605 dependencies : [libaudit],
2606 install_rpath : rootlibexecdir,
2608 install_dir : rootlibexecdir)
2610 if conf.get('HAVE_KMOD') == 1
2611 executable('systemd-modules-load',
2612 'src/modules-load/modules-load.c',
2613 include_directories : includes,
2614 link_with : [libshared],
2615 dependencies : [libkmod],
2616 install_rpath : rootlibexecdir,
2618 install_dir : rootlibexecdir)
2620 meson.add_install_script('sh', '-c',
2621 mkdir_p.format(modulesloaddir))
2622 meson.add_install_script('sh', '-c',
2623 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2626 exe = executable('systemd-nspawn',
2627 systemd_nspawn_sources,
2628 'src/core/mount-setup.c', # FIXME: use a variable?
2629 'src/core/mount-setup.h',
2630 'src/core/loopback-setup.c',
2631 'src/core/loopback-setup.h',
2632 include_directories : includes,
2633 link_with : [libnspawn_core,
2635 dependencies : [libblkid],
2636 install_rpath : rootlibexecdir,
2638 public_programs += exe
2640 if conf.get('ENABLE_NETWORKD') == 1
2641 executable('systemd-networkd',
2642 systemd_networkd_sources,
2643 include_directories : includes,
2644 link_with : [libnetworkd_core,
2648 dependencies : [threads],
2649 install_rpath : rootlibexecdir,
2651 install_dir : rootlibexecdir)
2653 executable('systemd-networkd-wait-online',
2654 systemd_networkd_wait_online_sources,
2655 include_directories : includes,
2656 link_with : [libnetworkd_core,
2658 install_rpath : rootlibexecdir,
2660 install_dir : rootlibexecdir)
2662 exe = executable('networkctl',
2664 include_directories : includes,
2665 link_with : [libsystemd_network,
2667 install_rpath : rootlibexecdir,
2669 install_dir : rootbindir)
2670 public_programs += exe
2673 executable('systemd-sulogin-shell',
2674 ['src/sulogin-shell/sulogin-shell.c'],
2675 include_directories : includes,
2676 link_with : [libshared],
2677 install_rpath : rootlibexecdir,
2679 install_dir : rootlibexecdir)
2681 ############################################################
2684 'systemd-runtest.env',
2685 output : 'systemd-runtest.env',
2686 command : ['sh', '-c', '{ ' +
2687 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2688 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2690 build_by_default : true)
2692 foreach tuple : tests
2694 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2695 dependencies = tuple[2]
2696 condition = tuple.length() >= 4 ? tuple[3] : ''
2697 type = tuple.length() >= 5 ? tuple[4] : ''
2698 defs = tuple.length() >= 6 ? tuple[5] : []
2699 incs = tuple.length() >= 7 ? tuple[6] : includes
2702 name = sources[0].split('/')[-1].split('.')[0]
2703 if type.startswith('timeout=')
2704 timeout = type.split('=')[1].to_int()
2708 if condition == '' or conf.get(condition) == 1
2712 include_directories : incs,
2713 link_with : link_with,
2714 dependencies : dependencies,
2716 build_by_default : want_tests != 'false',
2717 install_rpath : rootlibexecdir,
2718 install : install_tests,
2719 install_dir : join_paths(testsdir, type))
2722 message('@0@ is a manual test'.format(name))
2723 elif type == 'unsafe' and want_tests != 'unsafe'
2724 message('@0@ is an unsafe test'.format(name))
2725 elif want_tests != 'false'
2731 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2736 'test-libsystemd-sym',
2737 test_libsystemd_sym_c,
2738 include_directories : includes,
2739 link_with : [libsystemd],
2740 build_by_default : want_tests != 'false',
2741 install : install_tests,
2742 install_dir : testsdir)
2743 if want_tests != 'false'
2744 test('test-libsystemd-sym', exe)
2748 'test-libsystemd-static-sym',
2749 test_libsystemd_sym_c,
2750 include_directories : includes,
2751 link_with : [install_libsystemd_static],
2752 dependencies : [threads], # threads is already included in dependencies on the library,
2753 # but does not seem to get propagated. Add here as a work-around.
2754 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2755 install : install_tests and static_libsystemd_pic,
2756 install_dir : testsdir)
2757 if want_tests != 'false' and static_libsystemd_pic
2758 test('test-libsystemd-static-sym', exe)
2764 include_directories : includes,
2765 c_args : '-Wno-deprecated-declarations',
2766 link_with : [libudev],
2767 build_by_default : want_tests != 'false',
2768 install : install_tests,
2769 install_dir : testsdir)
2770 if want_tests != 'false'
2771 test('test-libudev-sym', exe)
2775 'test-libudev-static-sym',
2777 include_directories : includes,
2778 c_args : '-Wno-deprecated-declarations',
2779 link_with : [install_libudev_static],
2780 build_by_default : want_tests != 'false' and static_libudev_pic,
2781 install : install_tests and static_libudev_pic,
2782 install_dir : testsdir)
2783 if want_tests != 'false' and static_libudev_pic
2784 test('test-libudev-static-sym', exe)
2787 ############################################################
2791 if get_option('tests') != 'false'
2792 foreach tuple : fuzzers
2794 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2795 dependencies = tuple[2]
2796 defs = tuple.length() >= 4 ? tuple[3] : []
2797 incs = tuple.length() >= 5 ? tuple[4] : includes
2800 dependencies += fuzzing_engine
2802 sources += 'src/fuzz/fuzz-main.c'
2805 name = sources[0].split('/')[-1].split('.')[0]
2807 fuzzer_exes += executable(
2810 include_directories : [incs, include_directories('src/fuzz')],
2811 link_with : link_with,
2812 dependencies : dependencies,
2818 run_target('fuzzers',
2819 depends : fuzzer_exes,
2822 ############################################################
2824 make_directive_index_py = find_program('tools/make-directive-index.py')
2825 make_man_index_py = find_program('tools/make-man-index.py')
2826 xml_helper_py = find_program('tools/xml_helper.py')
2827 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2831 subdir('sysusers.d')
2832 subdir('tmpfiles.d')
2837 subdir('shell-completion/bash')
2838 subdir('shell-completion/zsh')
2839 subdir('docs/sysvinit')
2840 subdir('docs/var-log')
2842 install_subdir('factory/etc',
2843 install_dir : factorydir)
2845 install_data('xorg/50-systemd-user.sh',
2846 install_dir : xinitrcdir)
2847 install_data('modprobe.d/systemd.conf',
2848 install_dir : modprobedir)
2849 install_data('LICENSE.GPL2',
2853 'docs/CODING_STYLE.md',
2854 'docs/DISTRO_PORTING.md',
2855 'docs/ENVIRONMENT.md',
2857 'docs/TRANSIENT-SETTINGS.md',
2858 'docs/TRANSLATORS.md',
2859 'docs/UIDS-GIDS.md',
2860 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2861 install_dir : docdir)
2863 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2864 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2866 ############################################################
2868 meson_check_help = find_program('tools/meson-check-help.sh')
2870 foreach exec : public_programs
2871 name = exec.full_path().split('/')[-1]
2872 if want_tests != 'false'
2873 test('check-help-' + name,
2875 args : exec.full_path())
2879 ############################################################
2881 # Enable tests for all supported sanitizers
2882 foreach tuple : sanitizers
2883 sanitizer = tuple[0]
2886 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2888 foreach p : fuzz_regression_tests
2889 b = p.split('/')[-2]
2890 c = p.split('/')[-1]
2892 name = '@0@:@1@'.format(b, sanitizer)
2895 if want_tests == 'false'
2896 message('Not compiling @0@ because tests is set to false'.format(name))
2898 exe = custom_target(
2902 command : [env, 'ln', '-fs',
2903 join_paths(build.full_path(), b),
2905 build_by_default : true)
2907 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2912 if want_tests != 'false' and slow_tests
2913 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2915 args : [exe.full_path(),
2916 join_paths(meson.source_root(), p)])
2923 ############################################################
2926 all_files = run_command(
2928 ['--git-dir=@0@/.git'.format(meson.source_root()),
2931 all_files = files(all_files.stdout().split())
2936 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
2939 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
2943 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2946 command : [meson_git_contrib_sh])
2950 git_head = run_command(
2952 ['--git-dir=@0@/.git'.format(meson.source_root()),
2953 'rev-parse', 'HEAD']).stdout().strip()
2954 git_head_short = run_command(
2956 ['--git-dir=@0@/.git'.format(meson.source_root()),
2957 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2961 command : ['git', 'archive',
2962 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
2964 '--prefix', 'systemd-@0@/'.format(git_head),
2968 ############################################################
2970 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2973 depends : [man, libsystemd, libudev],
2974 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2978 command : ['sh', '@0@/tools/make-index-md.sh'.format(meson.source_root()), meson.source_root()])
2980 ############################################################
2983 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2985 'split /usr: @0@'.format(split_usr),
2986 'split bin-sbin: @0@'.format(split_bin),
2987 'prefix directory: @0@'.format(prefixdir),
2988 'rootprefix directory: @0@'.format(rootprefixdir),
2989 'sysconf directory: @0@'.format(sysconfdir),
2990 'include directory: @0@'.format(includedir),
2991 'lib directory: @0@'.format(libdir),
2992 'rootlib directory: @0@'.format(rootlibdir),
2993 'SysV init scripts: @0@'.format(sysvinit_path),
2994 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2995 'PAM modules directory: @0@'.format(pamlibdir),
2996 'PAM configuration directory: @0@'.format(pamconfdir),
2997 'RPM macros directory: @0@'.format(rpmmacrosdir),
2998 'modprobe.d directory: @0@'.format(modprobedir),
2999 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3000 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3001 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3002 'bash completions directory: @0@'.format(bashcompletiondir),
3003 'zsh completions directory: @0@'.format(zshcompletiondir),
3004 'extra start script: @0@'.format(get_option('rc-local')),
3005 'extra stop script: @0@'.format(get_option('halt-local')),
3006 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3007 get_option('debug-tty')),
3008 'TTY GID: @0@'.format(tty_gid),
3009 'users GID: @0@'.format(substs.get('USERS_GID')),
3010 'maximum system UID: @0@'.format(system_uid_max),
3011 'maximum system GID: @0@'.format(system_gid_max),
3012 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3013 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3014 'minimum container UID base: @0@'.format(container_uid_base_min),
3015 'maximum container UID base: @0@'.format(container_uid_base_max),
3016 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3017 'render group access mode: @0@'.format(get_option('group-render-mode')),
3018 'certificate root directory: @0@'.format(get_option('certificate-root')),
3019 'support URL: @0@'.format(support_url),
3020 'nobody user name: @0@'.format(nobody_user),
3021 'nobody group name: @0@'.format(nobody_group),
3022 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3023 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3025 'default DNSSEC mode: @0@'.format(default_dnssec),
3026 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3027 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3028 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
3030 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3031 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3033 'default DNS servers: @0@'.format(alt_dns_servers),
3034 'default NTP servers: @0@'.format(alt_ntp_servers)]
3036 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3037 '@@0@'.format(time_epoch)).stdout().strip()
3039 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3042 'static libsystemd: @0@'.format(static_libsystemd),
3043 'static libudev: @0@'.format(static_libudev)]
3046 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3047 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3048 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3050 if conf.get('ENABLE_EFI') == 1
3051 status += 'efi arch: @0@'.format(efi_arch)
3055 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3056 'EFI CC @0@'.format(efi_cc),
3057 'EFI lib directory: @0@'.format(efi_libdir),
3058 'EFI lds directory: @0@'.format(efi_ldsdir),
3059 'EFI include directory: @0@'.format(efi_incdir)]
3111 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3112 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3115 ['legacy pkla', install_polkit_pkla],
3117 ['gnu-efi', have_gnu_efi],
3130 ['man pages', want_man],
3131 ['html pages', want_html],
3132 ['man page indices', want_man and have_lxml],
3137 ['adm group', get_option('adm-group')],
3138 ['wheel group', get_option('wheel-group')],
3141 ['debug mmap cache'],
3144 ['valgrind', conf.get('VALGRIND') == 1],
3145 ['trace logging', conf.get('LOG_TRACE') == 1],
3146 ['link-udev-shared', get_option('link-udev-shared')],
3147 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3150 if tuple.length() >= 2
3153 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3154 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3155 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3166 'enabled features: @0@'.format(', '.join(found)),
3168 'disabled features: @0@'.format(', '.join(missing)),
3170 message('\n '.join(status))
3172 if rootprefixdir != rootprefix_default
3174 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3175 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3176 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))