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 #####################################################################
32 # Try to install the git pre-commit hook
33 git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
34 if git_hook.returncode() == 0
35 message(git_hook.stdout().strip())
38 #####################################################################
40 if get_option('split-usr') == 'auto'
41 split_usr = run_command('test', '-L', '/bin').returncode() != 0
43 split_usr = get_option('split-usr') == 'true'
45 conf.set10('HAVE_SPLIT_USR', split_usr,
46 description : '/usr/bin and /bin directories are separate')
48 if get_option('split-bin') == 'auto'
49 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
51 split_bin = get_option('split-bin') == 'true'
53 conf.set10('HAVE_SPLIT_BIN', split_bin,
54 description : 'bin and sbin directories are separate')
56 rootprefixdir = get_option('rootprefix')
57 # Unusual rootprefixdir values are used by some distros
58 # (see https://github.com/systemd/systemd/pull/7461).
59 rootprefix_default = split_usr ? '/' : '/usr'
60 if rootprefixdir == ''
61 rootprefixdir = rootprefix_default
64 sysvinit_path = get_option('sysvinit-path')
65 sysvrcnd_path = get_option('sysvrcnd-path')
66 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
67 description : 'SysV init scripts and rcN.d links are supported')
69 # join_paths ignore the preceding arguments if an absolute component is
70 # encountered, so this should canonicalize various paths when they are
71 # absolute or relative.
72 prefixdir = get_option('prefix')
73 if not prefixdir.startswith('/')
74 error('Prefix is not absolute: "@0@"'.format(prefixdir))
76 bindir = join_paths(prefixdir, get_option('bindir'))
77 libdir = join_paths(prefixdir, get_option('libdir'))
78 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
79 includedir = join_paths(prefixdir, get_option('includedir'))
80 datadir = join_paths(prefixdir, get_option('datadir'))
81 localstatedir = join_paths('/', get_option('localstatedir'))
83 rootbindir = join_paths(rootprefixdir, 'bin')
84 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
85 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
87 rootlibdir = get_option('rootlibdir')
89 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
92 # Dirs of external packages
93 pkgconfigdatadir = join_paths(datadir, 'pkgconfig')
94 pkgconfiglibdir = join_paths(libdir, 'pkgconfig')
95 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
96 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
97 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
98 varlogdir = join_paths(localstatedir, 'log')
99 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
100 rpmmacrosdir = get_option('rpmmacrosdir')
101 if rpmmacrosdir != 'no'
102 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
104 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
107 pkgdatadir = join_paths(datadir, 'systemd')
108 environmentdir = join_paths(prefixdir, 'lib/environment.d')
109 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
110 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
111 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
112 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
113 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
114 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
115 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
116 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
117 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
118 pkgincludedir = join_paths(includedir, 'systemd')
119 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
120 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
121 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
122 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
123 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
124 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
125 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
126 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
127 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
128 udevhomedir = udevlibexecdir
129 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
130 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
131 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
132 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
133 factorydir = join_paths(datadir, 'factory')
134 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
135 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
136 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
137 catalogstatedir = join_paths(systemdstatedir, 'catalog')
138 randomseeddir = join_paths(localstatedir, 'lib/systemd')
139 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
141 docdir = get_option('docdir')
143 docdir = join_paths(datadir, 'doc/systemd')
146 dbuspolicydir = get_option('dbuspolicydir')
147 if dbuspolicydir == ''
148 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
151 dbussessionservicedir = get_option('dbussessionservicedir')
152 if dbussessionservicedir == ''
153 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
156 dbussystemservicedir = get_option('dbussystemservicedir')
157 if dbussystemservicedir == ''
158 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
161 pamlibdir = get_option('pamlibdir')
163 pamlibdir = join_paths(rootlibdir, 'security')
166 pamconfdir = get_option('pamconfdir')
168 pamconfdir = join_paths(sysconfdir, 'pam.d')
171 memory_accounting_default = get_option('memory-accounting-default')
173 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
174 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
175 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
176 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
177 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
178 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
179 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
181 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
183 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
184 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
185 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
186 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
187 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
188 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
189 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
190 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
191 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
192 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
193 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
194 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
195 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
196 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
197 conf.set_quoted('ROOTPREFIX', rootprefixdir)
198 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
199 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
200 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
201 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
202 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
203 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
204 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
205 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
206 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
207 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
208 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
209 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
210 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
211 conf.set_quoted('LIBDIR', libdir)
212 conf.set_quoted('ROOTLIBDIR', rootlibdir)
213 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
214 conf.set_quoted('BOOTLIBDIR', bootlibdir)
215 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
216 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
217 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
218 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
219 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
220 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
221 conf.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'true' : 'false')
222 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
224 conf.set_quoted('ABS_BUILD_DIR', meson.build_root())
225 conf.set_quoted('ABS_SRC_DIR', meson.source_root())
227 substs.set('prefix', prefixdir)
228 substs.set('exec_prefix', prefixdir)
229 substs.set('libdir', libdir)
230 substs.set('rootlibdir', rootlibdir)
231 substs.set('includedir', includedir)
232 substs.set('pkgsysconfdir', pkgsysconfdir)
233 substs.set('bindir', bindir)
234 substs.set('rootbindir', rootbindir)
235 substs.set('rootlibexecdir', rootlibexecdir)
236 substs.set('systemunitdir', systemunitdir)
237 substs.set('userunitdir', userunitdir)
238 substs.set('systempresetdir', systempresetdir)
239 substs.set('userpresetdir', userpresetdir)
240 substs.set('udevhwdbdir', udevhwdbdir)
241 substs.set('udevrulesdir', udevrulesdir)
242 substs.set('udevlibexecdir', udevlibexecdir)
243 substs.set('environmentdir', environmentdir)
244 substs.set('catalogdir', catalogdir)
245 substs.set('tmpfilesdir', tmpfilesdir)
246 substs.set('sysusersdir', sysusersdir)
247 substs.set('sysctldir', sysctldir)
248 substs.set('binfmtdir', binfmtdir)
249 substs.set('modulesloaddir', modulesloaddir)
250 substs.set('modprobedir', modprobedir)
251 substs.set('systemgeneratordir', systemgeneratordir)
252 substs.set('usergeneratordir', usergeneratordir)
253 substs.set('systemenvgeneratordir', systemenvgeneratordir)
254 substs.set('userenvgeneratordir', userenvgeneratordir)
255 substs.set('systemshutdowndir', systemshutdowndir)
256 substs.set('systemsleepdir', systemsleepdir)
257 substs.set('VARLOGDIR', varlogdir)
258 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
259 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
260 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
261 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
262 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
263 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
264 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
265 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
267 #####################################################################
269 cc = meson.get_compiler('c')
270 pkgconfig = import('pkgconfig')
271 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
272 meson_build_sh = find_program('tools/meson-build.sh')
274 if get_option('tests') != 'false'
275 cxx = find_program('c++', required : false)
277 # Used only for tests
282 want_ossfuzz = get_option('oss-fuzz')
283 want_libfuzzer = get_option('llvm-fuzz')
284 fuzzer_build = want_ossfuzz or want_libfuzzer
285 if want_ossfuzz and want_libfuzzer
286 error('only one of oss-fuzz and llvm-fuzz can be specified')
289 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
292 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
295 possible_cc_flags = [
299 '-Wmissing-include-dirs',
300 '-Wold-style-definition',
304 '-Wsuggest-attribute=noreturn',
305 '-Werror=missing-prototypes',
306 '-Werror=implicit-function-declaration',
307 '-Werror=missing-declarations',
308 '-Werror=return-type',
309 '-Werror=incompatible-pointer-types',
311 '-Wstrict-prototypes',
313 '-Wmissing-noreturn',
314 '-Wimplicit-fallthrough=5',
317 '-Wstrict-aliasing=2',
320 '-Werror=shift-count-overflow',
321 '-Werror=shift-overflow=2',
326 '-fdiagnostics-show-option',
327 '-fno-strict-aliasing',
328 '-fvisibility=hidden',
330 '-fstack-protector-strong',
331 '--param=ssp-buffer-size=4',
334 # --as-needed and --no-undefined are provided by meson by default,
335 # run mesonconf to see what is enabled
336 possible_link_flags = [
341 # the oss-fuzz fuzzers are not built with -fPIE, so don't
342 # enable it when we are linking against them
344 possible_cc_flags += '-fPIE'
345 possible_link_flags += '-pie'
348 if cc.get_id() == 'clang'
349 possible_cc_flags += [
350 '-Wno-typedef-redefinition',
351 '-Wno-gnu-variable-sized-type-not-at-end',
355 if get_option('buildtype') != 'debug'
356 possible_cc_flags += [
357 '-ffunction-sections',
361 possible_link_flags += '-Wl,--gc-sections'
364 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
365 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
367 # "negative" arguments: gcc on purpose does not return an error for "-Wno-"
368 # arguments, just emits a warning. So test for the "positive" version instead.
369 foreach arg : ['unused-parameter',
370 'missing-field-initializers',
373 'error=nonnull', # work-around for gcc 7.1 turning this on on its own
375 if cc.has_argument('-W' + arg)
376 add_project_arguments('-Wno-' + arg, language : 'c')
382 #include <inttypes.h>
383 typedef uint64_t usec_t;
384 usec_t now(clockid_t clock);
389 ''', name : '-Werror=shadow with local shadowing')
390 add_project_arguments('-Werror=shadow', language : 'c')
393 cpp = ' '.join(cc.cmd_array()) + ' -E'
395 #####################################################################
396 # compilation result tests
398 conf.set('_GNU_SOURCE', true)
399 conf.set('__SANE_USERSPACE_TYPES__', true)
401 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
402 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
403 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
404 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
405 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
406 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
407 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
411 #include <linux/ethtool.h>
412 #include <linux/fib_rules.h>
413 #include <sys/stat.h>
416 foreach decl : ['char16_t',
418 'struct ethtool_link_settings',
419 'struct fib_rule_uid_range',
423 # We get -1 if the size cannot be determined
424 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
426 if decl == 'struct statx'
428 want_linux_stat_h = false
430 have = cc.sizeof(decl,
431 prefix : decl_headers + '#include <linux/stat.h>',
432 args : '-D_GNU_SOURCE') > 0
433 want_linux_stat_h = have
437 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
440 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
442 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
443 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
444 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
445 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
446 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
447 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
448 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
449 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
450 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
451 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
452 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
453 # if_tunnel.h is buggy and cannot be included on its own
454 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
455 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
456 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
457 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
458 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
459 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
460 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
461 ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
462 ['NDA_IFINDEX', 'linux/neighbour.h'],
463 ['IFA_FLAGS', 'linux/if_addr.h'],
464 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
465 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
466 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
468 prefix = decl.length() > 2 ? decl[2] : ''
469 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
470 conf.set10('HAVE_' + decl[0], have)
473 foreach ident : ['secure_getenv', '__secure_getenv']
474 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
478 ['memfd_create', '''#include <sys/mman.h>'''],
479 ['gettid', '''#include <sys/types.h>
480 #include <unistd.h>'''],
481 ['pivot_root', '''#include <stdlib.h>
482 #include <unistd.h>'''], # no known header declares pivot_root
483 ['name_to_handle_at', '''#include <sys/types.h>
484 #include <sys/stat.h>
485 #include <fcntl.h>'''],
486 ['setns', '''#include <sched.h>'''],
487 ['renameat2', '''#include <stdio.h>
488 #include <fcntl.h>'''],
489 ['kcmp', '''#include <linux/kcmp.h>'''],
490 ['keyctl', '''#include <sys/types.h>
491 #include <keyutils.h>'''],
492 ['copy_file_range', '''#include <sys/syscall.h>
493 #include <unistd.h>'''],
494 ['bpf', '''#include <sys/syscall.h>
495 #include <unistd.h>'''],
496 ['statx', '''#include <sys/types.h>
497 #include <sys/stat.h>
498 #include <unistd.h>'''],
499 ['explicit_bzero' , '''#include <string.h>'''],
500 ['reallocarray', '''#include <malloc.h>'''],
503 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
504 conf.set10('HAVE_' + ident[0].to_upper(), have)
507 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
508 conf.set10('USE_SYS_RANDOM_H', true)
509 conf.set10('HAVE_GETRANDOM', true)
511 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
512 conf.set10('USE_SYS_RANDOM_H', false)
513 conf.set10('HAVE_GETRANDOM', have)
516 #####################################################################
518 sed = find_program('sed')
519 awk = find_program('awk')
520 m4 = find_program('m4')
521 stat = find_program('stat')
522 git = find_program('git', required : false)
523 env = find_program('env')
524 perl = find_program('perl', required : false)
526 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
527 mkdir_p = 'mkdir -p $DESTDIR/@0@'
528 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
529 splash_bmp = files('test/splash.bmp')
531 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
532 # /usr/sbin, /sbin, and fall back to the default from middle column.
533 progs = [['quotaon', '/usr/sbin/quotaon' ],
534 ['quotacheck', '/usr/sbin/quotacheck' ],
535 ['kmod', '/usr/bin/kmod' ],
536 ['kexec', '/usr/sbin/kexec' ],
537 ['sulogin', '/usr/sbin/sulogin' ],
538 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
539 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
540 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
541 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
544 path = get_option(prog[0] + '-path')
546 message('Using @1@ for @0@'.format(prog[0], path))
548 exe = find_program(prog[0],
549 '/usr/sbin/' + prog[0],
552 path = exe.found() ? exe.path() : prog[1]
554 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
555 conf.set_quoted(name, path)
556 substs.set(name, path)
559 conf.set_quoted('TELINIT', get_option('telinit-path'))
561 if run_command('ln', '--relative', '--help').returncode() != 0
562 error('ln does not support --relative (added in coreutils 8.16)')
565 ############################################################
567 gperf = find_program('gperf')
569 gperf_test_format = '''
571 const char * in_word_set(const char *, @0@);
574 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
575 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
576 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
577 if cc.compiles(gperf_test)
578 gperf_len_type = 'size_t'
580 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
581 if cc.compiles(gperf_test)
582 gperf_len_type = 'unsigned'
584 error('unable to determine gperf len type')
587 message('gperf len type is @0@'.format(gperf_len_type))
588 conf.set('GPERF_LEN_TYPE', gperf_len_type,
589 description : 'The type of gperf "len" parameter')
591 ############################################################
593 if not cc.has_header('sys/capability.h')
594 error('POSIX caps headers not found')
596 foreach header : ['crypt.h',
599 'linux/vm_sockets.h',
601 'valgrind/memcheck.h',
602 'valgrind/valgrind.h',
605 conf.set10('HAVE_' + header.underscorify().to_upper(),
606 cc.has_header(header))
609 ############################################################
611 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
612 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
613 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
615 default_hierarchy = get_option('default-hierarchy')
616 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
617 description : 'default cgroup hierarchy as string')
618 if default_hierarchy == 'legacy'
619 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
620 elif default_hierarchy == 'hybrid'
621 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
623 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
626 time_epoch = get_option('time-epoch')
629 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
631 conf.set('TIME_EPOCH', time_epoch)
633 system_uid_max = get_option('system-uid-max')
634 if system_uid_max == -1
635 system_uid_max = run_command(
637 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
638 '/etc/login.defs').stdout().strip()
639 if system_uid_max == ''
642 system_uid_max = system_uid_max.to_int()
645 conf.set('SYSTEM_UID_MAX', system_uid_max)
646 substs.set('systemuidmax', system_uid_max)
648 system_gid_max = get_option('system-gid-max')
649 if system_gid_max == -1
650 system_gid_max = run_command(
652 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
653 '/etc/login.defs').stdout().strip()
654 if system_gid_max == ''
657 system_gid_max = system_gid_max.to_int()
660 conf.set('SYSTEM_GID_MAX', system_gid_max)
661 substs.set('systemgidmax', system_gid_max)
663 dynamic_uid_min = get_option('dynamic-uid-min')
664 dynamic_uid_max = get_option('dynamic-uid-max')
665 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
666 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
667 substs.set('dynamicuidmin', dynamic_uid_min)
668 substs.set('dynamicuidmax', dynamic_uid_max)
670 container_uid_base_min = get_option('container-uid-base-min')
671 container_uid_base_max = get_option('container-uid-base-max')
672 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
673 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
674 substs.set('containeruidbasemin', container_uid_base_min)
675 substs.set('containeruidbasemax', container_uid_base_max)
677 nobody_user = get_option('nobody-user')
678 nobody_group = get_option('nobody-group')
680 if not meson.is_cross_build()
681 getent_result = run_command('getent', 'passwd', '65534')
682 if getent_result.returncode() == 0
683 name = getent_result.stdout().split(':')[0]
684 if name != nobody_user
686 '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) +
687 'Your build will result in an user table setup that is incompatible with the local system.')
690 id_result = run_command('id', '-u', nobody_user)
691 if id_result.returncode() == 0
692 id = id_result.stdout().to_int()
695 '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) +
696 'Your build will result in an user table setup that is incompatible with the local system.')
700 getent_result = run_command('getent', 'group', '65534')
701 if getent_result.returncode() == 0
702 name = getent_result.stdout().split(':')[0]
703 if name != nobody_group
705 '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) +
706 'Your build will result in an group table setup that is incompatible with the local system.')
709 id_result = run_command('id', '-g', nobody_group)
710 if id_result.returncode() == 0
711 id = id_result.stdout().to_int()
714 '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) +
715 'Your build will result in an group table setup that is incompatible with the local system.')
719 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
721 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
722 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
725 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
726 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
727 substs.set('NOBODY_USER_NAME', nobody_user)
728 substs.set('NOBODY_GROUP_NAME', nobody_group)
730 tty_gid = get_option('tty-gid')
731 conf.set('TTY_GID', tty_gid)
732 substs.set('TTY_GID', tty_gid)
734 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
735 users_gid = get_option('users-gid')
736 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
738 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
739 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
741 dev_kvm_mode = get_option('dev-kvm-mode')
742 substs.set('DEV_KVM_MODE', dev_kvm_mode)
743 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
744 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
746 kill_user_processes = get_option('default-kill-user-processes')
747 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
748 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
749 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
751 dns_servers = get_option('dns-servers')
752 conf.set_quoted('DNS_SERVERS', dns_servers)
753 substs.set('DNS_SERVERS', dns_servers)
755 ntp_servers = get_option('ntp-servers')
756 conf.set_quoted('NTP_SERVERS', ntp_servers)
757 substs.set('NTP_SERVERS', ntp_servers)
759 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
761 substs.set('SUSHELL', get_option('debug-shell'))
762 substs.set('DEBUGTTY', get_option('debug-tty'))
764 enable_debug_hashmap = false
765 enable_debug_mmap_cache = false
766 foreach name : get_option('debug')
768 enable_debug_hashmap = true
769 elif name == 'mmap-cache'
770 enable_debug_mmap_cache = true
772 message('unknown debug option "@0@", ignoring'.format(name))
775 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
776 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
778 conf.set10('VALGRIND', get_option('valgrind'))
780 #####################################################################
782 threads = dependency('threads')
783 librt = cc.find_library('rt')
784 libm = cc.find_library('m')
785 libdl = cc.find_library('dl')
786 libcrypt = cc.find_library('crypt')
788 libcap = dependency('libcap', required : false)
789 if not libcap.found()
790 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
791 libcap = cc.find_library('cap')
794 libmount = dependency('mount',
795 version : fuzzer_build ? '>= 0' : '>= 2.30')
797 want_seccomp = get_option('seccomp')
798 if want_seccomp != 'false' and not fuzzer_build
799 libseccomp = dependency('libseccomp',
800 version : '>= 2.3.1',
801 required : want_seccomp == 'true')
802 have = libseccomp.found()
807 conf.set10('HAVE_SECCOMP', have)
809 want_selinux = get_option('selinux')
810 if want_selinux != 'false' and not fuzzer_build
811 libselinux = dependency('libselinux',
812 version : '>= 2.1.9',
813 required : want_selinux == 'true')
814 have = libselinux.found()
819 conf.set10('HAVE_SELINUX', have)
821 want_apparmor = get_option('apparmor')
822 if want_apparmor != 'false' and not fuzzer_build
823 libapparmor = dependency('libapparmor',
824 required : want_apparmor == 'true')
825 have = libapparmor.found()
830 conf.set10('HAVE_APPARMOR', have)
832 smack_run_label = get_option('smack-run-label')
833 if smack_run_label != ''
834 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
837 want_polkit = get_option('polkit')
838 install_polkit = false
839 install_polkit_pkla = false
840 if want_polkit != 'false' and not fuzzer_build
841 install_polkit = true
843 libpolkit = dependency('polkit-gobject-1',
845 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
846 message('Old polkit detected, will install pkla files')
847 install_polkit_pkla = true
850 conf.set10('ENABLE_POLKIT', install_polkit)
852 want_acl = get_option('acl')
853 if want_acl != 'false' and not fuzzer_build
854 libacl = cc.find_library('acl', required : want_acl == 'true')
855 have = libacl.found()
860 conf.set10('HAVE_ACL', have)
862 want_audit = get_option('audit')
863 if want_audit != 'false' and not fuzzer_build
864 libaudit = dependency('audit', required : want_audit == 'true')
865 have = libaudit.found()
870 conf.set10('HAVE_AUDIT', have)
872 want_blkid = get_option('blkid')
873 if want_blkid != 'false' and not fuzzer_build
874 libblkid = dependency('blkid', required : want_blkid == 'true')
875 have = libblkid.found()
880 conf.set10('HAVE_BLKID', have)
882 want_kmod = get_option('kmod')
883 if want_kmod != 'false' and not fuzzer_build
884 libkmod = dependency('libkmod',
886 required : want_kmod == 'true')
887 have = libkmod.found()
892 conf.set10('HAVE_KMOD', have)
894 want_pam = get_option('pam')
895 if want_pam != 'false' and not fuzzer_build
896 libpam = cc.find_library('pam', required : want_pam == 'true')
897 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
898 have = libpam.found() and libpam_misc.found()
904 conf.set10('HAVE_PAM', have)
906 want_microhttpd = get_option('microhttpd')
907 if want_microhttpd != 'false' and not fuzzer_build
908 libmicrohttpd = dependency('libmicrohttpd',
909 version : '>= 0.9.33',
910 required : want_microhttpd == 'true')
911 have = libmicrohttpd.found()
916 conf.set10('HAVE_MICROHTTPD', have)
918 want_libcryptsetup = get_option('libcryptsetup')
919 if want_libcryptsetup != 'false' and not fuzzer_build
920 libcryptsetup = dependency('libcryptsetup',
921 version : '>= 1.6.0',
922 required : want_libcryptsetup == 'true')
923 have = libcryptsetup.found()
928 conf.set10('HAVE_LIBCRYPTSETUP', have)
930 want_libcurl = get_option('libcurl')
931 if want_libcurl != 'false' and not fuzzer_build
932 libcurl = dependency('libcurl',
933 version : '>= 7.32.0',
934 required : want_libcurl == 'true')
935 have = libcurl.found()
940 conf.set10('HAVE_LIBCURL', have)
942 want_libidn = get_option('libidn')
943 want_libidn2 = get_option('libidn2')
944 if want_libidn == 'true' and want_libidn2 == 'true'
945 error('libidn and libidn2 cannot be requested simultaneously')
948 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
949 libidn = dependency('libidn',
950 required : want_libidn == 'true')
951 have = libidn.found()
956 conf.set10('HAVE_LIBIDN', have)
957 if not have and want_libidn2 != 'false' and not fuzzer_build
958 # libidn is used for both libidn and libidn2 objects
959 libidn = dependency('libidn2',
960 required : want_libidn2 == 'true')
961 have = libidn.found()
965 conf.set10('HAVE_LIBIDN2', have)
967 want_libiptc = get_option('libiptc')
968 if want_libiptc != 'false' and not fuzzer_build
969 libiptc = dependency('libiptc',
970 required : want_libiptc == 'true')
971 have = libiptc.found()
976 conf.set10('HAVE_LIBIPTC', have)
978 want_qrencode = get_option('qrencode')
979 if want_qrencode != 'false' and not fuzzer_build
980 libqrencode = dependency('libqrencode',
981 required : want_qrencode == 'true')
982 have = libqrencode.found()
987 conf.set10('HAVE_QRENCODE', have)
989 want_gcrypt = get_option('gcrypt')
990 if want_gcrypt != 'false' and not fuzzer_build
991 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
992 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
993 have = libgcrypt.found() and libgpg_error.found()
998 # link to neither of the libs if one is not found
1002 conf.set10('HAVE_GCRYPT', have)
1004 want_gnutls = get_option('gnutls')
1005 if want_gnutls != 'false' and not fuzzer_build
1006 libgnutls = dependency('gnutls',
1007 version : '>= 3.1.4',
1008 required : want_gnutls == 'true')
1009 have = libgnutls.found()
1014 conf.set10('HAVE_GNUTLS', have)
1016 want_openssl = get_option('openssl')
1017 if want_openssl != 'false' and not fuzzer_build
1018 libopenssl = dependency('openssl',
1019 version : '>= 1.1.0',
1020 required : want_openssl == 'true')
1021 have = libopenssl.found()
1026 conf.set10('HAVE_OPENSSL', have)
1028 want_elfutils = get_option('elfutils')
1029 if want_elfutils != 'false' and not fuzzer_build
1030 libdw = dependency('libdw',
1031 required : want_elfutils == 'true')
1032 have = libdw.found()
1037 conf.set10('HAVE_ELFUTILS', have)
1039 want_zlib = get_option('zlib')
1040 if want_zlib != 'false' and not fuzzer_build
1041 libz = dependency('zlib',
1042 required : want_zlib == 'true')
1048 conf.set10('HAVE_ZLIB', have)
1050 want_bzip2 = get_option('bzip2')
1051 if want_bzip2 != 'false' and not fuzzer_build
1052 libbzip2 = cc.find_library('bz2',
1053 required : want_bzip2 == 'true')
1054 have = libbzip2.found()
1059 conf.set10('HAVE_BZIP2', have)
1061 want_xz = get_option('xz')
1062 if want_xz != 'false' and not fuzzer_build
1063 libxz = dependency('liblzma',
1064 required : want_xz == 'true')
1065 have = libxz.found()
1070 conf.set10('HAVE_XZ', have)
1072 want_lz4 = get_option('lz4')
1073 if want_lz4 != 'false' and not fuzzer_build
1074 liblz4 = dependency('liblz4',
1075 required : want_lz4 == 'true')
1076 have = liblz4.found()
1081 conf.set10('HAVE_LZ4', have)
1083 want_xkbcommon = get_option('xkbcommon')
1084 if want_xkbcommon != 'false' and not fuzzer_build
1085 libxkbcommon = dependency('xkbcommon',
1086 version : '>= 0.3.0',
1087 required : want_xkbcommon == 'true')
1088 have = libxkbcommon.found()
1093 conf.set10('HAVE_XKBCOMMON', have)
1095 want_pcre2 = get_option('pcre2')
1096 if want_pcre2 != 'false'
1097 libpcre2 = dependency('libpcre2-8',
1098 required : want_pcre2 == 'true')
1099 have = libpcre2.found()
1104 conf.set10('HAVE_PCRE2', have)
1106 want_glib = get_option('glib')
1107 if want_glib != 'false' and not fuzzer_build
1108 libglib = dependency('glib-2.0',
1109 version : '>= 2.22.0',
1110 required : want_glib == 'true')
1111 libgobject = dependency('gobject-2.0',
1112 version : '>= 2.22.0',
1113 required : want_glib == 'true')
1114 libgio = dependency('gio-2.0',
1115 required : want_glib == 'true')
1116 have = libglib.found() and libgobject.found() and libgio.found()
1123 conf.set10('HAVE_GLIB', have)
1125 want_dbus = get_option('dbus')
1126 if want_dbus != 'false' and not fuzzer_build
1127 libdbus = dependency('dbus-1',
1128 version : '>= 1.3.2',
1129 required : want_dbus == 'true')
1130 have = libdbus.found()
1135 conf.set10('HAVE_DBUS', have)
1137 default_dnssec = get_option('default-dnssec')
1139 default_dnssec = 'no'
1141 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1142 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1143 default_dnssec = 'no'
1145 conf.set('DEFAULT_DNSSEC_MODE',
1146 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1147 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1149 dns_over_tls = get_option('dns-over-tls')
1150 if dns_over_tls != 'false'
1151 if dns_over_tls == 'openssl'
1154 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1155 if dns_over_tls == 'gnutls' and not have_gnutls
1156 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1159 if dns_over_tls == 'gnutls' or have_gnutls
1160 have_openssl = false
1162 have_openssl = conf.get('HAVE_OPENSSL') == 1
1163 if dns_over_tls != 'auto' and not have_openssl
1164 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1165 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1168 have = have_gnutls or have_openssl
1170 have = have_gnutls = have_openssl = false
1172 conf.set10('ENABLE_DNS_OVER_TLS', have)
1173 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1174 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1176 default_dns_over_tls = get_option('default-dns-over-tls')
1178 default_dns_over_tls = 'no'
1180 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1181 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1182 default_dns_over_tls = 'no'
1184 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1185 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1186 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1188 want_importd = get_option('importd')
1189 if want_importd != 'false'
1190 have = (conf.get('HAVE_LIBCURL') == 1 and
1191 conf.get('HAVE_ZLIB') == 1 and
1192 conf.get('HAVE_BZIP2') == 1 and
1193 conf.get('HAVE_XZ') == 1 and
1194 conf.get('HAVE_GCRYPT') == 1)
1195 if want_importd == 'true' and not have
1196 error('importd support was requested, but dependencies are not available')
1201 conf.set10('ENABLE_IMPORTD', have)
1203 want_remote = get_option('remote')
1204 if want_remote != 'false'
1205 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1206 conf.get('HAVE_LIBCURL') == 1]
1207 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1208 # it's possible to build one without the other. Complain only if
1209 # support was explictly requested. The auxiliary files like sysusers
1210 # config should be installed when any of the programs are built.
1211 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1212 error('remote support was requested, but dependencies are not available')
1214 have = have_deps[0] or have_deps[1]
1218 conf.set10('ENABLE_REMOTE', have)
1220 foreach term : ['utmp',
1252 have = get_option(term)
1253 name = 'ENABLE_' + term.underscorify().to_upper()
1254 conf.set10(name, have)
1257 foreach tuple : [['nss-mymachines', 'machined'],
1258 ['nss-resolve', 'resolve']]
1259 want = get_option(tuple[0])
1261 have = get_option(tuple[1])
1262 if want == 'true' and not have
1263 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1268 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1269 conf.set10(name, have)
1273 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1274 'ENABLE_NSS_MYMACHINES',
1275 'ENABLE_NSS_RESOLVE',
1276 'ENABLE_NSS_SYSTEMD']
1277 if conf.get(term) == 1
1281 conf.set10('ENABLE_NSS', enable_nss)
1283 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1285 want_tests = get_option('tests')
1286 install_tests = get_option('install-tests')
1287 slow_tests = get_option('slow-tests')
1291 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1293 #####################################################################
1295 if get_option('efi')
1296 efi_arch = host_machine.cpu_family()
1298 if efi_arch == 'x86'
1299 EFI_MACHINE_TYPE_NAME = 'ia32'
1300 gnu_efi_arch = 'ia32'
1301 elif efi_arch == 'x86_64'
1302 EFI_MACHINE_TYPE_NAME = 'x64'
1303 gnu_efi_arch = 'x86_64'
1304 elif efi_arch == 'arm'
1305 EFI_MACHINE_TYPE_NAME = 'arm'
1306 gnu_efi_arch = 'arm'
1307 elif efi_arch == 'aarch64'
1308 EFI_MACHINE_TYPE_NAME = 'aa64'
1309 gnu_efi_arch = 'aarch64'
1311 EFI_MACHINE_TYPE_NAME = ''
1316 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1318 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1322 conf.set10('ENABLE_EFI', have)
1324 #####################################################################
1326 config_h = configure_file(
1327 output : 'config.h',
1328 configuration : conf)
1330 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1332 includes = include_directories('src/basic',
1336 'src/journal-remote',
1340 'src/time-wait-sync',
1345 'src/libsystemd/sd-bus',
1346 'src/libsystemd/sd-device',
1347 'src/libsystemd/sd-hwdb',
1348 'src/libsystemd/sd-id128',
1349 'src/libsystemd/sd-netlink',
1350 'src/libsystemd/sd-network',
1351 'src/libsystemd-network',
1354 add_project_arguments('-include', 'config.h', language : 'c')
1358 subdir('src/systemd')
1360 subdir('src/libsystemd')
1361 subdir('src/libsystemd-network')
1362 subdir('src/journal')
1365 libjournal_core = static_library(
1367 libjournal_core_sources,
1369 include_directories : includes,
1372 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1373 libsystemd = shared_library(
1375 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1376 version : libsystemd_version,
1377 include_directories : includes,
1378 link_args : ['-shared',
1379 '-Wl,--version-script=' + libsystemd_sym_path],
1380 link_with : [libbasic,
1382 link_whole : [libsystemd_static,
1384 dependencies : [threads,
1388 link_depends : libsystemd_sym,
1390 install_dir : rootlibdir)
1392 static_libsystemd = get_option('static-libsystemd')
1393 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1395 install_libsystemd_static = static_library(
1398 journal_client_sources,
1400 basic_gcrypt_sources,
1401 include_directories : includes,
1402 build_by_default : static_libsystemd != 'false',
1403 install : static_libsystemd != 'false',
1404 install_dir : rootlibdir,
1405 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1406 dependencies : [threads,
1415 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1417 ############################################################
1419 # binaries that have --help and are intended for use by humans,
1420 # usually, but not always, installed in /bin.
1421 public_programs = []
1423 subdir('src/libudev')
1424 subdir('src/shared')
1427 subdir('src/network')
1429 subdir('src/analyze')
1430 subdir('src/journal-remote')
1431 subdir('src/coredump')
1432 subdir('src/hostname')
1433 subdir('src/import')
1434 subdir('src/kernel-install')
1435 subdir('src/locale')
1436 subdir('src/machine')
1437 subdir('src/portable')
1438 subdir('src/nspawn')
1439 subdir('src/resolve')
1440 subdir('src/timedate')
1441 subdir('src/timesync')
1442 subdir('src/vconsole')
1443 subdir('src/boot/efi')
1450 ############################################################
1452 # only static linking apart from libdl, to make sure that the
1453 # module is linked to all libraries that it uses.
1454 test_dlopen = executable(
1457 include_directories : includes,
1458 link_with : [libbasic],
1459 dependencies : [libdl])
1461 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1462 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1463 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1464 ['resolve', 'ENABLE_NSS_RESOLVE']]
1466 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1470 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1471 version_script_arg = join_paths(meson.current_source_dir(), sym)
1473 nss = shared_library(
1475 'src/nss-@0@/nss-@0@.c'.format(module),
1477 include_directories : includes,
1478 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1479 link_args : ['-Wl,-z,nodelete',
1481 '-Wl,--version-script=' + version_script_arg,
1483 link_with : [libsystemd_static,
1485 dependencies : [threads,
1489 install_dir : rootlibdir)
1491 # We cannot use shared_module because it does not support version suffix.
1492 # Unfortunately shared_library insists on creating the symlink…
1493 meson.add_install_script('sh', '-c',
1494 'rm $DESTDIR@0@/libnss_@1@.so'
1495 .format(rootlibdir, module))
1497 test('dlopen-nss_' + module,
1499 args : [nss.full_path()]) # path to dlopen must include a slash
1503 ############################################################
1505 executable('systemd',
1507 include_directories : includes,
1508 link_with : [libcore,
1510 dependencies : [threads,
1516 install_rpath : rootlibexecdir,
1518 install_dir : rootlibexecdir)
1520 meson.add_install_script(meson_make_symlink,
1521 join_paths(rootlibexecdir, 'systemd'),
1522 join_paths(rootsbindir, 'init'))
1524 exe = executable('systemd-analyze',
1525 systemd_analyze_sources,
1526 include_directories : includes,
1527 link_with : [libcore,
1529 dependencies : [threads,
1535 install_rpath : rootlibexecdir,
1537 public_programs += exe
1539 executable('systemd-journald',
1540 systemd_journald_sources,
1541 include_directories : includes,
1542 link_with : [libjournal_core,
1544 dependencies : [threads,
1548 install_rpath : rootlibexecdir,
1550 install_dir : rootlibexecdir)
1552 exe = executable('systemd-cat',
1553 systemd_cat_sources,
1554 include_directories : includes,
1555 link_with : [libjournal_core,
1557 dependencies : [threads],
1558 install_rpath : rootlibexecdir,
1560 public_programs += exe
1562 exe = executable('journalctl',
1564 include_directories : includes,
1565 link_with : [libshared],
1566 dependencies : [threads,
1571 install_rpath : rootlibexecdir,
1573 install_dir : rootbindir)
1574 public_programs += exe
1576 executable('systemd-getty-generator',
1577 'src/getty-generator/getty-generator.c',
1578 include_directories : includes,
1579 link_with : [libshared],
1580 install_rpath : rootlibexecdir,
1582 install_dir : systemgeneratordir)
1584 executable('systemd-debug-generator',
1585 'src/debug-generator/debug-generator.c',
1586 include_directories : includes,
1587 link_with : [libshared],
1588 install_rpath : rootlibexecdir,
1590 install_dir : systemgeneratordir)
1592 executable('systemd-fstab-generator',
1593 'src/fstab-generator/fstab-generator.c',
1594 'src/core/mount-setup.c',
1595 include_directories : includes,
1596 link_with : [libshared],
1597 install_rpath : rootlibexecdir,
1599 install_dir : systemgeneratordir)
1601 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1602 executable('30-systemd-environment-d-generator',
1603 'src/environment-d-generator/environment-d-generator.c',
1604 include_directories : includes,
1605 link_with : [libshared],
1606 install_rpath : rootlibexecdir,
1608 install_dir : userenvgeneratordir)
1610 meson.add_install_script(meson_make_symlink,
1611 join_paths(sysconfdir, 'environment'),
1612 join_paths(environmentdir, '99-environment.conf'))
1615 if conf.get('ENABLE_HIBERNATE') == 1
1616 executable('systemd-hibernate-resume-generator',
1617 'src/hibernate-resume/hibernate-resume-generator.c',
1618 include_directories : includes,
1619 link_with : [libshared],
1620 install_rpath : rootlibexecdir,
1622 install_dir : systemgeneratordir)
1624 executable('systemd-hibernate-resume',
1625 'src/hibernate-resume/hibernate-resume.c',
1626 include_directories : includes,
1627 link_with : [libshared],
1628 install_rpath : rootlibexecdir,
1630 install_dir : rootlibexecdir)
1633 if conf.get('HAVE_BLKID') == 1
1634 executable('systemd-gpt-auto-generator',
1635 'src/gpt-auto-generator/gpt-auto-generator.c',
1636 'src/basic/blkid-util.h',
1637 include_directories : includes,
1638 link_with : [libshared],
1639 dependencies : libblkid,
1640 install_rpath : rootlibexecdir,
1642 install_dir : systemgeneratordir)
1644 exe = executable('systemd-dissect',
1645 'src/dissect/dissect.c',
1646 include_directories : includes,
1647 link_with : [libshared],
1648 install_rpath : rootlibexecdir,
1650 install_dir : rootlibexecdir)
1651 public_programs += exe
1654 if conf.get('ENABLE_RESOLVE') == 1
1655 executable('systemd-resolved',
1656 systemd_resolved_sources,
1657 include_directories : includes,
1658 link_with : [libshared,
1660 libsystemd_resolve_core],
1661 dependencies : systemd_resolved_dependencies,
1662 install_rpath : rootlibexecdir,
1664 install_dir : rootlibexecdir)
1666 exe = executable('resolvectl',
1668 include_directories : includes,
1669 link_with : [libshared,
1671 libsystemd_resolve_core],
1672 dependencies : [threads,
1676 install_rpath : rootlibexecdir,
1678 public_programs += exe
1680 meson.add_install_script(meson_make_symlink,
1681 join_paths(bindir, 'resolvectl'),
1682 join_paths(rootsbindir, 'resolvconf'))
1684 meson.add_install_script(meson_make_symlink,
1685 join_paths(bindir, 'resolvectl'),
1686 join_paths(bindir, 'systemd-resolve'))
1689 if conf.get('ENABLE_LOGIND') == 1
1690 executable('systemd-logind',
1691 systemd_logind_sources,
1692 include_directories : includes,
1693 link_with : [liblogind_core,
1695 dependencies : [threads,
1697 install_rpath : rootlibexecdir,
1699 install_dir : rootlibexecdir)
1701 exe = executable('loginctl',
1703 include_directories : includes,
1704 link_with : [libshared],
1705 dependencies : [threads,
1708 install_rpath : rootlibexecdir,
1710 install_dir : rootbindir)
1711 public_programs += exe
1713 exe = executable('systemd-inhibit',
1714 'src/login/inhibit.c',
1715 include_directories : includes,
1716 link_with : [libshared],
1717 install_rpath : rootlibexecdir,
1719 install_dir : rootbindir)
1720 public_programs += exe
1722 if conf.get('HAVE_PAM') == 1
1723 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1724 pam_systemd = shared_library(
1728 include_directories : includes,
1729 link_args : ['-shared',
1730 '-Wl,--version-script=' + version_script_arg],
1731 link_with : [libsystemd_static,
1733 dependencies : [threads,
1736 link_depends : pam_systemd_sym,
1738 install_dir : pamlibdir)
1740 test('dlopen-pam_systemd',
1742 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1746 executable('systemd-user-runtime-dir',
1747 user_runtime_dir_sources,
1748 include_directories : includes,
1749 link_with : [libshared, liblogind_core],
1750 install_rpath : rootlibexecdir,
1752 install_dir : rootlibexecdir)
1754 if conf.get('HAVE_PAM') == 1
1755 executable('systemd-user-sessions',
1756 'src/user-sessions/user-sessions.c',
1757 include_directories : includes,
1758 link_with : [libshared],
1759 install_rpath : rootlibexecdir,
1761 install_dir : rootlibexecdir)
1764 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1765 exe = executable('bootctl',
1766 'src/boot/bootctl.c',
1767 include_directories : includes,
1768 link_with : [libshared],
1769 dependencies : [libblkid],
1770 install_rpath : rootlibexecdir,
1772 public_programs += exe
1775 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1776 include_directories : includes,
1777 link_with : [libshared],
1778 dependencies : [threads],
1779 install_rpath : rootlibexecdir,
1781 public_programs += exe
1784 if get_option('link-systemctl-shared')
1785 systemctl_link_with = [libshared]
1787 systemctl_link_with = [libsystemd_static,
1793 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1794 include_directories : includes,
1795 link_with : systemctl_link_with,
1796 dependencies : [threads,
1801 install_rpath : rootlibexecdir,
1803 install_dir : rootbindir)
1804 public_programs += exe
1806 if conf.get('ENABLE_PORTABLED') == 1
1807 executable('systemd-portabled',
1808 systemd_portabled_sources,
1809 include_directories : includes,
1810 link_with : [libshared],
1811 dependencies : [threads],
1812 install_rpath : rootlibexecdir,
1814 install_dir : rootlibexecdir)
1816 exe = executable('portablectl', 'src/portable/portablectl.c',
1817 include_directories : includes,
1818 link_with : [libshared],
1819 dependencies : [threads],
1820 install_rpath : rootlibexecdir,
1822 install_dir : rootlibexecdir)
1823 public_programs += exe
1826 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1827 meson.add_install_script(meson_make_symlink,
1828 join_paths(rootbindir, 'systemctl'),
1829 join_paths(rootsbindir, alias))
1832 if conf.get('ENABLE_BACKLIGHT') == 1
1833 executable('systemd-backlight',
1834 'src/backlight/backlight.c',
1835 include_directories : includes,
1836 link_with : [libshared],
1837 install_rpath : rootlibexecdir,
1839 install_dir : rootlibexecdir)
1842 if conf.get('ENABLE_RFKILL') == 1
1843 executable('systemd-rfkill',
1844 'src/rfkill/rfkill.c',
1845 include_directories : includes,
1846 link_with : [libshared],
1847 install_rpath : rootlibexecdir,
1849 install_dir : rootlibexecdir)
1852 executable('systemd-system-update-generator',
1853 'src/system-update-generator/system-update-generator.c',
1854 include_directories : includes,
1855 link_with : [libshared],
1856 install_rpath : rootlibexecdir,
1858 install_dir : systemgeneratordir)
1860 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1861 executable('systemd-cryptsetup',
1862 'src/cryptsetup/cryptsetup.c',
1863 include_directories : includes,
1864 link_with : [libshared],
1865 dependencies : [libcryptsetup],
1866 install_rpath : rootlibexecdir,
1868 install_dir : rootlibexecdir)
1870 executable('systemd-cryptsetup-generator',
1871 'src/cryptsetup/cryptsetup-generator.c',
1872 include_directories : includes,
1873 link_with : [libshared],
1874 dependencies : [libcryptsetup],
1875 install_rpath : rootlibexecdir,
1877 install_dir : systemgeneratordir)
1879 executable('systemd-veritysetup',
1880 'src/veritysetup/veritysetup.c',
1881 include_directories : includes,
1882 link_with : [libshared],
1883 dependencies : [libcryptsetup],
1884 install_rpath : rootlibexecdir,
1886 install_dir : rootlibexecdir)
1888 executable('systemd-veritysetup-generator',
1889 'src/veritysetup/veritysetup-generator.c',
1890 include_directories : includes,
1891 link_with : [libshared],
1892 dependencies : [libcryptsetup],
1893 install_rpath : rootlibexecdir,
1895 install_dir : systemgeneratordir)
1898 if conf.get('HAVE_SYSV_COMPAT') == 1
1899 executable('systemd-sysv-generator',
1900 'src/sysv-generator/sysv-generator.c',
1901 include_directories : includes,
1902 link_with : [libshared],
1903 install_rpath : rootlibexecdir,
1905 install_dir : systemgeneratordir)
1907 executable('systemd-rc-local-generator',
1908 'src/rc-local-generator/rc-local-generator.c',
1909 include_directories : includes,
1910 link_with : [libshared],
1911 install_rpath : rootlibexecdir,
1913 install_dir : systemgeneratordir)
1916 if conf.get('ENABLE_HOSTNAMED') == 1
1917 executable('systemd-hostnamed',
1918 'src/hostname/hostnamed.c',
1919 include_directories : includes,
1920 link_with : [libshared],
1921 install_rpath : rootlibexecdir,
1923 install_dir : rootlibexecdir)
1925 exe = executable('hostnamectl',
1926 'src/hostname/hostnamectl.c',
1927 include_directories : includes,
1928 link_with : [libshared],
1929 install_rpath : rootlibexecdir,
1931 public_programs += exe
1934 if conf.get('ENABLE_LOCALED') == 1
1935 if conf.get('HAVE_XKBCOMMON') == 1
1936 # logind will load libxkbcommon.so dynamically on its own
1942 executable('systemd-localed',
1943 systemd_localed_sources,
1944 include_directories : includes,
1945 link_with : [libshared],
1946 dependencies : deps,
1947 install_rpath : rootlibexecdir,
1949 install_dir : rootlibexecdir)
1951 exe = executable('localectl',
1953 include_directories : includes,
1954 link_with : [libshared],
1955 install_rpath : rootlibexecdir,
1957 public_programs += exe
1960 if conf.get('ENABLE_TIMEDATED') == 1
1961 executable('systemd-timedated',
1962 'src/timedate/timedated.c',
1963 include_directories : includes,
1964 link_with : [libshared],
1965 install_rpath : rootlibexecdir,
1967 install_dir : rootlibexecdir)
1970 if conf.get('ENABLE_TIMEDATECTL') == 1
1971 exe = executable('timedatectl',
1972 'src/timedate/timedatectl.c',
1973 include_directories : includes,
1974 install_rpath : rootlibexecdir,
1975 link_with : [libshared],
1976 dependencies : [libm],
1978 public_programs += exe
1981 if conf.get('ENABLE_TIMESYNCD') == 1
1982 executable('systemd-timesyncd',
1983 systemd_timesyncd_sources,
1984 include_directories : includes,
1985 link_with : [libshared],
1986 dependencies : [threads,
1988 install_rpath : rootlibexecdir,
1990 install_dir : rootlibexecdir)
1992 executable('systemd-time-wait-sync',
1993 'src/time-wait-sync/time-wait-sync.c',
1994 include_directories : includes,
1995 link_with : [libshared],
1996 install_rpath : rootlibexecdir,
1998 install_dir : rootlibexecdir)
2001 if conf.get('ENABLE_MACHINED') == 1
2002 executable('systemd-machined',
2003 systemd_machined_sources,
2004 include_directories : includes,
2005 link_with : [libmachine_core,
2007 install_rpath : rootlibexecdir,
2009 install_dir : rootlibexecdir)
2011 exe = executable('machinectl',
2012 'src/machine/machinectl.c',
2013 include_directories : includes,
2014 link_with : [libshared],
2015 dependencies : [threads,
2018 install_rpath : rootlibexecdir,
2020 install_dir : rootbindir)
2021 public_programs += exe
2024 if conf.get('ENABLE_IMPORTD') == 1
2025 executable('systemd-importd',
2026 systemd_importd_sources,
2027 include_directories : includes,
2028 link_with : [libshared],
2029 dependencies : [threads],
2030 install_rpath : rootlibexecdir,
2032 install_dir : rootlibexecdir)
2034 systemd_pull = executable('systemd-pull',
2035 systemd_pull_sources,
2036 include_directories : includes,
2037 link_with : [libshared],
2038 dependencies : [libcurl,
2043 install_rpath : rootlibexecdir,
2045 install_dir : rootlibexecdir)
2047 systemd_import = executable('systemd-import',
2048 systemd_import_sources,
2049 include_directories : includes,
2050 link_with : [libshared],
2051 dependencies : [libcurl,
2055 install_rpath : rootlibexecdir,
2057 install_dir : rootlibexecdir)
2059 systemd_export = executable('systemd-export',
2060 systemd_export_sources,
2061 include_directories : includes,
2062 link_with : [libshared],
2063 dependencies : [libcurl,
2067 install_rpath : rootlibexecdir,
2069 install_dir : rootlibexecdir)
2070 public_programs += [systemd_pull, systemd_import, systemd_export]
2073 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2074 exe = executable('systemd-journal-upload',
2075 systemd_journal_upload_sources,
2076 include_directories : includes,
2077 link_with : [libshared],
2078 dependencies : [threads,
2083 install_rpath : rootlibexecdir,
2085 install_dir : rootlibexecdir)
2086 public_programs += exe
2089 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2090 s_j_remote = executable('systemd-journal-remote',
2091 systemd_journal_remote_sources,
2092 include_directories : includes,
2093 link_with : [libshared,
2094 libsystemd_journal_remote],
2095 dependencies : [threads,
2100 install_rpath : rootlibexecdir,
2102 install_dir : rootlibexecdir)
2104 s_j_gatewayd = executable('systemd-journal-gatewayd',
2105 systemd_journal_gatewayd_sources,
2106 include_directories : includes,
2107 link_with : [libshared],
2108 dependencies : [threads,
2113 install_rpath : rootlibexecdir,
2115 install_dir : rootlibexecdir)
2116 public_programs += [s_j_remote, s_j_gatewayd]
2119 if conf.get('ENABLE_COREDUMP') == 1
2120 executable('systemd-coredump',
2121 systemd_coredump_sources,
2122 include_directories : includes,
2123 link_with : [libshared],
2124 dependencies : [threads,
2129 install_rpath : rootlibexecdir,
2131 install_dir : rootlibexecdir)
2133 exe = executable('coredumpctl',
2134 coredumpctl_sources,
2135 include_directories : includes,
2136 link_with : [libshared],
2137 dependencies : [threads,
2140 install_rpath : rootlibexecdir,
2142 public_programs += exe
2145 if conf.get('ENABLE_BINFMT') == 1
2146 exe = executable('systemd-binfmt',
2147 'src/binfmt/binfmt.c',
2148 include_directories : includes,
2149 link_with : [libshared],
2150 install_rpath : rootlibexecdir,
2152 install_dir : rootlibexecdir)
2153 public_programs += exe
2155 meson.add_install_script('sh', '-c',
2156 mkdir_p.format(binfmtdir))
2157 meson.add_install_script('sh', '-c',
2158 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2161 if conf.get('ENABLE_VCONSOLE') == 1
2162 executable('systemd-vconsole-setup',
2163 'src/vconsole/vconsole-setup.c',
2164 include_directories : includes,
2165 link_with : [libshared],
2166 install_rpath : rootlibexecdir,
2168 install_dir : rootlibexecdir)
2171 if conf.get('ENABLE_RANDOMSEED') == 1
2172 executable('systemd-random-seed',
2173 'src/random-seed/random-seed.c',
2174 include_directories : includes,
2175 link_with : [libshared],
2176 install_rpath : rootlibexecdir,
2178 install_dir : rootlibexecdir)
2181 if conf.get('ENABLE_FIRSTBOOT') == 1
2182 executable('systemd-firstboot',
2183 'src/firstboot/firstboot.c',
2184 include_directories : includes,
2185 link_with : [libshared],
2186 dependencies : [libcrypt],
2187 install_rpath : rootlibexecdir,
2189 install_dir : rootbindir)
2192 executable('systemd-remount-fs',
2193 'src/remount-fs/remount-fs.c',
2194 'src/core/mount-setup.c',
2195 'src/core/mount-setup.h',
2196 include_directories : includes,
2197 link_with : [libshared],
2198 install_rpath : rootlibexecdir,
2200 install_dir : rootlibexecdir)
2202 executable('systemd-machine-id-setup',
2203 'src/machine-id-setup/machine-id-setup-main.c',
2204 'src/core/machine-id-setup.c',
2205 'src/core/machine-id-setup.h',
2206 include_directories : includes,
2207 link_with : [libshared],
2208 install_rpath : rootlibexecdir,
2210 install_dir : rootbindir)
2212 executable('systemd-fsck',
2214 include_directories : includes,
2215 link_with : [libshared],
2216 install_rpath : rootlibexecdir,
2218 install_dir : rootlibexecdir)
2220 executable('systemd-growfs',
2221 'src/partition/growfs.c',
2222 include_directories : includes,
2223 link_with : [libshared],
2224 dependencies : [libcryptsetup],
2225 install_rpath : rootlibexecdir,
2227 install_dir : rootlibexecdir)
2229 executable('systemd-makefs',
2230 'src/partition/makefs.c',
2231 include_directories : includes,
2232 link_with : [libshared],
2233 install_rpath : rootlibexecdir,
2235 install_dir : rootlibexecdir)
2237 executable('systemd-sleep',
2238 'src/sleep/sleep.c',
2239 include_directories : includes,
2240 link_with : [libshared],
2241 install_rpath : rootlibexecdir,
2243 install_dir : rootlibexecdir)
2245 exe = executable('systemd-sysctl',
2246 'src/sysctl/sysctl.c',
2247 include_directories : includes,
2248 link_with : [libshared],
2249 install_rpath : rootlibexecdir,
2251 install_dir : rootlibexecdir)
2252 public_programs += exe
2254 executable('systemd-ac-power',
2255 'src/ac-power/ac-power.c',
2256 include_directories : includes,
2257 link_with : [libshared],
2258 install_rpath : rootlibexecdir,
2260 install_dir : rootlibexecdir)
2262 exe = executable('systemd-detect-virt',
2263 'src/detect-virt/detect-virt.c',
2264 include_directories : includes,
2265 link_with : [libshared],
2266 install_rpath : rootlibexecdir,
2268 public_programs += exe
2270 exe = executable('systemd-delta',
2271 'src/delta/delta.c',
2272 include_directories : includes,
2273 link_with : [libshared],
2274 install_rpath : rootlibexecdir,
2276 public_programs += exe
2278 exe = executable('systemd-escape',
2279 'src/escape/escape.c',
2280 include_directories : includes,
2281 link_with : [libshared],
2282 install_rpath : rootlibexecdir,
2284 install_dir : rootbindir)
2285 public_programs += exe
2287 exe = executable('systemd-notify',
2288 'src/notify/notify.c',
2289 include_directories : includes,
2290 link_with : [libshared],
2291 install_rpath : rootlibexecdir,
2293 install_dir : rootbindir)
2294 public_programs += exe
2296 executable('systemd-volatile-root',
2297 'src/volatile-root/volatile-root.c',
2298 include_directories : includes,
2299 link_with : [libshared],
2300 install_rpath : rootlibexecdir,
2302 install_dir : rootlibexecdir)
2304 executable('systemd-cgroups-agent',
2305 'src/cgroups-agent/cgroups-agent.c',
2306 include_directories : includes,
2307 link_with : [libshared],
2308 install_rpath : rootlibexecdir,
2310 install_dir : rootlibexecdir)
2312 exe = executable('systemd-path',
2314 include_directories : includes,
2315 link_with : [libshared],
2316 install_rpath : rootlibexecdir,
2318 public_programs += exe
2320 exe = executable('systemd-ask-password',
2321 'src/ask-password/ask-password.c',
2322 include_directories : includes,
2323 link_with : [libshared],
2324 install_rpath : rootlibexecdir,
2326 install_dir : rootbindir)
2327 public_programs += exe
2329 executable('systemd-reply-password',
2330 'src/reply-password/reply-password.c',
2331 include_directories : includes,
2332 link_with : [libshared],
2333 install_rpath : rootlibexecdir,
2335 install_dir : rootlibexecdir)
2337 exe = executable('systemd-tty-ask-password-agent',
2338 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2339 include_directories : includes,
2340 link_with : [libshared],
2341 install_rpath : rootlibexecdir,
2343 install_dir : rootbindir)
2344 public_programs += exe
2346 exe = executable('systemd-cgls',
2348 include_directories : includes,
2349 link_with : [libshared],
2350 install_rpath : rootlibexecdir,
2352 public_programs += exe
2354 exe = executable('systemd-cgtop',
2355 'src/cgtop/cgtop.c',
2356 include_directories : includes,
2357 link_with : [libshared],
2358 install_rpath : rootlibexecdir,
2360 public_programs += exe
2362 executable('systemd-initctl',
2363 'src/initctl/initctl.c',
2364 include_directories : includes,
2365 link_with : [libshared],
2366 install_rpath : rootlibexecdir,
2368 install_dir : rootlibexecdir)
2370 exe = executable('systemd-mount',
2371 'src/mount/mount-tool.c',
2372 include_directories : includes,
2373 link_with : [libshared],
2374 install_rpath : rootlibexecdir,
2376 public_programs += exe
2378 meson.add_install_script(meson_make_symlink,
2379 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2381 exe = executable('systemd-run',
2383 include_directories : includes,
2384 link_with : [libshared],
2385 install_rpath : rootlibexecdir,
2387 public_programs += exe
2389 exe = executable('systemd-stdio-bridge',
2390 'src/stdio-bridge/stdio-bridge.c',
2391 include_directories : includes,
2392 link_with : [libshared],
2393 install_rpath : rootlibexecdir,
2395 public_programs += exe
2397 exe = executable('busctl',
2398 'src/busctl/busctl.c',
2399 'src/busctl/busctl-introspect.c',
2400 'src/busctl/busctl-introspect.h',
2401 include_directories : includes,
2402 link_with : [libshared],
2403 install_rpath : rootlibexecdir,
2405 public_programs += exe
2407 if conf.get('ENABLE_SYSUSERS') == 1
2408 exe = executable('systemd-sysusers',
2409 'src/sysusers/sysusers.c',
2410 include_directories : includes,
2411 link_with : [libshared],
2412 install_rpath : rootlibexecdir,
2414 install_dir : rootbindir)
2415 public_programs += exe
2418 if conf.get('ENABLE_TMPFILES') == 1
2419 exe = executable('systemd-tmpfiles',
2420 'src/tmpfiles/tmpfiles.c',
2421 include_directories : includes,
2422 link_with : [libshared],
2423 dependencies : [libacl],
2424 install_rpath : rootlibexecdir,
2426 install_dir : rootbindir)
2427 public_programs += exe
2429 test('test-systemd-tmpfiles',
2430 test_systemd_tmpfiles_py,
2431 args : exe.full_path())
2432 # https://github.com/mesonbuild/meson/issues/2681
2435 if conf.get('ENABLE_HWDB') == 1
2436 exe = executable('systemd-hwdb',
2438 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2439 include_directories : includes,
2440 link_with : [libudev_static],
2441 install_rpath : udev_rpath,
2443 install_dir : rootbindir)
2444 public_programs += exe
2447 if conf.get('ENABLE_QUOTACHECK') == 1
2448 executable('systemd-quotacheck',
2449 'src/quotacheck/quotacheck.c',
2450 include_directories : includes,
2451 link_with : [libshared],
2452 install_rpath : rootlibexecdir,
2454 install_dir : rootlibexecdir)
2457 exe = executable('systemd-socket-proxyd',
2458 'src/socket-proxy/socket-proxyd.c',
2459 include_directories : includes,
2460 link_with : [libshared],
2461 dependencies : [threads],
2462 install_rpath : rootlibexecdir,
2464 install_dir : rootlibexecdir)
2465 public_programs += exe
2467 exe = executable('systemd-udevd',
2468 systemd_udevd_sources,
2469 include_directories : includes,
2470 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2471 link_with : [libudev_core,
2474 dependencies : [threads,
2479 install_rpath : udev_rpath,
2481 install_dir : rootlibexecdir)
2482 public_programs += exe
2484 exe = executable('udevadm',
2486 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2487 include_directories : includes,
2488 link_with : [libudev_core,
2491 dependencies : [threads,
2496 install_rpath : udev_rpath,
2498 install_dir : rootbindir)
2499 public_programs += exe
2501 executable('systemd-shutdown',
2502 systemd_shutdown_sources,
2503 include_directories : includes,
2504 link_with : [libshared],
2505 dependencies : [libmount],
2506 install_rpath : rootlibexecdir,
2508 install_dir : rootlibexecdir)
2510 executable('systemd-update-done',
2511 'src/update-done/update-done.c',
2512 include_directories : includes,
2513 link_with : [libshared],
2514 install_rpath : rootlibexecdir,
2516 install_dir : rootlibexecdir)
2518 executable('systemd-update-utmp',
2519 'src/update-utmp/update-utmp.c',
2520 include_directories : includes,
2521 link_with : [libshared],
2522 dependencies : [libaudit],
2523 install_rpath : rootlibexecdir,
2525 install_dir : rootlibexecdir)
2527 if conf.get('HAVE_KMOD') == 1
2528 executable('systemd-modules-load',
2529 'src/modules-load/modules-load.c',
2530 include_directories : includes,
2531 link_with : [libshared],
2532 dependencies : [libkmod],
2533 install_rpath : rootlibexecdir,
2535 install_dir : rootlibexecdir)
2537 meson.add_install_script('sh', '-c',
2538 mkdir_p.format(modulesloaddir))
2539 meson.add_install_script('sh', '-c',
2540 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2543 exe = executable('systemd-nspawn',
2544 systemd_nspawn_sources,
2545 'src/core/mount-setup.c', # FIXME: use a variable?
2546 'src/core/mount-setup.h',
2547 'src/core/loopback-setup.c',
2548 'src/core/loopback-setup.h',
2549 include_directories : includes,
2550 link_with : [libnspawn_core,
2552 dependencies : [libblkid],
2553 install_rpath : rootlibexecdir,
2555 public_programs += exe
2557 if conf.get('ENABLE_NETWORKD') == 1
2558 executable('systemd-networkd',
2559 systemd_networkd_sources,
2560 include_directories : includes,
2561 link_with : [libnetworkd_core,
2565 dependencies : [threads],
2566 install_rpath : rootlibexecdir,
2568 install_dir : rootlibexecdir)
2570 executable('systemd-networkd-wait-online',
2571 systemd_networkd_wait_online_sources,
2572 include_directories : includes,
2573 link_with : [libnetworkd_core,
2575 install_rpath : rootlibexecdir,
2577 install_dir : rootlibexecdir)
2579 exe = executable('networkctl',
2581 include_directories : includes,
2582 link_with : [libsystemd_network,
2584 install_rpath : rootlibexecdir,
2586 install_dir : rootbindir)
2587 public_programs += exe
2590 executable('systemd-sulogin-shell',
2591 ['src/sulogin-shell/sulogin-shell.c'],
2592 include_directories : includes,
2593 link_with : [libshared],
2594 install_rpath : rootlibexecdir,
2596 install_dir : rootlibexecdir)
2598 ############################################################
2600 foreach tuple : tests
2602 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2603 dependencies = tuple[2]
2604 condition = tuple.length() >= 4 ? tuple[3] : ''
2605 type = tuple.length() >= 5 ? tuple[4] : ''
2606 defs = tuple.length() >= 6 ? tuple[5] : []
2607 incs = tuple.length() >= 7 ? tuple[6] : includes
2610 name = sources[0].split('/')[-1].split('.')[0]
2611 if type.startswith('timeout=')
2612 timeout = type.split('=')[1].to_int()
2615 if want_tests == 'false'
2616 message('Not compiling @0@ because tests is set to false'.format(name))
2617 elif condition == '' or conf.get(condition) == 1
2621 include_directories : incs,
2622 link_with : link_with,
2623 dependencies : dependencies,
2625 install_rpath : rootlibexecdir,
2626 install : install_tests,
2627 install_dir : join_paths(testsdir, type))
2630 message('@0@ is a manual test'.format(name))
2631 elif type == 'unsafe' and want_tests != 'unsafe'
2632 message('@0@ is an unsafe test'.format(name))
2639 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2644 'test-libsystemd-sym',
2645 test_libsystemd_sym_c,
2646 include_directories : includes,
2647 link_with : [libsystemd],
2648 install : install_tests,
2649 install_dir : testsdir)
2650 test('test-libsystemd-sym', exe)
2653 'test-libsystemd-static-sym',
2654 test_libsystemd_sym_c,
2655 include_directories : includes,
2656 link_with : [install_libsystemd_static],
2657 dependencies : [threads], # threads is already included in dependencies on the library,
2658 # but does not seem to get propagated. Add here as a work-around.
2659 build_by_default : static_libsystemd_pic,
2660 install : install_tests and static_libsystemd_pic,
2661 install_dir : testsdir)
2662 if static_libsystemd_pic
2663 test('test-libsystemd-static-sym', exe)
2669 include_directories : includes,
2670 c_args : ['-Wno-deprecated-declarations'],
2671 link_with : [libudev],
2672 install : install_tests,
2673 install_dir : testsdir)
2674 test('test-libudev-sym', exe)
2677 'test-libudev-static-sym',
2679 include_directories : includes,
2680 c_args : ['-Wno-deprecated-declarations'],
2681 link_with : [install_libudev_static],
2682 build_by_default : static_libudev_pic,
2683 install : install_tests and static_libudev_pic,
2684 install_dir : testsdir)
2685 if static_libudev_pic
2686 test('test-libudev-static-sym', exe)
2689 ############################################################
2693 foreach tuple : fuzzers
2695 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2696 dependencies = tuple[2]
2697 defs = tuple.length() >= 4 ? tuple[3] : []
2698 incs = tuple.length() >= 5 ? tuple[4] : includes
2701 dependencies += fuzzing_engine
2703 sources += 'src/fuzz/fuzz-main.c'
2706 name = sources[0].split('/')[-1].split('.')[0]
2708 fuzzer_exes += executable(
2711 include_directories : [incs, include_directories('src/fuzz')],
2712 link_with : link_with,
2713 dependencies : dependencies,
2718 run_target('fuzzers',
2719 depends : fuzzer_exes,
2722 ############################################################
2724 make_directive_index_py = find_program('tools/make-directive-index.py')
2725 make_man_index_py = find_program('tools/make-man-index.py')
2726 xml_helper_py = find_program('tools/xml_helper.py')
2727 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2731 subdir('sysusers.d')
2732 subdir('tmpfiles.d')
2737 subdir('shell-completion/bash')
2738 subdir('shell-completion/zsh')
2739 subdir('doc/sysvinit')
2740 subdir('doc/var-log')
2742 # FIXME: figure out if the warning is true:
2743 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2744 install_subdir('factory/etc',
2745 install_dir : factorydir)
2748 install_data('xorg/50-systemd-user.sh',
2749 install_dir : xinitrcdir)
2750 install_data('modprobe.d/systemd.conf',
2751 install_dir : modprobedir)
2752 install_data('LICENSE.GPL2',
2757 'doc/DISTRO_PORTING',
2758 'doc/ENVIRONMENT.md',
2760 'doc/TRANSIENT-SETTINGS.md',
2763 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2764 install_dir : docdir)
2766 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2767 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2769 ############################################################
2771 meson_check_help = find_program('tools/meson-check-help.sh')
2773 foreach exec : public_programs
2774 name = exec.full_path().split('/')[-1]
2775 test('check-help-' + name,
2777 args : [exec.full_path()])
2780 ############################################################
2782 # Enable tests for all supported sanitizers
2783 foreach tuple : sanitizers
2784 sanitizer = tuple[0]
2787 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2789 foreach p : fuzz_regression_tests
2790 b = p.split('/')[-2]
2791 c = p.split('/')[-1]
2793 name = '@0@:@1@'.format(b, sanitizer)
2796 if want_tests == 'false'
2797 message('Not compiling @0@ because tests is set to false'.format(name))
2799 exe = custom_target(
2803 command : [env, 'ln', '-fs',
2804 join_paths(build.full_path(), b),
2806 build_by_default : true)
2808 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2813 if want_tests != 'false' and slow_tests
2814 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2816 args : [exe.full_path(),
2817 join_paths(meson.source_root(),
2818 'test/fuzz-regressions',
2826 ############################################################
2829 all_files = run_command(
2831 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2834 all_files = files(all_files.stdout().split())
2839 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2842 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2846 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2849 command : [meson_git_contrib_sh])
2853 git_head = run_command(
2855 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2856 'rev-parse', 'HEAD']).stdout().strip()
2857 git_head_short = run_command(
2859 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2860 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2864 command : ['git', 'archive',
2865 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2867 '--prefix', 'systemd-@0@/'.format(git_head),
2871 ############################################################
2873 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2876 depends : [man, libsystemd, libudev],
2877 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2879 ############################################################
2882 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2884 'split /usr: @0@'.format(split_usr),
2885 'split bin-sbin: @0@'.format(split_bin),
2886 'prefix directory: @0@'.format(prefixdir),
2887 'rootprefix directory: @0@'.format(rootprefixdir),
2888 'sysconf directory: @0@'.format(sysconfdir),
2889 'include directory: @0@'.format(includedir),
2890 'lib directory: @0@'.format(libdir),
2891 'rootlib directory: @0@'.format(rootlibdir),
2892 'SysV init scripts: @0@'.format(sysvinit_path),
2893 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2894 'PAM modules directory: @0@'.format(pamlibdir),
2895 'PAM configuration directory: @0@'.format(pamconfdir),
2896 'RPM macros directory: @0@'.format(rpmmacrosdir),
2897 'modprobe.d directory: @0@'.format(modprobedir),
2898 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2899 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2900 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2901 'bash completions directory: @0@'.format(bashcompletiondir),
2902 'zsh completions directory: @0@'.format(zshcompletiondir),
2903 'extra start script: @0@'.format(get_option('rc-local')),
2904 'extra stop script: @0@'.format(get_option('halt-local')),
2905 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2906 get_option('debug-tty')),
2907 'TTY GID: @0@'.format(tty_gid),
2908 'users GID: @0@'.format(substs.get('USERS_GID')),
2909 'maximum system UID: @0@'.format(system_uid_max),
2910 'maximum system GID: @0@'.format(system_gid_max),
2911 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2912 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2913 'minimum container UID base: @0@'.format(container_uid_base_min),
2914 'maximum container UID base: @0@'.format(container_uid_base_max),
2915 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2916 'render group access mode: @0@'.format(get_option('group-render-mode')),
2917 'certificate root directory: @0@'.format(get_option('certificate-root')),
2918 'support URL: @0@'.format(support_url),
2919 'nobody user name: @0@'.format(nobody_user),
2920 'nobody group name: @0@'.format(nobody_group),
2921 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2922 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2924 'default DNSSEC mode: @0@'.format(default_dnssec),
2925 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
2926 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2927 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2929 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2930 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2932 'default DNS servers: @0@'.format(alt_dns_servers),
2933 'default NTP servers: @0@'.format(alt_ntp_servers)]
2935 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2936 '@@0@'.format(time_epoch)).stdout().strip()
2938 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2941 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2942 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2943 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2945 if conf.get('ENABLE_EFI') == 1
2946 status += 'efi arch: @0@'.format(efi_arch)
2950 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2951 'EFI CC @0@'.format(efi_cc),
2952 'EFI lib directory: @0@'.format(efi_libdir),
2953 'EFI lds directory: @0@'.format(efi_ldsdir),
2954 'EFI include directory: @0@'.format(efi_incdir)]
3006 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3007 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3010 ['legacy pkla', install_polkit_pkla],
3012 ['gnu-efi', have_gnu_efi],
3019 ['nss-myhostname', conf.get('ENABLE_NSS_MYHOSTNAME') == 1],
3020 ['nss-mymachines', conf.get('ENABLE_NSS_MYMACHINES') == 1],
3021 ['nss-resolve', conf.get('ENABLE_NSS_RESOLVE') == 1],
3022 ['nss-systemd', conf.get('ENABLE_NSS_SYSTEMD') == 1],
3025 ['man pages', want_man],
3026 ['html pages', want_html],
3027 ['man page indices', want_man and have_lxml],
3032 ['adm group', get_option('adm-group')],
3033 ['wheel group', get_option('wheel-group')],
3036 ['debug mmap cache'],
3037 ['valgrind', conf.get('VALGRIND') == 1],
3040 if tuple.length() >= 2
3043 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3044 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3045 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3056 'enabled features: @0@'.format(', '.join(found)),
3058 'disabled features: @0@'.format(', '.join(missing)),
3060 message('\n '.join(status))
3062 if rootprefixdir != rootprefix_default
3064 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3065 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3066 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))