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-event',
1367 'src/libsystemd/sd-hwdb',
1368 'src/libsystemd/sd-id128',
1369 'src/libsystemd/sd-netlink',
1370 'src/libsystemd/sd-network',
1371 'src/libsystemd-network',
1374 add_project_arguments('-include', 'config.h', language : 'c')
1378 subdir('src/systemd')
1380 subdir('src/libsystemd')
1381 subdir('src/libsystemd-network')
1382 subdir('src/journal')
1385 libjournal_core = static_library(
1387 libjournal_core_sources,
1389 include_directories : includes,
1392 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1393 libsystemd = shared_library(
1396 version : libsystemd_version,
1397 include_directories : includes,
1398 link_args : ['-shared',
1399 '-Wl,--version-script=' + libsystemd_sym_path],
1400 link_with : [libbasic,
1402 link_whole : [libsystemd_static,
1404 dependencies : [threads,
1408 link_depends : libsystemd_sym,
1410 install_dir : rootlibdir)
1412 static_libsystemd = get_option('static-libsystemd')
1413 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1415 install_libsystemd_static = static_library(
1418 journal_client_sources,
1420 basic_gcrypt_sources,
1422 include_directories : includes,
1423 build_by_default : static_libsystemd != 'false',
1424 install : static_libsystemd != 'false',
1425 install_dir : rootlibdir,
1426 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1427 dependencies : [threads,
1436 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1438 ############################################################
1440 # binaries that have --help and are intended for use by humans,
1441 # usually, but not always, installed in /bin.
1442 public_programs = []
1444 subdir('src/libudev')
1445 subdir('src/shared')
1448 subdir('src/network')
1450 subdir('src/analyze')
1451 subdir('src/journal-remote')
1452 subdir('src/coredump')
1453 subdir('src/hostname')
1454 subdir('src/import')
1455 subdir('src/kernel-install')
1456 subdir('src/locale')
1457 subdir('src/machine')
1458 subdir('src/portable')
1459 subdir('src/nspawn')
1460 subdir('src/resolve')
1461 subdir('src/timedate')
1462 subdir('src/timesync')
1463 subdir('src/vconsole')
1464 subdir('src/boot/efi')
1471 ############################################################
1473 # only static linking apart from libdl, to make sure that the
1474 # module is linked to all libraries that it uses.
1475 test_dlopen = executable(
1479 include_directories : includes,
1480 link_with : [libbasic],
1481 dependencies : [libdl],
1482 build_by_default : want_tests != 'false')
1484 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1485 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1486 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1487 ['resolve', 'ENABLE_NSS_RESOLVE']]
1489 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1493 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1494 version_script_arg = join_paths(meson.source_root(), sym)
1496 nss = shared_library(
1498 'src/nss-@0@/nss-@0@.c'.format(module),
1501 include_directories : includes,
1502 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1503 link_args : ['-Wl,-z,nodelete',
1505 '-Wl,--version-script=' + version_script_arg,
1507 link_with : [libsystemd_static,
1509 dependencies : [threads,
1513 install_dir : rootlibdir)
1515 # We cannot use shared_module because it does not support version suffix.
1516 # Unfortunately shared_library insists on creating the symlink…
1517 meson.add_install_script('sh', '-c',
1518 'rm $DESTDIR@0@/libnss_@1@.so'
1519 .format(rootlibdir, module))
1521 if want_tests != 'false'
1522 test('dlopen-nss_' + module,
1524 # path to dlopen must include a slash
1525 args : nss.full_path())
1530 ############################################################
1532 executable('systemd',
1534 include_directories : includes,
1535 link_with : [libcore,
1537 dependencies : [threads,
1543 install_rpath : rootlibexecdir,
1545 install_dir : rootlibexecdir)
1547 meson.add_install_script(meson_make_symlink,
1548 join_paths(rootlibexecdir, 'systemd'),
1549 join_paths(rootsbindir, 'init'))
1551 exe = executable('systemd-analyze',
1552 systemd_analyze_sources,
1553 include_directories : includes,
1554 link_with : [libcore,
1556 dependencies : [threads,
1562 install_rpath : rootlibexecdir,
1564 public_programs += exe
1566 executable('systemd-journald',
1567 systemd_journald_sources,
1568 include_directories : includes,
1569 link_with : [libjournal_core,
1571 dependencies : [threads,
1575 install_rpath : rootlibexecdir,
1577 install_dir : rootlibexecdir)
1579 exe = executable('systemd-cat',
1580 systemd_cat_sources,
1581 include_directories : includes,
1582 link_with : [libjournal_core,
1584 dependencies : [threads],
1585 install_rpath : rootlibexecdir,
1587 public_programs += exe
1589 exe = executable('journalctl',
1591 include_directories : includes,
1592 link_with : [libshared],
1593 dependencies : [threads,
1598 install_rpath : rootlibexecdir,
1600 install_dir : rootbindir)
1601 public_programs += exe
1603 executable('systemd-getty-generator',
1604 'src/getty-generator/getty-generator.c',
1605 include_directories : includes,
1606 link_with : [libshared],
1607 install_rpath : rootlibexecdir,
1609 install_dir : systemgeneratordir)
1611 executable('systemd-debug-generator',
1612 'src/debug-generator/debug-generator.c',
1613 include_directories : includes,
1614 link_with : [libshared],
1615 install_rpath : rootlibexecdir,
1617 install_dir : systemgeneratordir)
1619 executable('systemd-fstab-generator',
1620 'src/fstab-generator/fstab-generator.c',
1621 'src/core/mount-setup.c',
1622 include_directories : includes,
1623 link_with : [libshared],
1624 install_rpath : rootlibexecdir,
1626 install_dir : systemgeneratordir)
1628 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1629 executable('30-systemd-environment-d-generator',
1630 'src/environment-d-generator/environment-d-generator.c',
1631 include_directories : includes,
1632 link_with : [libshared],
1633 install_rpath : rootlibexecdir,
1635 install_dir : userenvgeneratordir)
1637 meson.add_install_script(meson_make_symlink,
1638 join_paths(sysconfdir, 'environment'),
1639 join_paths(environmentdir, '99-environment.conf'))
1642 if conf.get('ENABLE_HIBERNATE') == 1
1643 executable('systemd-hibernate-resume-generator',
1644 'src/hibernate-resume/hibernate-resume-generator.c',
1645 include_directories : includes,
1646 link_with : [libshared],
1647 install_rpath : rootlibexecdir,
1649 install_dir : systemgeneratordir)
1651 executable('systemd-hibernate-resume',
1652 'src/hibernate-resume/hibernate-resume.c',
1653 include_directories : includes,
1654 link_with : [libshared],
1655 install_rpath : rootlibexecdir,
1657 install_dir : rootlibexecdir)
1660 if conf.get('HAVE_BLKID') == 1
1661 executable('systemd-gpt-auto-generator',
1662 'src/gpt-auto-generator/gpt-auto-generator.c',
1663 'src/basic/blkid-util.h',
1664 include_directories : includes,
1665 link_with : [libshared],
1666 dependencies : libblkid,
1667 install_rpath : rootlibexecdir,
1669 install_dir : systemgeneratordir)
1671 exe = executable('systemd-dissect',
1672 'src/dissect/dissect.c',
1673 include_directories : includes,
1674 link_with : [libshared],
1675 install_rpath : rootlibexecdir,
1677 install_dir : rootlibexecdir)
1678 public_programs += exe
1681 if conf.get('ENABLE_RESOLVE') == 1
1682 executable('systemd-resolved',
1683 systemd_resolved_sources,
1684 include_directories : includes,
1685 link_with : [libshared,
1687 libsystemd_resolve_core],
1688 dependencies : systemd_resolved_dependencies,
1689 install_rpath : rootlibexecdir,
1691 install_dir : rootlibexecdir)
1693 exe = executable('resolvectl',
1695 include_directories : includes,
1696 link_with : [libshared,
1698 libsystemd_resolve_core],
1699 dependencies : [threads,
1703 install_rpath : rootlibexecdir,
1705 public_programs += exe
1707 meson.add_install_script(meson_make_symlink,
1708 join_paths(bindir, 'resolvectl'),
1709 join_paths(rootsbindir, 'resolvconf'))
1711 meson.add_install_script(meson_make_symlink,
1712 join_paths(bindir, 'resolvectl'),
1713 join_paths(bindir, 'systemd-resolve'))
1716 if conf.get('ENABLE_LOGIND') == 1
1717 executable('systemd-logind',
1718 systemd_logind_sources,
1719 include_directories : includes,
1720 link_with : [liblogind_core,
1722 dependencies : [threads,
1724 install_rpath : rootlibexecdir,
1726 install_dir : rootlibexecdir)
1728 exe = executable('loginctl',
1730 include_directories : includes,
1731 link_with : [libshared],
1732 dependencies : [threads,
1735 install_rpath : rootlibexecdir,
1737 install_dir : rootbindir)
1738 public_programs += exe
1740 exe = executable('systemd-inhibit',
1741 'src/login/inhibit.c',
1742 include_directories : includes,
1743 link_with : [libshared],
1744 install_rpath : rootlibexecdir,
1746 install_dir : rootbindir)
1747 public_programs += exe
1749 if conf.get('HAVE_PAM') == 1
1750 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
1751 pam_systemd = shared_library(
1755 include_directories : includes,
1756 link_args : ['-shared',
1757 '-Wl,--version-script=' + version_script_arg],
1758 link_with : [libsystemd_static,
1760 dependencies : [threads,
1763 link_depends : pam_systemd_sym,
1765 install_dir : pamlibdir)
1767 if want_tests != 'false'
1768 test('dlopen-pam_systemd',
1770 # path to dlopen must include a slash
1771 args : pam_systemd.full_path())
1775 executable('systemd-user-runtime-dir',
1776 user_runtime_dir_sources,
1777 include_directories : includes,
1778 link_with : [libshared],
1779 install_rpath : rootlibexecdir,
1781 install_dir : rootlibexecdir)
1784 if conf.get('HAVE_PAM') == 1
1785 executable('systemd-user-sessions',
1786 'src/user-sessions/user-sessions.c',
1787 include_directories : includes,
1788 link_with : [libshared],
1789 install_rpath : rootlibexecdir,
1791 install_dir : rootlibexecdir)
1794 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1795 exe = executable('bootctl',
1796 'src/boot/bootctl.c',
1797 include_directories : includes,
1798 link_with : [libshared],
1799 dependencies : [libblkid],
1800 install_rpath : rootlibexecdir,
1802 public_programs += exe
1804 executable('systemd-bless-boot',
1805 'src/boot/bless-boot.c',
1806 include_directories : includes,
1807 link_with : [libshared],
1808 dependencies : [libblkid],
1809 install_rpath : rootlibexecdir,
1811 install_dir : rootlibexecdir)
1813 executable('systemd-bless-boot-generator',
1814 'src/boot/bless-boot-generator.c',
1815 include_directories : includes,
1816 link_with : [libshared],
1817 install_rpath : rootlibexecdir,
1819 install_dir : systemgeneratordir)
1822 executable('systemd-boot-check-no-failures',
1823 'src/boot/boot-check-no-failures.c',
1824 include_directories : includes,
1825 link_with : [libshared],
1826 dependencies : [libblkid],
1827 install_rpath : rootlibexecdir,
1829 install_dir : rootlibexecdir)
1831 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1832 include_directories : includes,
1833 link_with : [libshared],
1834 dependencies : [threads],
1835 install_rpath : rootlibexecdir,
1837 public_programs += exe
1840 if get_option('link-systemctl-shared')
1841 systemctl_link_with = [libshared]
1843 systemctl_link_with = [libsystemd_static,
1849 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1850 include_directories : includes,
1851 link_with : systemctl_link_with,
1852 dependencies : [threads,
1857 install_rpath : rootlibexecdir,
1859 install_dir : rootbindir)
1860 public_programs += exe
1862 if conf.get('ENABLE_PORTABLED') == 1
1863 executable('systemd-portabled',
1864 systemd_portabled_sources,
1865 include_directories : includes,
1866 link_with : [libshared],
1867 dependencies : [threads],
1868 install_rpath : rootlibexecdir,
1870 install_dir : rootlibexecdir)
1872 exe = executable('portablectl', 'src/portable/portablectl.c',
1873 include_directories : includes,
1874 link_with : [libshared],
1875 dependencies : [threads],
1876 install_rpath : rootlibexecdir,
1878 install_dir : rootbindir)
1879 public_programs += exe
1882 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1883 meson.add_install_script(meson_make_symlink,
1884 join_paths(rootbindir, 'systemctl'),
1885 join_paths(rootsbindir, alias))
1888 if conf.get('ENABLE_BACKLIGHT') == 1
1889 executable('systemd-backlight',
1890 'src/backlight/backlight.c',
1891 include_directories : includes,
1892 link_with : [libshared],
1893 install_rpath : rootlibexecdir,
1895 install_dir : rootlibexecdir)
1898 if conf.get('ENABLE_RFKILL') == 1
1899 executable('systemd-rfkill',
1900 'src/rfkill/rfkill.c',
1901 include_directories : includes,
1902 link_with : [libshared],
1903 install_rpath : rootlibexecdir,
1905 install_dir : rootlibexecdir)
1908 executable('systemd-system-update-generator',
1909 'src/system-update-generator/system-update-generator.c',
1910 include_directories : includes,
1911 link_with : [libshared],
1912 install_rpath : rootlibexecdir,
1914 install_dir : systemgeneratordir)
1916 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1917 executable('systemd-cryptsetup',
1918 'src/cryptsetup/cryptsetup.c',
1919 include_directories : includes,
1920 link_with : [libshared],
1921 dependencies : [libcryptsetup],
1922 install_rpath : rootlibexecdir,
1924 install_dir : rootlibexecdir)
1926 executable('systemd-cryptsetup-generator',
1927 'src/cryptsetup/cryptsetup-generator.c',
1928 include_directories : includes,
1929 link_with : [libshared],
1930 dependencies : [libcryptsetup],
1931 install_rpath : rootlibexecdir,
1933 install_dir : systemgeneratordir)
1935 executable('systemd-veritysetup',
1936 'src/veritysetup/veritysetup.c',
1937 include_directories : includes,
1938 link_with : [libshared],
1939 dependencies : [libcryptsetup],
1940 install_rpath : rootlibexecdir,
1942 install_dir : rootlibexecdir)
1944 executable('systemd-veritysetup-generator',
1945 'src/veritysetup/veritysetup-generator.c',
1946 include_directories : includes,
1947 link_with : [libshared],
1948 dependencies : [libcryptsetup],
1949 install_rpath : rootlibexecdir,
1951 install_dir : systemgeneratordir)
1954 if conf.get('HAVE_SYSV_COMPAT') == 1
1955 executable('systemd-sysv-generator',
1956 'src/sysv-generator/sysv-generator.c',
1957 include_directories : includes,
1958 link_with : [libshared],
1959 install_rpath : rootlibexecdir,
1961 install_dir : systemgeneratordir)
1963 executable('systemd-rc-local-generator',
1964 'src/rc-local-generator/rc-local-generator.c',
1965 include_directories : includes,
1966 link_with : [libshared],
1967 install_rpath : rootlibexecdir,
1969 install_dir : systemgeneratordir)
1972 if conf.get('ENABLE_HOSTNAMED') == 1
1973 executable('systemd-hostnamed',
1974 'src/hostname/hostnamed.c',
1975 include_directories : includes,
1976 link_with : [libshared],
1977 install_rpath : rootlibexecdir,
1979 install_dir : rootlibexecdir)
1981 exe = executable('hostnamectl',
1982 'src/hostname/hostnamectl.c',
1983 include_directories : includes,
1984 link_with : [libshared],
1985 install_rpath : rootlibexecdir,
1987 public_programs += exe
1990 if conf.get('ENABLE_LOCALED') == 1
1991 if conf.get('HAVE_XKBCOMMON') == 1
1992 # logind will load libxkbcommon.so dynamically on its own
1998 executable('systemd-localed',
1999 systemd_localed_sources,
2000 include_directories : includes,
2001 link_with : [libshared],
2002 dependencies : deps,
2003 install_rpath : rootlibexecdir,
2005 install_dir : rootlibexecdir)
2007 exe = executable('localectl',
2009 include_directories : includes,
2010 link_with : [libshared],
2011 install_rpath : rootlibexecdir,
2013 public_programs += exe
2016 if conf.get('ENABLE_TIMEDATED') == 1
2017 executable('systemd-timedated',
2018 'src/timedate/timedated.c',
2019 include_directories : includes,
2020 link_with : [libshared],
2021 install_rpath : rootlibexecdir,
2023 install_dir : rootlibexecdir)
2026 if conf.get('ENABLE_TIMEDATECTL') == 1
2027 exe = executable('timedatectl',
2028 'src/timedate/timedatectl.c',
2029 include_directories : includes,
2030 install_rpath : rootlibexecdir,
2031 link_with : [libshared],
2032 dependencies : [libm],
2034 public_programs += exe
2037 if conf.get('ENABLE_TIMESYNCD') == 1
2038 executable('systemd-timesyncd',
2039 systemd_timesyncd_sources,
2040 include_directories : includes,
2041 link_with : [libshared],
2042 dependencies : [threads,
2044 install_rpath : rootlibexecdir,
2046 install_dir : rootlibexecdir)
2048 executable('systemd-time-wait-sync',
2049 'src/time-wait-sync/time-wait-sync.c',
2050 include_directories : includes,
2051 link_with : [libshared],
2052 install_rpath : rootlibexecdir,
2054 install_dir : rootlibexecdir)
2057 if conf.get('ENABLE_MACHINED') == 1
2058 executable('systemd-machined',
2059 systemd_machined_sources,
2060 include_directories : includes,
2061 link_with : [libmachine_core,
2063 install_rpath : rootlibexecdir,
2065 install_dir : rootlibexecdir)
2067 exe = executable('machinectl',
2068 'src/machine/machinectl.c',
2069 include_directories : includes,
2070 link_with : [libshared],
2071 dependencies : [threads,
2074 install_rpath : rootlibexecdir,
2076 install_dir : rootbindir)
2077 public_programs += exe
2080 if conf.get('ENABLE_IMPORTD') == 1
2081 executable('systemd-importd',
2082 systemd_importd_sources,
2083 include_directories : includes,
2084 link_with : [libshared],
2085 dependencies : [threads],
2086 install_rpath : rootlibexecdir,
2088 install_dir : rootlibexecdir)
2090 systemd_pull = executable('systemd-pull',
2091 systemd_pull_sources,
2092 include_directories : includes,
2093 link_with : [libshared],
2094 dependencies : [libcurl,
2099 install_rpath : rootlibexecdir,
2101 install_dir : rootlibexecdir)
2103 systemd_import = executable('systemd-import',
2104 systemd_import_sources,
2105 include_directories : includes,
2106 link_with : [libshared],
2107 dependencies : [libcurl,
2111 install_rpath : rootlibexecdir,
2113 install_dir : rootlibexecdir)
2115 systemd_export = executable('systemd-export',
2116 systemd_export_sources,
2117 include_directories : includes,
2118 link_with : [libshared],
2119 dependencies : [libcurl,
2123 install_rpath : rootlibexecdir,
2125 install_dir : rootlibexecdir)
2126 public_programs += [systemd_pull, systemd_import, systemd_export]
2129 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2130 exe = executable('systemd-journal-upload',
2131 systemd_journal_upload_sources,
2132 include_directories : includes,
2133 link_with : [libshared],
2134 dependencies : [threads,
2139 install_rpath : rootlibexecdir,
2141 install_dir : rootlibexecdir)
2142 public_programs += exe
2145 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2146 s_j_remote = executable('systemd-journal-remote',
2147 systemd_journal_remote_sources,
2148 include_directories : includes,
2149 link_with : [libshared,
2150 libsystemd_journal_remote],
2151 dependencies : [threads,
2156 install_rpath : rootlibexecdir,
2158 install_dir : rootlibexecdir)
2160 s_j_gatewayd = executable('systemd-journal-gatewayd',
2161 systemd_journal_gatewayd_sources,
2162 include_directories : includes,
2163 link_with : [libshared],
2164 dependencies : [threads,
2169 install_rpath : rootlibexecdir,
2171 install_dir : rootlibexecdir)
2172 public_programs += [s_j_remote, s_j_gatewayd]
2175 if conf.get('ENABLE_COREDUMP') == 1
2176 executable('systemd-coredump',
2177 systemd_coredump_sources,
2178 include_directories : includes,
2179 link_with : [libshared],
2180 dependencies : [threads,
2185 install_rpath : rootlibexecdir,
2187 install_dir : rootlibexecdir)
2189 exe = executable('coredumpctl',
2190 coredumpctl_sources,
2191 include_directories : includes,
2192 link_with : [libshared],
2193 dependencies : [threads,
2196 install_rpath : rootlibexecdir,
2198 public_programs += exe
2201 if conf.get('ENABLE_BINFMT') == 1
2202 exe = executable('systemd-binfmt',
2203 'src/binfmt/binfmt.c',
2204 include_directories : includes,
2205 link_with : [libshared],
2206 install_rpath : rootlibexecdir,
2208 install_dir : rootlibexecdir)
2209 public_programs += exe
2211 meson.add_install_script('sh', '-c',
2212 mkdir_p.format(binfmtdir))
2213 meson.add_install_script('sh', '-c',
2214 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2217 if conf.get('ENABLE_VCONSOLE') == 1
2218 executable('systemd-vconsole-setup',
2219 'src/vconsole/vconsole-setup.c',
2220 include_directories : includes,
2221 link_with : [libshared],
2222 install_rpath : rootlibexecdir,
2224 install_dir : rootlibexecdir)
2227 if conf.get('ENABLE_RANDOMSEED') == 1
2228 executable('systemd-random-seed',
2229 'src/random-seed/random-seed.c',
2230 include_directories : includes,
2231 link_with : [libshared],
2232 install_rpath : rootlibexecdir,
2234 install_dir : rootlibexecdir)
2237 if conf.get('ENABLE_FIRSTBOOT') == 1
2238 executable('systemd-firstboot',
2239 'src/firstboot/firstboot.c',
2240 include_directories : includes,
2241 link_with : [libshared],
2242 dependencies : [libcrypt],
2243 install_rpath : rootlibexecdir,
2245 install_dir : rootbindir)
2248 executable('systemd-remount-fs',
2249 'src/remount-fs/remount-fs.c',
2250 'src/core/mount-setup.c',
2251 'src/core/mount-setup.h',
2252 include_directories : includes,
2253 link_with : [libshared],
2254 install_rpath : rootlibexecdir,
2256 install_dir : rootlibexecdir)
2258 executable('systemd-machine-id-setup',
2259 'src/machine-id-setup/machine-id-setup-main.c',
2260 'src/core/machine-id-setup.c',
2261 'src/core/machine-id-setup.h',
2262 include_directories : includes,
2263 link_with : [libshared],
2264 install_rpath : rootlibexecdir,
2266 install_dir : rootbindir)
2268 executable('systemd-fsck',
2270 include_directories : includes,
2271 link_with : [libshared],
2272 install_rpath : rootlibexecdir,
2274 install_dir : rootlibexecdir)
2276 executable('systemd-growfs',
2277 'src/partition/growfs.c',
2278 include_directories : includes,
2279 link_with : [libshared],
2280 dependencies : [libcryptsetup],
2281 install_rpath : rootlibexecdir,
2283 install_dir : rootlibexecdir)
2285 executable('systemd-makefs',
2286 'src/partition/makefs.c',
2287 include_directories : includes,
2288 link_with : [libshared],
2289 install_rpath : rootlibexecdir,
2291 install_dir : rootlibexecdir)
2293 executable('systemd-sleep',
2294 'src/sleep/sleep.c',
2295 include_directories : includes,
2296 link_with : [libshared],
2297 install_rpath : rootlibexecdir,
2299 install_dir : rootlibexecdir)
2301 exe = executable('systemd-sysctl',
2302 'src/sysctl/sysctl.c',
2303 include_directories : includes,
2304 link_with : [libshared],
2305 install_rpath : rootlibexecdir,
2307 install_dir : rootlibexecdir)
2308 public_programs += exe
2310 executable('systemd-ac-power',
2311 'src/ac-power/ac-power.c',
2312 include_directories : includes,
2313 link_with : [libshared],
2314 install_rpath : rootlibexecdir,
2316 install_dir : rootlibexecdir)
2318 exe = executable('systemd-detect-virt',
2319 'src/detect-virt/detect-virt.c',
2320 include_directories : includes,
2321 link_with : [libshared],
2322 install_rpath : rootlibexecdir,
2324 public_programs += exe
2326 exe = executable('systemd-delta',
2327 'src/delta/delta.c',
2328 include_directories : includes,
2329 link_with : [libshared],
2330 install_rpath : rootlibexecdir,
2332 public_programs += exe
2334 exe = executable('systemd-escape',
2335 'src/escape/escape.c',
2336 include_directories : includes,
2337 link_with : [libshared],
2338 install_rpath : rootlibexecdir,
2340 install_dir : rootbindir)
2341 public_programs += exe
2343 exe = executable('systemd-notify',
2344 'src/notify/notify.c',
2345 include_directories : includes,
2346 link_with : [libshared],
2347 install_rpath : rootlibexecdir,
2349 install_dir : rootbindir)
2350 public_programs += exe
2352 executable('systemd-volatile-root',
2353 'src/volatile-root/volatile-root.c',
2354 include_directories : includes,
2355 link_with : [libshared],
2356 install_rpath : rootlibexecdir,
2358 install_dir : rootlibexecdir)
2360 executable('systemd-cgroups-agent',
2361 'src/cgroups-agent/cgroups-agent.c',
2362 include_directories : includes,
2363 link_with : [libshared],
2364 install_rpath : rootlibexecdir,
2366 install_dir : rootlibexecdir)
2368 exe = executable('systemd-id128',
2369 'src/id128/id128.c',
2370 include_directories : includes,
2371 link_with : [libshared],
2372 install_rpath : rootlibexecdir,
2374 public_programs += exe
2376 exe = executable('systemd-path',
2378 include_directories : includes,
2379 link_with : [libshared],
2380 install_rpath : rootlibexecdir,
2382 public_programs += exe
2384 exe = executable('systemd-ask-password',
2385 'src/ask-password/ask-password.c',
2386 include_directories : includes,
2387 link_with : [libshared],
2388 install_rpath : rootlibexecdir,
2390 install_dir : rootbindir)
2391 public_programs += exe
2393 executable('systemd-reply-password',
2394 'src/reply-password/reply-password.c',
2395 include_directories : includes,
2396 link_with : [libshared],
2397 install_rpath : rootlibexecdir,
2399 install_dir : rootlibexecdir)
2401 exe = executable('systemd-tty-ask-password-agent',
2402 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2403 include_directories : includes,
2404 link_with : [libshared],
2405 install_rpath : rootlibexecdir,
2407 install_dir : rootbindir)
2408 public_programs += exe
2410 exe = executable('systemd-cgls',
2412 include_directories : includes,
2413 link_with : [libshared],
2414 install_rpath : rootlibexecdir,
2416 public_programs += exe
2418 exe = executable('systemd-cgtop',
2419 'src/cgtop/cgtop.c',
2420 include_directories : includes,
2421 link_with : [libshared],
2422 install_rpath : rootlibexecdir,
2424 public_programs += exe
2426 executable('systemd-initctl',
2427 'src/initctl/initctl.c',
2428 include_directories : includes,
2429 link_with : [libshared],
2430 install_rpath : rootlibexecdir,
2432 install_dir : rootlibexecdir)
2434 exe = executable('systemd-mount',
2435 'src/mount/mount-tool.c',
2436 include_directories : includes,
2437 link_with : [libshared],
2438 install_rpath : rootlibexecdir,
2440 public_programs += exe
2442 meson.add_install_script(meson_make_symlink,
2443 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2445 exe = executable('systemd-run',
2447 include_directories : includes,
2448 link_with : [libshared],
2449 install_rpath : rootlibexecdir,
2451 public_programs += exe
2453 exe = executable('systemd-stdio-bridge',
2454 'src/stdio-bridge/stdio-bridge.c',
2455 include_directories : includes,
2456 link_with : [libshared],
2457 install_rpath : rootlibexecdir,
2459 public_programs += exe
2461 exe = executable('busctl',
2462 'src/busctl/busctl.c',
2463 'src/busctl/busctl-introspect.c',
2464 'src/busctl/busctl-introspect.h',
2465 include_directories : includes,
2466 link_with : [libshared],
2467 install_rpath : rootlibexecdir,
2469 public_programs += exe
2471 if conf.get('ENABLE_SYSUSERS') == 1
2472 exe = executable('systemd-sysusers',
2473 'src/sysusers/sysusers.c',
2474 include_directories : includes,
2475 link_with : [libshared],
2476 install_rpath : rootlibexecdir,
2478 install_dir : rootbindir)
2479 public_programs += exe
2482 if conf.get('ENABLE_TMPFILES') == 1
2483 exe = executable('systemd-tmpfiles',
2484 'src/tmpfiles/tmpfiles.c',
2485 include_directories : includes,
2486 link_with : [libshared],
2487 dependencies : [libacl],
2488 install_rpath : rootlibexecdir,
2490 install_dir : rootbindir)
2491 public_programs += exe
2493 if want_tests != 'false'
2494 test('test-systemd-tmpfiles',
2495 test_systemd_tmpfiles_py,
2496 # https://github.com/mesonbuild/meson/issues/2681
2497 args : exe.full_path())
2501 if conf.get('ENABLE_HWDB') == 1
2502 exe = executable('systemd-hwdb',
2504 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2505 include_directories : includes,
2506 link_with : [libudev_static],
2507 install_rpath : udev_rpath,
2509 install_dir : rootbindir)
2510 public_programs += exe
2513 if conf.get('ENABLE_QUOTACHECK') == 1
2514 executable('systemd-quotacheck',
2515 'src/quotacheck/quotacheck.c',
2516 include_directories : includes,
2517 link_with : [libshared],
2518 install_rpath : rootlibexecdir,
2520 install_dir : rootlibexecdir)
2523 exe = executable('systemd-socket-proxyd',
2524 'src/socket-proxy/socket-proxyd.c',
2525 include_directories : includes,
2526 link_with : [libshared],
2527 dependencies : [threads],
2528 install_rpath : rootlibexecdir,
2530 install_dir : rootlibexecdir)
2531 public_programs += exe
2533 exe = executable('systemd-udevd',
2534 systemd_udevd_sources,
2535 include_directories : includes,
2536 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2537 link_with : [libudev_core,
2540 dependencies : [threads,
2545 install_rpath : udev_rpath,
2547 install_dir : rootlibexecdir)
2548 public_programs += exe
2550 exe = executable('udevadm',
2552 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2553 include_directories : includes,
2554 link_with : [libudev_core,
2557 dependencies : [threads,
2562 install_rpath : udev_rpath,
2564 install_dir : rootbindir)
2565 public_programs += exe
2567 executable('systemd-shutdown',
2568 systemd_shutdown_sources,
2569 include_directories : includes,
2570 link_with : [libshared],
2571 dependencies : [libmount],
2572 install_rpath : rootlibexecdir,
2574 install_dir : rootlibexecdir)
2576 executable('systemd-update-done',
2577 'src/update-done/update-done.c',
2578 include_directories : includes,
2579 link_with : [libshared],
2580 install_rpath : rootlibexecdir,
2582 install_dir : rootlibexecdir)
2584 executable('systemd-update-utmp',
2585 'src/update-utmp/update-utmp.c',
2586 include_directories : includes,
2587 link_with : [libshared],
2588 dependencies : [libaudit],
2589 install_rpath : rootlibexecdir,
2591 install_dir : rootlibexecdir)
2593 if conf.get('HAVE_KMOD') == 1
2594 executable('systemd-modules-load',
2595 'src/modules-load/modules-load.c',
2596 include_directories : includes,
2597 link_with : [libshared],
2598 dependencies : [libkmod],
2599 install_rpath : rootlibexecdir,
2601 install_dir : rootlibexecdir)
2603 meson.add_install_script('sh', '-c',
2604 mkdir_p.format(modulesloaddir))
2605 meson.add_install_script('sh', '-c',
2606 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2609 exe = executable('systemd-nspawn',
2610 systemd_nspawn_sources,
2611 'src/core/mount-setup.c', # FIXME: use a variable?
2612 'src/core/mount-setup.h',
2613 'src/core/loopback-setup.c',
2614 'src/core/loopback-setup.h',
2615 include_directories : includes,
2616 link_with : [libnspawn_core,
2618 dependencies : [libblkid],
2619 install_rpath : rootlibexecdir,
2621 public_programs += exe
2623 if conf.get('ENABLE_NETWORKD') == 1
2624 executable('systemd-networkd',
2625 systemd_networkd_sources,
2626 include_directories : includes,
2627 link_with : [libnetworkd_core,
2631 dependencies : [threads],
2632 install_rpath : rootlibexecdir,
2634 install_dir : rootlibexecdir)
2636 executable('systemd-networkd-wait-online',
2637 systemd_networkd_wait_online_sources,
2638 include_directories : includes,
2639 link_with : [libnetworkd_core,
2641 install_rpath : rootlibexecdir,
2643 install_dir : rootlibexecdir)
2645 exe = executable('networkctl',
2647 include_directories : includes,
2648 link_with : [libsystemd_network,
2650 install_rpath : rootlibexecdir,
2652 install_dir : rootbindir)
2653 public_programs += exe
2656 executable('systemd-sulogin-shell',
2657 ['src/sulogin-shell/sulogin-shell.c'],
2658 include_directories : includes,
2659 link_with : [libshared],
2660 install_rpath : rootlibexecdir,
2662 install_dir : rootlibexecdir)
2664 ############################################################
2667 'systemd-runtest.env',
2668 output : 'systemd-runtest.env',
2669 command : ['sh', '-c', '{ ' +
2670 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2671 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2673 build_by_default : true)
2675 foreach tuple : tests
2677 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2678 dependencies = tuple[2]
2679 condition = tuple.length() >= 4 ? tuple[3] : ''
2680 type = tuple.length() >= 5 ? tuple[4] : ''
2681 defs = tuple.length() >= 6 ? tuple[5] : []
2682 incs = tuple.length() >= 7 ? tuple[6] : includes
2685 name = sources[0].split('/')[-1].split('.')[0]
2686 if type.startswith('timeout=')
2687 timeout = type.split('=')[1].to_int()
2691 if condition == '' or conf.get(condition) == 1
2695 include_directories : incs,
2696 link_with : link_with,
2697 dependencies : dependencies,
2699 build_by_default : want_tests != 'false',
2700 install_rpath : rootlibexecdir,
2701 install : install_tests,
2702 install_dir : join_paths(testsdir, type))
2705 message('@0@ is a manual test'.format(name))
2706 elif type == 'unsafe' and want_tests != 'unsafe'
2707 message('@0@ is an unsafe test'.format(name))
2708 elif want_tests != 'false'
2714 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2719 'test-libsystemd-sym',
2720 test_libsystemd_sym_c,
2721 include_directories : includes,
2722 link_with : [libsystemd],
2723 build_by_default : want_tests != 'false',
2724 install : install_tests,
2725 install_dir : testsdir)
2726 if want_tests != 'false'
2727 test('test-libsystemd-sym', exe)
2731 'test-libsystemd-static-sym',
2732 test_libsystemd_sym_c,
2733 include_directories : includes,
2734 link_with : [install_libsystemd_static],
2735 dependencies : [threads], # threads is already included in dependencies on the library,
2736 # but does not seem to get propagated. Add here as a work-around.
2737 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2738 install : install_tests and static_libsystemd_pic,
2739 install_dir : testsdir)
2740 if want_tests != 'false' and static_libsystemd_pic
2741 test('test-libsystemd-static-sym', exe)
2747 include_directories : includes,
2748 c_args : '-Wno-deprecated-declarations',
2749 link_with : [libudev],
2750 build_by_default : want_tests != 'false',
2751 install : install_tests,
2752 install_dir : testsdir)
2753 if want_tests != 'false'
2754 test('test-libudev-sym', exe)
2758 'test-libudev-static-sym',
2760 include_directories : includes,
2761 c_args : '-Wno-deprecated-declarations',
2762 link_with : [install_libudev_static],
2763 build_by_default : want_tests != 'false' and static_libudev_pic,
2764 install : install_tests and static_libudev_pic,
2765 install_dir : testsdir)
2766 if want_tests != 'false' and static_libudev_pic
2767 test('test-libudev-static-sym', exe)
2770 ############################################################
2774 if get_option('tests') != 'false'
2775 foreach tuple : fuzzers
2777 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2778 dependencies = tuple[2]
2779 defs = tuple.length() >= 4 ? tuple[3] : []
2780 incs = tuple.length() >= 5 ? tuple[4] : includes
2783 dependencies += fuzzing_engine
2785 sources += 'src/fuzz/fuzz-main.c'
2788 name = sources[0].split('/')[-1].split('.')[0]
2790 fuzzer_exes += executable(
2793 include_directories : [incs, include_directories('src/fuzz')],
2794 link_with : link_with,
2795 dependencies : dependencies,
2801 run_target('fuzzers',
2802 depends : fuzzer_exes,
2805 ############################################################
2807 make_directive_index_py = find_program('tools/make-directive-index.py')
2808 make_man_index_py = find_program('tools/make-man-index.py')
2809 xml_helper_py = find_program('tools/xml_helper.py')
2810 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2814 subdir('sysusers.d')
2815 subdir('tmpfiles.d')
2820 subdir('shell-completion/bash')
2821 subdir('shell-completion/zsh')
2822 subdir('docs/sysvinit')
2823 subdir('docs/var-log')
2825 install_subdir('factory/etc',
2826 install_dir : factorydir)
2828 install_data('xorg/50-systemd-user.sh',
2829 install_dir : xinitrcdir)
2830 install_data('modprobe.d/systemd.conf',
2831 install_dir : modprobedir)
2832 install_data('LICENSE.GPL2',
2836 'docs/CODING_STYLE.md',
2837 'docs/DISTRO_PORTING.md',
2838 'docs/ENVIRONMENT.md',
2840 'docs/TRANSIENT-SETTINGS.md',
2841 'docs/TRANSLATORS.md',
2842 'docs/UIDS-GIDS.md',
2843 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2844 install_dir : docdir)
2846 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2847 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2849 ############################################################
2851 meson_check_help = find_program('tools/meson-check-help.sh')
2853 foreach exec : public_programs
2854 name = exec.full_path().split('/')[-1]
2855 if want_tests != 'false'
2856 test('check-help-' + name,
2858 args : exec.full_path())
2862 ############################################################
2864 # Enable tests for all supported sanitizers
2865 foreach tuple : sanitizers
2866 sanitizer = tuple[0]
2869 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2871 foreach p : fuzz_regression_tests
2872 b = p.split('/')[-2]
2873 c = p.split('/')[-1]
2875 name = '@0@:@1@'.format(b, sanitizer)
2878 if want_tests == 'false'
2879 message('Not compiling @0@ because tests is set to false'.format(name))
2881 exe = custom_target(
2885 command : [env, 'ln', '-fs',
2886 join_paths(build.full_path(), b),
2888 build_by_default : true)
2890 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2895 if want_tests != 'false' and slow_tests
2896 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2898 args : [exe.full_path(),
2899 join_paths(meson.source_root(), p)])
2906 ############################################################
2909 all_files = run_command(
2911 ['--git-dir=@0@/.git'.format(meson.source_root()),
2914 all_files = files(all_files.stdout().split())
2919 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
2922 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
2926 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2929 command : [meson_git_contrib_sh])
2933 git_head = run_command(
2935 ['--git-dir=@0@/.git'.format(meson.source_root()),
2936 'rev-parse', 'HEAD']).stdout().strip()
2937 git_head_short = run_command(
2939 ['--git-dir=@0@/.git'.format(meson.source_root()),
2940 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2944 command : ['git', 'archive',
2945 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
2947 '--prefix', 'systemd-@0@/'.format(git_head),
2951 ############################################################
2953 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2956 depends : [man, libsystemd, libudev],
2957 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2961 command : ['sh', '@0@/tools/make-index-md.sh'.format(meson.source_root()), meson.source_root()])
2963 ############################################################
2966 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2968 'split /usr: @0@'.format(split_usr),
2969 'split bin-sbin: @0@'.format(split_bin),
2970 'prefix directory: @0@'.format(prefixdir),
2971 'rootprefix directory: @0@'.format(rootprefixdir),
2972 'sysconf directory: @0@'.format(sysconfdir),
2973 'include directory: @0@'.format(includedir),
2974 'lib directory: @0@'.format(libdir),
2975 'rootlib directory: @0@'.format(rootlibdir),
2976 'SysV init scripts: @0@'.format(sysvinit_path),
2977 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2978 'PAM modules directory: @0@'.format(pamlibdir),
2979 'PAM configuration directory: @0@'.format(pamconfdir),
2980 'RPM macros directory: @0@'.format(rpmmacrosdir),
2981 'modprobe.d directory: @0@'.format(modprobedir),
2982 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2983 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2984 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2985 'bash completions directory: @0@'.format(bashcompletiondir),
2986 'zsh completions directory: @0@'.format(zshcompletiondir),
2987 'extra start script: @0@'.format(get_option('rc-local')),
2988 'extra stop script: @0@'.format(get_option('halt-local')),
2989 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2990 get_option('debug-tty')),
2991 'TTY GID: @0@'.format(tty_gid),
2992 'users GID: @0@'.format(substs.get('USERS_GID')),
2993 'maximum system UID: @0@'.format(system_uid_max),
2994 'maximum system GID: @0@'.format(system_gid_max),
2995 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2996 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2997 'minimum container UID base: @0@'.format(container_uid_base_min),
2998 'maximum container UID base: @0@'.format(container_uid_base_max),
2999 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3000 'render group access mode: @0@'.format(get_option('group-render-mode')),
3001 'certificate root directory: @0@'.format(get_option('certificate-root')),
3002 'support URL: @0@'.format(support_url),
3003 'nobody user name: @0@'.format(nobody_user),
3004 'nobody group name: @0@'.format(nobody_group),
3005 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3006 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3008 'default DNSSEC mode: @0@'.format(default_dnssec),
3009 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3010 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3011 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
3013 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3014 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3016 'default DNS servers: @0@'.format(alt_dns_servers),
3017 'default NTP servers: @0@'.format(alt_ntp_servers)]
3019 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3020 '@@0@'.format(time_epoch)).stdout().strip()
3022 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3025 'static libsystemd: @0@'.format(static_libsystemd),
3026 'static libudev: @0@'.format(static_libudev)]
3029 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3030 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3031 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3033 if conf.get('ENABLE_EFI') == 1
3034 status += 'efi arch: @0@'.format(efi_arch)
3038 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3039 'EFI CC @0@'.format(efi_cc),
3040 'EFI lib directory: @0@'.format(efi_libdir),
3041 'EFI lds directory: @0@'.format(efi_ldsdir),
3042 'EFI include directory: @0@'.format(efi_incdir)]
3094 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3095 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3098 ['legacy pkla', install_polkit_pkla],
3100 ['gnu-efi', have_gnu_efi],
3113 ['man pages', want_man],
3114 ['html pages', want_html],
3115 ['man page indices', want_man and have_lxml],
3120 ['adm group', get_option('adm-group')],
3121 ['wheel group', get_option('wheel-group')],
3124 ['debug mmap cache'],
3125 ['valgrind', conf.get('VALGRIND') == 1],
3126 ['trace logging', conf.get('LOG_TRACE') == 1],
3127 ['link-udev-shared', get_option('link-udev-shared')],
3128 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3131 if tuple.length() >= 2
3134 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3135 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3136 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3147 'enabled features: @0@'.format(', '.join(found)),
3149 'disabled features: @0@'.format(', '.join(missing)),
3151 message('\n '.join(status))
3153 if rootprefixdir != rootprefix_default
3155 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3156 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3157 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))