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 = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
94 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
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',
325 # negative arguments are correctly detected starting with meson 0.46.
326 '-Wno-unused-parameter',
327 '-Wno-missing-field-initializers',
328 '-Wno-unused-result',
329 '-Wno-format-signedness',
331 # work-around for gcc 7.1 turning this on on its own.
332 '-Wno-error=nonnull',
334 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
335 # optimizations enabled, producing essentially false positives.
336 '-Wno-maybe-uninitialized',
340 '-fdiagnostics-show-option',
341 '-fno-strict-aliasing',
342 '-fvisibility=hidden',
344 '-fstack-protector-strong',
345 '--param=ssp-buffer-size=4',
348 # --as-needed and --no-undefined are provided by meson by default,
349 # run mesonconf to see what is enabled
350 possible_link_flags = [
355 # the oss-fuzz fuzzers are not built with -fPIE, so don't
356 # enable it when we are linking against them
358 possible_cc_flags += '-fPIE'
359 possible_link_flags += '-pie'
362 if cc.get_id() == 'clang'
363 possible_cc_flags += [
364 '-Wno-typedef-redefinition',
365 '-Wno-gnu-variable-sized-type-not-at-end',
369 if get_option('buildtype') != 'debug'
370 possible_cc_flags += [
371 '-ffunction-sections',
375 possible_link_flags += '-Wl,--gc-sections'
378 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
379 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
383 #include <inttypes.h>
384 typedef uint64_t usec_t;
385 usec_t now(clockid_t clock);
390 ''', name : '-Werror=shadow with local shadowing')
391 add_project_arguments('-Werror=shadow', language : 'c')
394 cpp = ' '.join(cc.cmd_array()) + ' -E'
396 #####################################################################
397 # compilation result tests
399 conf.set('_GNU_SOURCE', true)
400 conf.set('__SANE_USERSPACE_TYPES__', true)
402 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
403 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
404 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
405 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
406 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
407 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
408 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
412 #include <linux/ethtool.h>
413 #include <linux/fib_rules.h>
414 #include <sys/stat.h>
417 foreach decl : ['char16_t',
419 'struct ethtool_link_settings',
420 'struct fib_rule_uid_range',
424 # We get -1 if the size cannot be determined
425 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
427 if decl == 'struct statx'
429 want_linux_stat_h = false
431 have = cc.sizeof(decl,
432 prefix : decl_headers + '#include <linux/stat.h>',
433 args : '-D_GNU_SOURCE') > 0
434 want_linux_stat_h = have
438 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
441 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
443 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
444 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
445 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
446 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
447 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
448 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
449 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
450 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
451 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
452 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
453 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
454 # if_tunnel.h is buggy and cannot be included on its own
455 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
456 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
457 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
458 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
459 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
460 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
461 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
462 ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
463 ['NDA_IFINDEX', 'linux/neighbour.h'],
464 ['IFA_FLAGS', 'linux/if_addr.h'],
465 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
466 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
467 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
468 ['FOU_ATTR_REMCSUM_NOPARTIAL', 'linux/fou.h'],
469 ['FOU_CMD_GET', 'linux/fou.h'],
470 ['FOU_ENCAP_GUE', 'linux/fou.h'],
472 prefix = decl.length() > 2 ? decl[2] : ''
473 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
474 conf.set10('HAVE_' + decl[0], have)
477 foreach ident : ['secure_getenv', '__secure_getenv']
478 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
482 ['memfd_create', '''#include <sys/mman.h>'''],
483 ['gettid', '''#include <sys/types.h>
484 #include <unistd.h>'''],
485 ['pivot_root', '''#include <stdlib.h>
486 #include <unistd.h>'''], # no known header declares pivot_root
487 ['name_to_handle_at', '''#include <sys/types.h>
488 #include <sys/stat.h>
489 #include <fcntl.h>'''],
490 ['setns', '''#include <sched.h>'''],
491 ['renameat2', '''#include <stdio.h>
492 #include <fcntl.h>'''],
493 ['kcmp', '''#include <linux/kcmp.h>'''],
494 ['keyctl', '''#include <sys/types.h>
495 #include <keyutils.h>'''],
496 ['copy_file_range', '''#include <sys/syscall.h>
497 #include <unistd.h>'''],
498 ['bpf', '''#include <sys/syscall.h>
499 #include <unistd.h>'''],
500 ['statx', '''#include <sys/types.h>
501 #include <sys/stat.h>
502 #include <unistd.h>'''],
503 ['explicit_bzero' , '''#include <string.h>'''],
504 ['reallocarray', '''#include <malloc.h>'''],
507 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
508 conf.set10('HAVE_' + ident[0].to_upper(), have)
511 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
512 conf.set10('USE_SYS_RANDOM_H', true)
513 conf.set10('HAVE_GETRANDOM', true)
515 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
516 conf.set10('USE_SYS_RANDOM_H', false)
517 conf.set10('HAVE_GETRANDOM', have)
520 #####################################################################
522 sed = find_program('sed')
523 awk = find_program('awk')
524 m4 = find_program('m4')
525 stat = find_program('stat')
526 git = find_program('git', required : false)
527 env = find_program('env')
528 perl = find_program('perl', required : false)
530 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
531 mkdir_p = 'mkdir -p $DESTDIR/@0@'
532 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
533 splash_bmp = files('test/splash.bmp')
535 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
536 # /usr/sbin, /sbin, and fall back to the default from middle column.
537 progs = [['quotaon', '/usr/sbin/quotaon' ],
538 ['quotacheck', '/usr/sbin/quotacheck' ],
539 ['kmod', '/usr/bin/kmod' ],
540 ['kexec', '/usr/sbin/kexec' ],
541 ['sulogin', '/usr/sbin/sulogin' ],
542 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
543 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
544 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
545 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
548 path = get_option(prog[0] + '-path')
550 message('Using @1@ for @0@'.format(prog[0], path))
552 exe = find_program(prog[0],
553 '/usr/sbin/' + prog[0],
556 path = exe.found() ? exe.path() : prog[1]
558 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
559 conf.set_quoted(name, path)
560 substs.set(name, path)
563 conf.set_quoted('TELINIT', get_option('telinit-path'))
565 if run_command('ln', '--relative', '--help').returncode() != 0
566 error('ln does not support --relative (added in coreutils 8.16)')
569 ############################################################
571 gperf = find_program('gperf')
573 gperf_test_format = '''
575 const char * in_word_set(const char *, @0@);
578 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
579 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
580 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
581 if cc.compiles(gperf_test)
582 gperf_len_type = 'size_t'
584 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
585 if cc.compiles(gperf_test)
586 gperf_len_type = 'unsigned'
588 error('unable to determine gperf len type')
591 message('gperf len type is @0@'.format(gperf_len_type))
592 conf.set('GPERF_LEN_TYPE', gperf_len_type,
593 description : 'The type of gperf "len" parameter')
595 ############################################################
597 if not cc.has_header('sys/capability.h')
598 error('POSIX caps headers not found')
600 foreach header : ['crypt.h',
603 'linux/vm_sockets.h',
605 'valgrind/memcheck.h',
606 'valgrind/valgrind.h',
609 conf.set10('HAVE_' + header.underscorify().to_upper(),
610 cc.has_header(header))
613 ############################################################
615 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
616 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
617 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
619 default_hierarchy = get_option('default-hierarchy')
620 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
621 description : 'default cgroup hierarchy as string')
622 if default_hierarchy == 'legacy'
623 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
624 elif default_hierarchy == 'hybrid'
625 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
627 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
630 time_epoch = get_option('time-epoch')
633 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
635 conf.set('TIME_EPOCH', time_epoch)
637 system_uid_max = get_option('system-uid-max')
638 if system_uid_max == -1
639 system_uid_max = run_command(
641 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
642 '/etc/login.defs').stdout().strip()
643 if system_uid_max == ''
646 system_uid_max = system_uid_max.to_int()
649 conf.set('SYSTEM_UID_MAX', system_uid_max)
650 substs.set('systemuidmax', system_uid_max)
652 system_gid_max = get_option('system-gid-max')
653 if system_gid_max == -1
654 system_gid_max = run_command(
656 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
657 '/etc/login.defs').stdout().strip()
658 if system_gid_max == ''
661 system_gid_max = system_gid_max.to_int()
664 conf.set('SYSTEM_GID_MAX', system_gid_max)
665 substs.set('systemgidmax', system_gid_max)
667 dynamic_uid_min = get_option('dynamic-uid-min')
668 dynamic_uid_max = get_option('dynamic-uid-max')
669 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
670 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
671 substs.set('dynamicuidmin', dynamic_uid_min)
672 substs.set('dynamicuidmax', dynamic_uid_max)
674 container_uid_base_min = get_option('container-uid-base-min')
675 container_uid_base_max = get_option('container-uid-base-max')
676 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
677 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
678 substs.set('containeruidbasemin', container_uid_base_min)
679 substs.set('containeruidbasemax', container_uid_base_max)
681 nobody_user = get_option('nobody-user')
682 nobody_group = get_option('nobody-group')
684 if not meson.is_cross_build()
685 getent_result = run_command('getent', 'passwd', '65534')
686 if getent_result.returncode() == 0
687 name = getent_result.stdout().split(':')[0]
688 if name != nobody_user
690 '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) +
691 'Your build will result in an user table setup that is incompatible with the local system.')
694 id_result = run_command('id', '-u', nobody_user)
695 if id_result.returncode() == 0
696 id = id_result.stdout().to_int()
699 '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) +
700 'Your build will result in an user table setup that is incompatible with the local system.')
704 getent_result = run_command('getent', 'group', '65534')
705 if getent_result.returncode() == 0
706 name = getent_result.stdout().split(':')[0]
707 if name != nobody_group
709 '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) +
710 'Your build will result in an group table setup that is incompatible with the local system.')
713 id_result = run_command('id', '-g', nobody_group)
714 if id_result.returncode() == 0
715 id = id_result.stdout().to_int()
718 '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) +
719 'Your build will result in an group table setup that is incompatible with the local system.')
723 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
725 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
726 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
729 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
730 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
731 substs.set('NOBODY_USER_NAME', nobody_user)
732 substs.set('NOBODY_GROUP_NAME', nobody_group)
734 tty_gid = get_option('tty-gid')
735 conf.set('TTY_GID', tty_gid)
736 substs.set('TTY_GID', tty_gid)
738 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
739 users_gid = get_option('users-gid')
740 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
742 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
743 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
745 dev_kvm_mode = get_option('dev-kvm-mode')
746 substs.set('DEV_KVM_MODE', dev_kvm_mode)
747 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
748 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
750 kill_user_processes = get_option('default-kill-user-processes')
751 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
752 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
753 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
755 dns_servers = get_option('dns-servers')
756 conf.set_quoted('DNS_SERVERS', dns_servers)
757 substs.set('DNS_SERVERS', dns_servers)
759 ntp_servers = get_option('ntp-servers')
760 conf.set_quoted('NTP_SERVERS', ntp_servers)
761 substs.set('NTP_SERVERS', ntp_servers)
763 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
765 substs.set('SUSHELL', get_option('debug-shell'))
766 substs.set('DEBUGTTY', get_option('debug-tty'))
768 enable_debug_hashmap = false
769 enable_debug_mmap_cache = false
770 foreach name : get_option('debug-extra')
772 enable_debug_hashmap = true
773 elif name == 'mmap-cache'
774 enable_debug_mmap_cache = true
776 message('unknown debug option "@0@", ignoring'.format(name))
779 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
780 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
782 conf.set10('VALGRIND', get_option('valgrind'))
784 #####################################################################
786 threads = dependency('threads')
787 librt = cc.find_library('rt')
788 libm = cc.find_library('m')
789 libdl = cc.find_library('dl')
790 libcrypt = cc.find_library('crypt')
792 libcap = dependency('libcap', required : false)
793 if not libcap.found()
794 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
795 libcap = cc.find_library('cap')
798 libmount = dependency('mount',
799 version : fuzzer_build ? '>= 0' : '>= 2.30')
801 want_seccomp = get_option('seccomp')
802 if want_seccomp != 'false' and not fuzzer_build
803 libseccomp = dependency('libseccomp',
804 version : '>= 2.3.1',
805 required : want_seccomp == 'true')
806 have = libseccomp.found()
811 conf.set10('HAVE_SECCOMP', have)
813 want_selinux = get_option('selinux')
814 if want_selinux != 'false' and not fuzzer_build
815 libselinux = dependency('libselinux',
816 version : '>= 2.1.9',
817 required : want_selinux == 'true')
818 have = libselinux.found()
823 conf.set10('HAVE_SELINUX', have)
825 want_apparmor = get_option('apparmor')
826 if want_apparmor != 'false' and not fuzzer_build
827 libapparmor = dependency('libapparmor',
828 required : want_apparmor == 'true')
829 have = libapparmor.found()
834 conf.set10('HAVE_APPARMOR', have)
836 smack_run_label = get_option('smack-run-label')
837 if smack_run_label != ''
838 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
841 want_polkit = get_option('polkit')
842 install_polkit = false
843 install_polkit_pkla = false
844 if want_polkit != 'false' and not fuzzer_build
845 install_polkit = true
847 libpolkit = dependency('polkit-gobject-1',
849 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
850 message('Old polkit detected, will install pkla files')
851 install_polkit_pkla = true
854 conf.set10('ENABLE_POLKIT', install_polkit)
856 want_acl = get_option('acl')
857 if want_acl != 'false' and not fuzzer_build
858 libacl = cc.find_library('acl', required : want_acl == 'true')
859 have = libacl.found()
864 conf.set10('HAVE_ACL', have)
866 want_audit = get_option('audit')
867 if want_audit != 'false' and not fuzzer_build
868 libaudit = dependency('audit', required : want_audit == 'true')
869 have = libaudit.found()
874 conf.set10('HAVE_AUDIT', have)
876 want_blkid = get_option('blkid')
877 if want_blkid != 'false' and not fuzzer_build
878 libblkid = dependency('blkid', required : want_blkid == 'true')
879 have = libblkid.found()
884 conf.set10('HAVE_BLKID', have)
886 want_kmod = get_option('kmod')
887 if want_kmod != 'false' and not fuzzer_build
888 libkmod = dependency('libkmod',
890 required : want_kmod == 'true')
891 have = libkmod.found()
896 conf.set10('HAVE_KMOD', have)
898 want_pam = get_option('pam')
899 if want_pam != 'false' and not fuzzer_build
900 libpam = cc.find_library('pam', required : want_pam == 'true')
901 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
902 have = libpam.found() and libpam_misc.found()
908 conf.set10('HAVE_PAM', have)
910 want_microhttpd = get_option('microhttpd')
911 if want_microhttpd != 'false' and not fuzzer_build
912 libmicrohttpd = dependency('libmicrohttpd',
913 version : '>= 0.9.33',
914 required : want_microhttpd == 'true')
915 have = libmicrohttpd.found()
920 conf.set10('HAVE_MICROHTTPD', have)
922 want_libcryptsetup = get_option('libcryptsetup')
923 if want_libcryptsetup != 'false' and not fuzzer_build
924 libcryptsetup = dependency('libcryptsetup',
925 version : '>= 1.6.0',
926 required : want_libcryptsetup == 'true')
927 have = libcryptsetup.found()
928 have_sector = cc.has_member(
929 'struct crypt_params_plain',
931 prefix : '#include <libcryptsetup.h>')
937 conf.set10('HAVE_LIBCRYPTSETUP', have)
938 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
940 want_libcurl = get_option('libcurl')
941 if want_libcurl != 'false' and not fuzzer_build
942 libcurl = dependency('libcurl',
943 version : '>= 7.32.0',
944 required : want_libcurl == 'true')
945 have = libcurl.found()
950 conf.set10('HAVE_LIBCURL', have)
952 want_libidn = get_option('libidn')
953 want_libidn2 = get_option('libidn2')
954 if want_libidn == 'true' and want_libidn2 == 'true'
955 error('libidn and libidn2 cannot be requested simultaneously')
958 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
959 libidn = dependency('libidn',
960 required : want_libidn == 'true')
961 have = libidn.found()
966 conf.set10('HAVE_LIBIDN', have)
967 if not have and want_libidn2 != 'false' and not fuzzer_build
968 # libidn is used for both libidn and libidn2 objects
969 libidn = dependency('libidn2',
970 required : want_libidn2 == 'true')
971 have = libidn.found()
975 conf.set10('HAVE_LIBIDN2', have)
977 want_libiptc = get_option('libiptc')
978 if want_libiptc != 'false' and not fuzzer_build
979 libiptc = dependency('libiptc',
980 required : want_libiptc == 'true')
981 have = libiptc.found()
986 conf.set10('HAVE_LIBIPTC', have)
988 want_qrencode = get_option('qrencode')
989 if want_qrencode != 'false' and not fuzzer_build
990 libqrencode = dependency('libqrencode',
991 required : want_qrencode == 'true')
992 have = libqrencode.found()
997 conf.set10('HAVE_QRENCODE', have)
999 want_gcrypt = get_option('gcrypt')
1000 if want_gcrypt != 'false' and not fuzzer_build
1001 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1002 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1003 have = libgcrypt.found() and libgpg_error.found()
1008 # link to neither of the libs if one is not found
1012 conf.set10('HAVE_GCRYPT', have)
1014 want_gnutls = get_option('gnutls')
1015 if want_gnutls != 'false' and not fuzzer_build
1016 libgnutls = dependency('gnutls',
1017 version : '>= 3.1.4',
1018 required : want_gnutls == 'true')
1019 have = libgnutls.found()
1024 conf.set10('HAVE_GNUTLS', have)
1026 want_openssl = get_option('openssl')
1027 if want_openssl != 'false' and not fuzzer_build
1028 libopenssl = dependency('openssl',
1029 version : '>= 1.1.0',
1030 required : want_openssl == 'true')
1031 have = libopenssl.found()
1036 conf.set10('HAVE_OPENSSL', have)
1038 want_elfutils = get_option('elfutils')
1039 if want_elfutils != 'false' and not fuzzer_build
1040 libdw = dependency('libdw',
1041 required : want_elfutils == 'true')
1042 have = libdw.found()
1047 conf.set10('HAVE_ELFUTILS', have)
1049 want_zlib = get_option('zlib')
1050 if want_zlib != 'false' and not fuzzer_build
1051 libz = dependency('zlib',
1052 required : want_zlib == 'true')
1058 conf.set10('HAVE_ZLIB', have)
1060 want_bzip2 = get_option('bzip2')
1061 if want_bzip2 != 'false' and not fuzzer_build
1062 libbzip2 = cc.find_library('bz2',
1063 required : want_bzip2 == 'true')
1064 have = libbzip2.found()
1069 conf.set10('HAVE_BZIP2', have)
1071 want_xz = get_option('xz')
1072 if want_xz != 'false' and not fuzzer_build
1073 libxz = dependency('liblzma',
1074 required : want_xz == 'true')
1075 have = libxz.found()
1080 conf.set10('HAVE_XZ', have)
1082 want_lz4 = get_option('lz4')
1083 if want_lz4 != 'false' and not fuzzer_build
1084 liblz4 = dependency('liblz4',
1085 required : want_lz4 == 'true')
1086 have = liblz4.found()
1091 conf.set10('HAVE_LZ4', have)
1093 want_xkbcommon = get_option('xkbcommon')
1094 if want_xkbcommon != 'false' and not fuzzer_build
1095 libxkbcommon = dependency('xkbcommon',
1096 version : '>= 0.3.0',
1097 required : want_xkbcommon == 'true')
1098 have = libxkbcommon.found()
1103 conf.set10('HAVE_XKBCOMMON', have)
1105 want_pcre2 = get_option('pcre2')
1106 if want_pcre2 != 'false'
1107 libpcre2 = dependency('libpcre2-8',
1108 required : want_pcre2 == 'true')
1109 have = libpcre2.found()
1114 conf.set10('HAVE_PCRE2', have)
1116 want_glib = get_option('glib')
1117 if want_glib != 'false' and not fuzzer_build
1118 libglib = dependency('glib-2.0',
1119 version : '>= 2.22.0',
1120 required : want_glib == 'true')
1121 libgobject = dependency('gobject-2.0',
1122 version : '>= 2.22.0',
1123 required : want_glib == 'true')
1124 libgio = dependency('gio-2.0',
1125 required : want_glib == 'true')
1126 have = libglib.found() and libgobject.found() and libgio.found()
1133 conf.set10('HAVE_GLIB', have)
1135 want_dbus = get_option('dbus')
1136 if want_dbus != 'false' and not fuzzer_build
1137 libdbus = dependency('dbus-1',
1138 version : '>= 1.3.2',
1139 required : want_dbus == 'true')
1140 have = libdbus.found()
1145 conf.set10('HAVE_DBUS', have)
1147 default_dnssec = get_option('default-dnssec')
1149 default_dnssec = 'no'
1151 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1152 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1153 default_dnssec = 'no'
1155 conf.set('DEFAULT_DNSSEC_MODE',
1156 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1157 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1159 dns_over_tls = get_option('dns-over-tls')
1160 if dns_over_tls != 'false'
1161 if dns_over_tls == 'openssl'
1164 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1165 if dns_over_tls == 'gnutls' and not have_gnutls
1166 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1169 if dns_over_tls == 'gnutls' or have_gnutls
1170 have_openssl = false
1172 have_openssl = conf.get('HAVE_OPENSSL') == 1
1173 if dns_over_tls != 'auto' and not have_openssl
1174 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1175 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1178 have = have_gnutls or have_openssl
1180 have = have_gnutls = have_openssl = false
1182 conf.set10('ENABLE_DNS_OVER_TLS', have)
1183 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1184 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1186 default_dns_over_tls = get_option('default-dns-over-tls')
1188 default_dns_over_tls = 'no'
1190 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1191 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1192 default_dns_over_tls = 'no'
1194 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1195 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1196 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1198 want_importd = get_option('importd')
1199 if want_importd != 'false'
1200 have = (conf.get('HAVE_LIBCURL') == 1 and
1201 conf.get('HAVE_ZLIB') == 1 and
1202 conf.get('HAVE_BZIP2') == 1 and
1203 conf.get('HAVE_XZ') == 1 and
1204 conf.get('HAVE_GCRYPT') == 1)
1205 if want_importd == 'true' and not have
1206 error('importd support was requested, but dependencies are not available')
1211 conf.set10('ENABLE_IMPORTD', have)
1213 want_remote = get_option('remote')
1214 if want_remote != 'false'
1215 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1216 conf.get('HAVE_LIBCURL') == 1]
1217 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1218 # it's possible to build one without the other. Complain only if
1219 # support was explictly requested. The auxiliary files like sysusers
1220 # config should be installed when any of the programs are built.
1221 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1222 error('remote support was requested, but dependencies are not available')
1224 have = have_deps[0] or have_deps[1]
1228 conf.set10('ENABLE_REMOTE', have)
1230 foreach term : ['utmp',
1262 have = get_option(term)
1263 name = 'ENABLE_' + term.underscorify().to_upper()
1264 conf.set10(name, have)
1267 foreach tuple : [['nss-mymachines', 'machined'],
1268 ['nss-resolve', 'resolve']]
1269 want = get_option(tuple[0])
1271 have = get_option(tuple[1])
1272 if want == 'true' and not have
1273 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1278 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1279 conf.set10(name, have)
1283 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1284 'ENABLE_NSS_MYMACHINES',
1285 'ENABLE_NSS_RESOLVE',
1286 'ENABLE_NSS_SYSTEMD']
1287 if conf.get(term) == 1
1291 conf.set10('ENABLE_NSS', enable_nss)
1293 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1295 want_tests = get_option('tests')
1296 install_tests = get_option('install-tests')
1297 slow_tests = get_option('slow-tests')
1301 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1303 #####################################################################
1305 if get_option('efi')
1306 efi_arch = host_machine.cpu_family()
1308 if efi_arch == 'x86'
1309 EFI_MACHINE_TYPE_NAME = 'ia32'
1310 gnu_efi_arch = 'ia32'
1311 elif efi_arch == 'x86_64'
1312 EFI_MACHINE_TYPE_NAME = 'x64'
1313 gnu_efi_arch = 'x86_64'
1314 elif efi_arch == 'arm'
1315 EFI_MACHINE_TYPE_NAME = 'arm'
1316 gnu_efi_arch = 'arm'
1317 elif efi_arch == 'aarch64'
1318 EFI_MACHINE_TYPE_NAME = 'aa64'
1319 gnu_efi_arch = 'aarch64'
1321 EFI_MACHINE_TYPE_NAME = ''
1326 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1328 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1332 conf.set10('ENABLE_EFI', have)
1334 #####################################################################
1336 config_h = configure_file(
1337 output : 'config.h',
1338 configuration : conf)
1340 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1342 includes = include_directories('src/basic',
1346 'src/journal-remote',
1350 'src/time-wait-sync',
1355 'src/libsystemd/sd-bus',
1356 'src/libsystemd/sd-device',
1357 'src/libsystemd/sd-hwdb',
1358 'src/libsystemd/sd-id128',
1359 'src/libsystemd/sd-netlink',
1360 'src/libsystemd/sd-network',
1361 'src/libsystemd-network',
1364 add_project_arguments('-include', 'config.h', language : 'c')
1368 subdir('src/systemd')
1370 subdir('src/libsystemd')
1371 subdir('src/libsystemd-network')
1372 subdir('src/journal')
1375 libjournal_core = static_library(
1377 libjournal_core_sources,
1379 include_directories : includes,
1382 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1383 libsystemd = shared_library(
1385 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1386 version : libsystemd_version,
1387 include_directories : includes,
1388 link_args : ['-shared',
1389 '-Wl,--version-script=' + libsystemd_sym_path],
1390 link_with : [libbasic,
1392 link_whole : [libsystemd_static,
1394 dependencies : [threads,
1398 link_depends : libsystemd_sym,
1400 install_dir : rootlibdir)
1402 static_libsystemd = get_option('static-libsystemd')
1403 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1405 install_libsystemd_static = static_library(
1408 journal_client_sources,
1410 basic_gcrypt_sources,
1411 include_directories : includes,
1412 build_by_default : static_libsystemd != 'false',
1413 install : static_libsystemd != 'false',
1414 install_dir : rootlibdir,
1415 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1416 dependencies : [threads,
1425 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1427 ############################################################
1429 # binaries that have --help and are intended for use by humans,
1430 # usually, but not always, installed in /bin.
1431 public_programs = []
1433 subdir('src/libudev')
1434 subdir('src/shared')
1437 subdir('src/network')
1439 subdir('src/analyze')
1440 subdir('src/journal-remote')
1441 subdir('src/coredump')
1442 subdir('src/hostname')
1443 subdir('src/import')
1444 subdir('src/kernel-install')
1445 subdir('src/locale')
1446 subdir('src/machine')
1447 subdir('src/portable')
1448 subdir('src/nspawn')
1449 subdir('src/resolve')
1450 subdir('src/timedate')
1451 subdir('src/timesync')
1452 subdir('src/vconsole')
1453 subdir('src/boot/efi')
1460 ############################################################
1462 # only static linking apart from libdl, to make sure that the
1463 # module is linked to all libraries that it uses.
1464 test_dlopen = executable(
1467 include_directories : includes,
1468 link_with : [libbasic],
1469 dependencies : [libdl])
1471 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1472 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1473 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1474 ['resolve', 'ENABLE_NSS_RESOLVE']]
1476 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1480 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1481 version_script_arg = join_paths(meson.current_source_dir(), sym)
1483 nss = shared_library(
1485 'src/nss-@0@/nss-@0@.c'.format(module),
1487 include_directories : includes,
1488 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1489 link_args : ['-Wl,-z,nodelete',
1491 '-Wl,--version-script=' + version_script_arg,
1493 link_with : [libsystemd_static,
1495 dependencies : [threads,
1499 install_dir : rootlibdir)
1501 # We cannot use shared_module because it does not support version suffix.
1502 # Unfortunately shared_library insists on creating the symlink…
1503 meson.add_install_script('sh', '-c',
1504 'rm $DESTDIR@0@/libnss_@1@.so'
1505 .format(rootlibdir, module))
1507 test('dlopen-nss_' + module,
1509 args : [nss.full_path()]) # path to dlopen must include a slash
1513 ############################################################
1515 executable('systemd',
1517 include_directories : includes,
1518 link_with : [libcore,
1520 dependencies : [threads,
1526 install_rpath : rootlibexecdir,
1528 install_dir : rootlibexecdir)
1530 meson.add_install_script(meson_make_symlink,
1531 join_paths(rootlibexecdir, 'systemd'),
1532 join_paths(rootsbindir, 'init'))
1534 exe = executable('systemd-analyze',
1535 systemd_analyze_sources,
1536 include_directories : includes,
1537 link_with : [libcore,
1539 dependencies : [threads,
1545 install_rpath : rootlibexecdir,
1547 public_programs += exe
1549 executable('systemd-journald',
1550 systemd_journald_sources,
1551 include_directories : includes,
1552 link_with : [libjournal_core,
1554 dependencies : [threads,
1558 install_rpath : rootlibexecdir,
1560 install_dir : rootlibexecdir)
1562 exe = executable('systemd-cat',
1563 systemd_cat_sources,
1564 include_directories : includes,
1565 link_with : [libjournal_core,
1567 dependencies : [threads],
1568 install_rpath : rootlibexecdir,
1570 public_programs += exe
1572 exe = executable('journalctl',
1574 include_directories : includes,
1575 link_with : [libshared],
1576 dependencies : [threads,
1581 install_rpath : rootlibexecdir,
1583 install_dir : rootbindir)
1584 public_programs += exe
1586 executable('systemd-getty-generator',
1587 'src/getty-generator/getty-generator.c',
1588 include_directories : includes,
1589 link_with : [libshared],
1590 install_rpath : rootlibexecdir,
1592 install_dir : systemgeneratordir)
1594 executable('systemd-debug-generator',
1595 'src/debug-generator/debug-generator.c',
1596 include_directories : includes,
1597 link_with : [libshared],
1598 install_rpath : rootlibexecdir,
1600 install_dir : systemgeneratordir)
1602 executable('systemd-fstab-generator',
1603 'src/fstab-generator/fstab-generator.c',
1604 'src/core/mount-setup.c',
1605 include_directories : includes,
1606 link_with : [libshared],
1607 install_rpath : rootlibexecdir,
1609 install_dir : systemgeneratordir)
1611 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1612 executable('30-systemd-environment-d-generator',
1613 'src/environment-d-generator/environment-d-generator.c',
1614 include_directories : includes,
1615 link_with : [libshared],
1616 install_rpath : rootlibexecdir,
1618 install_dir : userenvgeneratordir)
1620 meson.add_install_script(meson_make_symlink,
1621 join_paths(sysconfdir, 'environment'),
1622 join_paths(environmentdir, '99-environment.conf'))
1625 if conf.get('ENABLE_HIBERNATE') == 1
1626 executable('systemd-hibernate-resume-generator',
1627 'src/hibernate-resume/hibernate-resume-generator.c',
1628 include_directories : includes,
1629 link_with : [libshared],
1630 install_rpath : rootlibexecdir,
1632 install_dir : systemgeneratordir)
1634 executable('systemd-hibernate-resume',
1635 'src/hibernate-resume/hibernate-resume.c',
1636 include_directories : includes,
1637 link_with : [libshared],
1638 install_rpath : rootlibexecdir,
1640 install_dir : rootlibexecdir)
1643 if conf.get('HAVE_BLKID') == 1
1644 executable('systemd-gpt-auto-generator',
1645 'src/gpt-auto-generator/gpt-auto-generator.c',
1646 'src/basic/blkid-util.h',
1647 include_directories : includes,
1648 link_with : [libshared],
1649 dependencies : libblkid,
1650 install_rpath : rootlibexecdir,
1652 install_dir : systemgeneratordir)
1654 exe = executable('systemd-dissect',
1655 'src/dissect/dissect.c',
1656 include_directories : includes,
1657 link_with : [libshared],
1658 install_rpath : rootlibexecdir,
1660 install_dir : rootlibexecdir)
1661 public_programs += exe
1664 if conf.get('ENABLE_RESOLVE') == 1
1665 executable('systemd-resolved',
1666 systemd_resolved_sources,
1667 include_directories : includes,
1668 link_with : [libshared,
1670 libsystemd_resolve_core],
1671 dependencies : systemd_resolved_dependencies,
1672 install_rpath : rootlibexecdir,
1674 install_dir : rootlibexecdir)
1676 exe = executable('resolvectl',
1678 include_directories : includes,
1679 link_with : [libshared,
1681 libsystemd_resolve_core],
1682 dependencies : [threads,
1686 install_rpath : rootlibexecdir,
1688 public_programs += exe
1690 meson.add_install_script(meson_make_symlink,
1691 join_paths(bindir, 'resolvectl'),
1692 join_paths(rootsbindir, 'resolvconf'))
1694 meson.add_install_script(meson_make_symlink,
1695 join_paths(bindir, 'resolvectl'),
1696 join_paths(bindir, 'systemd-resolve'))
1699 if conf.get('ENABLE_LOGIND') == 1
1700 executable('systemd-logind',
1701 systemd_logind_sources,
1702 include_directories : includes,
1703 link_with : [liblogind_core,
1705 dependencies : [threads,
1707 install_rpath : rootlibexecdir,
1709 install_dir : rootlibexecdir)
1711 exe = executable('loginctl',
1713 include_directories : includes,
1714 link_with : [libshared],
1715 dependencies : [threads,
1718 install_rpath : rootlibexecdir,
1720 install_dir : rootbindir)
1721 public_programs += exe
1723 exe = executable('systemd-inhibit',
1724 'src/login/inhibit.c',
1725 include_directories : includes,
1726 link_with : [libshared],
1727 install_rpath : rootlibexecdir,
1729 install_dir : rootbindir)
1730 public_programs += exe
1732 if conf.get('HAVE_PAM') == 1
1733 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1734 pam_systemd = shared_library(
1738 include_directories : includes,
1739 link_args : ['-shared',
1740 '-Wl,--version-script=' + version_script_arg],
1741 link_with : [libsystemd_static,
1743 dependencies : [threads,
1746 link_depends : pam_systemd_sym,
1748 install_dir : pamlibdir)
1750 test('dlopen-pam_systemd',
1752 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1756 executable('systemd-user-runtime-dir',
1757 user_runtime_dir_sources,
1758 include_directories : includes,
1759 link_with : [libshared, liblogind_core],
1760 install_rpath : rootlibexecdir,
1762 install_dir : rootlibexecdir)
1764 if conf.get('HAVE_PAM') == 1
1765 executable('systemd-user-sessions',
1766 'src/user-sessions/user-sessions.c',
1767 include_directories : includes,
1768 link_with : [libshared],
1769 install_rpath : rootlibexecdir,
1771 install_dir : rootlibexecdir)
1774 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1775 exe = executable('bootctl',
1776 'src/boot/bootctl.c',
1777 include_directories : includes,
1778 link_with : [libshared],
1779 dependencies : [libblkid],
1780 install_rpath : rootlibexecdir,
1782 public_programs += exe
1785 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1786 include_directories : includes,
1787 link_with : [libshared],
1788 dependencies : [threads],
1789 install_rpath : rootlibexecdir,
1791 public_programs += exe
1794 if get_option('link-systemctl-shared')
1795 systemctl_link_with = [libshared]
1797 systemctl_link_with = [libsystemd_static,
1803 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1804 include_directories : includes,
1805 link_with : systemctl_link_with,
1806 dependencies : [threads,
1811 install_rpath : rootlibexecdir,
1813 install_dir : rootbindir)
1814 public_programs += exe
1816 if conf.get('ENABLE_PORTABLED') == 1
1817 executable('systemd-portabled',
1818 systemd_portabled_sources,
1819 include_directories : includes,
1820 link_with : [libshared],
1821 dependencies : [threads],
1822 install_rpath : rootlibexecdir,
1824 install_dir : rootlibexecdir)
1826 exe = executable('portablectl', 'src/portable/portablectl.c',
1827 include_directories : includes,
1828 link_with : [libshared],
1829 dependencies : [threads],
1830 install_rpath : rootlibexecdir,
1832 install_dir : rootlibexecdir)
1833 public_programs += exe
1836 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1837 meson.add_install_script(meson_make_symlink,
1838 join_paths(rootbindir, 'systemctl'),
1839 join_paths(rootsbindir, alias))
1842 if conf.get('ENABLE_BACKLIGHT') == 1
1843 executable('systemd-backlight',
1844 'src/backlight/backlight.c',
1845 include_directories : includes,
1846 link_with : [libshared],
1847 install_rpath : rootlibexecdir,
1849 install_dir : rootlibexecdir)
1852 if conf.get('ENABLE_RFKILL') == 1
1853 executable('systemd-rfkill',
1854 'src/rfkill/rfkill.c',
1855 include_directories : includes,
1856 link_with : [libshared],
1857 install_rpath : rootlibexecdir,
1859 install_dir : rootlibexecdir)
1862 executable('systemd-system-update-generator',
1863 'src/system-update-generator/system-update-generator.c',
1864 include_directories : includes,
1865 link_with : [libshared],
1866 install_rpath : rootlibexecdir,
1868 install_dir : systemgeneratordir)
1870 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1871 executable('systemd-cryptsetup',
1872 'src/cryptsetup/cryptsetup.c',
1873 include_directories : includes,
1874 link_with : [libshared],
1875 dependencies : [libcryptsetup],
1876 install_rpath : rootlibexecdir,
1878 install_dir : rootlibexecdir)
1880 executable('systemd-cryptsetup-generator',
1881 'src/cryptsetup/cryptsetup-generator.c',
1882 include_directories : includes,
1883 link_with : [libshared],
1884 dependencies : [libcryptsetup],
1885 install_rpath : rootlibexecdir,
1887 install_dir : systemgeneratordir)
1889 executable('systemd-veritysetup',
1890 'src/veritysetup/veritysetup.c',
1891 include_directories : includes,
1892 link_with : [libshared],
1893 dependencies : [libcryptsetup],
1894 install_rpath : rootlibexecdir,
1896 install_dir : rootlibexecdir)
1898 executable('systemd-veritysetup-generator',
1899 'src/veritysetup/veritysetup-generator.c',
1900 include_directories : includes,
1901 link_with : [libshared],
1902 dependencies : [libcryptsetup],
1903 install_rpath : rootlibexecdir,
1905 install_dir : systemgeneratordir)
1908 if conf.get('HAVE_SYSV_COMPAT') == 1
1909 executable('systemd-sysv-generator',
1910 'src/sysv-generator/sysv-generator.c',
1911 include_directories : includes,
1912 link_with : [libshared],
1913 install_rpath : rootlibexecdir,
1915 install_dir : systemgeneratordir)
1917 executable('systemd-rc-local-generator',
1918 'src/rc-local-generator/rc-local-generator.c',
1919 include_directories : includes,
1920 link_with : [libshared],
1921 install_rpath : rootlibexecdir,
1923 install_dir : systemgeneratordir)
1926 if conf.get('ENABLE_HOSTNAMED') == 1
1927 executable('systemd-hostnamed',
1928 'src/hostname/hostnamed.c',
1929 include_directories : includes,
1930 link_with : [libshared],
1931 install_rpath : rootlibexecdir,
1933 install_dir : rootlibexecdir)
1935 exe = executable('hostnamectl',
1936 'src/hostname/hostnamectl.c',
1937 include_directories : includes,
1938 link_with : [libshared],
1939 install_rpath : rootlibexecdir,
1941 public_programs += exe
1944 if conf.get('ENABLE_LOCALED') == 1
1945 if conf.get('HAVE_XKBCOMMON') == 1
1946 # logind will load libxkbcommon.so dynamically on its own
1952 executable('systemd-localed',
1953 systemd_localed_sources,
1954 include_directories : includes,
1955 link_with : [libshared],
1956 dependencies : deps,
1957 install_rpath : rootlibexecdir,
1959 install_dir : rootlibexecdir)
1961 exe = executable('localectl',
1963 include_directories : includes,
1964 link_with : [libshared],
1965 install_rpath : rootlibexecdir,
1967 public_programs += exe
1970 if conf.get('ENABLE_TIMEDATED') == 1
1971 executable('systemd-timedated',
1972 'src/timedate/timedated.c',
1973 include_directories : includes,
1974 link_with : [libshared],
1975 install_rpath : rootlibexecdir,
1977 install_dir : rootlibexecdir)
1980 if conf.get('ENABLE_TIMEDATECTL') == 1
1981 exe = executable('timedatectl',
1982 'src/timedate/timedatectl.c',
1983 include_directories : includes,
1984 install_rpath : rootlibexecdir,
1985 link_with : [libshared],
1986 dependencies : [libm],
1988 public_programs += exe
1991 if conf.get('ENABLE_TIMESYNCD') == 1
1992 executable('systemd-timesyncd',
1993 systemd_timesyncd_sources,
1994 include_directories : includes,
1995 link_with : [libshared],
1996 dependencies : [threads,
1998 install_rpath : rootlibexecdir,
2000 install_dir : rootlibexecdir)
2002 executable('systemd-time-wait-sync',
2003 'src/time-wait-sync/time-wait-sync.c',
2004 include_directories : includes,
2005 link_with : [libshared],
2006 install_rpath : rootlibexecdir,
2008 install_dir : rootlibexecdir)
2011 if conf.get('ENABLE_MACHINED') == 1
2012 executable('systemd-machined',
2013 systemd_machined_sources,
2014 include_directories : includes,
2015 link_with : [libmachine_core,
2017 install_rpath : rootlibexecdir,
2019 install_dir : rootlibexecdir)
2021 exe = executable('machinectl',
2022 'src/machine/machinectl.c',
2023 include_directories : includes,
2024 link_with : [libshared],
2025 dependencies : [threads,
2028 install_rpath : rootlibexecdir,
2030 install_dir : rootbindir)
2031 public_programs += exe
2034 if conf.get('ENABLE_IMPORTD') == 1
2035 executable('systemd-importd',
2036 systemd_importd_sources,
2037 include_directories : includes,
2038 link_with : [libshared],
2039 dependencies : [threads],
2040 install_rpath : rootlibexecdir,
2042 install_dir : rootlibexecdir)
2044 systemd_pull = executable('systemd-pull',
2045 systemd_pull_sources,
2046 include_directories : includes,
2047 link_with : [libshared],
2048 dependencies : [libcurl,
2053 install_rpath : rootlibexecdir,
2055 install_dir : rootlibexecdir)
2057 systemd_import = executable('systemd-import',
2058 systemd_import_sources,
2059 include_directories : includes,
2060 link_with : [libshared],
2061 dependencies : [libcurl,
2065 install_rpath : rootlibexecdir,
2067 install_dir : rootlibexecdir)
2069 systemd_export = executable('systemd-export',
2070 systemd_export_sources,
2071 include_directories : includes,
2072 link_with : [libshared],
2073 dependencies : [libcurl,
2077 install_rpath : rootlibexecdir,
2079 install_dir : rootlibexecdir)
2080 public_programs += [systemd_pull, systemd_import, systemd_export]
2083 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2084 exe = executable('systemd-journal-upload',
2085 systemd_journal_upload_sources,
2086 include_directories : includes,
2087 link_with : [libshared],
2088 dependencies : [threads,
2093 install_rpath : rootlibexecdir,
2095 install_dir : rootlibexecdir)
2096 public_programs += exe
2099 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2100 s_j_remote = executable('systemd-journal-remote',
2101 systemd_journal_remote_sources,
2102 include_directories : includes,
2103 link_with : [libshared,
2104 libsystemd_journal_remote],
2105 dependencies : [threads,
2110 install_rpath : rootlibexecdir,
2112 install_dir : rootlibexecdir)
2114 s_j_gatewayd = executable('systemd-journal-gatewayd',
2115 systemd_journal_gatewayd_sources,
2116 include_directories : includes,
2117 link_with : [libshared],
2118 dependencies : [threads,
2123 install_rpath : rootlibexecdir,
2125 install_dir : rootlibexecdir)
2126 public_programs += [s_j_remote, s_j_gatewayd]
2129 if conf.get('ENABLE_COREDUMP') == 1
2130 executable('systemd-coredump',
2131 systemd_coredump_sources,
2132 include_directories : includes,
2133 link_with : [libshared],
2134 dependencies : [threads,
2139 install_rpath : rootlibexecdir,
2141 install_dir : rootlibexecdir)
2143 exe = executable('coredumpctl',
2144 coredumpctl_sources,
2145 include_directories : includes,
2146 link_with : [libshared],
2147 dependencies : [threads,
2150 install_rpath : rootlibexecdir,
2152 public_programs += exe
2155 if conf.get('ENABLE_BINFMT') == 1
2156 exe = executable('systemd-binfmt',
2157 'src/binfmt/binfmt.c',
2158 include_directories : includes,
2159 link_with : [libshared],
2160 install_rpath : rootlibexecdir,
2162 install_dir : rootlibexecdir)
2163 public_programs += exe
2165 meson.add_install_script('sh', '-c',
2166 mkdir_p.format(binfmtdir))
2167 meson.add_install_script('sh', '-c',
2168 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2171 if conf.get('ENABLE_VCONSOLE') == 1
2172 executable('systemd-vconsole-setup',
2173 'src/vconsole/vconsole-setup.c',
2174 include_directories : includes,
2175 link_with : [libshared],
2176 install_rpath : rootlibexecdir,
2178 install_dir : rootlibexecdir)
2181 if conf.get('ENABLE_RANDOMSEED') == 1
2182 executable('systemd-random-seed',
2183 'src/random-seed/random-seed.c',
2184 include_directories : includes,
2185 link_with : [libshared],
2186 install_rpath : rootlibexecdir,
2188 install_dir : rootlibexecdir)
2191 if conf.get('ENABLE_FIRSTBOOT') == 1
2192 executable('systemd-firstboot',
2193 'src/firstboot/firstboot.c',
2194 include_directories : includes,
2195 link_with : [libshared],
2196 dependencies : [libcrypt],
2197 install_rpath : rootlibexecdir,
2199 install_dir : rootbindir)
2202 executable('systemd-remount-fs',
2203 'src/remount-fs/remount-fs.c',
2204 'src/core/mount-setup.c',
2205 'src/core/mount-setup.h',
2206 include_directories : includes,
2207 link_with : [libshared],
2208 install_rpath : rootlibexecdir,
2210 install_dir : rootlibexecdir)
2212 executable('systemd-machine-id-setup',
2213 'src/machine-id-setup/machine-id-setup-main.c',
2214 'src/core/machine-id-setup.c',
2215 'src/core/machine-id-setup.h',
2216 include_directories : includes,
2217 link_with : [libshared],
2218 install_rpath : rootlibexecdir,
2220 install_dir : rootbindir)
2222 executable('systemd-fsck',
2224 include_directories : includes,
2225 link_with : [libshared],
2226 install_rpath : rootlibexecdir,
2228 install_dir : rootlibexecdir)
2230 executable('systemd-growfs',
2231 'src/partition/growfs.c',
2232 include_directories : includes,
2233 link_with : [libshared],
2234 dependencies : [libcryptsetup],
2235 install_rpath : rootlibexecdir,
2237 install_dir : rootlibexecdir)
2239 executable('systemd-makefs',
2240 'src/partition/makefs.c',
2241 include_directories : includes,
2242 link_with : [libshared],
2243 install_rpath : rootlibexecdir,
2245 install_dir : rootlibexecdir)
2247 executable('systemd-sleep',
2248 'src/sleep/sleep.c',
2249 include_directories : includes,
2250 link_with : [libshared],
2251 install_rpath : rootlibexecdir,
2253 install_dir : rootlibexecdir)
2255 exe = executable('systemd-sysctl',
2256 'src/sysctl/sysctl.c',
2257 include_directories : includes,
2258 link_with : [libshared],
2259 install_rpath : rootlibexecdir,
2261 install_dir : rootlibexecdir)
2262 public_programs += exe
2264 executable('systemd-ac-power',
2265 'src/ac-power/ac-power.c',
2266 include_directories : includes,
2267 link_with : [libshared],
2268 install_rpath : rootlibexecdir,
2270 install_dir : rootlibexecdir)
2272 exe = executable('systemd-detect-virt',
2273 'src/detect-virt/detect-virt.c',
2274 include_directories : includes,
2275 link_with : [libshared],
2276 install_rpath : rootlibexecdir,
2278 public_programs += exe
2280 exe = executable('systemd-delta',
2281 'src/delta/delta.c',
2282 include_directories : includes,
2283 link_with : [libshared],
2284 install_rpath : rootlibexecdir,
2286 public_programs += exe
2288 exe = executable('systemd-escape',
2289 'src/escape/escape.c',
2290 include_directories : includes,
2291 link_with : [libshared],
2292 install_rpath : rootlibexecdir,
2294 install_dir : rootbindir)
2295 public_programs += exe
2297 exe = executable('systemd-notify',
2298 'src/notify/notify.c',
2299 include_directories : includes,
2300 link_with : [libshared],
2301 install_rpath : rootlibexecdir,
2303 install_dir : rootbindir)
2304 public_programs += exe
2306 executable('systemd-volatile-root',
2307 'src/volatile-root/volatile-root.c',
2308 include_directories : includes,
2309 link_with : [libshared],
2310 install_rpath : rootlibexecdir,
2312 install_dir : rootlibexecdir)
2314 executable('systemd-cgroups-agent',
2315 'src/cgroups-agent/cgroups-agent.c',
2316 include_directories : includes,
2317 link_with : [libshared],
2318 install_rpath : rootlibexecdir,
2320 install_dir : rootlibexecdir)
2322 exe = executable('systemd-path',
2324 include_directories : includes,
2325 link_with : [libshared],
2326 install_rpath : rootlibexecdir,
2328 public_programs += exe
2330 exe = executable('systemd-ask-password',
2331 'src/ask-password/ask-password.c',
2332 include_directories : includes,
2333 link_with : [libshared],
2334 install_rpath : rootlibexecdir,
2336 install_dir : rootbindir)
2337 public_programs += exe
2339 executable('systemd-reply-password',
2340 'src/reply-password/reply-password.c',
2341 include_directories : includes,
2342 link_with : [libshared],
2343 install_rpath : rootlibexecdir,
2345 install_dir : rootlibexecdir)
2347 exe = executable('systemd-tty-ask-password-agent',
2348 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2349 include_directories : includes,
2350 link_with : [libshared],
2351 install_rpath : rootlibexecdir,
2353 install_dir : rootbindir)
2354 public_programs += exe
2356 exe = executable('systemd-cgls',
2358 include_directories : includes,
2359 link_with : [libshared],
2360 install_rpath : rootlibexecdir,
2362 public_programs += exe
2364 exe = executable('systemd-cgtop',
2365 'src/cgtop/cgtop.c',
2366 include_directories : includes,
2367 link_with : [libshared],
2368 install_rpath : rootlibexecdir,
2370 public_programs += exe
2372 executable('systemd-initctl',
2373 'src/initctl/initctl.c',
2374 include_directories : includes,
2375 link_with : [libshared],
2376 install_rpath : rootlibexecdir,
2378 install_dir : rootlibexecdir)
2380 exe = executable('systemd-mount',
2381 'src/mount/mount-tool.c',
2382 include_directories : includes,
2383 link_with : [libshared],
2384 install_rpath : rootlibexecdir,
2386 public_programs += exe
2388 meson.add_install_script(meson_make_symlink,
2389 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2391 exe = executable('systemd-run',
2393 include_directories : includes,
2394 link_with : [libshared],
2395 install_rpath : rootlibexecdir,
2397 public_programs += exe
2399 exe = executable('systemd-stdio-bridge',
2400 'src/stdio-bridge/stdio-bridge.c',
2401 include_directories : includes,
2402 link_with : [libshared],
2403 install_rpath : rootlibexecdir,
2405 public_programs += exe
2407 exe = executable('busctl',
2408 'src/busctl/busctl.c',
2409 'src/busctl/busctl-introspect.c',
2410 'src/busctl/busctl-introspect.h',
2411 include_directories : includes,
2412 link_with : [libshared],
2413 install_rpath : rootlibexecdir,
2415 public_programs += exe
2417 if conf.get('ENABLE_SYSUSERS') == 1
2418 exe = executable('systemd-sysusers',
2419 'src/sysusers/sysusers.c',
2420 include_directories : includes,
2421 link_with : [libshared],
2422 install_rpath : rootlibexecdir,
2424 install_dir : rootbindir)
2425 public_programs += exe
2428 if conf.get('ENABLE_TMPFILES') == 1
2429 exe = executable('systemd-tmpfiles',
2430 'src/tmpfiles/tmpfiles.c',
2431 include_directories : includes,
2432 link_with : [libshared],
2433 dependencies : [libacl],
2434 install_rpath : rootlibexecdir,
2436 install_dir : rootbindir)
2437 public_programs += exe
2439 test('test-systemd-tmpfiles',
2440 test_systemd_tmpfiles_py,
2441 args : exe.full_path())
2442 # https://github.com/mesonbuild/meson/issues/2681
2445 if conf.get('ENABLE_HWDB') == 1
2446 exe = executable('systemd-hwdb',
2448 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2449 include_directories : includes,
2450 link_with : [libudev_static],
2451 install_rpath : udev_rpath,
2453 install_dir : rootbindir)
2454 public_programs += exe
2457 if conf.get('ENABLE_QUOTACHECK') == 1
2458 executable('systemd-quotacheck',
2459 'src/quotacheck/quotacheck.c',
2460 include_directories : includes,
2461 link_with : [libshared],
2462 install_rpath : rootlibexecdir,
2464 install_dir : rootlibexecdir)
2467 exe = executable('systemd-socket-proxyd',
2468 'src/socket-proxy/socket-proxyd.c',
2469 include_directories : includes,
2470 link_with : [libshared],
2471 dependencies : [threads],
2472 install_rpath : rootlibexecdir,
2474 install_dir : rootlibexecdir)
2475 public_programs += exe
2477 exe = executable('systemd-udevd',
2478 systemd_udevd_sources,
2479 include_directories : includes,
2480 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2481 link_with : [libudev_core,
2484 dependencies : [threads,
2489 install_rpath : udev_rpath,
2491 install_dir : rootlibexecdir)
2492 public_programs += exe
2494 exe = executable('udevadm',
2496 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2497 include_directories : includes,
2498 link_with : [libudev_core,
2501 dependencies : [threads,
2506 install_rpath : udev_rpath,
2508 install_dir : rootbindir)
2509 public_programs += exe
2511 executable('systemd-shutdown',
2512 systemd_shutdown_sources,
2513 include_directories : includes,
2514 link_with : [libshared],
2515 dependencies : [libmount],
2516 install_rpath : rootlibexecdir,
2518 install_dir : rootlibexecdir)
2520 executable('systemd-update-done',
2521 'src/update-done/update-done.c',
2522 include_directories : includes,
2523 link_with : [libshared],
2524 install_rpath : rootlibexecdir,
2526 install_dir : rootlibexecdir)
2528 executable('systemd-update-utmp',
2529 'src/update-utmp/update-utmp.c',
2530 include_directories : includes,
2531 link_with : [libshared],
2532 dependencies : [libaudit],
2533 install_rpath : rootlibexecdir,
2535 install_dir : rootlibexecdir)
2537 if conf.get('HAVE_KMOD') == 1
2538 executable('systemd-modules-load',
2539 'src/modules-load/modules-load.c',
2540 include_directories : includes,
2541 link_with : [libshared],
2542 dependencies : [libkmod],
2543 install_rpath : rootlibexecdir,
2545 install_dir : rootlibexecdir)
2547 meson.add_install_script('sh', '-c',
2548 mkdir_p.format(modulesloaddir))
2549 meson.add_install_script('sh', '-c',
2550 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2553 exe = executable('systemd-nspawn',
2554 systemd_nspawn_sources,
2555 'src/core/mount-setup.c', # FIXME: use a variable?
2556 'src/core/mount-setup.h',
2557 'src/core/loopback-setup.c',
2558 'src/core/loopback-setup.h',
2559 include_directories : includes,
2560 link_with : [libnspawn_core,
2562 dependencies : [libblkid],
2563 install_rpath : rootlibexecdir,
2565 public_programs += exe
2567 if conf.get('ENABLE_NETWORKD') == 1
2568 executable('systemd-networkd',
2569 systemd_networkd_sources,
2570 include_directories : includes,
2571 link_with : [libnetworkd_core,
2575 dependencies : [threads],
2576 install_rpath : rootlibexecdir,
2578 install_dir : rootlibexecdir)
2580 executable('systemd-networkd-wait-online',
2581 systemd_networkd_wait_online_sources,
2582 include_directories : includes,
2583 link_with : [libnetworkd_core,
2585 install_rpath : rootlibexecdir,
2587 install_dir : rootlibexecdir)
2589 exe = executable('networkctl',
2591 include_directories : includes,
2592 link_with : [libsystemd_network,
2594 install_rpath : rootlibexecdir,
2596 install_dir : rootbindir)
2597 public_programs += exe
2600 executable('systemd-sulogin-shell',
2601 ['src/sulogin-shell/sulogin-shell.c'],
2602 include_directories : includes,
2603 link_with : [libshared],
2604 install_rpath : rootlibexecdir,
2606 install_dir : rootlibexecdir)
2608 ############################################################
2610 foreach tuple : tests
2612 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2613 dependencies = tuple[2]
2614 condition = tuple.length() >= 4 ? tuple[3] : ''
2615 type = tuple.length() >= 5 ? tuple[4] : ''
2616 defs = tuple.length() >= 6 ? tuple[5] : []
2617 incs = tuple.length() >= 7 ? tuple[6] : includes
2620 name = sources[0].split('/')[-1].split('.')[0]
2621 if type.startswith('timeout=')
2622 timeout = type.split('=')[1].to_int()
2625 if want_tests == 'false'
2626 message('Not compiling @0@ because tests is set to false'.format(name))
2627 elif condition == '' or conf.get(condition) == 1
2631 include_directories : incs,
2632 link_with : link_with,
2633 dependencies : dependencies,
2635 install_rpath : rootlibexecdir,
2636 install : install_tests,
2637 install_dir : join_paths(testsdir, type))
2640 message('@0@ is a manual test'.format(name))
2641 elif type == 'unsafe' and want_tests != 'unsafe'
2642 message('@0@ is an unsafe test'.format(name))
2649 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2654 'test-libsystemd-sym',
2655 test_libsystemd_sym_c,
2656 include_directories : includes,
2657 link_with : [libsystemd],
2658 install : install_tests,
2659 install_dir : testsdir)
2660 test('test-libsystemd-sym', exe)
2663 'test-libsystemd-static-sym',
2664 test_libsystemd_sym_c,
2665 include_directories : includes,
2666 link_with : [install_libsystemd_static],
2667 dependencies : [threads], # threads is already included in dependencies on the library,
2668 # but does not seem to get propagated. Add here as a work-around.
2669 build_by_default : static_libsystemd_pic,
2670 install : install_tests and static_libsystemd_pic,
2671 install_dir : testsdir)
2672 if static_libsystemd_pic
2673 test('test-libsystemd-static-sym', exe)
2679 include_directories : includes,
2680 c_args : ['-Wno-deprecated-declarations'],
2681 link_with : [libudev],
2682 install : install_tests,
2683 install_dir : testsdir)
2684 test('test-libudev-sym', exe)
2687 'test-libudev-static-sym',
2689 include_directories : includes,
2690 c_args : ['-Wno-deprecated-declarations'],
2691 link_with : [install_libudev_static],
2692 build_by_default : static_libudev_pic,
2693 install : install_tests and static_libudev_pic,
2694 install_dir : testsdir)
2695 if static_libudev_pic
2696 test('test-libudev-static-sym', exe)
2699 ############################################################
2703 foreach tuple : fuzzers
2705 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2706 dependencies = tuple[2]
2707 defs = tuple.length() >= 4 ? tuple[3] : []
2708 incs = tuple.length() >= 5 ? tuple[4] : includes
2711 dependencies += fuzzing_engine
2713 sources += 'src/fuzz/fuzz-main.c'
2716 name = sources[0].split('/')[-1].split('.')[0]
2718 fuzzer_exes += executable(
2721 include_directories : [incs, include_directories('src/fuzz')],
2722 link_with : link_with,
2723 dependencies : dependencies,
2728 run_target('fuzzers',
2729 depends : fuzzer_exes,
2732 ############################################################
2734 make_directive_index_py = find_program('tools/make-directive-index.py')
2735 make_man_index_py = find_program('tools/make-man-index.py')
2736 xml_helper_py = find_program('tools/xml_helper.py')
2737 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2741 subdir('sysusers.d')
2742 subdir('tmpfiles.d')
2747 subdir('shell-completion/bash')
2748 subdir('shell-completion/zsh')
2749 subdir('docs/sysvinit')
2750 subdir('docs/var-log')
2752 # FIXME: figure out if the warning is true:
2753 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2754 install_subdir('factory/etc',
2755 install_dir : factorydir)
2758 install_data('xorg/50-systemd-user.sh',
2759 install_dir : xinitrcdir)
2760 install_data('modprobe.d/systemd.conf',
2761 install_dir : modprobedir)
2762 install_data('LICENSE.GPL2',
2766 'docs/CODING_STYLE',
2767 'docs/DISTRO_PORTING.md',
2768 'docs/ENVIRONMENT.md',
2770 'docs/TRANSIENT-SETTINGS.md',
2771 'docs/TRANSLATORS.md',
2772 'docs/UIDS-GIDS.md',
2773 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2774 install_dir : docdir)
2776 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2777 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2779 ############################################################
2781 meson_check_help = find_program('tools/meson-check-help.sh')
2783 foreach exec : public_programs
2784 name = exec.full_path().split('/')[-1]
2785 test('check-help-' + name,
2787 args : [exec.full_path()])
2790 ############################################################
2792 # Enable tests for all supported sanitizers
2793 foreach tuple : sanitizers
2794 sanitizer = tuple[0]
2797 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2799 foreach p : fuzz_regression_tests
2800 b = p.split('/')[-2]
2801 c = p.split('/')[-1]
2803 name = '@0@:@1@'.format(b, sanitizer)
2806 if want_tests == 'false'
2807 message('Not compiling @0@ because tests is set to false'.format(name))
2809 exe = custom_target(
2813 command : [env, 'ln', '-fs',
2814 join_paths(build.full_path(), b),
2816 build_by_default : true)
2818 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2823 if want_tests != 'false' and slow_tests
2824 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2826 args : [exe.full_path(),
2827 join_paths(meson.source_root(),
2828 'test/fuzz-regressions',
2836 ############################################################
2839 all_files = run_command(
2841 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2844 all_files = files(all_files.stdout().split())
2849 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2852 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2856 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2859 command : [meson_git_contrib_sh])
2863 git_head = run_command(
2865 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2866 'rev-parse', 'HEAD']).stdout().strip()
2867 git_head_short = run_command(
2869 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2870 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2874 command : ['git', 'archive',
2875 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2877 '--prefix', 'systemd-@0@/'.format(git_head),
2881 ############################################################
2883 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2886 depends : [man, libsystemd, libudev],
2887 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2889 ############################################################
2892 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2894 'split /usr: @0@'.format(split_usr),
2895 'split bin-sbin: @0@'.format(split_bin),
2896 'prefix directory: @0@'.format(prefixdir),
2897 'rootprefix directory: @0@'.format(rootprefixdir),
2898 'sysconf directory: @0@'.format(sysconfdir),
2899 'include directory: @0@'.format(includedir),
2900 'lib directory: @0@'.format(libdir),
2901 'rootlib directory: @0@'.format(rootlibdir),
2902 'SysV init scripts: @0@'.format(sysvinit_path),
2903 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2904 'PAM modules directory: @0@'.format(pamlibdir),
2905 'PAM configuration directory: @0@'.format(pamconfdir),
2906 'RPM macros directory: @0@'.format(rpmmacrosdir),
2907 'modprobe.d directory: @0@'.format(modprobedir),
2908 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2909 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2910 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2911 'bash completions directory: @0@'.format(bashcompletiondir),
2912 'zsh completions directory: @0@'.format(zshcompletiondir),
2913 'extra start script: @0@'.format(get_option('rc-local')),
2914 'extra stop script: @0@'.format(get_option('halt-local')),
2915 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2916 get_option('debug-tty')),
2917 'TTY GID: @0@'.format(tty_gid),
2918 'users GID: @0@'.format(substs.get('USERS_GID')),
2919 'maximum system UID: @0@'.format(system_uid_max),
2920 'maximum system GID: @0@'.format(system_gid_max),
2921 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2922 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2923 'minimum container UID base: @0@'.format(container_uid_base_min),
2924 'maximum container UID base: @0@'.format(container_uid_base_max),
2925 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2926 'render group access mode: @0@'.format(get_option('group-render-mode')),
2927 'certificate root directory: @0@'.format(get_option('certificate-root')),
2928 'support URL: @0@'.format(support_url),
2929 'nobody user name: @0@'.format(nobody_user),
2930 'nobody group name: @0@'.format(nobody_group),
2931 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2932 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2934 'default DNSSEC mode: @0@'.format(default_dnssec),
2935 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
2936 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2937 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2939 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2940 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2942 'default DNS servers: @0@'.format(alt_dns_servers),
2943 'default NTP servers: @0@'.format(alt_ntp_servers)]
2945 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2946 '@@0@'.format(time_epoch)).stdout().strip()
2948 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2951 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2952 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2953 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2955 if conf.get('ENABLE_EFI') == 1
2956 status += 'efi arch: @0@'.format(efi_arch)
2960 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2961 'EFI CC @0@'.format(efi_cc),
2962 'EFI lib directory: @0@'.format(efi_libdir),
2963 'EFI lds directory: @0@'.format(efi_ldsdir),
2964 'EFI include directory: @0@'.format(efi_incdir)]
3016 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3017 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3020 ['legacy pkla', install_polkit_pkla],
3022 ['gnu-efi', have_gnu_efi],
3029 ['nss-myhostname', conf.get('ENABLE_NSS_MYHOSTNAME') == 1],
3030 ['nss-mymachines', conf.get('ENABLE_NSS_MYMACHINES') == 1],
3031 ['nss-resolve', conf.get('ENABLE_NSS_RESOLVE') == 1],
3032 ['nss-systemd', conf.get('ENABLE_NSS_SYSTEMD') == 1],
3035 ['man pages', want_man],
3036 ['html pages', want_html],
3037 ['man page indices', want_man and have_lxml],
3042 ['adm group', get_option('adm-group')],
3043 ['wheel group', get_option('wheel-group')],
3046 ['debug mmap cache'],
3047 ['valgrind', conf.get('VALGRIND') == 1],
3050 if tuple.length() >= 2
3053 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3054 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3055 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3066 'enabled features: @0@'.format(', '.join(found)),
3068 'disabled features: @0@'.format(', '.join(missing)),
3070 message('\n '.join(status))
3072 if rootprefixdir != rootprefix_default
3074 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3075 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3076 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))