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('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
210 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
211 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
212 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
213 conf.set_quoted('LIBDIR', libdir)
214 conf.set_quoted('ROOTLIBDIR', rootlibdir)
215 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
216 conf.set_quoted('BOOTLIBDIR', bootlibdir)
217 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
218 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
219 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
220 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
221 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
222 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
223 conf.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'true' : 'false')
224 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
226 substs.set('prefix', prefixdir)
227 substs.set('exec_prefix', prefixdir)
228 substs.set('libdir', libdir)
229 substs.set('rootlibdir', rootlibdir)
230 substs.set('includedir', includedir)
231 substs.set('pkgsysconfdir', pkgsysconfdir)
232 substs.set('bindir', bindir)
233 substs.set('rootbindir', rootbindir)
234 substs.set('rootlibexecdir', rootlibexecdir)
235 substs.set('systemunitdir', systemunitdir)
236 substs.set('userunitdir', userunitdir)
237 substs.set('systempresetdir', systempresetdir)
238 substs.set('userpresetdir', userpresetdir)
239 substs.set('udevhwdbdir', udevhwdbdir)
240 substs.set('udevrulesdir', udevrulesdir)
241 substs.set('udevlibexecdir', udevlibexecdir)
242 substs.set('environmentdir', environmentdir)
243 substs.set('catalogdir', catalogdir)
244 substs.set('tmpfilesdir', tmpfilesdir)
245 substs.set('sysusersdir', sysusersdir)
246 substs.set('sysctldir', sysctldir)
247 substs.set('binfmtdir', binfmtdir)
248 substs.set('modulesloaddir', modulesloaddir)
249 substs.set('modprobedir', modprobedir)
250 substs.set('systemgeneratordir', systemgeneratordir)
251 substs.set('usergeneratordir', usergeneratordir)
252 substs.set('systemenvgeneratordir', systemenvgeneratordir)
253 substs.set('userenvgeneratordir', userenvgeneratordir)
254 substs.set('systemshutdowndir', systemshutdowndir)
255 substs.set('systemsleepdir', systemsleepdir)
256 substs.set('VARLOGDIR', varlogdir)
257 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
258 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
259 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
260 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
261 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
262 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
263 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
264 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
266 #####################################################################
268 cc = meson.get_compiler('c')
269 pkgconfig = import('pkgconfig')
270 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
271 meson_build_sh = find_program('tools/meson-build.sh')
273 want_tests = get_option('tests')
274 slow_tests = want_tests != 'false' and get_option('slow-tests')
275 install_tests = get_option('install-tests')
277 cxx = find_program('c++', required : false)
279 # Used only for tests
283 want_ossfuzz = get_option('oss-fuzz')
284 want_libfuzzer = get_option('llvm-fuzz')
285 fuzzer_build = want_ossfuzz or want_libfuzzer
286 if want_ossfuzz and want_libfuzzer
287 error('only one of oss-fuzz and llvm-fuzz can be specified')
290 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
293 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
296 possible_cc_flags = [
300 '-Wmissing-include-dirs',
301 '-Wold-style-definition',
305 '-Wsuggest-attribute=noreturn',
306 '-Werror=missing-prototypes',
307 '-Werror=implicit-function-declaration',
308 '-Werror=missing-declarations',
309 '-Werror=return-type',
310 '-Werror=incompatible-pointer-types',
312 '-Wstrict-prototypes',
314 '-Wmissing-noreturn',
315 '-Wimplicit-fallthrough=5',
318 '-Wstrict-aliasing=2',
321 '-Werror=shift-count-overflow',
322 '-Werror=shift-overflow=2',
326 # negative arguments are correctly detected starting with meson 0.46.
327 '-Wno-unused-parameter',
328 '-Wno-missing-field-initializers',
329 '-Wno-unused-result',
330 '-Wno-format-signedness',
332 # work-around for gcc 7.1 turning this on on its own.
333 '-Wno-error=nonnull',
335 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
336 # optimizations enabled, producing essentially false positives.
337 '-Wno-maybe-uninitialized',
341 '-fdiagnostics-show-option',
342 '-fno-strict-aliasing',
343 '-fvisibility=hidden',
345 '-fstack-protector-strong',
346 '--param=ssp-buffer-size=4',
349 # --as-needed and --no-undefined are provided by meson by default,
350 # run mesonconf to see what is enabled
351 possible_link_flags = [
356 # the oss-fuzz fuzzers are not built with -fPIE, so don't
357 # enable it when we are linking against them
359 possible_cc_flags += '-fPIE'
360 possible_link_flags += '-pie'
363 if cc.get_id() == 'clang'
364 possible_cc_flags += [
365 '-Wno-typedef-redefinition',
366 '-Wno-gnu-variable-sized-type-not-at-end',
370 if get_option('buildtype') != 'debug'
371 possible_cc_flags += [
372 '-ffunction-sections',
376 possible_link_flags += '-Wl,--gc-sections'
379 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
380 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
384 #include <inttypes.h>
385 typedef uint64_t usec_t;
386 usec_t now(clockid_t clock);
391 ''', name : '-Werror=shadow with local shadowing')
392 add_project_arguments('-Werror=shadow', language : 'c')
395 cpp = ' '.join(cc.cmd_array()) + ' -E'
397 #####################################################################
398 # compilation result tests
400 conf.set('_GNU_SOURCE', true)
401 conf.set('__SANE_USERSPACE_TYPES__', true)
403 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
404 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
405 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
406 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
407 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
408 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
409 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
413 #include <linux/ethtool.h>
414 #include <linux/fib_rules.h>
415 #include <sys/stat.h>
418 foreach decl : ['char16_t',
420 'struct ethtool_link_settings',
421 'struct fib_rule_uid_range',
425 # We get -1 if the size cannot be determined
426 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
428 if decl == 'struct statx'
430 want_linux_stat_h = false
432 have = cc.sizeof(decl,
433 prefix : decl_headers + '#include <linux/stat.h>',
434 args : '-D_GNU_SOURCE') > 0
435 want_linux_stat_h = have
439 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
442 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
444 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
445 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
446 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
447 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
448 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
449 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
450 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
451 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
452 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
453 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
454 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
455 # if_tunnel.h is buggy and cannot be included on its own
456 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
457 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
458 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
459 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
460 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
461 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
462 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
463 ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
464 ['NDA_IFINDEX', 'linux/neighbour.h'],
465 ['IFA_FLAGS', 'linux/if_addr.h'],
466 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
467 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
468 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
469 ['FOU_ATTR_REMCSUM_NOPARTIAL', 'linux/fou.h'],
470 ['FOU_CMD_GET', 'linux/fou.h'],
471 ['FOU_ENCAP_GUE', 'linux/fou.h'],
473 prefix = decl.length() > 2 ? decl[2] : ''
474 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
475 conf.set10('HAVE_' + decl[0], have)
478 foreach ident : ['secure_getenv', '__secure_getenv']
479 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
483 ['memfd_create', '''#include <sys/mman.h>'''],
484 ['gettid', '''#include <sys/types.h>
485 #include <unistd.h>'''],
486 ['pivot_root', '''#include <stdlib.h>
487 #include <unistd.h>'''], # no known header declares pivot_root
488 ['name_to_handle_at', '''#include <sys/types.h>
489 #include <sys/stat.h>
490 #include <fcntl.h>'''],
491 ['setns', '''#include <sched.h>'''],
492 ['renameat2', '''#include <stdio.h>
493 #include <fcntl.h>'''],
494 ['kcmp', '''#include <linux/kcmp.h>'''],
495 ['keyctl', '''#include <sys/types.h>
496 #include <keyutils.h>'''],
497 ['copy_file_range', '''#include <sys/syscall.h>
498 #include <unistd.h>'''],
499 ['bpf', '''#include <sys/syscall.h>
500 #include <unistd.h>'''],
501 ['statx', '''#include <sys/types.h>
502 #include <sys/stat.h>
503 #include <unistd.h>'''],
504 ['explicit_bzero' , '''#include <string.h>'''],
505 ['reallocarray', '''#include <malloc.h>'''],
508 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
509 conf.set10('HAVE_' + ident[0].to_upper(), have)
512 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
513 conf.set10('USE_SYS_RANDOM_H', true)
514 conf.set10('HAVE_GETRANDOM', true)
516 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
517 conf.set10('USE_SYS_RANDOM_H', false)
518 conf.set10('HAVE_GETRANDOM', have)
521 #####################################################################
523 sed = find_program('sed')
524 awk = find_program('awk')
525 m4 = find_program('m4')
526 stat = find_program('stat')
527 git = find_program('git', required : false)
528 env = find_program('env')
529 perl = find_program('perl', required : false)
531 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
532 mkdir_p = 'mkdir -p $DESTDIR/@0@'
533 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
534 splash_bmp = files('test/splash.bmp')
536 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
537 # /usr/sbin, /sbin, and fall back to the default from middle column.
538 progs = [['quotaon', '/usr/sbin/quotaon' ],
539 ['quotacheck', '/usr/sbin/quotacheck' ],
540 ['kmod', '/usr/bin/kmod' ],
541 ['kexec', '/usr/sbin/kexec' ],
542 ['sulogin', '/usr/sbin/sulogin' ],
543 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
544 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
545 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
546 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
549 path = get_option(prog[0] + '-path')
551 message('Using @1@ for @0@'.format(prog[0], path))
553 exe = find_program(prog[0],
554 '/usr/sbin/' + prog[0],
557 path = exe.found() ? exe.path() : prog[1]
559 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
560 conf.set_quoted(name, path)
561 substs.set(name, path)
564 conf.set_quoted('TELINIT', get_option('telinit-path'))
566 if run_command('ln', '--relative', '--help').returncode() != 0
567 error('ln does not support --relative (added in coreutils 8.16)')
570 ############################################################
572 gperf = find_program('gperf')
574 gperf_test_format = '''
576 const char * in_word_set(const char *, @0@);
579 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
580 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
581 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
582 if cc.compiles(gperf_test)
583 gperf_len_type = 'size_t'
585 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
586 if cc.compiles(gperf_test)
587 gperf_len_type = 'unsigned'
589 error('unable to determine gperf len type')
592 message('gperf len type is @0@'.format(gperf_len_type))
593 conf.set('GPERF_LEN_TYPE', gperf_len_type,
594 description : 'The type of gperf "len" parameter')
596 ############################################################
598 if not cc.has_header('sys/capability.h')
599 error('POSIX caps headers not found')
601 foreach header : ['crypt.h',
604 'linux/vm_sockets.h',
606 'valgrind/memcheck.h',
607 'valgrind/valgrind.h',
610 conf.set10('HAVE_' + header.underscorify().to_upper(),
611 cc.has_header(header))
614 ############################################################
616 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
617 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
618 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
620 default_hierarchy = get_option('default-hierarchy')
621 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
622 description : 'default cgroup hierarchy as string')
623 if default_hierarchy == 'legacy'
624 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
625 elif default_hierarchy == 'hybrid'
626 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
628 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
631 time_epoch = get_option('time-epoch')
634 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
636 conf.set('TIME_EPOCH', time_epoch)
638 system_uid_max = get_option('system-uid-max')
639 if system_uid_max == -1
640 system_uid_max = run_command(
642 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
643 '/etc/login.defs').stdout().strip()
644 if system_uid_max == ''
647 system_uid_max = system_uid_max.to_int()
650 conf.set('SYSTEM_UID_MAX', system_uid_max)
651 substs.set('systemuidmax', system_uid_max)
653 system_gid_max = get_option('system-gid-max')
654 if system_gid_max == -1
655 system_gid_max = run_command(
657 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
658 '/etc/login.defs').stdout().strip()
659 if system_gid_max == ''
662 system_gid_max = system_gid_max.to_int()
665 conf.set('SYSTEM_GID_MAX', system_gid_max)
666 substs.set('systemgidmax', system_gid_max)
668 dynamic_uid_min = get_option('dynamic-uid-min')
669 dynamic_uid_max = get_option('dynamic-uid-max')
670 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
671 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
672 substs.set('dynamicuidmin', dynamic_uid_min)
673 substs.set('dynamicuidmax', dynamic_uid_max)
675 container_uid_base_min = get_option('container-uid-base-min')
676 container_uid_base_max = get_option('container-uid-base-max')
677 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
678 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
679 substs.set('containeruidbasemin', container_uid_base_min)
680 substs.set('containeruidbasemax', container_uid_base_max)
682 nobody_user = get_option('nobody-user')
683 nobody_group = get_option('nobody-group')
685 if not meson.is_cross_build()
686 getent_result = run_command('getent', 'passwd', '65534')
687 if getent_result.returncode() == 0
688 name = getent_result.stdout().split(':')[0]
689 if name != nobody_user
691 '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) +
692 'Your build will result in an user table setup that is incompatible with the local system.')
695 id_result = run_command('id', '-u', nobody_user)
696 if id_result.returncode() == 0
697 id = id_result.stdout().to_int()
700 '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) +
701 'Your build will result in an user table setup that is incompatible with the local system.')
705 getent_result = run_command('getent', 'group', '65534')
706 if getent_result.returncode() == 0
707 name = getent_result.stdout().split(':')[0]
708 if name != nobody_group
710 '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) +
711 'Your build will result in an group table setup that is incompatible with the local system.')
714 id_result = run_command('id', '-g', nobody_group)
715 if id_result.returncode() == 0
716 id = id_result.stdout().to_int()
719 '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) +
720 'Your build will result in an group table setup that is incompatible with the local system.')
724 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
726 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
727 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
730 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
731 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
732 substs.set('NOBODY_USER_NAME', nobody_user)
733 substs.set('NOBODY_GROUP_NAME', nobody_group)
735 tty_gid = get_option('tty-gid')
736 conf.set('TTY_GID', tty_gid)
737 substs.set('TTY_GID', tty_gid)
739 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
740 users_gid = get_option('users-gid')
741 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
743 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
744 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
746 dev_kvm_mode = get_option('dev-kvm-mode')
747 substs.set('DEV_KVM_MODE', dev_kvm_mode)
748 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
749 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
751 kill_user_processes = get_option('default-kill-user-processes')
752 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
753 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
754 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
756 dns_servers = get_option('dns-servers')
757 conf.set_quoted('DNS_SERVERS', dns_servers)
758 substs.set('DNS_SERVERS', dns_servers)
760 ntp_servers = get_option('ntp-servers')
761 conf.set_quoted('NTP_SERVERS', ntp_servers)
762 substs.set('NTP_SERVERS', ntp_servers)
764 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
766 substs.set('SUSHELL', get_option('debug-shell'))
767 substs.set('DEBUGTTY', get_option('debug-tty'))
769 enable_debug_hashmap = false
770 enable_debug_mmap_cache = false
771 foreach name : get_option('debug-extra')
773 enable_debug_hashmap = true
774 elif name == 'mmap-cache'
775 enable_debug_mmap_cache = true
777 message('unknown debug option "@0@", ignoring'.format(name))
780 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
781 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
783 conf.set10('VALGRIND', get_option('valgrind'))
785 #####################################################################
787 threads = dependency('threads')
788 librt = cc.find_library('rt')
789 libm = cc.find_library('m')
790 libdl = cc.find_library('dl')
791 libcrypt = cc.find_library('crypt')
793 libcap = dependency('libcap', required : false)
794 if not libcap.found()
795 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
796 libcap = cc.find_library('cap')
799 libmount = dependency('mount',
800 version : fuzzer_build ? '>= 0' : '>= 2.30')
802 want_seccomp = get_option('seccomp')
803 if want_seccomp != 'false' and not fuzzer_build
804 libseccomp = dependency('libseccomp',
805 version : '>= 2.3.1',
806 required : want_seccomp == 'true')
807 have = libseccomp.found()
812 conf.set10('HAVE_SECCOMP', have)
814 want_selinux = get_option('selinux')
815 if want_selinux != 'false' and not fuzzer_build
816 libselinux = dependency('libselinux',
817 version : '>= 2.1.9',
818 required : want_selinux == 'true')
819 have = libselinux.found()
824 conf.set10('HAVE_SELINUX', have)
826 want_apparmor = get_option('apparmor')
827 if want_apparmor != 'false' and not fuzzer_build
828 libapparmor = dependency('libapparmor',
829 required : want_apparmor == 'true')
830 have = libapparmor.found()
835 conf.set10('HAVE_APPARMOR', have)
837 smack_run_label = get_option('smack-run-label')
838 if smack_run_label != ''
839 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
842 want_polkit = get_option('polkit')
843 install_polkit = false
844 install_polkit_pkla = false
845 if want_polkit != 'false' and not fuzzer_build
846 install_polkit = true
848 libpolkit = dependency('polkit-gobject-1',
850 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
851 message('Old polkit detected, will install pkla files')
852 install_polkit_pkla = true
855 conf.set10('ENABLE_POLKIT', install_polkit)
857 want_acl = get_option('acl')
858 if want_acl != 'false' and not fuzzer_build
859 libacl = cc.find_library('acl', required : want_acl == 'true')
860 have = libacl.found()
865 conf.set10('HAVE_ACL', have)
867 want_audit = get_option('audit')
868 if want_audit != 'false' and not fuzzer_build
869 libaudit = dependency('audit', required : want_audit == 'true')
870 have = libaudit.found()
875 conf.set10('HAVE_AUDIT', have)
877 want_blkid = get_option('blkid')
878 if want_blkid != 'false' and not fuzzer_build
879 libblkid = dependency('blkid', required : want_blkid == 'true')
880 have = libblkid.found()
885 conf.set10('HAVE_BLKID', have)
887 want_kmod = get_option('kmod')
888 if want_kmod != 'false' and not fuzzer_build
889 libkmod = dependency('libkmod',
891 required : want_kmod == 'true')
892 have = libkmod.found()
897 conf.set10('HAVE_KMOD', have)
899 want_pam = get_option('pam')
900 if want_pam != 'false' and not fuzzer_build
901 libpam = cc.find_library('pam', required : want_pam == 'true')
902 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
903 have = libpam.found() and libpam_misc.found()
909 conf.set10('HAVE_PAM', have)
911 want_microhttpd = get_option('microhttpd')
912 if want_microhttpd != 'false' and not fuzzer_build
913 libmicrohttpd = dependency('libmicrohttpd',
914 version : '>= 0.9.33',
915 required : want_microhttpd == 'true')
916 have = libmicrohttpd.found()
921 conf.set10('HAVE_MICROHTTPD', have)
923 want_libcryptsetup = get_option('libcryptsetup')
924 if want_libcryptsetup != 'false' and not fuzzer_build
925 libcryptsetup = dependency('libcryptsetup',
926 version : '>= 1.6.0',
927 required : want_libcryptsetup == 'true')
928 have = libcryptsetup.found()
929 have_sector = cc.has_member(
930 'struct crypt_params_plain',
932 prefix : '#include <libcryptsetup.h>')
938 conf.set10('HAVE_LIBCRYPTSETUP', have)
939 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
941 want_libcurl = get_option('libcurl')
942 if want_libcurl != 'false' and not fuzzer_build
943 libcurl = dependency('libcurl',
944 version : '>= 7.32.0',
945 required : want_libcurl == 'true')
946 have = libcurl.found()
951 conf.set10('HAVE_LIBCURL', have)
953 want_libidn = get_option('libidn')
954 want_libidn2 = get_option('libidn2')
955 if want_libidn == 'true' and want_libidn2 == 'true'
956 error('libidn and libidn2 cannot be requested simultaneously')
959 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
960 libidn = dependency('libidn',
961 required : want_libidn == 'true')
962 have = libidn.found()
967 conf.set10('HAVE_LIBIDN', have)
968 if not have and want_libidn2 != 'false' and not fuzzer_build
969 # libidn is used for both libidn and libidn2 objects
970 libidn = dependency('libidn2',
971 required : want_libidn2 == 'true')
972 have = libidn.found()
976 conf.set10('HAVE_LIBIDN2', have)
978 want_libiptc = get_option('libiptc')
979 if want_libiptc != 'false' and not fuzzer_build
980 libiptc = dependency('libiptc',
981 required : want_libiptc == 'true')
982 have = libiptc.found()
987 conf.set10('HAVE_LIBIPTC', have)
989 want_qrencode = get_option('qrencode')
990 if want_qrencode != 'false' and not fuzzer_build
991 libqrencode = dependency('libqrencode',
992 required : want_qrencode == 'true')
993 have = libqrencode.found()
998 conf.set10('HAVE_QRENCODE', have)
1000 want_gcrypt = get_option('gcrypt')
1001 if want_gcrypt != 'false' and not fuzzer_build
1002 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1003 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1004 have = libgcrypt.found() and libgpg_error.found()
1009 # link to neither of the libs if one is not found
1013 conf.set10('HAVE_GCRYPT', have)
1015 want_gnutls = get_option('gnutls')
1016 if want_gnutls != 'false' and not fuzzer_build
1017 libgnutls = dependency('gnutls',
1018 version : '>= 3.1.4',
1019 required : want_gnutls == 'true')
1020 have = libgnutls.found()
1025 conf.set10('HAVE_GNUTLS', have)
1027 want_openssl = get_option('openssl')
1028 if want_openssl != 'false' and not fuzzer_build
1029 libopenssl = dependency('openssl',
1030 version : '>= 1.1.0',
1031 required : want_openssl == 'true')
1032 have = libopenssl.found()
1037 conf.set10('HAVE_OPENSSL', have)
1039 want_elfutils = get_option('elfutils')
1040 if want_elfutils != 'false' and not fuzzer_build
1041 libdw = dependency('libdw',
1042 required : want_elfutils == 'true')
1043 have = libdw.found()
1048 conf.set10('HAVE_ELFUTILS', have)
1050 want_zlib = get_option('zlib')
1051 if want_zlib != 'false' and not fuzzer_build
1052 libz = dependency('zlib',
1053 required : want_zlib == 'true')
1059 conf.set10('HAVE_ZLIB', have)
1061 want_bzip2 = get_option('bzip2')
1062 if want_bzip2 != 'false' and not fuzzer_build
1063 libbzip2 = cc.find_library('bz2',
1064 required : want_bzip2 == 'true')
1065 have = libbzip2.found()
1070 conf.set10('HAVE_BZIP2', have)
1072 want_xz = get_option('xz')
1073 if want_xz != 'false' and not fuzzer_build
1074 libxz = dependency('liblzma',
1075 required : want_xz == 'true')
1076 have = libxz.found()
1081 conf.set10('HAVE_XZ', have)
1083 want_lz4 = get_option('lz4')
1084 if want_lz4 != 'false' and not fuzzer_build
1085 liblz4 = dependency('liblz4',
1086 required : want_lz4 == 'true')
1087 have = liblz4.found()
1092 conf.set10('HAVE_LZ4', have)
1094 want_xkbcommon = get_option('xkbcommon')
1095 if want_xkbcommon != 'false' and not fuzzer_build
1096 libxkbcommon = dependency('xkbcommon',
1097 version : '>= 0.3.0',
1098 required : want_xkbcommon == 'true')
1099 have = libxkbcommon.found()
1104 conf.set10('HAVE_XKBCOMMON', have)
1106 want_pcre2 = get_option('pcre2')
1107 if want_pcre2 != 'false'
1108 libpcre2 = dependency('libpcre2-8',
1109 required : want_pcre2 == 'true')
1110 have = libpcre2.found()
1115 conf.set10('HAVE_PCRE2', have)
1117 want_glib = get_option('glib')
1118 if want_glib != 'false' and not fuzzer_build
1119 libglib = dependency('glib-2.0',
1120 version : '>= 2.22.0',
1121 required : want_glib == 'true')
1122 libgobject = dependency('gobject-2.0',
1123 version : '>= 2.22.0',
1124 required : want_glib == 'true')
1125 libgio = dependency('gio-2.0',
1126 required : want_glib == 'true')
1127 have = libglib.found() and libgobject.found() and libgio.found()
1134 conf.set10('HAVE_GLIB', have)
1136 want_dbus = get_option('dbus')
1137 if want_dbus != 'false' and not fuzzer_build
1138 libdbus = dependency('dbus-1',
1139 version : '>= 1.3.2',
1140 required : want_dbus == 'true')
1141 have = libdbus.found()
1146 conf.set10('HAVE_DBUS', have)
1148 default_dnssec = get_option('default-dnssec')
1150 default_dnssec = 'no'
1152 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1153 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1154 default_dnssec = 'no'
1156 conf.set('DEFAULT_DNSSEC_MODE',
1157 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1158 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1160 dns_over_tls = get_option('dns-over-tls')
1161 if dns_over_tls != 'false'
1162 if dns_over_tls == 'openssl'
1165 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1166 if dns_over_tls == 'gnutls' and not have_gnutls
1167 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1170 if dns_over_tls == 'gnutls' or have_gnutls
1171 have_openssl = false
1173 have_openssl = conf.get('HAVE_OPENSSL') == 1
1174 if dns_over_tls != 'auto' and not have_openssl
1175 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1176 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1179 have = have_gnutls or have_openssl
1181 have = have_gnutls = have_openssl = false
1183 conf.set10('ENABLE_DNS_OVER_TLS', have)
1184 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1185 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1187 default_dns_over_tls = get_option('default-dns-over-tls')
1189 default_dns_over_tls = 'no'
1191 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1192 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1193 default_dns_over_tls = 'no'
1195 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1196 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1197 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1199 want_importd = get_option('importd')
1200 if want_importd != 'false'
1201 have = (conf.get('HAVE_LIBCURL') == 1 and
1202 conf.get('HAVE_ZLIB') == 1 and
1203 conf.get('HAVE_BZIP2') == 1 and
1204 conf.get('HAVE_XZ') == 1 and
1205 conf.get('HAVE_GCRYPT') == 1)
1206 if want_importd == 'true' and not have
1207 error('importd support was requested, but dependencies are not available')
1212 conf.set10('ENABLE_IMPORTD', have)
1214 want_remote = get_option('remote')
1215 if want_remote != 'false'
1216 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1217 conf.get('HAVE_LIBCURL') == 1]
1218 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1219 # it's possible to build one without the other. Complain only if
1220 # support was explictly requested. The auxiliary files like sysusers
1221 # config should be installed when any of the programs are built.
1222 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1223 error('remote support was requested, but dependencies are not available')
1225 have = have_deps[0] or have_deps[1]
1229 conf.set10('ENABLE_REMOTE', have)
1231 foreach term : ['utmp',
1263 have = get_option(term)
1264 name = 'ENABLE_' + term.underscorify().to_upper()
1265 conf.set10(name, have)
1268 foreach tuple : [['nss-mymachines', 'machined'],
1269 ['nss-resolve', 'resolve']]
1270 want = get_option(tuple[0])
1272 have = get_option(tuple[1])
1273 if want == 'true' and not have
1274 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1279 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1280 conf.set10(name, have)
1284 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1285 'ENABLE_NSS_MYMACHINES',
1286 'ENABLE_NSS_RESOLVE',
1287 'ENABLE_NSS_SYSTEMD']
1288 if conf.get(term) == 1
1292 conf.set10('ENABLE_NSS', enable_nss)
1294 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1299 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1301 #####################################################################
1303 if get_option('efi')
1304 efi_arch = host_machine.cpu_family()
1306 if efi_arch == 'x86'
1307 EFI_MACHINE_TYPE_NAME = 'ia32'
1308 gnu_efi_arch = 'ia32'
1309 elif efi_arch == 'x86_64'
1310 EFI_MACHINE_TYPE_NAME = 'x64'
1311 gnu_efi_arch = 'x86_64'
1312 elif efi_arch == 'arm'
1313 EFI_MACHINE_TYPE_NAME = 'arm'
1314 gnu_efi_arch = 'arm'
1315 elif efi_arch == 'aarch64'
1316 EFI_MACHINE_TYPE_NAME = 'aa64'
1317 gnu_efi_arch = 'aarch64'
1319 EFI_MACHINE_TYPE_NAME = ''
1324 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1326 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1330 conf.set10('ENABLE_EFI', have)
1332 #####################################################################
1334 config_h = configure_file(
1335 output : 'config.h',
1336 configuration : conf)
1338 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1340 includes = include_directories('src/basic',
1344 'src/journal-remote',
1348 'src/time-wait-sync',
1353 'src/libsystemd/sd-bus',
1354 'src/libsystemd/sd-device',
1355 'src/libsystemd/sd-hwdb',
1356 'src/libsystemd/sd-id128',
1357 'src/libsystemd/sd-netlink',
1358 'src/libsystemd/sd-network',
1359 'src/libsystemd-network',
1362 add_project_arguments('-include', 'config.h', language : 'c')
1366 subdir('src/systemd')
1368 subdir('src/libsystemd')
1369 subdir('src/libsystemd-network')
1370 subdir('src/journal')
1373 libjournal_core = static_library(
1375 libjournal_core_sources,
1377 include_directories : includes,
1380 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1381 libsystemd = shared_library(
1383 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1384 version : libsystemd_version,
1385 include_directories : includes,
1386 link_args : ['-shared',
1387 '-Wl,--version-script=' + libsystemd_sym_path],
1388 link_with : [libbasic,
1390 link_whole : [libsystemd_static,
1392 dependencies : [threads,
1396 link_depends : libsystemd_sym,
1398 install_dir : rootlibdir)
1400 static_libsystemd = get_option('static-libsystemd')
1401 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1403 install_libsystemd_static = static_library(
1406 journal_client_sources,
1408 basic_gcrypt_sources,
1409 include_directories : includes,
1410 build_by_default : static_libsystemd != 'false',
1411 install : static_libsystemd != 'false',
1412 install_dir : rootlibdir,
1413 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1414 dependencies : [threads,
1423 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1425 ############################################################
1427 # binaries that have --help and are intended for use by humans,
1428 # usually, but not always, installed in /bin.
1429 public_programs = []
1431 subdir('src/libudev')
1432 subdir('src/shared')
1435 subdir('src/network')
1437 subdir('src/analyze')
1438 subdir('src/journal-remote')
1439 subdir('src/coredump')
1440 subdir('src/hostname')
1441 subdir('src/import')
1442 subdir('src/kernel-install')
1443 subdir('src/locale')
1444 subdir('src/machine')
1445 subdir('src/portable')
1446 subdir('src/nspawn')
1447 subdir('src/resolve')
1448 subdir('src/timedate')
1449 subdir('src/timesync')
1450 subdir('src/vconsole')
1451 subdir('src/boot/efi')
1458 ############################################################
1460 # only static linking apart from libdl, to make sure that the
1461 # module is linked to all libraries that it uses.
1462 test_dlopen = executable(
1465 include_directories : includes,
1466 link_with : [libbasic],
1467 dependencies : [libdl],
1468 build_by_default : want_tests != 'false')
1470 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1471 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1472 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1473 ['resolve', 'ENABLE_NSS_RESOLVE']]
1475 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1479 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1480 version_script_arg = join_paths(meson.current_source_dir(), sym)
1482 nss = shared_library(
1484 'src/nss-@0@/nss-@0@.c'.format(module),
1486 include_directories : includes,
1487 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1488 link_args : ['-Wl,-z,nodelete',
1490 '-Wl,--version-script=' + version_script_arg,
1492 link_with : [libsystemd_static,
1494 dependencies : [threads,
1498 install_dir : rootlibdir)
1500 # We cannot use shared_module because it does not support version suffix.
1501 # Unfortunately shared_library insists on creating the symlink…
1502 meson.add_install_script('sh', '-c',
1503 'rm $DESTDIR@0@/libnss_@1@.so'
1504 .format(rootlibdir, module))
1506 if want_tests != 'false'
1507 test('dlopen-nss_' + module,
1509 # path to dlopen must include a slash
1510 args : nss.full_path())
1515 ############################################################
1517 executable('systemd',
1519 include_directories : includes,
1520 link_with : [libcore,
1522 dependencies : [threads,
1528 install_rpath : rootlibexecdir,
1530 install_dir : rootlibexecdir)
1532 meson.add_install_script(meson_make_symlink,
1533 join_paths(rootlibexecdir, 'systemd'),
1534 join_paths(rootsbindir, 'init'))
1536 exe = executable('systemd-analyze',
1537 systemd_analyze_sources,
1538 include_directories : includes,
1539 link_with : [libcore,
1541 dependencies : [threads,
1547 install_rpath : rootlibexecdir,
1549 public_programs += exe
1551 executable('systemd-journald',
1552 systemd_journald_sources,
1553 include_directories : includes,
1554 link_with : [libjournal_core,
1556 dependencies : [threads,
1560 install_rpath : rootlibexecdir,
1562 install_dir : rootlibexecdir)
1564 exe = executable('systemd-cat',
1565 systemd_cat_sources,
1566 include_directories : includes,
1567 link_with : [libjournal_core,
1569 dependencies : [threads],
1570 install_rpath : rootlibexecdir,
1572 public_programs += exe
1574 exe = executable('journalctl',
1576 include_directories : includes,
1577 link_with : [libshared],
1578 dependencies : [threads,
1583 install_rpath : rootlibexecdir,
1585 install_dir : rootbindir)
1586 public_programs += exe
1588 executable('systemd-getty-generator',
1589 'src/getty-generator/getty-generator.c',
1590 include_directories : includes,
1591 link_with : [libshared],
1592 install_rpath : rootlibexecdir,
1594 install_dir : systemgeneratordir)
1596 executable('systemd-debug-generator',
1597 'src/debug-generator/debug-generator.c',
1598 include_directories : includes,
1599 link_with : [libshared],
1600 install_rpath : rootlibexecdir,
1602 install_dir : systemgeneratordir)
1604 executable('systemd-fstab-generator',
1605 'src/fstab-generator/fstab-generator.c',
1606 'src/core/mount-setup.c',
1607 include_directories : includes,
1608 link_with : [libshared],
1609 install_rpath : rootlibexecdir,
1611 install_dir : systemgeneratordir)
1613 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1614 executable('30-systemd-environment-d-generator',
1615 'src/environment-d-generator/environment-d-generator.c',
1616 include_directories : includes,
1617 link_with : [libshared],
1618 install_rpath : rootlibexecdir,
1620 install_dir : userenvgeneratordir)
1622 meson.add_install_script(meson_make_symlink,
1623 join_paths(sysconfdir, 'environment'),
1624 join_paths(environmentdir, '99-environment.conf'))
1627 if conf.get('ENABLE_HIBERNATE') == 1
1628 executable('systemd-hibernate-resume-generator',
1629 'src/hibernate-resume/hibernate-resume-generator.c',
1630 include_directories : includes,
1631 link_with : [libshared],
1632 install_rpath : rootlibexecdir,
1634 install_dir : systemgeneratordir)
1636 executable('systemd-hibernate-resume',
1637 'src/hibernate-resume/hibernate-resume.c',
1638 include_directories : includes,
1639 link_with : [libshared],
1640 install_rpath : rootlibexecdir,
1642 install_dir : rootlibexecdir)
1645 if conf.get('HAVE_BLKID') == 1
1646 executable('systemd-gpt-auto-generator',
1647 'src/gpt-auto-generator/gpt-auto-generator.c',
1648 'src/basic/blkid-util.h',
1649 include_directories : includes,
1650 link_with : [libshared],
1651 dependencies : libblkid,
1652 install_rpath : rootlibexecdir,
1654 install_dir : systemgeneratordir)
1656 exe = executable('systemd-dissect',
1657 'src/dissect/dissect.c',
1658 include_directories : includes,
1659 link_with : [libshared],
1660 install_rpath : rootlibexecdir,
1662 install_dir : rootlibexecdir)
1663 public_programs += exe
1666 if conf.get('ENABLE_RESOLVE') == 1
1667 executable('systemd-resolved',
1668 systemd_resolved_sources,
1669 include_directories : includes,
1670 link_with : [libshared,
1672 libsystemd_resolve_core],
1673 dependencies : systemd_resolved_dependencies,
1674 install_rpath : rootlibexecdir,
1676 install_dir : rootlibexecdir)
1678 exe = executable('resolvectl',
1680 include_directories : includes,
1681 link_with : [libshared,
1683 libsystemd_resolve_core],
1684 dependencies : [threads,
1688 install_rpath : rootlibexecdir,
1690 public_programs += exe
1692 meson.add_install_script(meson_make_symlink,
1693 join_paths(bindir, 'resolvectl'),
1694 join_paths(rootsbindir, 'resolvconf'))
1696 meson.add_install_script(meson_make_symlink,
1697 join_paths(bindir, 'resolvectl'),
1698 join_paths(bindir, 'systemd-resolve'))
1701 if conf.get('ENABLE_LOGIND') == 1
1702 executable('systemd-logind',
1703 systemd_logind_sources,
1704 include_directories : includes,
1705 link_with : [liblogind_core,
1707 dependencies : [threads,
1709 install_rpath : rootlibexecdir,
1711 install_dir : rootlibexecdir)
1713 exe = executable('loginctl',
1715 include_directories : includes,
1716 link_with : [libshared],
1717 dependencies : [threads,
1720 install_rpath : rootlibexecdir,
1722 install_dir : rootbindir)
1723 public_programs += exe
1725 exe = executable('systemd-inhibit',
1726 'src/login/inhibit.c',
1727 include_directories : includes,
1728 link_with : [libshared],
1729 install_rpath : rootlibexecdir,
1731 install_dir : rootbindir)
1732 public_programs += exe
1734 if conf.get('HAVE_PAM') == 1
1735 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1736 pam_systemd = shared_library(
1740 include_directories : includes,
1741 link_args : ['-shared',
1742 '-Wl,--version-script=' + version_script_arg],
1743 link_with : [libsystemd_static,
1745 dependencies : [threads,
1748 link_depends : pam_systemd_sym,
1750 install_dir : pamlibdir)
1752 if want_tests != 'false'
1753 test('dlopen-pam_systemd',
1755 # path to dlopen must include a slash
1756 args : pam_systemd.full_path())
1761 executable('systemd-user-runtime-dir',
1762 user_runtime_dir_sources,
1763 include_directories : includes,
1764 link_with : [libshared, liblogind_core],
1765 install_rpath : rootlibexecdir,
1767 install_dir : rootlibexecdir)
1769 if conf.get('HAVE_PAM') == 1
1770 executable('systemd-user-sessions',
1771 'src/user-sessions/user-sessions.c',
1772 include_directories : includes,
1773 link_with : [libshared],
1774 install_rpath : rootlibexecdir,
1776 install_dir : rootlibexecdir)
1779 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1780 exe = executable('bootctl',
1781 'src/boot/bootctl.c',
1782 include_directories : includes,
1783 link_with : [libshared],
1784 dependencies : [libblkid],
1785 install_rpath : rootlibexecdir,
1787 public_programs += exe
1790 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1791 include_directories : includes,
1792 link_with : [libshared],
1793 dependencies : [threads],
1794 install_rpath : rootlibexecdir,
1796 public_programs += exe
1799 if get_option('link-systemctl-shared')
1800 systemctl_link_with = [libshared]
1802 systemctl_link_with = [libsystemd_static,
1808 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1809 include_directories : includes,
1810 link_with : systemctl_link_with,
1811 dependencies : [threads,
1816 install_rpath : rootlibexecdir,
1818 install_dir : rootbindir)
1819 public_programs += exe
1821 if conf.get('ENABLE_PORTABLED') == 1
1822 executable('systemd-portabled',
1823 systemd_portabled_sources,
1824 include_directories : includes,
1825 link_with : [libshared],
1826 dependencies : [threads],
1827 install_rpath : rootlibexecdir,
1829 install_dir : rootlibexecdir)
1831 exe = executable('portablectl', 'src/portable/portablectl.c',
1832 include_directories : includes,
1833 link_with : [libshared],
1834 dependencies : [threads],
1835 install_rpath : rootlibexecdir,
1837 install_dir : rootlibexecdir)
1838 public_programs += exe
1841 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1842 meson.add_install_script(meson_make_symlink,
1843 join_paths(rootbindir, 'systemctl'),
1844 join_paths(rootsbindir, alias))
1847 if conf.get('ENABLE_BACKLIGHT') == 1
1848 executable('systemd-backlight',
1849 'src/backlight/backlight.c',
1850 include_directories : includes,
1851 link_with : [libshared],
1852 install_rpath : rootlibexecdir,
1854 install_dir : rootlibexecdir)
1857 if conf.get('ENABLE_RFKILL') == 1
1858 executable('systemd-rfkill',
1859 'src/rfkill/rfkill.c',
1860 include_directories : includes,
1861 link_with : [libshared],
1862 install_rpath : rootlibexecdir,
1864 install_dir : rootlibexecdir)
1867 executable('systemd-system-update-generator',
1868 'src/system-update-generator/system-update-generator.c',
1869 include_directories : includes,
1870 link_with : [libshared],
1871 install_rpath : rootlibexecdir,
1873 install_dir : systemgeneratordir)
1875 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1876 executable('systemd-cryptsetup',
1877 'src/cryptsetup/cryptsetup.c',
1878 include_directories : includes,
1879 link_with : [libshared],
1880 dependencies : [libcryptsetup],
1881 install_rpath : rootlibexecdir,
1883 install_dir : rootlibexecdir)
1885 executable('systemd-cryptsetup-generator',
1886 'src/cryptsetup/cryptsetup-generator.c',
1887 include_directories : includes,
1888 link_with : [libshared],
1889 dependencies : [libcryptsetup],
1890 install_rpath : rootlibexecdir,
1892 install_dir : systemgeneratordir)
1894 executable('systemd-veritysetup',
1895 'src/veritysetup/veritysetup.c',
1896 include_directories : includes,
1897 link_with : [libshared],
1898 dependencies : [libcryptsetup],
1899 install_rpath : rootlibexecdir,
1901 install_dir : rootlibexecdir)
1903 executable('systemd-veritysetup-generator',
1904 'src/veritysetup/veritysetup-generator.c',
1905 include_directories : includes,
1906 link_with : [libshared],
1907 dependencies : [libcryptsetup],
1908 install_rpath : rootlibexecdir,
1910 install_dir : systemgeneratordir)
1913 if conf.get('HAVE_SYSV_COMPAT') == 1
1914 executable('systemd-sysv-generator',
1915 'src/sysv-generator/sysv-generator.c',
1916 include_directories : includes,
1917 link_with : [libshared],
1918 install_rpath : rootlibexecdir,
1920 install_dir : systemgeneratordir)
1922 executable('systemd-rc-local-generator',
1923 'src/rc-local-generator/rc-local-generator.c',
1924 include_directories : includes,
1925 link_with : [libshared],
1926 install_rpath : rootlibexecdir,
1928 install_dir : systemgeneratordir)
1931 if conf.get('ENABLE_HOSTNAMED') == 1
1932 executable('systemd-hostnamed',
1933 'src/hostname/hostnamed.c',
1934 include_directories : includes,
1935 link_with : [libshared],
1936 install_rpath : rootlibexecdir,
1938 install_dir : rootlibexecdir)
1940 exe = executable('hostnamectl',
1941 'src/hostname/hostnamectl.c',
1942 include_directories : includes,
1943 link_with : [libshared],
1944 install_rpath : rootlibexecdir,
1946 public_programs += exe
1949 if conf.get('ENABLE_LOCALED') == 1
1950 if conf.get('HAVE_XKBCOMMON') == 1
1951 # logind will load libxkbcommon.so dynamically on its own
1957 executable('systemd-localed',
1958 systemd_localed_sources,
1959 include_directories : includes,
1960 link_with : [libshared],
1961 dependencies : deps,
1962 install_rpath : rootlibexecdir,
1964 install_dir : rootlibexecdir)
1966 exe = executable('localectl',
1968 include_directories : includes,
1969 link_with : [libshared],
1970 install_rpath : rootlibexecdir,
1972 public_programs += exe
1975 if conf.get('ENABLE_TIMEDATED') == 1
1976 executable('systemd-timedated',
1977 'src/timedate/timedated.c',
1978 include_directories : includes,
1979 link_with : [libshared],
1980 install_rpath : rootlibexecdir,
1982 install_dir : rootlibexecdir)
1985 if conf.get('ENABLE_TIMEDATECTL') == 1
1986 exe = executable('timedatectl',
1987 'src/timedate/timedatectl.c',
1988 include_directories : includes,
1989 install_rpath : rootlibexecdir,
1990 link_with : [libshared],
1991 dependencies : [libm],
1993 public_programs += exe
1996 if conf.get('ENABLE_TIMESYNCD') == 1
1997 executable('systemd-timesyncd',
1998 systemd_timesyncd_sources,
1999 include_directories : includes,
2000 link_with : [libshared],
2001 dependencies : [threads,
2003 install_rpath : rootlibexecdir,
2005 install_dir : rootlibexecdir)
2007 executable('systemd-time-wait-sync',
2008 'src/time-wait-sync/time-wait-sync.c',
2009 include_directories : includes,
2010 link_with : [libshared],
2011 install_rpath : rootlibexecdir,
2013 install_dir : rootlibexecdir)
2016 if conf.get('ENABLE_MACHINED') == 1
2017 executable('systemd-machined',
2018 systemd_machined_sources,
2019 include_directories : includes,
2020 link_with : [libmachine_core,
2022 install_rpath : rootlibexecdir,
2024 install_dir : rootlibexecdir)
2026 exe = executable('machinectl',
2027 'src/machine/machinectl.c',
2028 include_directories : includes,
2029 link_with : [libshared],
2030 dependencies : [threads,
2033 install_rpath : rootlibexecdir,
2035 install_dir : rootbindir)
2036 public_programs += exe
2039 if conf.get('ENABLE_IMPORTD') == 1
2040 executable('systemd-importd',
2041 systemd_importd_sources,
2042 include_directories : includes,
2043 link_with : [libshared],
2044 dependencies : [threads],
2045 install_rpath : rootlibexecdir,
2047 install_dir : rootlibexecdir)
2049 systemd_pull = executable('systemd-pull',
2050 systemd_pull_sources,
2051 include_directories : includes,
2052 link_with : [libshared],
2053 dependencies : [libcurl,
2058 install_rpath : rootlibexecdir,
2060 install_dir : rootlibexecdir)
2062 systemd_import = executable('systemd-import',
2063 systemd_import_sources,
2064 include_directories : includes,
2065 link_with : [libshared],
2066 dependencies : [libcurl,
2070 install_rpath : rootlibexecdir,
2072 install_dir : rootlibexecdir)
2074 systemd_export = executable('systemd-export',
2075 systemd_export_sources,
2076 include_directories : includes,
2077 link_with : [libshared],
2078 dependencies : [libcurl,
2082 install_rpath : rootlibexecdir,
2084 install_dir : rootlibexecdir)
2085 public_programs += [systemd_pull, systemd_import, systemd_export]
2088 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2089 exe = executable('systemd-journal-upload',
2090 systemd_journal_upload_sources,
2091 include_directories : includes,
2092 link_with : [libshared],
2093 dependencies : [threads,
2098 install_rpath : rootlibexecdir,
2100 install_dir : rootlibexecdir)
2101 public_programs += exe
2104 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2105 s_j_remote = executable('systemd-journal-remote',
2106 systemd_journal_remote_sources,
2107 include_directories : includes,
2108 link_with : [libshared,
2109 libsystemd_journal_remote],
2110 dependencies : [threads,
2115 install_rpath : rootlibexecdir,
2117 install_dir : rootlibexecdir)
2119 s_j_gatewayd = executable('systemd-journal-gatewayd',
2120 systemd_journal_gatewayd_sources,
2121 include_directories : includes,
2122 link_with : [libshared],
2123 dependencies : [threads,
2128 install_rpath : rootlibexecdir,
2130 install_dir : rootlibexecdir)
2131 public_programs += [s_j_remote, s_j_gatewayd]
2134 if conf.get('ENABLE_COREDUMP') == 1
2135 executable('systemd-coredump',
2136 systemd_coredump_sources,
2137 include_directories : includes,
2138 link_with : [libshared],
2139 dependencies : [threads,
2144 install_rpath : rootlibexecdir,
2146 install_dir : rootlibexecdir)
2148 exe = executable('coredumpctl',
2149 coredumpctl_sources,
2150 include_directories : includes,
2151 link_with : [libshared],
2152 dependencies : [threads,
2155 install_rpath : rootlibexecdir,
2157 public_programs += exe
2160 if conf.get('ENABLE_BINFMT') == 1
2161 exe = executable('systemd-binfmt',
2162 'src/binfmt/binfmt.c',
2163 include_directories : includes,
2164 link_with : [libshared],
2165 install_rpath : rootlibexecdir,
2167 install_dir : rootlibexecdir)
2168 public_programs += exe
2170 meson.add_install_script('sh', '-c',
2171 mkdir_p.format(binfmtdir))
2172 meson.add_install_script('sh', '-c',
2173 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2176 if conf.get('ENABLE_VCONSOLE') == 1
2177 executable('systemd-vconsole-setup',
2178 'src/vconsole/vconsole-setup.c',
2179 include_directories : includes,
2180 link_with : [libshared],
2181 install_rpath : rootlibexecdir,
2183 install_dir : rootlibexecdir)
2186 if conf.get('ENABLE_RANDOMSEED') == 1
2187 executable('systemd-random-seed',
2188 'src/random-seed/random-seed.c',
2189 include_directories : includes,
2190 link_with : [libshared],
2191 install_rpath : rootlibexecdir,
2193 install_dir : rootlibexecdir)
2196 if conf.get('ENABLE_FIRSTBOOT') == 1
2197 executable('systemd-firstboot',
2198 'src/firstboot/firstboot.c',
2199 include_directories : includes,
2200 link_with : [libshared],
2201 dependencies : [libcrypt],
2202 install_rpath : rootlibexecdir,
2204 install_dir : rootbindir)
2207 executable('systemd-remount-fs',
2208 'src/remount-fs/remount-fs.c',
2209 'src/core/mount-setup.c',
2210 'src/core/mount-setup.h',
2211 include_directories : includes,
2212 link_with : [libshared],
2213 install_rpath : rootlibexecdir,
2215 install_dir : rootlibexecdir)
2217 executable('systemd-machine-id-setup',
2218 'src/machine-id-setup/machine-id-setup-main.c',
2219 'src/core/machine-id-setup.c',
2220 'src/core/machine-id-setup.h',
2221 include_directories : includes,
2222 link_with : [libshared],
2223 install_rpath : rootlibexecdir,
2225 install_dir : rootbindir)
2227 executable('systemd-fsck',
2229 include_directories : includes,
2230 link_with : [libshared],
2231 install_rpath : rootlibexecdir,
2233 install_dir : rootlibexecdir)
2235 executable('systemd-growfs',
2236 'src/partition/growfs.c',
2237 include_directories : includes,
2238 link_with : [libshared],
2239 dependencies : [libcryptsetup],
2240 install_rpath : rootlibexecdir,
2242 install_dir : rootlibexecdir)
2244 executable('systemd-makefs',
2245 'src/partition/makefs.c',
2246 include_directories : includes,
2247 link_with : [libshared],
2248 install_rpath : rootlibexecdir,
2250 install_dir : rootlibexecdir)
2252 executable('systemd-sleep',
2253 'src/sleep/sleep.c',
2254 include_directories : includes,
2255 link_with : [libshared],
2256 install_rpath : rootlibexecdir,
2258 install_dir : rootlibexecdir)
2260 exe = executable('systemd-sysctl',
2261 'src/sysctl/sysctl.c',
2262 include_directories : includes,
2263 link_with : [libshared],
2264 install_rpath : rootlibexecdir,
2266 install_dir : rootlibexecdir)
2267 public_programs += exe
2269 executable('systemd-ac-power',
2270 'src/ac-power/ac-power.c',
2271 include_directories : includes,
2272 link_with : [libshared],
2273 install_rpath : rootlibexecdir,
2275 install_dir : rootlibexecdir)
2277 exe = executable('systemd-detect-virt',
2278 'src/detect-virt/detect-virt.c',
2279 include_directories : includes,
2280 link_with : [libshared],
2281 install_rpath : rootlibexecdir,
2283 public_programs += exe
2285 exe = executable('systemd-delta',
2286 'src/delta/delta.c',
2287 include_directories : includes,
2288 link_with : [libshared],
2289 install_rpath : rootlibexecdir,
2291 public_programs += exe
2293 exe = executable('systemd-escape',
2294 'src/escape/escape.c',
2295 include_directories : includes,
2296 link_with : [libshared],
2297 install_rpath : rootlibexecdir,
2299 install_dir : rootbindir)
2300 public_programs += exe
2302 exe = executable('systemd-notify',
2303 'src/notify/notify.c',
2304 include_directories : includes,
2305 link_with : [libshared],
2306 install_rpath : rootlibexecdir,
2308 install_dir : rootbindir)
2309 public_programs += exe
2311 executable('systemd-volatile-root',
2312 'src/volatile-root/volatile-root.c',
2313 include_directories : includes,
2314 link_with : [libshared],
2315 install_rpath : rootlibexecdir,
2317 install_dir : rootlibexecdir)
2319 executable('systemd-cgroups-agent',
2320 'src/cgroups-agent/cgroups-agent.c',
2321 include_directories : includes,
2322 link_with : [libshared],
2323 install_rpath : rootlibexecdir,
2325 install_dir : rootlibexecdir)
2327 exe = executable('systemd-path',
2329 include_directories : includes,
2330 link_with : [libshared],
2331 install_rpath : rootlibexecdir,
2333 public_programs += exe
2335 exe = executable('systemd-ask-password',
2336 'src/ask-password/ask-password.c',
2337 include_directories : includes,
2338 link_with : [libshared],
2339 install_rpath : rootlibexecdir,
2341 install_dir : rootbindir)
2342 public_programs += exe
2344 executable('systemd-reply-password',
2345 'src/reply-password/reply-password.c',
2346 include_directories : includes,
2347 link_with : [libshared],
2348 install_rpath : rootlibexecdir,
2350 install_dir : rootlibexecdir)
2352 exe = executable('systemd-tty-ask-password-agent',
2353 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2354 include_directories : includes,
2355 link_with : [libshared],
2356 install_rpath : rootlibexecdir,
2358 install_dir : rootbindir)
2359 public_programs += exe
2361 exe = executable('systemd-cgls',
2363 include_directories : includes,
2364 link_with : [libshared],
2365 install_rpath : rootlibexecdir,
2367 public_programs += exe
2369 exe = executable('systemd-cgtop',
2370 'src/cgtop/cgtop.c',
2371 include_directories : includes,
2372 link_with : [libshared],
2373 install_rpath : rootlibexecdir,
2375 public_programs += exe
2377 executable('systemd-initctl',
2378 'src/initctl/initctl.c',
2379 include_directories : includes,
2380 link_with : [libshared],
2381 install_rpath : rootlibexecdir,
2383 install_dir : rootlibexecdir)
2385 exe = executable('systemd-mount',
2386 'src/mount/mount-tool.c',
2387 include_directories : includes,
2388 link_with : [libshared],
2389 install_rpath : rootlibexecdir,
2391 public_programs += exe
2393 meson.add_install_script(meson_make_symlink,
2394 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2396 exe = executable('systemd-run',
2398 include_directories : includes,
2399 link_with : [libshared],
2400 install_rpath : rootlibexecdir,
2402 public_programs += exe
2404 exe = executable('systemd-stdio-bridge',
2405 'src/stdio-bridge/stdio-bridge.c',
2406 include_directories : includes,
2407 link_with : [libshared],
2408 install_rpath : rootlibexecdir,
2410 public_programs += exe
2412 exe = executable('busctl',
2413 'src/busctl/busctl.c',
2414 'src/busctl/busctl-introspect.c',
2415 'src/busctl/busctl-introspect.h',
2416 include_directories : includes,
2417 link_with : [libshared],
2418 install_rpath : rootlibexecdir,
2420 public_programs += exe
2422 if conf.get('ENABLE_SYSUSERS') == 1
2423 exe = executable('systemd-sysusers',
2424 'src/sysusers/sysusers.c',
2425 include_directories : includes,
2426 link_with : [libshared],
2427 install_rpath : rootlibexecdir,
2429 install_dir : rootbindir)
2430 public_programs += exe
2433 if conf.get('ENABLE_TMPFILES') == 1
2434 exe = executable('systemd-tmpfiles',
2435 'src/tmpfiles/tmpfiles.c',
2436 include_directories : includes,
2437 link_with : [libshared],
2438 dependencies : [libacl],
2439 install_rpath : rootlibexecdir,
2441 install_dir : rootbindir)
2442 public_programs += exe
2444 if want_tests != 'false'
2445 test('test-systemd-tmpfiles',
2446 test_systemd_tmpfiles_py,
2447 # https://github.com/mesonbuild/meson/issues/2681
2448 args : exe.full_path())
2452 if conf.get('ENABLE_HWDB') == 1
2453 exe = executable('systemd-hwdb',
2455 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2456 include_directories : includes,
2457 link_with : [libudev_static],
2458 install_rpath : udev_rpath,
2460 install_dir : rootbindir)
2461 public_programs += exe
2464 if conf.get('ENABLE_QUOTACHECK') == 1
2465 executable('systemd-quotacheck',
2466 'src/quotacheck/quotacheck.c',
2467 include_directories : includes,
2468 link_with : [libshared],
2469 install_rpath : rootlibexecdir,
2471 install_dir : rootlibexecdir)
2474 exe = executable('systemd-socket-proxyd',
2475 'src/socket-proxy/socket-proxyd.c',
2476 include_directories : includes,
2477 link_with : [libshared],
2478 dependencies : [threads],
2479 install_rpath : rootlibexecdir,
2481 install_dir : rootlibexecdir)
2482 public_programs += exe
2484 exe = executable('systemd-udevd',
2485 systemd_udevd_sources,
2486 include_directories : includes,
2487 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2488 link_with : [libudev_core,
2491 dependencies : [threads,
2496 install_rpath : udev_rpath,
2498 install_dir : rootlibexecdir)
2499 public_programs += exe
2501 exe = executable('udevadm',
2503 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2504 include_directories : includes,
2505 link_with : [libudev_core,
2508 dependencies : [threads,
2513 install_rpath : udev_rpath,
2515 install_dir : rootbindir)
2516 public_programs += exe
2518 executable('systemd-shutdown',
2519 systemd_shutdown_sources,
2520 include_directories : includes,
2521 link_with : [libshared],
2522 dependencies : [libmount],
2523 install_rpath : rootlibexecdir,
2525 install_dir : rootlibexecdir)
2527 executable('systemd-update-done',
2528 'src/update-done/update-done.c',
2529 include_directories : includes,
2530 link_with : [libshared],
2531 install_rpath : rootlibexecdir,
2533 install_dir : rootlibexecdir)
2535 executable('systemd-update-utmp',
2536 'src/update-utmp/update-utmp.c',
2537 include_directories : includes,
2538 link_with : [libshared],
2539 dependencies : [libaudit],
2540 install_rpath : rootlibexecdir,
2542 install_dir : rootlibexecdir)
2544 if conf.get('HAVE_KMOD') == 1
2545 executable('systemd-modules-load',
2546 'src/modules-load/modules-load.c',
2547 include_directories : includes,
2548 link_with : [libshared],
2549 dependencies : [libkmod],
2550 install_rpath : rootlibexecdir,
2552 install_dir : rootlibexecdir)
2554 meson.add_install_script('sh', '-c',
2555 mkdir_p.format(modulesloaddir))
2556 meson.add_install_script('sh', '-c',
2557 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2560 exe = executable('systemd-nspawn',
2561 systemd_nspawn_sources,
2562 'src/core/mount-setup.c', # FIXME: use a variable?
2563 'src/core/mount-setup.h',
2564 'src/core/loopback-setup.c',
2565 'src/core/loopback-setup.h',
2566 include_directories : includes,
2567 link_with : [libnspawn_core,
2569 dependencies : [libblkid],
2570 install_rpath : rootlibexecdir,
2572 public_programs += exe
2574 if conf.get('ENABLE_NETWORKD') == 1
2575 executable('systemd-networkd',
2576 systemd_networkd_sources,
2577 include_directories : includes,
2578 link_with : [libnetworkd_core,
2582 dependencies : [threads],
2583 install_rpath : rootlibexecdir,
2585 install_dir : rootlibexecdir)
2587 executable('systemd-networkd-wait-online',
2588 systemd_networkd_wait_online_sources,
2589 include_directories : includes,
2590 link_with : [libnetworkd_core,
2592 install_rpath : rootlibexecdir,
2594 install_dir : rootlibexecdir)
2596 exe = executable('networkctl',
2598 include_directories : includes,
2599 link_with : [libsystemd_network,
2601 install_rpath : rootlibexecdir,
2603 install_dir : rootbindir)
2604 public_programs += exe
2607 executable('systemd-sulogin-shell',
2608 ['src/sulogin-shell/sulogin-shell.c'],
2609 include_directories : includes,
2610 link_with : [libshared],
2611 install_rpath : rootlibexecdir,
2613 install_dir : rootlibexecdir)
2615 ############################################################
2618 'systemd-runtest.env',
2619 output : 'systemd-runtest.env',
2620 command : ['sh', '-c', '{ ' +
2621 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2622 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2624 build_by_default : true)
2626 foreach tuple : tests
2628 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2629 dependencies = tuple[2]
2630 condition = tuple.length() >= 4 ? tuple[3] : ''
2631 type = tuple.length() >= 5 ? tuple[4] : ''
2632 defs = tuple.length() >= 6 ? tuple[5] : []
2633 incs = tuple.length() >= 7 ? tuple[6] : includes
2636 name = sources[0].split('/')[-1].split('.')[0]
2637 if type.startswith('timeout=')
2638 timeout = type.split('=')[1].to_int()
2642 if condition == '' or conf.get(condition) == 1
2646 include_directories : incs,
2647 link_with : link_with,
2648 dependencies : dependencies,
2650 build_by_default : want_tests != 'false',
2651 install_rpath : rootlibexecdir,
2652 install : install_tests,
2653 install_dir : join_paths(testsdir, type))
2656 message('@0@ is a manual test'.format(name))
2657 elif type == 'unsafe' and want_tests != 'unsafe'
2658 message('@0@ is an unsafe test'.format(name))
2659 elif want_tests != 'false'
2665 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2670 'test-libsystemd-sym',
2671 test_libsystemd_sym_c,
2672 include_directories : includes,
2673 link_with : [libsystemd],
2674 build_by_default : want_tests != 'false',
2675 install : install_tests,
2676 install_dir : testsdir)
2677 if want_tests != 'false'
2678 test('test-libsystemd-sym', exe)
2682 'test-libsystemd-static-sym',
2683 test_libsystemd_sym_c,
2684 include_directories : includes,
2685 link_with : [install_libsystemd_static],
2686 dependencies : [threads], # threads is already included in dependencies on the library,
2687 # but does not seem to get propagated. Add here as a work-around.
2688 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2689 install : install_tests and static_libsystemd_pic,
2690 install_dir : testsdir)
2691 if want_tests != 'false' and static_libsystemd_pic
2692 test('test-libsystemd-static-sym', exe)
2698 include_directories : includes,
2699 c_args : '-Wno-deprecated-declarations',
2700 link_with : [libudev],
2701 build_by_default : want_tests != 'false',
2702 install : install_tests,
2703 install_dir : testsdir)
2704 if want_tests != 'false'
2705 test('test-libudev-sym', exe)
2709 'test-libudev-static-sym',
2711 include_directories : includes,
2712 c_args : '-Wno-deprecated-declarations',
2713 link_with : [install_libudev_static],
2714 build_by_default : want_tests != 'false' and static_libudev_pic,
2715 install : install_tests and static_libudev_pic,
2716 install_dir : testsdir)
2717 if want_tests != 'false' and static_libudev_pic
2718 test('test-libudev-static-sym', exe)
2721 ############################################################
2725 foreach tuple : fuzzers
2727 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2728 dependencies = tuple[2]
2729 defs = tuple.length() >= 4 ? tuple[3] : []
2730 incs = tuple.length() >= 5 ? tuple[4] : includes
2733 dependencies += fuzzing_engine
2735 sources += 'src/fuzz/fuzz-main.c'
2738 name = sources[0].split('/')[-1].split('.')[0]
2740 fuzzer_exes += executable(
2743 include_directories : [incs, include_directories('src/fuzz')],
2744 link_with : link_with,
2745 dependencies : dependencies,
2750 run_target('fuzzers',
2751 depends : fuzzer_exes,
2754 ############################################################
2756 make_directive_index_py = find_program('tools/make-directive-index.py')
2757 make_man_index_py = find_program('tools/make-man-index.py')
2758 xml_helper_py = find_program('tools/xml_helper.py')
2759 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2763 subdir('sysusers.d')
2764 subdir('tmpfiles.d')
2769 subdir('shell-completion/bash')
2770 subdir('shell-completion/zsh')
2771 subdir('docs/sysvinit')
2772 subdir('docs/var-log')
2774 # FIXME: figure out if the warning is true:
2775 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2776 install_subdir('factory/etc',
2777 install_dir : factorydir)
2780 install_data('xorg/50-systemd-user.sh',
2781 install_dir : xinitrcdir)
2782 install_data('modprobe.d/systemd.conf',
2783 install_dir : modprobedir)
2784 install_data('LICENSE.GPL2',
2788 'docs/CODING_STYLE',
2789 'docs/DISTRO_PORTING.md',
2790 'docs/ENVIRONMENT.md',
2792 'docs/TRANSIENT-SETTINGS.md',
2793 'docs/TRANSLATORS.md',
2794 'docs/UIDS-GIDS.md',
2795 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2796 install_dir : docdir)
2798 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2799 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2801 ############################################################
2803 meson_check_help = find_program('tools/meson-check-help.sh')
2805 foreach exec : public_programs
2806 name = exec.full_path().split('/')[-1]
2807 if want_tests != 'false'
2808 test('check-help-' + name,
2810 args : exec.full_path())
2814 ############################################################
2816 # Enable tests for all supported sanitizers
2817 foreach tuple : sanitizers
2818 sanitizer = tuple[0]
2821 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2823 foreach p : fuzz_regression_tests
2824 b = p.split('/')[-2]
2825 c = p.split('/')[-1]
2827 name = '@0@:@1@'.format(b, sanitizer)
2830 if want_tests == 'false'
2831 message('Not compiling @0@ because tests is set to false'.format(name))
2833 exe = custom_target(
2837 command : [env, 'ln', '-fs',
2838 join_paths(build.full_path(), b),
2840 build_by_default : true)
2842 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2847 if want_tests != 'false' and slow_tests
2848 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2850 args : [exe.full_path(),
2851 join_paths(meson.source_root(),
2852 'test/fuzz-regressions',
2860 ############################################################
2863 all_files = run_command(
2865 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2868 all_files = files(all_files.stdout().split())
2873 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2876 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2880 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2883 command : [meson_git_contrib_sh])
2887 git_head = run_command(
2889 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2890 'rev-parse', 'HEAD']).stdout().strip()
2891 git_head_short = run_command(
2893 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2894 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2898 command : ['git', 'archive',
2899 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2901 '--prefix', 'systemd-@0@/'.format(git_head),
2905 ############################################################
2907 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2910 depends : [man, libsystemd, libudev],
2911 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2913 ############################################################
2916 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2918 'split /usr: @0@'.format(split_usr),
2919 'split bin-sbin: @0@'.format(split_bin),
2920 'prefix directory: @0@'.format(prefixdir),
2921 'rootprefix directory: @0@'.format(rootprefixdir),
2922 'sysconf directory: @0@'.format(sysconfdir),
2923 'include directory: @0@'.format(includedir),
2924 'lib directory: @0@'.format(libdir),
2925 'rootlib directory: @0@'.format(rootlibdir),
2926 'SysV init scripts: @0@'.format(sysvinit_path),
2927 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2928 'PAM modules directory: @0@'.format(pamlibdir),
2929 'PAM configuration directory: @0@'.format(pamconfdir),
2930 'RPM macros directory: @0@'.format(rpmmacrosdir),
2931 'modprobe.d directory: @0@'.format(modprobedir),
2932 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2933 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2934 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2935 'bash completions directory: @0@'.format(bashcompletiondir),
2936 'zsh completions directory: @0@'.format(zshcompletiondir),
2937 'extra start script: @0@'.format(get_option('rc-local')),
2938 'extra stop script: @0@'.format(get_option('halt-local')),
2939 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2940 get_option('debug-tty')),
2941 'TTY GID: @0@'.format(tty_gid),
2942 'users GID: @0@'.format(substs.get('USERS_GID')),
2943 'maximum system UID: @0@'.format(system_uid_max),
2944 'maximum system GID: @0@'.format(system_gid_max),
2945 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2946 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2947 'minimum container UID base: @0@'.format(container_uid_base_min),
2948 'maximum container UID base: @0@'.format(container_uid_base_max),
2949 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2950 'render group access mode: @0@'.format(get_option('group-render-mode')),
2951 'certificate root directory: @0@'.format(get_option('certificate-root')),
2952 'support URL: @0@'.format(support_url),
2953 'nobody user name: @0@'.format(nobody_user),
2954 'nobody group name: @0@'.format(nobody_group),
2955 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2956 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2958 'default DNSSEC mode: @0@'.format(default_dnssec),
2959 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
2960 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2961 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2963 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2964 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2966 'default DNS servers: @0@'.format(alt_dns_servers),
2967 'default NTP servers: @0@'.format(alt_ntp_servers)]
2969 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2970 '@@0@'.format(time_epoch)).stdout().strip()
2972 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2975 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2976 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2977 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2979 if conf.get('ENABLE_EFI') == 1
2980 status += 'efi arch: @0@'.format(efi_arch)
2984 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2985 'EFI CC @0@'.format(efi_cc),
2986 'EFI lib directory: @0@'.format(efi_libdir),
2987 'EFI lds directory: @0@'.format(efi_ldsdir),
2988 'EFI include directory: @0@'.format(efi_incdir)]
3040 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3041 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3044 ['legacy pkla', install_polkit_pkla],
3046 ['gnu-efi', have_gnu_efi],
3053 ['nss-myhostname', conf.get('ENABLE_NSS_MYHOSTNAME') == 1],
3054 ['nss-mymachines', conf.get('ENABLE_NSS_MYMACHINES') == 1],
3055 ['nss-resolve', conf.get('ENABLE_NSS_RESOLVE') == 1],
3056 ['nss-systemd', conf.get('ENABLE_NSS_SYSTEMD') == 1],
3059 ['man pages', want_man],
3060 ['html pages', want_html],
3061 ['man page indices', want_man and have_lxml],
3066 ['adm group', get_option('adm-group')],
3067 ['wheel group', get_option('wheel-group')],
3070 ['debug mmap cache'],
3071 ['valgrind', conf.get('VALGRIND') == 1],
3074 if tuple.length() >= 2
3077 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3078 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3079 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3090 'enabled features: @0@'.format(', '.join(found)),
3092 'disabled features: @0@'.format(', '.join(missing)),
3094 message('\n '.join(status))
3096 if rootprefixdir != rootprefix_default
3098 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3099 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3100 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))