1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
12 meson_version : '>= 0.46',
15 libsystemd_version = '0.23.0'
16 libudev_version = '1.6.11'
18 # We need the same data in two different formats, ugh!
19 # Also, for hysterical reasons, we use different variable
20 # names, sometimes. Not all variables are included in every
22 conf = configuration_data()
23 conf.set_quoted('PACKAGE_STRING', meson.project_name() + ' ' + meson.project_version())
24 conf.set_quoted('PACKAGE_VERSION', meson.project_version())
26 substs = configuration_data()
27 substs.set('PACKAGE_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
28 substs.set('PACKAGE_VERSION', meson.project_version())
30 want_ossfuzz = get_option('oss-fuzz')
31 want_libfuzzer = get_option('llvm-fuzz')
32 if want_ossfuzz and want_libfuzzer
33 error('only one of oss-fuzz and llvm-fuzz can be specified')
35 fuzzer_build = want_ossfuzz or want_libfuzzer
37 #####################################################################
39 # Try to install the git pre-commit hook
40 git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
41 if git_hook.returncode() == 0
42 message(git_hook.stdout().strip())
45 #####################################################################
47 if get_option('split-usr') == 'auto'
48 split_usr = run_command('test', '-L', '/bin').returncode() != 0
50 split_usr = get_option('split-usr') == 'true'
52 conf.set10('HAVE_SPLIT_USR', split_usr,
53 description : '/usr/bin and /bin directories are separate')
55 if get_option('split-bin') == 'auto'
56 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
58 split_bin = get_option('split-bin') == 'true'
60 conf.set10('HAVE_SPLIT_BIN', split_bin,
61 description : 'bin and sbin directories are separate')
63 rootprefixdir = get_option('rootprefix')
64 # Unusual rootprefixdir values are used by some distros
65 # (see https://github.com/systemd/systemd/pull/7461).
66 rootprefix_default = split_usr ? '/' : '/usr'
67 if rootprefixdir == ''
68 rootprefixdir = rootprefix_default
71 sysvinit_path = get_option('sysvinit-path')
72 sysvrcnd_path = get_option('sysvrcnd-path')
73 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
74 description : 'SysV init scripts and rcN.d links are supported')
76 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
77 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
78 conf.set('HIGH_RLIMIT_NOFILE', 256*1024)
80 # join_paths ignore the preceding arguments if an absolute component is
81 # encountered, so this should canonicalize various paths when they are
82 # absolute or relative.
83 prefixdir = get_option('prefix')
84 if not prefixdir.startswith('/')
85 error('Prefix is not absolute: "@0@"'.format(prefixdir))
87 bindir = join_paths(prefixdir, get_option('bindir'))
88 libdir = join_paths(prefixdir, get_option('libdir'))
89 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
90 includedir = join_paths(prefixdir, get_option('includedir'))
91 datadir = join_paths(prefixdir, get_option('datadir'))
92 localstatedir = join_paths('/', get_option('localstatedir'))
94 rootbindir = join_paths(rootprefixdir, 'bin')
95 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
96 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
98 rootlibdir = get_option('rootlibdir')
100 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
103 # Dirs of external packages
104 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
105 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
106 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
107 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
108 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
109 varlogdir = join_paths(localstatedir, 'log')
110 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
111 rpmmacrosdir = get_option('rpmmacrosdir')
112 if rpmmacrosdir != 'no'
113 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
115 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
118 pkgdatadir = join_paths(datadir, 'systemd')
119 environmentdir = join_paths(prefixdir, 'lib/environment.d')
120 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
121 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
122 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
123 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
124 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
125 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
126 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
127 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
128 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
129 pkgincludedir = join_paths(includedir, 'systemd')
130 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
131 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
132 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
133 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
134 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
135 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
136 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
137 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
138 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
139 udevhomedir = udevlibexecdir
140 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
141 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
142 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
143 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
144 factorydir = join_paths(datadir, 'factory')
145 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
146 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
147 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
148 catalogstatedir = join_paths(systemdstatedir, 'catalog')
149 randomseeddir = join_paths(localstatedir, 'lib/systemd')
150 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
152 docdir = get_option('docdir')
154 docdir = join_paths(datadir, 'doc/systemd')
157 dbuspolicydir = get_option('dbuspolicydir')
158 if dbuspolicydir == ''
159 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
162 dbussessionservicedir = get_option('dbussessionservicedir')
163 if dbussessionservicedir == ''
164 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
167 dbussystemservicedir = get_option('dbussystemservicedir')
168 if dbussystemservicedir == ''
169 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
172 pamlibdir = get_option('pamlibdir')
174 pamlibdir = join_paths(rootlibdir, 'security')
177 pamconfdir = get_option('pamconfdir')
179 pamconfdir = join_paths(sysconfdir, 'pam.d')
182 memory_accounting_default = get_option('memory-accounting-default')
184 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
185 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
186 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
187 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
188 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
189 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
190 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
192 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
194 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
195 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
196 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
197 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
198 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
199 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
200 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
201 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
202 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
203 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
204 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
205 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
206 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
207 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
208 conf.set_quoted('ROOTPREFIX', rootprefixdir)
209 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
210 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
211 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
212 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
213 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
214 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
215 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
216 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
217 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
218 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
219 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
220 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
221 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
222 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
223 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
224 conf.set_quoted('LIBDIR', libdir)
225 conf.set_quoted('ROOTLIBDIR', rootlibdir)
226 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
227 conf.set_quoted('BOOTLIBDIR', bootlibdir)
228 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
229 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
230 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
231 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
232 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
233 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
234 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
235 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
237 substs.set('prefix', prefixdir)
238 substs.set('exec_prefix', prefixdir)
239 substs.set('libdir', libdir)
240 substs.set('rootlibdir', rootlibdir)
241 substs.set('includedir', includedir)
242 substs.set('pkgsysconfdir', pkgsysconfdir)
243 substs.set('bindir', bindir)
244 substs.set('rootbindir', rootbindir)
245 substs.set('rootlibexecdir', rootlibexecdir)
246 substs.set('systemunitdir', systemunitdir)
247 substs.set('userunitdir', userunitdir)
248 substs.set('systempresetdir', systempresetdir)
249 substs.set('userpresetdir', userpresetdir)
250 substs.set('udevhwdbdir', udevhwdbdir)
251 substs.set('udevrulesdir', udevrulesdir)
252 substs.set('udevlibexecdir', udevlibexecdir)
253 substs.set('environmentdir', environmentdir)
254 substs.set('catalogdir', catalogdir)
255 substs.set('tmpfilesdir', tmpfilesdir)
256 substs.set('sysusersdir', sysusersdir)
257 substs.set('sysctldir', sysctldir)
258 substs.set('binfmtdir', binfmtdir)
259 substs.set('modulesloaddir', modulesloaddir)
260 substs.set('modprobedir', modprobedir)
261 substs.set('systemgeneratordir', systemgeneratordir)
262 substs.set('usergeneratordir', usergeneratordir)
263 substs.set('systemenvgeneratordir', systemenvgeneratordir)
264 substs.set('userenvgeneratordir', userenvgeneratordir)
265 substs.set('systemshutdowndir', systemshutdowndir)
266 substs.set('systemsleepdir', systemsleepdir)
267 substs.set('VARLOGDIR', varlogdir)
268 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
269 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
270 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
271 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
272 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
273 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
274 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
275 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
276 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
278 #####################################################################
280 cc = meson.get_compiler('c')
281 pkgconfig = import('pkgconfig')
282 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
283 meson_build_sh = find_program('tools/meson-build.sh')
285 want_tests = get_option('tests')
286 slow_tests = want_tests != 'false' and get_option('slow-tests')
287 install_tests = get_option('install-tests')
289 cxx = find_program('c++', required : fuzzer_build)
291 # Used only for tests
293 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
299 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
301 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
304 possible_cc_flags = [
308 '-Wmissing-include-dirs',
309 '-Wold-style-definition',
313 '-Wsuggest-attribute=noreturn',
314 '-Werror=missing-prototypes',
315 '-Werror=implicit-function-declaration',
316 '-Werror=missing-declarations',
317 '-Werror=return-type',
318 '-Werror=incompatible-pointer-types',
320 '-Wstrict-prototypes',
322 '-Wmissing-noreturn',
323 '-Wimplicit-fallthrough=5',
326 '-Wstrict-aliasing=2',
329 '-Werror=shift-count-overflow',
330 '-Werror=shift-overflow=2',
334 # negative arguments are correctly detected starting with meson 0.46.
335 '-Wno-unused-parameter',
336 '-Wno-missing-field-initializers',
337 '-Wno-unused-result',
338 '-Wno-format-signedness',
340 # work-around for gcc 7.1 turning this on on its own.
341 '-Wno-error=nonnull',
343 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
344 # optimizations enabled, producing essentially false positives.
345 '-Wno-maybe-uninitialized',
349 '-fdiagnostics-show-option',
350 '-fno-strict-aliasing',
351 '-fvisibility=hidden',
353 '-fstack-protector-strong',
354 '--param=ssp-buffer-size=4',
357 # --as-needed and --no-undefined are provided by meson by default,
358 # run mesonconf to see what is enabled
359 possible_link_flags = [
364 # the oss-fuzz fuzzers are not built with -fPIE, so don't
365 # enable it when we are linking against them
367 possible_cc_flags += '-fPIE'
368 possible_link_flags += '-pie'
371 if cc.get_id() == 'clang'
372 possible_cc_flags += [
373 '-Wno-typedef-redefinition',
374 '-Wno-gnu-variable-sized-type-not-at-end',
378 if get_option('buildtype') != 'debug'
379 possible_cc_flags += [
380 '-ffunction-sections',
384 possible_link_flags += '-Wl,--gc-sections'
387 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
388 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
392 #include <inttypes.h>
393 typedef uint64_t usec_t;
394 usec_t now(clockid_t clock);
399 ''', name : '-Werror=shadow with local shadowing')
400 add_project_arguments('-Werror=shadow', language : 'c')
403 cpp = ' '.join(cc.cmd_array()) + ' -E'
405 #####################################################################
406 # compilation result tests
408 conf.set('_GNU_SOURCE', true)
409 conf.set('__SANE_USERSPACE_TYPES__', true)
411 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
412 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
413 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
414 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
415 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
416 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
417 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
421 #include <linux/ethtool.h>
422 #include <linux/fib_rules.h>
423 #include <sys/stat.h>
426 foreach decl : ['char16_t',
428 'struct ethtool_link_settings',
429 'struct fib_rule_uid_range',
433 # We get -1 if the size cannot be determined
434 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
436 if decl == 'struct statx'
438 want_linux_stat_h = false
440 have = cc.sizeof(decl,
441 prefix : decl_headers + '#include <linux/stat.h>',
442 args : '-D_GNU_SOURCE') > 0
443 want_linux_stat_h = have
447 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
450 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
452 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
453 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
454 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
455 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
456 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
457 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
458 ['IFLA_BOND_AD_ACTOR_SYSTEM', 'linux/if_link.h'],
459 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
460 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
461 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
462 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
463 # if_tunnel.h is buggy and cannot be included on its own
464 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
465 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
466 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
467 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
468 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
469 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
470 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
471 ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
472 ['NDA_IFINDEX', 'linux/neighbour.h'],
473 ['IFA_FLAGS', 'linux/if_addr.h'],
474 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
475 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
476 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
477 ['FOU_ATTR_REMCSUM_NOPARTIAL', 'linux/fou.h'],
478 ['FOU_CMD_GET', 'linux/fou.h'],
480 prefix = decl.length() > 2 ? decl[2] : ''
481 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
482 conf.set10('HAVE_' + decl[0], have)
485 foreach ident : ['secure_getenv', '__secure_getenv']
486 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
490 ['memfd_create', '''#include <sys/mman.h>'''],
491 ['gettid', '''#include <sys/types.h>
492 #include <unistd.h>'''],
493 ['pivot_root', '''#include <stdlib.h>
494 #include <unistd.h>'''], # no known header declares pivot_root
495 ['name_to_handle_at', '''#include <sys/types.h>
496 #include <sys/stat.h>
497 #include <fcntl.h>'''],
498 ['setns', '''#include <sched.h>'''],
499 ['renameat2', '''#include <stdio.h>
500 #include <fcntl.h>'''],
501 ['kcmp', '''#include <linux/kcmp.h>'''],
502 ['keyctl', '''#include <sys/types.h>
503 #include <keyutils.h>'''],
504 ['copy_file_range', '''#include <sys/syscall.h>
505 #include <unistd.h>'''],
506 ['bpf', '''#include <sys/syscall.h>
507 #include <unistd.h>'''],
508 ['statx', '''#include <sys/types.h>
509 #include <sys/stat.h>
510 #include <unistd.h>'''],
511 ['explicit_bzero' , '''#include <string.h>'''],
512 ['reallocarray', '''#include <malloc.h>'''],
515 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
516 conf.set10('HAVE_' + ident[0].to_upper(), have)
519 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
520 conf.set10('USE_SYS_RANDOM_H', true)
521 conf.set10('HAVE_GETRANDOM', true)
523 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
524 conf.set10('USE_SYS_RANDOM_H', false)
525 conf.set10('HAVE_GETRANDOM', have)
528 #####################################################################
530 sed = find_program('sed')
531 awk = find_program('awk')
532 m4 = find_program('m4')
533 stat = find_program('stat')
534 git = find_program('git', required : false)
535 env = find_program('env')
536 perl = find_program('perl', required : false)
538 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
539 mkdir_p = 'mkdir -p $DESTDIR/@0@'
540 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
541 splash_bmp = files('test/splash.bmp')
543 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
544 # /usr/sbin, /sbin, and fall back to the default from middle column.
545 progs = [['quotaon', '/usr/sbin/quotaon' ],
546 ['quotacheck', '/usr/sbin/quotacheck' ],
547 ['kmod', '/usr/bin/kmod' ],
548 ['kexec', '/usr/sbin/kexec' ],
549 ['sulogin', '/usr/sbin/sulogin' ],
550 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
551 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
552 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
553 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
556 path = get_option(prog[0] + '-path')
558 message('Using @1@ for @0@'.format(prog[0], path))
560 exe = find_program(prog[0],
561 '/usr/sbin/' + prog[0],
564 path = exe.found() ? exe.path() : prog[1]
566 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
567 conf.set_quoted(name, path)
568 substs.set(name, path)
571 conf.set_quoted('TELINIT', get_option('telinit-path'))
573 if run_command('ln', '--relative', '--help').returncode() != 0
574 error('ln does not support --relative (added in coreutils 8.16)')
577 ############################################################
579 gperf = find_program('gperf')
581 gperf_test_format = '''
583 const char * in_word_set(const char *, @0@);
586 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
587 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
588 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
589 if cc.compiles(gperf_test)
590 gperf_len_type = 'size_t'
592 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
593 if cc.compiles(gperf_test)
594 gperf_len_type = 'unsigned'
596 error('unable to determine gperf len type')
599 message('gperf len type is @0@'.format(gperf_len_type))
600 conf.set('GPERF_LEN_TYPE', gperf_len_type,
601 description : 'The type of gperf "len" parameter')
603 ############################################################
605 if not cc.has_header('sys/capability.h')
606 error('POSIX caps headers not found')
608 foreach header : ['crypt.h',
612 'linux/vm_sockets.h',
614 'valgrind/memcheck.h',
615 'valgrind/valgrind.h',
618 conf.set10('HAVE_' + header.underscorify().to_upper(),
619 cc.has_header(header))
622 ############################################################
624 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
625 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
626 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
628 default_hierarchy = get_option('default-hierarchy')
629 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
630 description : 'default cgroup hierarchy as string')
631 if default_hierarchy == 'legacy'
632 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
633 elif default_hierarchy == 'hybrid'
634 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
636 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
639 time_epoch = get_option('time-epoch')
642 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
644 conf.set('TIME_EPOCH', time_epoch)
646 system_uid_max = get_option('system-uid-max')
647 if system_uid_max == -1
648 system_uid_max = run_command(
650 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
651 '/etc/login.defs').stdout().strip()
652 if system_uid_max == ''
655 system_uid_max = system_uid_max.to_int()
658 conf.set('SYSTEM_UID_MAX', system_uid_max)
659 substs.set('systemuidmax', system_uid_max)
661 system_gid_max = get_option('system-gid-max')
662 if system_gid_max == -1
663 system_gid_max = run_command(
665 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
666 '/etc/login.defs').stdout().strip()
667 if system_gid_max == ''
670 system_gid_max = system_gid_max.to_int()
673 conf.set('SYSTEM_GID_MAX', system_gid_max)
674 substs.set('systemgidmax', system_gid_max)
676 dynamic_uid_min = get_option('dynamic-uid-min')
677 dynamic_uid_max = get_option('dynamic-uid-max')
678 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
679 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
680 substs.set('dynamicuidmin', dynamic_uid_min)
681 substs.set('dynamicuidmax', dynamic_uid_max)
683 container_uid_base_min = get_option('container-uid-base-min')
684 container_uid_base_max = get_option('container-uid-base-max')
685 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
686 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
687 substs.set('containeruidbasemin', container_uid_base_min)
688 substs.set('containeruidbasemax', container_uid_base_max)
690 nobody_user = get_option('nobody-user')
691 nobody_group = get_option('nobody-group')
693 if not meson.is_cross_build()
694 getent_result = run_command('getent', 'passwd', '65534')
695 if getent_result.returncode() == 0
696 name = getent_result.stdout().split(':')[0]
697 if name != nobody_user
699 '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) +
700 'Your build will result in an user table setup that is incompatible with the local system.')
703 id_result = run_command('id', '-u', nobody_user)
704 if id_result.returncode() == 0
705 id = id_result.stdout().to_int()
708 '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) +
709 'Your build will result in an user table setup that is incompatible with the local system.')
713 getent_result = run_command('getent', 'group', '65534')
714 if getent_result.returncode() == 0
715 name = getent_result.stdout().split(':')[0]
716 if name != nobody_group
718 '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) +
719 'Your build will result in an group table setup that is incompatible with the local system.')
722 id_result = run_command('id', '-g', nobody_group)
723 if id_result.returncode() == 0
724 id = id_result.stdout().to_int()
727 '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) +
728 'Your build will result in an group table setup that is incompatible with the local system.')
732 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
734 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
735 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
738 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
739 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
740 substs.set('NOBODY_USER_NAME', nobody_user)
741 substs.set('NOBODY_GROUP_NAME', nobody_group)
743 tty_gid = get_option('tty-gid')
744 conf.set('TTY_GID', tty_gid)
745 substs.set('TTY_GID', tty_gid)
747 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
748 users_gid = get_option('users-gid')
749 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
751 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
752 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
754 dev_kvm_mode = get_option('dev-kvm-mode')
755 substs.set('DEV_KVM_MODE', dev_kvm_mode)
756 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
757 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
759 kill_user_processes = get_option('default-kill-user-processes')
760 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
761 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
762 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
764 dns_servers = get_option('dns-servers')
765 conf.set_quoted('DNS_SERVERS', dns_servers)
766 substs.set('DNS_SERVERS', dns_servers)
768 ntp_servers = get_option('ntp-servers')
769 conf.set_quoted('NTP_SERVERS', ntp_servers)
770 substs.set('NTP_SERVERS', ntp_servers)
772 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
774 substs.set('SUSHELL', get_option('debug-shell'))
775 substs.set('DEBUGTTY', get_option('debug-tty'))
777 enable_debug_hashmap = false
778 enable_debug_mmap_cache = false
779 foreach name : get_option('debug-extra')
781 enable_debug_hashmap = true
782 elif name == 'mmap-cache'
783 enable_debug_mmap_cache = true
785 message('unknown debug option "@0@", ignoring'.format(name))
788 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
789 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
791 conf.set10('VALGRIND', get_option('valgrind'))
792 conf.set10('LOG_TRACE', get_option('log-trace'))
794 #####################################################################
796 threads = dependency('threads')
797 librt = cc.find_library('rt')
798 libm = cc.find_library('m')
799 libdl = cc.find_library('dl')
800 libcrypt = cc.find_library('crypt')
802 libcap = dependency('libcap', required : false)
803 if not libcap.found()
804 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
805 libcap = cc.find_library('cap')
808 libmount = dependency('mount',
809 version : fuzzer_build ? '>= 0' : '>= 2.30')
811 want_seccomp = get_option('seccomp')
812 if want_seccomp != 'false' and not fuzzer_build
813 libseccomp = dependency('libseccomp',
814 version : '>= 2.3.1',
815 required : want_seccomp == 'true')
816 have = libseccomp.found()
821 conf.set10('HAVE_SECCOMP', have)
823 want_selinux = get_option('selinux')
824 if want_selinux != 'false' and not fuzzer_build
825 libselinux = dependency('libselinux',
826 version : '>= 2.1.9',
827 required : want_selinux == 'true')
828 have = libselinux.found()
833 conf.set10('HAVE_SELINUX', have)
835 want_apparmor = get_option('apparmor')
836 if want_apparmor != 'false' and not fuzzer_build
837 libapparmor = dependency('libapparmor',
838 required : want_apparmor == 'true')
839 have = libapparmor.found()
844 conf.set10('HAVE_APPARMOR', have)
846 smack_run_label = get_option('smack-run-label')
847 if smack_run_label != ''
848 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
851 want_polkit = get_option('polkit')
852 install_polkit = false
853 install_polkit_pkla = false
854 if want_polkit != 'false' and not fuzzer_build
855 install_polkit = true
857 libpolkit = dependency('polkit-gobject-1',
859 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
860 message('Old polkit detected, will install pkla files')
861 install_polkit_pkla = true
864 conf.set10('ENABLE_POLKIT', install_polkit)
866 want_acl = get_option('acl')
867 if want_acl != 'false' and not fuzzer_build
868 libacl = cc.find_library('acl', required : want_acl == 'true')
869 have = libacl.found()
874 conf.set10('HAVE_ACL', have)
876 want_audit = get_option('audit')
877 if want_audit != 'false' and not fuzzer_build
878 libaudit = dependency('audit', required : want_audit == 'true')
879 have = libaudit.found()
884 conf.set10('HAVE_AUDIT', have)
886 want_blkid = get_option('blkid')
887 if want_blkid != 'false' and not fuzzer_build
888 libblkid = dependency('blkid', required : want_blkid == 'true')
889 have = libblkid.found()
894 conf.set10('HAVE_BLKID', have)
896 want_kmod = get_option('kmod')
897 if want_kmod != 'false' and not fuzzer_build
898 libkmod = dependency('libkmod',
900 required : want_kmod == 'true')
901 have = libkmod.found()
906 conf.set10('HAVE_KMOD', have)
908 want_pam = get_option('pam')
909 if want_pam != 'false' and not fuzzer_build
910 libpam = cc.find_library('pam', required : want_pam == 'true')
911 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
912 have = libpam.found() and libpam_misc.found()
918 conf.set10('HAVE_PAM', have)
920 want_microhttpd = get_option('microhttpd')
921 if want_microhttpd != 'false' and not fuzzer_build
922 libmicrohttpd = dependency('libmicrohttpd',
923 version : '>= 0.9.33',
924 required : want_microhttpd == 'true')
925 have = libmicrohttpd.found()
930 conf.set10('HAVE_MICROHTTPD', have)
932 want_libcryptsetup = get_option('libcryptsetup')
933 if want_libcryptsetup != 'false' and not fuzzer_build
934 libcryptsetup = dependency('libcryptsetup',
935 version : '>= 1.6.0',
936 required : want_libcryptsetup == 'true')
937 have = libcryptsetup.found()
938 have_sector = cc.has_member(
939 'struct crypt_params_plain',
941 prefix : '#include <libcryptsetup.h>')
947 conf.set10('HAVE_LIBCRYPTSETUP', have)
948 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
950 want_libcurl = get_option('libcurl')
951 if want_libcurl != 'false' and not fuzzer_build
952 libcurl = dependency('libcurl',
953 version : '>= 7.32.0',
954 required : want_libcurl == 'true')
955 have = libcurl.found()
960 conf.set10('HAVE_LIBCURL', have)
962 want_libidn = get_option('libidn')
963 want_libidn2 = get_option('libidn2')
964 if want_libidn == 'true' and want_libidn2 == 'true'
965 error('libidn and libidn2 cannot be requested simultaneously')
968 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
969 libidn = dependency('libidn',
970 required : want_libidn == 'true')
971 have = libidn.found()
976 conf.set10('HAVE_LIBIDN', have)
977 if not have and want_libidn2 != 'false' and not fuzzer_build
978 # libidn is used for both libidn and libidn2 objects
979 libidn = dependency('libidn2',
980 required : want_libidn2 == 'true')
981 have = libidn.found()
985 conf.set10('HAVE_LIBIDN2', have)
987 want_libiptc = get_option('libiptc')
988 if want_libiptc != 'false' and not fuzzer_build
989 libiptc = dependency('libiptc',
990 required : want_libiptc == 'true')
991 have = libiptc.found()
996 conf.set10('HAVE_LIBIPTC', have)
998 want_qrencode = get_option('qrencode')
999 if want_qrencode != 'false' and not fuzzer_build
1000 libqrencode = dependency('libqrencode',
1001 required : want_qrencode == 'true')
1002 have = libqrencode.found()
1007 conf.set10('HAVE_QRENCODE', have)
1009 want_gcrypt = get_option('gcrypt')
1010 if want_gcrypt != 'false' and not fuzzer_build
1011 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1012 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1013 have = libgcrypt.found() and libgpg_error.found()
1018 # link to neither of the libs if one is not found
1022 conf.set10('HAVE_GCRYPT', have)
1024 want_gnutls = get_option('gnutls')
1025 if want_gnutls != 'false' and not fuzzer_build
1026 libgnutls = dependency('gnutls',
1027 version : '>= 3.1.4',
1028 required : want_gnutls == 'true')
1029 have = libgnutls.found()
1034 conf.set10('HAVE_GNUTLS', have)
1036 want_openssl = get_option('openssl')
1037 if want_openssl != 'false' and not fuzzer_build
1038 libopenssl = dependency('openssl',
1039 version : '>= 1.1.0',
1040 required : want_openssl == 'true')
1041 have = libopenssl.found()
1046 conf.set10('HAVE_OPENSSL', have)
1048 want_elfutils = get_option('elfutils')
1049 if want_elfutils != 'false' and not fuzzer_build
1050 libdw = dependency('libdw',
1051 required : want_elfutils == 'true')
1052 have = libdw.found()
1057 conf.set10('HAVE_ELFUTILS', have)
1059 want_zlib = get_option('zlib')
1060 if want_zlib != 'false' and not fuzzer_build
1061 libz = dependency('zlib',
1062 required : want_zlib == 'true')
1068 conf.set10('HAVE_ZLIB', have)
1070 want_bzip2 = get_option('bzip2')
1071 if want_bzip2 != 'false' and not fuzzer_build
1072 libbzip2 = cc.find_library('bz2',
1073 required : want_bzip2 == 'true')
1074 have = libbzip2.found()
1079 conf.set10('HAVE_BZIP2', have)
1081 want_xz = get_option('xz')
1082 if want_xz != 'false' and not fuzzer_build
1083 libxz = dependency('liblzma',
1084 required : want_xz == 'true')
1085 have = libxz.found()
1090 conf.set10('HAVE_XZ', have)
1092 want_lz4 = get_option('lz4')
1093 if want_lz4 != 'false' and not fuzzer_build
1094 liblz4 = dependency('liblz4',
1095 version : '>= 1.3.0',
1096 required : want_lz4 == 'true')
1097 have = liblz4.found()
1102 conf.set10('HAVE_LZ4', have)
1104 want_xkbcommon = get_option('xkbcommon')
1105 if want_xkbcommon != 'false' and not fuzzer_build
1106 libxkbcommon = dependency('xkbcommon',
1107 version : '>= 0.3.0',
1108 required : want_xkbcommon == 'true')
1109 have = libxkbcommon.found()
1114 conf.set10('HAVE_XKBCOMMON', have)
1116 want_pcre2 = get_option('pcre2')
1117 if want_pcre2 != 'false'
1118 libpcre2 = dependency('libpcre2-8',
1119 required : want_pcre2 == 'true')
1120 have = libpcre2.found()
1125 conf.set10('HAVE_PCRE2', have)
1127 want_glib = get_option('glib')
1128 if want_glib != 'false' and not fuzzer_build
1129 libglib = dependency('glib-2.0',
1130 version : '>= 2.22.0',
1131 required : want_glib == 'true')
1132 libgobject = dependency('gobject-2.0',
1133 version : '>= 2.22.0',
1134 required : want_glib == 'true')
1135 libgio = dependency('gio-2.0',
1136 required : want_glib == 'true')
1137 have = libglib.found() and libgobject.found() and libgio.found()
1144 conf.set10('HAVE_GLIB', have)
1146 want_dbus = get_option('dbus')
1147 if want_dbus != 'false' and not fuzzer_build
1148 libdbus = dependency('dbus-1',
1149 version : '>= 1.3.2',
1150 required : want_dbus == 'true')
1151 have = libdbus.found()
1156 conf.set10('HAVE_DBUS', have)
1158 default_dnssec = get_option('default-dnssec')
1160 default_dnssec = 'no'
1162 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1163 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1164 default_dnssec = 'no'
1166 conf.set('DEFAULT_DNSSEC_MODE',
1167 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1168 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1170 dns_over_tls = get_option('dns-over-tls')
1171 if dns_over_tls != 'false'
1172 if dns_over_tls == 'openssl'
1175 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1176 if dns_over_tls == 'gnutls' and not have_gnutls
1177 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1180 if dns_over_tls == 'gnutls' or have_gnutls
1181 have_openssl = false
1183 have_openssl = conf.get('HAVE_OPENSSL') == 1
1184 if dns_over_tls != 'auto' and not have_openssl
1185 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1186 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1189 have = have_gnutls or have_openssl
1193 have_openssl = false
1195 conf.set10('ENABLE_DNS_OVER_TLS', have)
1196 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1197 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1199 default_dns_over_tls = get_option('default-dns-over-tls')
1201 default_dns_over_tls = 'no'
1203 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1204 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1205 default_dns_over_tls = 'no'
1207 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1208 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1209 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1211 want_importd = get_option('importd')
1212 if want_importd != 'false'
1213 have = (conf.get('HAVE_LIBCURL') == 1 and
1214 conf.get('HAVE_ZLIB') == 1 and
1215 conf.get('HAVE_XZ') == 1 and
1216 conf.get('HAVE_GCRYPT') == 1)
1217 if want_importd == 'true' and not have
1218 error('importd support was requested, but dependencies are not available')
1223 conf.set10('ENABLE_IMPORTD', have)
1225 want_remote = get_option('remote')
1226 if want_remote != 'false'
1227 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1228 conf.get('HAVE_LIBCURL') == 1]
1229 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1230 # it's possible to build one without the other. Complain only if
1231 # support was explictly requested. The auxiliary files like sysusers
1232 # config should be installed when any of the programs are built.
1233 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1234 error('remote support was requested, but dependencies are not available')
1236 have = have_deps[0] or have_deps[1]
1240 conf.set10('ENABLE_REMOTE', have)
1242 foreach term : ['utmp',
1274 have = get_option(term)
1275 name = 'ENABLE_' + term.underscorify().to_upper()
1276 conf.set10(name, have)
1279 foreach tuple : [['nss-mymachines', 'machined'],
1280 ['nss-resolve', 'resolve']]
1281 want = get_option(tuple[0])
1283 have = get_option(tuple[1])
1284 if want == 'true' and not have
1285 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1290 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1291 conf.set10(name, have)
1295 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1296 'ENABLE_NSS_MYMACHINES',
1297 'ENABLE_NSS_RESOLVE',
1298 'ENABLE_NSS_SYSTEMD']
1299 if conf.get(term) == 1
1303 conf.set10('ENABLE_NSS', enable_nss)
1305 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1310 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1312 #####################################################################
1314 if get_option('efi')
1315 efi_arch = host_machine.cpu_family()
1317 if efi_arch == 'x86'
1318 EFI_MACHINE_TYPE_NAME = 'ia32'
1319 gnu_efi_arch = 'ia32'
1320 elif efi_arch == 'x86_64'
1321 EFI_MACHINE_TYPE_NAME = 'x64'
1322 gnu_efi_arch = 'x86_64'
1323 elif efi_arch == 'arm'
1324 EFI_MACHINE_TYPE_NAME = 'arm'
1325 gnu_efi_arch = 'arm'
1326 elif efi_arch == 'aarch64'
1327 EFI_MACHINE_TYPE_NAME = 'aa64'
1328 gnu_efi_arch = 'aarch64'
1330 EFI_MACHINE_TYPE_NAME = ''
1335 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1337 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1341 conf.set10('ENABLE_EFI', have)
1343 #####################################################################
1345 config_h = configure_file(
1346 output : 'config.h',
1347 configuration : conf)
1349 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1351 includes = include_directories('src/basic',
1355 'src/journal-remote',
1359 'src/time-wait-sync',
1364 'src/libsystemd/sd-bus',
1365 'src/libsystemd/sd-device',
1366 'src/libsystemd/sd-hwdb',
1367 'src/libsystemd/sd-id128',
1368 'src/libsystemd/sd-netlink',
1369 'src/libsystemd/sd-network',
1370 'src/libsystemd-network',
1373 add_project_arguments('-include', 'config.h', language : 'c')
1377 subdir('src/systemd')
1379 subdir('src/libsystemd')
1380 subdir('src/libsystemd-network')
1381 subdir('src/journal')
1384 libjournal_core = static_library(
1386 libjournal_core_sources,
1388 include_directories : includes,
1391 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1392 libsystemd = shared_library(
1395 version : libsystemd_version,
1396 include_directories : includes,
1397 link_args : ['-shared',
1398 '-Wl,--version-script=' + libsystemd_sym_path],
1399 link_with : [libbasic,
1401 link_whole : [libsystemd_static,
1403 dependencies : [threads,
1407 link_depends : libsystemd_sym,
1409 install_dir : rootlibdir)
1411 static_libsystemd = get_option('static-libsystemd')
1412 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1414 install_libsystemd_static = static_library(
1417 journal_client_sources,
1419 basic_gcrypt_sources,
1421 include_directories : includes,
1422 build_by_default : static_libsystemd != 'false',
1423 install : static_libsystemd != 'false',
1424 install_dir : rootlibdir,
1425 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1426 dependencies : [threads,
1435 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1437 ############################################################
1439 # binaries that have --help and are intended for use by humans,
1440 # usually, but not always, installed in /bin.
1441 public_programs = []
1443 subdir('src/libudev')
1444 subdir('src/shared')
1447 subdir('src/network')
1449 subdir('src/analyze')
1450 subdir('src/journal-remote')
1451 subdir('src/coredump')
1452 subdir('src/hostname')
1453 subdir('src/import')
1454 subdir('src/kernel-install')
1455 subdir('src/locale')
1456 subdir('src/machine')
1457 subdir('src/portable')
1458 subdir('src/nspawn')
1459 subdir('src/resolve')
1460 subdir('src/timedate')
1461 subdir('src/timesync')
1462 subdir('src/vconsole')
1463 subdir('src/boot/efi')
1470 ############################################################
1472 # only static linking apart from libdl, to make sure that the
1473 # module is linked to all libraries that it uses.
1474 test_dlopen = executable(
1478 include_directories : includes,
1479 link_with : [libbasic],
1480 dependencies : [libdl],
1481 build_by_default : want_tests != 'false')
1483 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1484 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1485 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1486 ['resolve', 'ENABLE_NSS_RESOLVE']]
1488 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1492 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1493 version_script_arg = join_paths(meson.source_root(), sym)
1495 nss = shared_library(
1497 'src/nss-@0@/nss-@0@.c'.format(module),
1500 include_directories : includes,
1501 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1502 link_args : ['-Wl,-z,nodelete',
1504 '-Wl,--version-script=' + version_script_arg,
1506 link_with : [libsystemd_static,
1508 dependencies : [threads,
1512 install_dir : rootlibdir)
1514 # We cannot use shared_module because it does not support version suffix.
1515 # Unfortunately shared_library insists on creating the symlink…
1516 meson.add_install_script('sh', '-c',
1517 'rm $DESTDIR@0@/libnss_@1@.so'
1518 .format(rootlibdir, module))
1520 if want_tests != 'false'
1521 test('dlopen-nss_' + module,
1523 # path to dlopen must include a slash
1524 args : nss.full_path())
1529 ############################################################
1531 executable('systemd',
1533 include_directories : includes,
1534 link_with : [libcore,
1536 dependencies : [threads,
1542 install_rpath : rootlibexecdir,
1544 install_dir : rootlibexecdir)
1546 meson.add_install_script(meson_make_symlink,
1547 join_paths(rootlibexecdir, 'systemd'),
1548 join_paths(rootsbindir, 'init'))
1550 exe = executable('systemd-analyze',
1551 systemd_analyze_sources,
1552 include_directories : includes,
1553 link_with : [libcore,
1555 dependencies : [threads,
1561 install_rpath : rootlibexecdir,
1563 public_programs += exe
1565 executable('systemd-journald',
1566 systemd_journald_sources,
1567 include_directories : includes,
1568 link_with : [libjournal_core,
1570 dependencies : [threads,
1574 install_rpath : rootlibexecdir,
1576 install_dir : rootlibexecdir)
1578 exe = executable('systemd-cat',
1579 systemd_cat_sources,
1580 include_directories : includes,
1581 link_with : [libjournal_core,
1583 dependencies : [threads],
1584 install_rpath : rootlibexecdir,
1586 public_programs += exe
1588 exe = executable('journalctl',
1590 include_directories : includes,
1591 link_with : [libshared],
1592 dependencies : [threads,
1597 install_rpath : rootlibexecdir,
1599 install_dir : rootbindir)
1600 public_programs += exe
1602 executable('systemd-getty-generator',
1603 'src/getty-generator/getty-generator.c',
1604 include_directories : includes,
1605 link_with : [libshared],
1606 install_rpath : rootlibexecdir,
1608 install_dir : systemgeneratordir)
1610 executable('systemd-debug-generator',
1611 'src/debug-generator/debug-generator.c',
1612 include_directories : includes,
1613 link_with : [libshared],
1614 install_rpath : rootlibexecdir,
1616 install_dir : systemgeneratordir)
1618 executable('systemd-fstab-generator',
1619 'src/fstab-generator/fstab-generator.c',
1620 'src/core/mount-setup.c',
1621 include_directories : includes,
1622 link_with : [libshared],
1623 install_rpath : rootlibexecdir,
1625 install_dir : systemgeneratordir)
1627 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1628 executable('30-systemd-environment-d-generator',
1629 'src/environment-d-generator/environment-d-generator.c',
1630 include_directories : includes,
1631 link_with : [libshared],
1632 install_rpath : rootlibexecdir,
1634 install_dir : userenvgeneratordir)
1636 meson.add_install_script(meson_make_symlink,
1637 join_paths(sysconfdir, 'environment'),
1638 join_paths(environmentdir, '99-environment.conf'))
1641 if conf.get('ENABLE_HIBERNATE') == 1
1642 executable('systemd-hibernate-resume-generator',
1643 'src/hibernate-resume/hibernate-resume-generator.c',
1644 include_directories : includes,
1645 link_with : [libshared],
1646 install_rpath : rootlibexecdir,
1648 install_dir : systemgeneratordir)
1650 executable('systemd-hibernate-resume',
1651 'src/hibernate-resume/hibernate-resume.c',
1652 include_directories : includes,
1653 link_with : [libshared],
1654 install_rpath : rootlibexecdir,
1656 install_dir : rootlibexecdir)
1659 if conf.get('HAVE_BLKID') == 1
1660 executable('systemd-gpt-auto-generator',
1661 'src/gpt-auto-generator/gpt-auto-generator.c',
1662 'src/basic/blkid-util.h',
1663 include_directories : includes,
1664 link_with : [libshared],
1665 dependencies : libblkid,
1666 install_rpath : rootlibexecdir,
1668 install_dir : systemgeneratordir)
1670 exe = executable('systemd-dissect',
1671 'src/dissect/dissect.c',
1672 include_directories : includes,
1673 link_with : [libshared],
1674 install_rpath : rootlibexecdir,
1676 install_dir : rootlibexecdir)
1677 public_programs += exe
1680 if conf.get('ENABLE_RESOLVE') == 1
1681 executable('systemd-resolved',
1682 systemd_resolved_sources,
1683 include_directories : includes,
1684 link_with : [libshared,
1686 libsystemd_resolve_core],
1687 dependencies : systemd_resolved_dependencies,
1688 install_rpath : rootlibexecdir,
1690 install_dir : rootlibexecdir)
1692 exe = executable('resolvectl',
1694 include_directories : includes,
1695 link_with : [libshared,
1697 libsystemd_resolve_core],
1698 dependencies : [threads,
1702 install_rpath : rootlibexecdir,
1704 public_programs += exe
1706 meson.add_install_script(meson_make_symlink,
1707 join_paths(bindir, 'resolvectl'),
1708 join_paths(rootsbindir, 'resolvconf'))
1710 meson.add_install_script(meson_make_symlink,
1711 join_paths(bindir, 'resolvectl'),
1712 join_paths(bindir, 'systemd-resolve'))
1715 if conf.get('ENABLE_LOGIND') == 1
1716 executable('systemd-logind',
1717 systemd_logind_sources,
1718 include_directories : includes,
1719 link_with : [liblogind_core,
1721 dependencies : [threads,
1723 install_rpath : rootlibexecdir,
1725 install_dir : rootlibexecdir)
1727 exe = executable('loginctl',
1729 include_directories : includes,
1730 link_with : [libshared],
1731 dependencies : [threads,
1734 install_rpath : rootlibexecdir,
1736 install_dir : rootbindir)
1737 public_programs += exe
1739 exe = executable('systemd-inhibit',
1740 'src/login/inhibit.c',
1741 include_directories : includes,
1742 link_with : [libshared],
1743 install_rpath : rootlibexecdir,
1745 install_dir : rootbindir)
1746 public_programs += exe
1748 if conf.get('HAVE_PAM') == 1
1749 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
1750 pam_systemd = shared_library(
1754 include_directories : includes,
1755 link_args : ['-shared',
1756 '-Wl,--version-script=' + version_script_arg],
1757 link_with : [libsystemd_static,
1759 dependencies : [threads,
1762 link_depends : pam_systemd_sym,
1764 install_dir : pamlibdir)
1766 if want_tests != 'false'
1767 test('dlopen-pam_systemd',
1769 # path to dlopen must include a slash
1770 args : pam_systemd.full_path())
1774 executable('systemd-user-runtime-dir',
1775 user_runtime_dir_sources,
1776 include_directories : includes,
1777 link_with : [libshared],
1778 install_rpath : rootlibexecdir,
1780 install_dir : rootlibexecdir)
1783 if conf.get('HAVE_PAM') == 1
1784 executable('systemd-user-sessions',
1785 'src/user-sessions/user-sessions.c',
1786 include_directories : includes,
1787 link_with : [libshared],
1788 install_rpath : rootlibexecdir,
1790 install_dir : rootlibexecdir)
1793 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1794 exe = executable('bootctl',
1795 'src/boot/bootctl.c',
1796 include_directories : includes,
1797 link_with : [libshared],
1798 dependencies : [libblkid],
1799 install_rpath : rootlibexecdir,
1801 public_programs += exe
1803 executable('systemd-bless-boot',
1804 'src/boot/bless-boot.c',
1805 include_directories : includes,
1806 link_with : [libshared],
1807 dependencies : [libblkid],
1808 install_rpath : rootlibexecdir,
1810 install_dir : rootlibexecdir)
1812 executable('systemd-bless-boot-generator',
1813 'src/boot/bless-boot-generator.c',
1814 include_directories : includes,
1815 link_with : [libshared],
1816 install_rpath : rootlibexecdir,
1818 install_dir : systemgeneratordir)
1821 executable('systemd-boot-check-no-failures',
1822 'src/boot/boot-check-no-failures.c',
1823 include_directories : includes,
1824 link_with : [libshared],
1825 dependencies : [libblkid],
1826 install_rpath : rootlibexecdir,
1828 install_dir : rootlibexecdir)
1830 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1831 include_directories : includes,
1832 link_with : [libshared],
1833 dependencies : [threads],
1834 install_rpath : rootlibexecdir,
1836 public_programs += exe
1839 if get_option('link-systemctl-shared')
1840 systemctl_link_with = [libshared]
1842 systemctl_link_with = [libsystemd_static,
1848 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1849 include_directories : includes,
1850 link_with : systemctl_link_with,
1851 dependencies : [threads,
1856 install_rpath : rootlibexecdir,
1858 install_dir : rootbindir)
1859 public_programs += exe
1861 if conf.get('ENABLE_PORTABLED') == 1
1862 executable('systemd-portabled',
1863 systemd_portabled_sources,
1864 include_directories : includes,
1865 link_with : [libshared],
1866 dependencies : [threads],
1867 install_rpath : rootlibexecdir,
1869 install_dir : rootlibexecdir)
1871 exe = executable('portablectl', 'src/portable/portablectl.c',
1872 include_directories : includes,
1873 link_with : [libshared],
1874 dependencies : [threads],
1875 install_rpath : rootlibexecdir,
1877 install_dir : rootbindir)
1878 public_programs += exe
1881 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1882 meson.add_install_script(meson_make_symlink,
1883 join_paths(rootbindir, 'systemctl'),
1884 join_paths(rootsbindir, alias))
1887 if conf.get('ENABLE_BACKLIGHT') == 1
1888 executable('systemd-backlight',
1889 'src/backlight/backlight.c',
1890 include_directories : includes,
1891 link_with : [libshared],
1892 install_rpath : rootlibexecdir,
1894 install_dir : rootlibexecdir)
1897 if conf.get('ENABLE_RFKILL') == 1
1898 executable('systemd-rfkill',
1899 'src/rfkill/rfkill.c',
1900 include_directories : includes,
1901 link_with : [libshared],
1902 install_rpath : rootlibexecdir,
1904 install_dir : rootlibexecdir)
1907 executable('systemd-system-update-generator',
1908 'src/system-update-generator/system-update-generator.c',
1909 include_directories : includes,
1910 link_with : [libshared],
1911 install_rpath : rootlibexecdir,
1913 install_dir : systemgeneratordir)
1915 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1916 executable('systemd-cryptsetup',
1917 'src/cryptsetup/cryptsetup.c',
1918 include_directories : includes,
1919 link_with : [libshared],
1920 dependencies : [libcryptsetup],
1921 install_rpath : rootlibexecdir,
1923 install_dir : rootlibexecdir)
1925 executable('systemd-cryptsetup-generator',
1926 'src/cryptsetup/cryptsetup-generator.c',
1927 include_directories : includes,
1928 link_with : [libshared],
1929 dependencies : [libcryptsetup],
1930 install_rpath : rootlibexecdir,
1932 install_dir : systemgeneratordir)
1934 executable('systemd-veritysetup',
1935 'src/veritysetup/veritysetup.c',
1936 include_directories : includes,
1937 link_with : [libshared],
1938 dependencies : [libcryptsetup],
1939 install_rpath : rootlibexecdir,
1941 install_dir : rootlibexecdir)
1943 executable('systemd-veritysetup-generator',
1944 'src/veritysetup/veritysetup-generator.c',
1945 include_directories : includes,
1946 link_with : [libshared],
1947 dependencies : [libcryptsetup],
1948 install_rpath : rootlibexecdir,
1950 install_dir : systemgeneratordir)
1953 if conf.get('HAVE_SYSV_COMPAT') == 1
1954 executable('systemd-sysv-generator',
1955 'src/sysv-generator/sysv-generator.c',
1956 include_directories : includes,
1957 link_with : [libshared],
1958 install_rpath : rootlibexecdir,
1960 install_dir : systemgeneratordir)
1962 executable('systemd-rc-local-generator',
1963 'src/rc-local-generator/rc-local-generator.c',
1964 include_directories : includes,
1965 link_with : [libshared],
1966 install_rpath : rootlibexecdir,
1968 install_dir : systemgeneratordir)
1971 if conf.get('ENABLE_HOSTNAMED') == 1
1972 executable('systemd-hostnamed',
1973 'src/hostname/hostnamed.c',
1974 include_directories : includes,
1975 link_with : [libshared],
1976 install_rpath : rootlibexecdir,
1978 install_dir : rootlibexecdir)
1980 exe = executable('hostnamectl',
1981 'src/hostname/hostnamectl.c',
1982 include_directories : includes,
1983 link_with : [libshared],
1984 install_rpath : rootlibexecdir,
1986 public_programs += exe
1989 if conf.get('ENABLE_LOCALED') == 1
1990 if conf.get('HAVE_XKBCOMMON') == 1
1991 # logind will load libxkbcommon.so dynamically on its own
1997 executable('systemd-localed',
1998 systemd_localed_sources,
1999 include_directories : includes,
2000 link_with : [libshared],
2001 dependencies : deps,
2002 install_rpath : rootlibexecdir,
2004 install_dir : rootlibexecdir)
2006 exe = executable('localectl',
2008 include_directories : includes,
2009 link_with : [libshared],
2010 install_rpath : rootlibexecdir,
2012 public_programs += exe
2015 if conf.get('ENABLE_TIMEDATED') == 1
2016 executable('systemd-timedated',
2017 'src/timedate/timedated.c',
2018 include_directories : includes,
2019 link_with : [libshared],
2020 install_rpath : rootlibexecdir,
2022 install_dir : rootlibexecdir)
2025 if conf.get('ENABLE_TIMEDATECTL') == 1
2026 exe = executable('timedatectl',
2027 'src/timedate/timedatectl.c',
2028 include_directories : includes,
2029 install_rpath : rootlibexecdir,
2030 link_with : [libshared],
2031 dependencies : [libm],
2033 public_programs += exe
2036 if conf.get('ENABLE_TIMESYNCD') == 1
2037 executable('systemd-timesyncd',
2038 systemd_timesyncd_sources,
2039 include_directories : includes,
2040 link_with : [libshared],
2041 dependencies : [threads,
2043 install_rpath : rootlibexecdir,
2045 install_dir : rootlibexecdir)
2047 executable('systemd-time-wait-sync',
2048 'src/time-wait-sync/time-wait-sync.c',
2049 include_directories : includes,
2050 link_with : [libshared],
2051 install_rpath : rootlibexecdir,
2053 install_dir : rootlibexecdir)
2056 if conf.get('ENABLE_MACHINED') == 1
2057 executable('systemd-machined',
2058 systemd_machined_sources,
2059 include_directories : includes,
2060 link_with : [libmachine_core,
2062 install_rpath : rootlibexecdir,
2064 install_dir : rootlibexecdir)
2066 exe = executable('machinectl',
2067 'src/machine/machinectl.c',
2068 include_directories : includes,
2069 link_with : [libshared],
2070 dependencies : [threads,
2073 install_rpath : rootlibexecdir,
2075 install_dir : rootbindir)
2076 public_programs += exe
2079 if conf.get('ENABLE_IMPORTD') == 1
2080 executable('systemd-importd',
2081 systemd_importd_sources,
2082 include_directories : includes,
2083 link_with : [libshared],
2084 dependencies : [threads],
2085 install_rpath : rootlibexecdir,
2087 install_dir : rootlibexecdir)
2089 systemd_pull = executable('systemd-pull',
2090 systemd_pull_sources,
2091 include_directories : includes,
2092 link_with : [libshared],
2093 dependencies : [libcurl,
2098 install_rpath : rootlibexecdir,
2100 install_dir : rootlibexecdir)
2102 systemd_import = executable('systemd-import',
2103 systemd_import_sources,
2104 include_directories : includes,
2105 link_with : [libshared],
2106 dependencies : [libcurl,
2110 install_rpath : rootlibexecdir,
2112 install_dir : rootlibexecdir)
2114 systemd_export = executable('systemd-export',
2115 systemd_export_sources,
2116 include_directories : includes,
2117 link_with : [libshared],
2118 dependencies : [libcurl,
2122 install_rpath : rootlibexecdir,
2124 install_dir : rootlibexecdir)
2125 public_programs += [systemd_pull, systemd_import, systemd_export]
2128 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2129 exe = executable('systemd-journal-upload',
2130 systemd_journal_upload_sources,
2131 include_directories : includes,
2132 link_with : [libshared],
2133 dependencies : [threads,
2138 install_rpath : rootlibexecdir,
2140 install_dir : rootlibexecdir)
2141 public_programs += exe
2144 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2145 s_j_remote = executable('systemd-journal-remote',
2146 systemd_journal_remote_sources,
2147 include_directories : includes,
2148 link_with : [libshared,
2149 libsystemd_journal_remote],
2150 dependencies : [threads,
2155 install_rpath : rootlibexecdir,
2157 install_dir : rootlibexecdir)
2159 s_j_gatewayd = executable('systemd-journal-gatewayd',
2160 systemd_journal_gatewayd_sources,
2161 include_directories : includes,
2162 link_with : [libshared],
2163 dependencies : [threads,
2168 install_rpath : rootlibexecdir,
2170 install_dir : rootlibexecdir)
2171 public_programs += [s_j_remote, s_j_gatewayd]
2174 if conf.get('ENABLE_COREDUMP') == 1
2175 executable('systemd-coredump',
2176 systemd_coredump_sources,
2177 include_directories : includes,
2178 link_with : [libshared],
2179 dependencies : [threads,
2184 install_rpath : rootlibexecdir,
2186 install_dir : rootlibexecdir)
2188 exe = executable('coredumpctl',
2189 coredumpctl_sources,
2190 include_directories : includes,
2191 link_with : [libshared],
2192 dependencies : [threads,
2195 install_rpath : rootlibexecdir,
2197 public_programs += exe
2200 if conf.get('ENABLE_BINFMT') == 1
2201 exe = executable('systemd-binfmt',
2202 'src/binfmt/binfmt.c',
2203 include_directories : includes,
2204 link_with : [libshared],
2205 install_rpath : rootlibexecdir,
2207 install_dir : rootlibexecdir)
2208 public_programs += exe
2210 meson.add_install_script('sh', '-c',
2211 mkdir_p.format(binfmtdir))
2212 meson.add_install_script('sh', '-c',
2213 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2216 if conf.get('ENABLE_VCONSOLE') == 1
2217 executable('systemd-vconsole-setup',
2218 'src/vconsole/vconsole-setup.c',
2219 include_directories : includes,
2220 link_with : [libshared],
2221 install_rpath : rootlibexecdir,
2223 install_dir : rootlibexecdir)
2226 if conf.get('ENABLE_RANDOMSEED') == 1
2227 executable('systemd-random-seed',
2228 'src/random-seed/random-seed.c',
2229 include_directories : includes,
2230 link_with : [libshared],
2231 install_rpath : rootlibexecdir,
2233 install_dir : rootlibexecdir)
2236 if conf.get('ENABLE_FIRSTBOOT') == 1
2237 executable('systemd-firstboot',
2238 'src/firstboot/firstboot.c',
2239 include_directories : includes,
2240 link_with : [libshared],
2241 dependencies : [libcrypt],
2242 install_rpath : rootlibexecdir,
2244 install_dir : rootbindir)
2247 executable('systemd-remount-fs',
2248 'src/remount-fs/remount-fs.c',
2249 'src/core/mount-setup.c',
2250 'src/core/mount-setup.h',
2251 include_directories : includes,
2252 link_with : [libshared],
2253 install_rpath : rootlibexecdir,
2255 install_dir : rootlibexecdir)
2257 executable('systemd-machine-id-setup',
2258 'src/machine-id-setup/machine-id-setup-main.c',
2259 'src/core/machine-id-setup.c',
2260 'src/core/machine-id-setup.h',
2261 include_directories : includes,
2262 link_with : [libshared],
2263 install_rpath : rootlibexecdir,
2265 install_dir : rootbindir)
2267 executable('systemd-fsck',
2269 include_directories : includes,
2270 link_with : [libshared],
2271 install_rpath : rootlibexecdir,
2273 install_dir : rootlibexecdir)
2275 executable('systemd-growfs',
2276 'src/partition/growfs.c',
2277 include_directories : includes,
2278 link_with : [libshared],
2279 dependencies : [libcryptsetup],
2280 install_rpath : rootlibexecdir,
2282 install_dir : rootlibexecdir)
2284 executable('systemd-makefs',
2285 'src/partition/makefs.c',
2286 include_directories : includes,
2287 link_with : [libshared],
2288 install_rpath : rootlibexecdir,
2290 install_dir : rootlibexecdir)
2292 executable('systemd-sleep',
2293 'src/sleep/sleep.c',
2294 include_directories : includes,
2295 link_with : [libshared],
2296 install_rpath : rootlibexecdir,
2298 install_dir : rootlibexecdir)
2300 exe = executable('systemd-sysctl',
2301 'src/sysctl/sysctl.c',
2302 include_directories : includes,
2303 link_with : [libshared],
2304 install_rpath : rootlibexecdir,
2306 install_dir : rootlibexecdir)
2307 public_programs += exe
2309 executable('systemd-ac-power',
2310 'src/ac-power/ac-power.c',
2311 include_directories : includes,
2312 link_with : [libshared],
2313 install_rpath : rootlibexecdir,
2315 install_dir : rootlibexecdir)
2317 exe = executable('systemd-detect-virt',
2318 'src/detect-virt/detect-virt.c',
2319 include_directories : includes,
2320 link_with : [libshared],
2321 install_rpath : rootlibexecdir,
2323 public_programs += exe
2325 exe = executable('systemd-delta',
2326 'src/delta/delta.c',
2327 include_directories : includes,
2328 link_with : [libshared],
2329 install_rpath : rootlibexecdir,
2331 public_programs += exe
2333 exe = executable('systemd-escape',
2334 'src/escape/escape.c',
2335 include_directories : includes,
2336 link_with : [libshared],
2337 install_rpath : rootlibexecdir,
2339 install_dir : rootbindir)
2340 public_programs += exe
2342 exe = executable('systemd-notify',
2343 'src/notify/notify.c',
2344 include_directories : includes,
2345 link_with : [libshared],
2346 install_rpath : rootlibexecdir,
2348 install_dir : rootbindir)
2349 public_programs += exe
2351 executable('systemd-volatile-root',
2352 'src/volatile-root/volatile-root.c',
2353 include_directories : includes,
2354 link_with : [libshared],
2355 install_rpath : rootlibexecdir,
2357 install_dir : rootlibexecdir)
2359 executable('systemd-cgroups-agent',
2360 'src/cgroups-agent/cgroups-agent.c',
2361 include_directories : includes,
2362 link_with : [libshared],
2363 install_rpath : rootlibexecdir,
2365 install_dir : rootlibexecdir)
2367 exe = executable('systemd-id128',
2368 'src/id128/id128.c',
2369 include_directories : includes,
2370 link_with : [libshared],
2371 install_rpath : rootlibexecdir,
2373 public_programs += exe
2375 exe = executable('systemd-path',
2377 include_directories : includes,
2378 link_with : [libshared],
2379 install_rpath : rootlibexecdir,
2381 public_programs += exe
2383 exe = executable('systemd-ask-password',
2384 'src/ask-password/ask-password.c',
2385 include_directories : includes,
2386 link_with : [libshared],
2387 install_rpath : rootlibexecdir,
2389 install_dir : rootbindir)
2390 public_programs += exe
2392 executable('systemd-reply-password',
2393 'src/reply-password/reply-password.c',
2394 include_directories : includes,
2395 link_with : [libshared],
2396 install_rpath : rootlibexecdir,
2398 install_dir : rootlibexecdir)
2400 exe = executable('systemd-tty-ask-password-agent',
2401 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2402 include_directories : includes,
2403 link_with : [libshared],
2404 install_rpath : rootlibexecdir,
2406 install_dir : rootbindir)
2407 public_programs += exe
2409 exe = executable('systemd-cgls',
2411 include_directories : includes,
2412 link_with : [libshared],
2413 install_rpath : rootlibexecdir,
2415 public_programs += exe
2417 exe = executable('systemd-cgtop',
2418 'src/cgtop/cgtop.c',
2419 include_directories : includes,
2420 link_with : [libshared],
2421 install_rpath : rootlibexecdir,
2423 public_programs += exe
2425 executable('systemd-initctl',
2426 'src/initctl/initctl.c',
2427 include_directories : includes,
2428 link_with : [libshared],
2429 install_rpath : rootlibexecdir,
2431 install_dir : rootlibexecdir)
2433 exe = executable('systemd-mount',
2434 'src/mount/mount-tool.c',
2435 include_directories : includes,
2436 link_with : [libshared],
2437 install_rpath : rootlibexecdir,
2439 public_programs += exe
2441 meson.add_install_script(meson_make_symlink,
2442 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2444 exe = executable('systemd-run',
2446 include_directories : includes,
2447 link_with : [libshared],
2448 install_rpath : rootlibexecdir,
2450 public_programs += exe
2452 exe = executable('systemd-stdio-bridge',
2453 'src/stdio-bridge/stdio-bridge.c',
2454 include_directories : includes,
2455 link_with : [libshared],
2456 install_rpath : rootlibexecdir,
2458 public_programs += exe
2460 exe = executable('busctl',
2461 'src/busctl/busctl.c',
2462 'src/busctl/busctl-introspect.c',
2463 'src/busctl/busctl-introspect.h',
2464 include_directories : includes,
2465 link_with : [libshared],
2466 install_rpath : rootlibexecdir,
2468 public_programs += exe
2470 if conf.get('ENABLE_SYSUSERS') == 1
2471 exe = executable('systemd-sysusers',
2472 'src/sysusers/sysusers.c',
2473 include_directories : includes,
2474 link_with : [libshared],
2475 install_rpath : rootlibexecdir,
2477 install_dir : rootbindir)
2478 public_programs += exe
2481 if conf.get('ENABLE_TMPFILES') == 1
2482 exe = executable('systemd-tmpfiles',
2483 'src/tmpfiles/tmpfiles.c',
2484 include_directories : includes,
2485 link_with : [libshared],
2486 dependencies : [libacl],
2487 install_rpath : rootlibexecdir,
2489 install_dir : rootbindir)
2490 public_programs += exe
2492 if want_tests != 'false'
2493 test('test-systemd-tmpfiles',
2494 test_systemd_tmpfiles_py,
2495 # https://github.com/mesonbuild/meson/issues/2681
2496 args : exe.full_path())
2500 if conf.get('ENABLE_HWDB') == 1
2501 exe = executable('systemd-hwdb',
2503 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2504 include_directories : includes,
2505 link_with : [libudev_static],
2506 install_rpath : udev_rpath,
2508 install_dir : rootbindir)
2509 public_programs += exe
2512 if conf.get('ENABLE_QUOTACHECK') == 1
2513 executable('systemd-quotacheck',
2514 'src/quotacheck/quotacheck.c',
2515 include_directories : includes,
2516 link_with : [libshared],
2517 install_rpath : rootlibexecdir,
2519 install_dir : rootlibexecdir)
2522 exe = executable('systemd-socket-proxyd',
2523 'src/socket-proxy/socket-proxyd.c',
2524 include_directories : includes,
2525 link_with : [libshared],
2526 dependencies : [threads],
2527 install_rpath : rootlibexecdir,
2529 install_dir : rootlibexecdir)
2530 public_programs += exe
2532 exe = executable('systemd-udevd',
2533 systemd_udevd_sources,
2534 include_directories : includes,
2535 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2536 link_with : [libudev_core,
2539 dependencies : [threads,
2544 install_rpath : udev_rpath,
2546 install_dir : rootlibexecdir)
2547 public_programs += exe
2549 exe = executable('udevadm',
2551 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2552 include_directories : includes,
2553 link_with : [libudev_core,
2556 dependencies : [threads,
2561 install_rpath : udev_rpath,
2563 install_dir : rootbindir)
2564 public_programs += exe
2566 executable('systemd-shutdown',
2567 systemd_shutdown_sources,
2568 include_directories : includes,
2569 link_with : [libshared],
2570 dependencies : [libmount],
2571 install_rpath : rootlibexecdir,
2573 install_dir : rootlibexecdir)
2575 executable('systemd-update-done',
2576 'src/update-done/update-done.c',
2577 include_directories : includes,
2578 link_with : [libshared],
2579 install_rpath : rootlibexecdir,
2581 install_dir : rootlibexecdir)
2583 executable('systemd-update-utmp',
2584 'src/update-utmp/update-utmp.c',
2585 include_directories : includes,
2586 link_with : [libshared],
2587 dependencies : [libaudit],
2588 install_rpath : rootlibexecdir,
2590 install_dir : rootlibexecdir)
2592 if conf.get('HAVE_KMOD') == 1
2593 executable('systemd-modules-load',
2594 'src/modules-load/modules-load.c',
2595 include_directories : includes,
2596 link_with : [libshared],
2597 dependencies : [libkmod],
2598 install_rpath : rootlibexecdir,
2600 install_dir : rootlibexecdir)
2602 meson.add_install_script('sh', '-c',
2603 mkdir_p.format(modulesloaddir))
2604 meson.add_install_script('sh', '-c',
2605 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2608 exe = executable('systemd-nspawn',
2609 systemd_nspawn_sources,
2610 'src/core/mount-setup.c', # FIXME: use a variable?
2611 'src/core/mount-setup.h',
2612 'src/core/loopback-setup.c',
2613 'src/core/loopback-setup.h',
2614 include_directories : includes,
2615 link_with : [libnspawn_core,
2617 dependencies : [libblkid],
2618 install_rpath : rootlibexecdir,
2620 public_programs += exe
2622 if conf.get('ENABLE_NETWORKD') == 1
2623 executable('systemd-networkd',
2624 systemd_networkd_sources,
2625 include_directories : includes,
2626 link_with : [libnetworkd_core,
2630 dependencies : [threads],
2631 install_rpath : rootlibexecdir,
2633 install_dir : rootlibexecdir)
2635 executable('systemd-networkd-wait-online',
2636 systemd_networkd_wait_online_sources,
2637 include_directories : includes,
2638 link_with : [libnetworkd_core,
2640 install_rpath : rootlibexecdir,
2642 install_dir : rootlibexecdir)
2644 exe = executable('networkctl',
2646 include_directories : includes,
2647 link_with : [libsystemd_network,
2649 install_rpath : rootlibexecdir,
2651 install_dir : rootbindir)
2652 public_programs += exe
2655 executable('systemd-sulogin-shell',
2656 ['src/sulogin-shell/sulogin-shell.c'],
2657 include_directories : includes,
2658 link_with : [libshared],
2659 install_rpath : rootlibexecdir,
2661 install_dir : rootlibexecdir)
2663 ############################################################
2666 'systemd-runtest.env',
2667 output : 'systemd-runtest.env',
2668 command : ['sh', '-c', '{ ' +
2669 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2670 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2672 build_by_default : true)
2674 foreach tuple : tests
2676 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2677 dependencies = tuple[2]
2678 condition = tuple.length() >= 4 ? tuple[3] : ''
2679 type = tuple.length() >= 5 ? tuple[4] : ''
2680 defs = tuple.length() >= 6 ? tuple[5] : []
2681 incs = tuple.length() >= 7 ? tuple[6] : includes
2684 name = sources[0].split('/')[-1].split('.')[0]
2685 if type.startswith('timeout=')
2686 timeout = type.split('=')[1].to_int()
2690 if condition == '' or conf.get(condition) == 1
2694 include_directories : incs,
2695 link_with : link_with,
2696 dependencies : dependencies,
2698 build_by_default : want_tests != 'false',
2699 install_rpath : rootlibexecdir,
2700 install : install_tests,
2701 install_dir : join_paths(testsdir, type))
2704 message('@0@ is a manual test'.format(name))
2705 elif type == 'unsafe' and want_tests != 'unsafe'
2706 message('@0@ is an unsafe test'.format(name))
2707 elif want_tests != 'false'
2713 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2718 'test-libsystemd-sym',
2719 test_libsystemd_sym_c,
2720 include_directories : includes,
2721 link_with : [libsystemd],
2722 build_by_default : want_tests != 'false',
2723 install : install_tests,
2724 install_dir : testsdir)
2725 if want_tests != 'false'
2726 test('test-libsystemd-sym', exe)
2730 'test-libsystemd-static-sym',
2731 test_libsystemd_sym_c,
2732 include_directories : includes,
2733 link_with : [install_libsystemd_static],
2734 dependencies : [threads], # threads is already included in dependencies on the library,
2735 # but does not seem to get propagated. Add here as a work-around.
2736 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2737 install : install_tests and static_libsystemd_pic,
2738 install_dir : testsdir)
2739 if want_tests != 'false' and static_libsystemd_pic
2740 test('test-libsystemd-static-sym', exe)
2746 include_directories : includes,
2747 c_args : '-Wno-deprecated-declarations',
2748 link_with : [libudev],
2749 build_by_default : want_tests != 'false',
2750 install : install_tests,
2751 install_dir : testsdir)
2752 if want_tests != 'false'
2753 test('test-libudev-sym', exe)
2757 'test-libudev-static-sym',
2759 include_directories : includes,
2760 c_args : '-Wno-deprecated-declarations',
2761 link_with : [install_libudev_static],
2762 build_by_default : want_tests != 'false' and static_libudev_pic,
2763 install : install_tests and static_libudev_pic,
2764 install_dir : testsdir)
2765 if want_tests != 'false' and static_libudev_pic
2766 test('test-libudev-static-sym', exe)
2769 ############################################################
2773 if get_option('tests') != 'false'
2774 foreach tuple : fuzzers
2776 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2777 dependencies = tuple[2]
2778 defs = tuple.length() >= 4 ? tuple[3] : []
2779 incs = tuple.length() >= 5 ? tuple[4] : includes
2782 dependencies += fuzzing_engine
2784 sources += 'src/fuzz/fuzz-main.c'
2787 name = sources[0].split('/')[-1].split('.')[0]
2789 fuzzer_exes += executable(
2792 include_directories : [incs, include_directories('src/fuzz')],
2793 link_with : link_with,
2794 dependencies : dependencies,
2800 run_target('fuzzers',
2801 depends : fuzzer_exes,
2804 ############################################################
2806 make_directive_index_py = find_program('tools/make-directive-index.py')
2807 make_man_index_py = find_program('tools/make-man-index.py')
2808 xml_helper_py = find_program('tools/xml_helper.py')
2809 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2813 subdir('sysusers.d')
2814 subdir('tmpfiles.d')
2819 subdir('shell-completion/bash')
2820 subdir('shell-completion/zsh')
2821 subdir('docs/sysvinit')
2822 subdir('docs/var-log')
2824 install_subdir('factory/etc',
2825 install_dir : factorydir)
2827 install_data('xorg/50-systemd-user.sh',
2828 install_dir : xinitrcdir)
2829 install_data('modprobe.d/systemd.conf',
2830 install_dir : modprobedir)
2831 install_data('LICENSE.GPL2',
2835 'docs/CODING_STYLE.md',
2836 'docs/DISTRO_PORTING.md',
2837 'docs/ENVIRONMENT.md',
2839 'docs/TRANSIENT-SETTINGS.md',
2840 'docs/TRANSLATORS.md',
2841 'docs/UIDS-GIDS.md',
2842 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2843 install_dir : docdir)
2845 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2846 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2848 ############################################################
2850 meson_check_help = find_program('tools/meson-check-help.sh')
2852 foreach exec : public_programs
2853 name = exec.full_path().split('/')[-1]
2854 if want_tests != 'false'
2855 test('check-help-' + name,
2857 args : exec.full_path())
2861 ############################################################
2863 # Enable tests for all supported sanitizers
2864 foreach tuple : sanitizers
2865 sanitizer = tuple[0]
2868 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2870 foreach p : fuzz_regression_tests
2871 b = p.split('/')[-2]
2872 c = p.split('/')[-1]
2874 name = '@0@:@1@'.format(b, sanitizer)
2877 if want_tests == 'false'
2878 message('Not compiling @0@ because tests is set to false'.format(name))
2880 exe = custom_target(
2884 command : [env, 'ln', '-fs',
2885 join_paths(build.full_path(), b),
2887 build_by_default : true)
2889 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2894 if want_tests != 'false' and slow_tests
2895 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2897 args : [exe.full_path(),
2898 join_paths(meson.source_root(), p)])
2905 ############################################################
2908 all_files = run_command(
2910 ['--git-dir=@0@/.git'.format(meson.source_root()),
2913 all_files = files(all_files.stdout().split())
2918 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
2921 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
2925 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2928 command : [meson_git_contrib_sh])
2932 git_head = run_command(
2934 ['--git-dir=@0@/.git'.format(meson.source_root()),
2935 'rev-parse', 'HEAD']).stdout().strip()
2936 git_head_short = run_command(
2938 ['--git-dir=@0@/.git'.format(meson.source_root()),
2939 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2943 command : ['git', 'archive',
2944 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
2946 '--prefix', 'systemd-@0@/'.format(git_head),
2950 ############################################################
2952 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2955 depends : [man, libsystemd, libudev],
2956 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2960 command : ['sh', '@0@/tools/make-index-md.sh'.format(meson.source_root()), meson.source_root()])
2962 ############################################################
2965 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2967 'split /usr: @0@'.format(split_usr),
2968 'split bin-sbin: @0@'.format(split_bin),
2969 'prefix directory: @0@'.format(prefixdir),
2970 'rootprefix directory: @0@'.format(rootprefixdir),
2971 'sysconf directory: @0@'.format(sysconfdir),
2972 'include directory: @0@'.format(includedir),
2973 'lib directory: @0@'.format(libdir),
2974 'rootlib directory: @0@'.format(rootlibdir),
2975 'SysV init scripts: @0@'.format(sysvinit_path),
2976 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2977 'PAM modules directory: @0@'.format(pamlibdir),
2978 'PAM configuration directory: @0@'.format(pamconfdir),
2979 'RPM macros directory: @0@'.format(rpmmacrosdir),
2980 'modprobe.d directory: @0@'.format(modprobedir),
2981 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2982 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2983 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2984 'bash completions directory: @0@'.format(bashcompletiondir),
2985 'zsh completions directory: @0@'.format(zshcompletiondir),
2986 'extra start script: @0@'.format(get_option('rc-local')),
2987 'extra stop script: @0@'.format(get_option('halt-local')),
2988 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2989 get_option('debug-tty')),
2990 'TTY GID: @0@'.format(tty_gid),
2991 'users GID: @0@'.format(substs.get('USERS_GID')),
2992 'maximum system UID: @0@'.format(system_uid_max),
2993 'maximum system GID: @0@'.format(system_gid_max),
2994 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2995 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2996 'minimum container UID base: @0@'.format(container_uid_base_min),
2997 'maximum container UID base: @0@'.format(container_uid_base_max),
2998 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2999 'render group access mode: @0@'.format(get_option('group-render-mode')),
3000 'certificate root directory: @0@'.format(get_option('certificate-root')),
3001 'support URL: @0@'.format(support_url),
3002 'nobody user name: @0@'.format(nobody_user),
3003 'nobody group name: @0@'.format(nobody_group),
3004 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3005 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3007 'default DNSSEC mode: @0@'.format(default_dnssec),
3008 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3009 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3010 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
3012 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3013 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3015 'default DNS servers: @0@'.format(alt_dns_servers),
3016 'default NTP servers: @0@'.format(alt_ntp_servers)]
3018 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3019 '@@0@'.format(time_epoch)).stdout().strip()
3021 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3024 'static libsystemd: @0@'.format(static_libsystemd),
3025 'static libudev: @0@'.format(static_libudev)]
3028 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3029 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3030 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3032 if conf.get('ENABLE_EFI') == 1
3033 status += 'efi arch: @0@'.format(efi_arch)
3037 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3038 'EFI CC @0@'.format(efi_cc),
3039 'EFI lib directory: @0@'.format(efi_libdir),
3040 'EFI lds directory: @0@'.format(efi_ldsdir),
3041 'EFI include directory: @0@'.format(efi_incdir)]
3093 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3094 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3097 ['legacy pkla', install_polkit_pkla],
3099 ['gnu-efi', have_gnu_efi],
3112 ['man pages', want_man],
3113 ['html pages', want_html],
3114 ['man page indices', want_man and have_lxml],
3119 ['adm group', get_option('adm-group')],
3120 ['wheel group', get_option('wheel-group')],
3123 ['debug mmap cache'],
3124 ['valgrind', conf.get('VALGRIND') == 1],
3125 ['trace logging', conf.get('LOG_TRACE') == 1],
3126 ['link-udev-shared', get_option('link-udev-shared')],
3127 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3130 if tuple.length() >= 2
3133 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3134 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3135 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3146 'enabled features: @0@'.format(', '.join(found)),
3148 'disabled features: @0@'.format(', '.join(missing)),
3150 message('\n '.join(status))
3152 if rootprefixdir != rootprefix_default
3154 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3155 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3156 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))