1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
12 meson_version : '>= 0.44',
15 libsystemd_version = '0.23.0'
16 libudev_version = '1.6.11'
18 # We need the same data in two different formats, ugh!
19 # Also, for hysterical reasons, we use different variable
20 # names, sometimes. Not all variables are included in every
22 conf = configuration_data()
23 conf.set_quoted('PACKAGE_STRING', meson.project_name() + ' ' + meson.project_version())
24 conf.set_quoted('PACKAGE_VERSION', meson.project_version())
26 substs = configuration_data()
27 substs.set('PACKAGE_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
28 substs.set('PACKAGE_VERSION', meson.project_version())
30 #####################################################################
32 # Try to install the git pre-commit hook
33 git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
34 if git_hook.returncode() == 0
35 message(git_hook.stdout().strip())
38 #####################################################################
40 if get_option('split-usr') == 'auto'
41 split_usr = run_command('test', '-L', '/bin').returncode() != 0
43 split_usr = get_option('split-usr') == 'true'
45 conf.set10('HAVE_SPLIT_USR', split_usr,
46 description : '/usr/bin and /bin directories are separate')
48 if get_option('split-bin') == 'auto'
49 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
51 split_bin = get_option('split-bin') == 'true'
53 conf.set10('HAVE_SPLIT_BIN', split_bin,
54 description : 'bin and sbin directories are separate')
56 rootprefixdir = get_option('rootprefix')
57 # Unusual rootprefixdir values are used by some distros
58 # (see https://github.com/systemd/systemd/pull/7461).
59 rootprefix_default = split_usr ? '/' : '/usr'
60 if rootprefixdir == ''
61 rootprefixdir = rootprefix_default
64 sysvinit_path = get_option('sysvinit-path')
65 sysvrcnd_path = get_option('sysvrcnd-path')
66 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
67 description : 'SysV init scripts and rcN.d links are supported')
69 # join_paths ignore the preceding arguments if an absolute component is
70 # encountered, so this should canonicalize various paths when they are
71 # absolute or relative.
72 prefixdir = get_option('prefix')
73 if not prefixdir.startswith('/')
74 error('Prefix is not absolute: "@0@"'.format(prefixdir))
76 bindir = join_paths(prefixdir, get_option('bindir'))
77 libdir = join_paths(prefixdir, get_option('libdir'))
78 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
79 includedir = join_paths(prefixdir, get_option('includedir'))
80 datadir = join_paths(prefixdir, get_option('datadir'))
81 localstatedir = join_paths('/', get_option('localstatedir'))
83 rootbindir = join_paths(rootprefixdir, 'bin')
84 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
85 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
87 rootlibdir = get_option('rootlibdir')
89 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
92 # Dirs of external packages
93 pkgconfigdatadir = join_paths(datadir, 'pkgconfig')
94 pkgconfiglibdir = join_paths(libdir, 'pkgconfig')
95 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
96 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
97 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
98 varlogdir = join_paths(localstatedir, 'log')
99 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
100 rpmmacrosdir = get_option('rpmmacrosdir')
101 if rpmmacrosdir != 'no'
102 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
104 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
107 pkgdatadir = join_paths(datadir, 'systemd')
108 environmentdir = join_paths(prefixdir, 'lib/environment.d')
109 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
110 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
111 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
112 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
113 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
114 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
115 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
116 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
117 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
118 pkgincludedir = join_paths(includedir, 'systemd')
119 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
120 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
121 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
122 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
123 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
124 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
125 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
126 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
127 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
128 udevhomedir = udevlibexecdir
129 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
130 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
131 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
132 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
133 factorydir = join_paths(datadir, 'factory')
134 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
135 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
136 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
137 catalogstatedir = join_paths(systemdstatedir, 'catalog')
138 randomseeddir = join_paths(localstatedir, 'lib/systemd')
139 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
141 docdir = get_option('docdir')
143 docdir = join_paths(datadir, 'doc/systemd')
146 dbuspolicydir = get_option('dbuspolicydir')
147 if dbuspolicydir == ''
148 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
151 dbussessionservicedir = get_option('dbussessionservicedir')
152 if dbussessionservicedir == ''
153 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
156 dbussystemservicedir = get_option('dbussystemservicedir')
157 if dbussystemservicedir == ''
158 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
161 pamlibdir = get_option('pamlibdir')
163 pamlibdir = join_paths(rootlibdir, 'security')
166 pamconfdir = get_option('pamconfdir')
168 pamconfdir = join_paths(sysconfdir, 'pam.d')
171 memory_accounting_default = get_option('memory-accounting-default')
173 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
174 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
175 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
176 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
177 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
178 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
179 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
181 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
183 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
184 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
185 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
186 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
187 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
188 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
189 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
190 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
191 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
192 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
193 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
194 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
195 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
196 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
197 conf.set_quoted('ROOTPREFIX', rootprefixdir)
198 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
199 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
200 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
201 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
202 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
203 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
204 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
205 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
206 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
207 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
208 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
209 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
210 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
211 conf.set_quoted('LIBDIR', libdir)
212 conf.set_quoted('ROOTLIBDIR', rootlibdir)
213 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
214 conf.set_quoted('BOOTLIBDIR', bootlibdir)
215 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
216 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
217 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
218 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
219 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
220 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
221 conf.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'true' : 'false')
222 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
224 conf.set_quoted('ABS_BUILD_DIR', meson.build_root())
225 conf.set_quoted('ABS_SRC_DIR', meson.source_root())
227 substs.set('prefix', prefixdir)
228 substs.set('exec_prefix', prefixdir)
229 substs.set('libdir', libdir)
230 substs.set('rootlibdir', rootlibdir)
231 substs.set('includedir', includedir)
232 substs.set('pkgsysconfdir', pkgsysconfdir)
233 substs.set('bindir', bindir)
234 substs.set('rootbindir', rootbindir)
235 substs.set('rootlibexecdir', rootlibexecdir)
236 substs.set('systemunitdir', systemunitdir)
237 substs.set('userunitdir', userunitdir)
238 substs.set('systempresetdir', systempresetdir)
239 substs.set('userpresetdir', userpresetdir)
240 substs.set('udevhwdbdir', udevhwdbdir)
241 substs.set('udevrulesdir', udevrulesdir)
242 substs.set('udevlibexecdir', udevlibexecdir)
243 substs.set('environmentdir', environmentdir)
244 substs.set('catalogdir', catalogdir)
245 substs.set('tmpfilesdir', tmpfilesdir)
246 substs.set('sysusersdir', sysusersdir)
247 substs.set('sysctldir', sysctldir)
248 substs.set('binfmtdir', binfmtdir)
249 substs.set('modulesloaddir', modulesloaddir)
250 substs.set('modprobedir', modprobedir)
251 substs.set('systemgeneratordir', systemgeneratordir)
252 substs.set('usergeneratordir', usergeneratordir)
253 substs.set('systemenvgeneratordir', systemenvgeneratordir)
254 substs.set('userenvgeneratordir', userenvgeneratordir)
255 substs.set('systemshutdowndir', systemshutdowndir)
256 substs.set('systemsleepdir', systemsleepdir)
257 substs.set('VARLOGDIR', varlogdir)
258 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
259 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
260 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
261 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
262 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
263 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
264 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
265 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
267 #####################################################################
269 cc = meson.get_compiler('c')
270 pkgconfig = import('pkgconfig')
271 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
272 meson_build_sh = find_program('tools/meson-build.sh')
274 if get_option('tests') != 'false'
275 cxx = find_program('c++', required : false)
277 # Used only for tests
282 want_ossfuzz = get_option('oss-fuzz')
283 want_libfuzzer = get_option('llvm-fuzz')
284 fuzzer_build = want_ossfuzz or want_libfuzzer
285 if want_ossfuzz and want_libfuzzer
286 error('only one of oss-fuzz and llvm-fuzz can be specified')
289 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
292 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
295 possible_cc_flags = [
299 '-Wmissing-include-dirs',
300 '-Wold-style-definition',
304 '-Wsuggest-attribute=noreturn',
305 '-Werror=missing-prototypes',
306 '-Werror=implicit-function-declaration',
307 '-Werror=missing-declarations',
308 '-Werror=return-type',
309 '-Werror=incompatible-pointer-types',
311 '-Wstrict-prototypes',
313 '-Wmissing-noreturn',
314 '-Wimplicit-fallthrough=5',
317 '-Wstrict-aliasing=2',
320 '-Werror=shift-count-overflow',
321 '-Werror=shift-overflow=2',
326 '-fdiagnostics-show-option',
327 '-fno-strict-aliasing',
328 '-fvisibility=hidden',
330 '-fstack-protector-strong',
331 '--param=ssp-buffer-size=4',
334 # --as-needed and --no-undefined are provided by meson by default,
335 # run mesonconf to see what is enabled
336 possible_link_flags = [
341 # the oss-fuzz fuzzers are not built with -fPIE, so don't
342 # enable it when we are linking against them
344 possible_cc_flags += '-fPIE'
345 possible_link_flags += '-pie'
348 if cc.get_id() == 'clang'
349 possible_cc_flags += [
350 '-Wno-typedef-redefinition',
351 '-Wno-gnu-variable-sized-type-not-at-end',
355 if get_option('buildtype') != 'debug'
356 possible_cc_flags += [
357 '-ffunction-sections',
361 possible_link_flags += '-Wl,--gc-sections'
364 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
366 # "negative" arguments: gcc on purpose does not return an error for "-Wno-"
367 # arguments, just emits a warning. So test for the "positive" version instead.
368 foreach arg : ['unused-parameter',
369 'missing-field-initializers',
372 'error=nonnull', # work-around for gcc 7.1 turning this on on its own
374 if cc.has_argument('-W' + arg)
375 add_project_arguments('-Wno-' + arg, language : 'c')
381 #include <inttypes.h>
382 typedef uint64_t usec_t;
383 usec_t now(clockid_t clock);
388 ''', name : '-Werror=shadow with local shadowing')
389 add_project_arguments('-Werror=shadow', language : 'c')
392 link_test_c = files('tools/meson-link-test.c')
394 foreach arg : possible_link_flags
395 have = run_command(check_compilation_sh,
396 cc.cmd_array(), '-x', 'c', arg,
397 '-include', link_test_c).returncode() == 0
398 message('Linking with @0@ supported: @1@'.format(arg, have ? 'yes' : 'no'))
400 add_project_link_arguments(arg, language : 'c')
404 cpp = ' '.join(cc.cmd_array()) + ' -E'
406 #####################################################################
407 # compilation result tests
409 conf.set('_GNU_SOURCE', true)
410 conf.set('__SANE_USERSPACE_TYPES__', true)
412 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
413 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
414 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
415 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
416 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
417 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
418 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
422 #include <linux/ethtool.h>
423 #include <linux/fib_rules.h>
424 #include <sys/stat.h>
427 foreach decl : ['char16_t',
429 'struct ethtool_link_settings',
430 'struct fib_rule_uid_range',
434 # We get -1 if the size cannot be determined
435 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
437 if decl == 'struct statx'
439 want_linux_stat_h = false
441 have = cc.sizeof(decl,
442 prefix : decl_headers + '#include <linux/stat.h>',
443 args : '-D_GNU_SOURCE') > 0
444 want_linux_stat_h = have
448 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
451 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
453 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
454 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
455 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
456 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
457 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
458 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
459 ['IFLA_BOND_AD_INFO', 'linux/if_link.h'],
460 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
461 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
462 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
463 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
464 # if_tunnel.h is buggy and cannot be included on its own
465 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
466 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
467 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
468 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
469 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
470 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
471 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
472 ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
473 ['NDA_IFINDEX', 'linux/neighbour.h'],
474 ['IFA_FLAGS', 'linux/if_addr.h'],
475 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
476 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
477 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
479 prefix = decl.length() > 2 ? decl[2] : ''
480 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
481 conf.set10('HAVE_' + decl[0], have)
484 foreach ident : ['secure_getenv', '__secure_getenv']
485 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
489 ['memfd_create', '''#include <sys/mman.h>'''],
490 ['gettid', '''#include <sys/types.h>
491 #include <unistd.h>'''],
492 ['pivot_root', '''#include <stdlib.h>
493 #include <unistd.h>'''], # no known header declares pivot_root
494 ['name_to_handle_at', '''#include <sys/types.h>
495 #include <sys/stat.h>
496 #include <fcntl.h>'''],
497 ['setns', '''#include <sched.h>'''],
498 ['renameat2', '''#include <stdio.h>
499 #include <fcntl.h>'''],
500 ['kcmp', '''#include <linux/kcmp.h>'''],
501 ['keyctl', '''#include <sys/types.h>
502 #include <keyutils.h>'''],
503 ['copy_file_range', '''#include <sys/syscall.h>
504 #include <unistd.h>'''],
505 ['bpf', '''#include <sys/syscall.h>
506 #include <unistd.h>'''],
507 ['statx', '''#include <sys/types.h>
508 #include <sys/stat.h>
509 #include <unistd.h>'''],
510 ['explicit_bzero' , '''#include <string.h>'''],
511 ['reallocarray', '''#include <malloc.h>'''],
514 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
515 conf.set10('HAVE_' + ident[0].to_upper(), have)
518 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
519 conf.set10('USE_SYS_RANDOM_H', true)
520 conf.set10('HAVE_GETRANDOM', true)
522 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
523 conf.set10('USE_SYS_RANDOM_H', false)
524 conf.set10('HAVE_GETRANDOM', have)
527 #####################################################################
529 sed = find_program('sed')
530 awk = find_program('awk')
531 m4 = find_program('m4')
532 stat = find_program('stat')
533 git = find_program('git', required : false)
534 env = find_program('env')
535 perl = find_program('perl', required : false)
537 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
538 mkdir_p = 'mkdir -p $DESTDIR/@0@'
539 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
540 splash_bmp = files('test/splash.bmp')
542 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
543 # /usr/sbin, /sbin, and fall back to the default from middle column.
544 progs = [['quotaon', '/usr/sbin/quotaon' ],
545 ['quotacheck', '/usr/sbin/quotacheck' ],
546 ['kmod', '/usr/bin/kmod' ],
547 ['kexec', '/usr/sbin/kexec' ],
548 ['sulogin', '/usr/sbin/sulogin' ],
549 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
550 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
551 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
552 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
555 path = get_option(prog[0] + '-path')
557 message('Using @1@ for @0@'.format(prog[0], path))
559 exe = find_program(prog[0],
560 '/usr/sbin/' + prog[0],
563 path = exe.found() ? exe.path() : prog[1]
565 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
566 conf.set_quoted(name, path)
567 substs.set(name, path)
570 conf.set_quoted('TELINIT', get_option('telinit-path'))
572 if run_command('ln', '--relative', '--help').returncode() != 0
573 error('ln does not support --relative (added in coreutils 8.16)')
576 ############################################################
578 gperf = find_program('gperf')
580 gperf_test_format = '''
582 const char * in_word_set(const char *, @0@);
585 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
586 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
587 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
588 if cc.compiles(gperf_test)
589 gperf_len_type = 'size_t'
591 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
592 if cc.compiles(gperf_test)
593 gperf_len_type = 'unsigned'
595 error('unable to determine gperf len type')
598 message('gperf len type is @0@'.format(gperf_len_type))
599 conf.set('GPERF_LEN_TYPE', gperf_len_type,
600 description : 'The type of gperf "len" parameter')
602 ############################################################
604 if not cc.has_header('sys/capability.h')
605 error('POSIX caps headers not found')
607 foreach header : ['crypt.h',
610 'linux/vm_sockets.h',
612 'valgrind/memcheck.h',
613 'valgrind/valgrind.h',
616 conf.set10('HAVE_' + header.underscorify().to_upper(),
617 cc.has_header(header))
620 ############################################################
622 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
623 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
624 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
626 default_hierarchy = get_option('default-hierarchy')
627 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
628 description : 'default cgroup hierarchy as string')
629 if default_hierarchy == 'legacy'
630 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
631 elif default_hierarchy == 'hybrid'
632 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
634 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
637 time_epoch = get_option('time-epoch')
640 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
642 time_epoch = time_epoch.to_int()
643 conf.set('TIME_EPOCH', time_epoch)
645 system_uid_max = get_option('system-uid-max')
646 if system_uid_max == ''
647 system_uid_max = run_command(
649 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
650 '/etc/login.defs').stdout().strip()
651 if system_uid_max == ''
652 system_uid_max = '999'
655 system_uid_max = system_uid_max.to_int()
656 conf.set('SYSTEM_UID_MAX', system_uid_max)
657 substs.set('systemuidmax', system_uid_max)
659 system_gid_max = get_option('system-gid-max')
660 if system_gid_max == ''
661 system_gid_max = run_command(
663 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
664 '/etc/login.defs').stdout().strip()
665 if system_gid_max == ''
666 system_gid_max = '999'
669 system_gid_max = system_gid_max.to_int()
670 conf.set('SYSTEM_GID_MAX', system_gid_max)
671 substs.set('systemgidmax', system_gid_max)
673 dynamic_uid_min = get_option('dynamic-uid-min').to_int()
674 dynamic_uid_max = get_option('dynamic-uid-max').to_int()
675 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
676 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
677 substs.set('dynamicuidmin', dynamic_uid_min)
678 substs.set('dynamicuidmax', dynamic_uid_max)
680 container_uid_base_min = get_option('container-uid-base-min').to_int()
681 container_uid_base_max = get_option('container-uid-base-max').to_int()
682 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
683 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
684 substs.set('containeruidbasemin', container_uid_base_min)
685 substs.set('containeruidbasemax', container_uid_base_max)
687 nobody_user = get_option('nobody-user')
688 nobody_group = get_option('nobody-group')
690 if not meson.is_cross_build()
691 getent_result = run_command('getent', 'passwd', '65534')
692 if getent_result.returncode() == 0
693 name = getent_result.stdout().split(':')[0]
694 if name != nobody_user
696 '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) +
697 'Your build will result in an user table setup that is incompatible with the local system.')
700 id_result = run_command('id', '-u', nobody_user)
701 if id_result.returncode() == 0
702 id = id_result.stdout().to_int()
705 '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) +
706 'Your build will result in an user table setup that is incompatible with the local system.')
710 getent_result = run_command('getent', 'group', '65534')
711 if getent_result.returncode() == 0
712 name = getent_result.stdout().split(':')[0]
713 if name != nobody_group
715 '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) +
716 'Your build will result in an group table setup that is incompatible with the local system.')
719 id_result = run_command('id', '-g', nobody_group)
720 if id_result.returncode() == 0
721 id = id_result.stdout().to_int()
724 '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) +
725 'Your build will result in an group table setup that is incompatible with the local system.')
729 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
731 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
732 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
735 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
736 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
737 substs.set('NOBODY_USER_NAME', nobody_user)
738 substs.set('NOBODY_GROUP_NAME', nobody_group)
740 tty_gid = get_option('tty-gid')
741 conf.set('TTY_GID', tty_gid)
742 substs.set('TTY_GID', tty_gid)
744 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
745 if get_option('users-gid') != ''
746 users_gid = get_option('users-gid').to_int()
750 substs.set('USERS_GID', users_gid)
752 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
753 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
755 substs.set('DEV_KVM_MODE', get_option('dev-kvm-mode'))
756 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
758 kill_user_processes = get_option('default-kill-user-processes')
759 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
760 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
761 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
763 dns_servers = get_option('dns-servers')
764 conf.set_quoted('DNS_SERVERS', dns_servers)
765 substs.set('DNS_SERVERS', dns_servers)
767 ntp_servers = get_option('ntp-servers')
768 conf.set_quoted('NTP_SERVERS', ntp_servers)
769 substs.set('NTP_SERVERS', ntp_servers)
771 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
773 substs.set('SUSHELL', get_option('debug-shell'))
774 substs.set('DEBUGTTY', get_option('debug-tty'))
776 enable_debug_hashmap = false
777 enable_debug_mmap_cache = false
778 foreach name : get_option('debug')
780 enable_debug_hashmap = true
781 elif name == 'mmap-cache'
782 enable_debug_mmap_cache = true
784 message('unknown debug option "@0@", ignoring'.format(name))
787 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
788 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
790 conf.set10('VALGRIND', get_option('valgrind'))
792 #####################################################################
794 threads = dependency('threads')
795 librt = cc.find_library('rt')
796 libm = cc.find_library('m')
797 libdl = cc.find_library('dl')
798 libcrypt = cc.find_library('crypt')
800 libcap = dependency('libcap', required : false)
801 if not libcap.found()
802 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
803 libcap = cc.find_library('cap')
806 libmount = dependency('mount',
807 version : fuzzer_build ? '>= 0' : '>= 2.30')
809 want_seccomp = get_option('seccomp')
810 if want_seccomp != 'false' and not fuzzer_build
811 libseccomp = dependency('libseccomp',
812 version : '>= 2.3.1',
813 required : want_seccomp == 'true')
814 have = libseccomp.found()
819 conf.set10('HAVE_SECCOMP', have)
821 want_selinux = get_option('selinux')
822 if want_selinux != 'false' and not fuzzer_build
823 libselinux = dependency('libselinux',
824 version : '>= 2.1.9',
825 required : want_selinux == 'true')
826 have = libselinux.found()
831 conf.set10('HAVE_SELINUX', have)
833 want_apparmor = get_option('apparmor')
834 if want_apparmor != 'false' and not fuzzer_build
835 libapparmor = dependency('libapparmor',
836 required : want_apparmor == 'true')
837 have = libapparmor.found()
842 conf.set10('HAVE_APPARMOR', have)
844 smack_run_label = get_option('smack-run-label')
845 if smack_run_label != ''
846 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
849 want_polkit = get_option('polkit')
850 install_polkit = false
851 install_polkit_pkla = false
852 if want_polkit != 'false' and not fuzzer_build
853 install_polkit = true
855 libpolkit = dependency('polkit-gobject-1',
857 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
858 message('Old polkit detected, will install pkla files')
859 install_polkit_pkla = true
862 conf.set10('ENABLE_POLKIT', install_polkit)
864 want_acl = get_option('acl')
865 if want_acl != 'false' and not fuzzer_build
866 libacl = cc.find_library('acl', required : want_acl == 'true')
867 have = libacl.found()
872 conf.set10('HAVE_ACL', have)
874 want_audit = get_option('audit')
875 if want_audit != 'false' and not fuzzer_build
876 libaudit = dependency('audit', required : want_audit == 'true')
877 have = libaudit.found()
882 conf.set10('HAVE_AUDIT', have)
884 want_blkid = get_option('blkid')
885 if want_blkid != 'false' and not fuzzer_build
886 libblkid = dependency('blkid', required : want_blkid == 'true')
887 have = libblkid.found()
892 conf.set10('HAVE_BLKID', have)
894 want_kmod = get_option('kmod')
895 if want_kmod != 'false' and not fuzzer_build
896 libkmod = dependency('libkmod',
898 required : want_kmod == 'true')
899 have = libkmod.found()
904 conf.set10('HAVE_KMOD', have)
906 want_pam = get_option('pam')
907 if want_pam != 'false' and not fuzzer_build
908 libpam = cc.find_library('pam', required : want_pam == 'true')
909 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
910 have = libpam.found() and libpam_misc.found()
916 conf.set10('HAVE_PAM', have)
918 want_microhttpd = get_option('microhttpd')
919 if want_microhttpd != 'false' and not fuzzer_build
920 libmicrohttpd = dependency('libmicrohttpd',
921 version : '>= 0.9.33',
922 required : want_microhttpd == 'true')
923 have = libmicrohttpd.found()
928 conf.set10('HAVE_MICROHTTPD', have)
930 want_libcryptsetup = get_option('libcryptsetup')
931 if want_libcryptsetup != 'false' and not fuzzer_build
932 libcryptsetup = dependency('libcryptsetup',
933 version : '>= 1.6.0',
934 required : want_libcryptsetup == 'true')
935 have = libcryptsetup.found()
940 conf.set10('HAVE_LIBCRYPTSETUP', have)
942 want_libcurl = get_option('libcurl')
943 if want_libcurl != 'false' and not fuzzer_build
944 libcurl = dependency('libcurl',
945 version : '>= 7.32.0',
946 required : want_libcurl == 'true')
947 have = libcurl.found()
952 conf.set10('HAVE_LIBCURL', have)
954 want_libidn = get_option('libidn')
955 want_libidn2 = get_option('libidn2')
956 if want_libidn == 'true' and want_libidn2 == 'true'
957 error('libidn and libidn2 cannot be requested simultaneously')
960 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
961 libidn = dependency('libidn',
962 required : want_libidn == 'true')
963 have = libidn.found()
968 conf.set10('HAVE_LIBIDN', have)
969 if not have and want_libidn2 != 'false' and not fuzzer_build
970 # libidn is used for both libidn and libidn2 objects
971 libidn = dependency('libidn2',
972 required : want_libidn2 == 'true')
973 have = libidn.found()
977 conf.set10('HAVE_LIBIDN2', have)
979 want_libiptc = get_option('libiptc')
980 if want_libiptc != 'false' and not fuzzer_build
981 libiptc = dependency('libiptc',
982 required : want_libiptc == 'true')
983 have = libiptc.found()
988 conf.set10('HAVE_LIBIPTC', have)
990 want_qrencode = get_option('qrencode')
991 if want_qrencode != 'false' and not fuzzer_build
992 libqrencode = dependency('libqrencode',
993 required : want_qrencode == 'true')
994 have = libqrencode.found()
999 conf.set10('HAVE_QRENCODE', have)
1001 want_gcrypt = get_option('gcrypt')
1002 if want_gcrypt != 'false' and not fuzzer_build
1003 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1004 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1005 have = libgcrypt.found() and libgpg_error.found()
1010 # link to neither of the libs if one is not found
1014 conf.set10('HAVE_GCRYPT', have)
1016 want_gnutls = get_option('gnutls')
1017 if want_gnutls != 'false' and not fuzzer_build
1018 libgnutls = dependency('gnutls',
1019 version : '>= 3.1.4',
1020 required : want_gnutls == 'true')
1021 have = libgnutls.found()
1026 conf.set10('HAVE_GNUTLS', have)
1028 want_elfutils = get_option('elfutils')
1029 if want_elfutils != 'false' and not fuzzer_build
1030 libdw = dependency('libdw',
1031 required : want_elfutils == 'true')
1032 have = libdw.found()
1037 conf.set10('HAVE_ELFUTILS', have)
1039 want_zlib = get_option('zlib')
1040 if want_zlib != 'false' and not fuzzer_build
1041 libz = dependency('zlib',
1042 required : want_zlib == 'true')
1048 conf.set10('HAVE_ZLIB', have)
1050 want_bzip2 = get_option('bzip2')
1051 if want_bzip2 != 'false' and not fuzzer_build
1052 libbzip2 = cc.find_library('bz2',
1053 required : want_bzip2 == 'true')
1054 have = libbzip2.found()
1059 conf.set10('HAVE_BZIP2', have)
1061 want_xz = get_option('xz')
1062 if want_xz != 'false' and not fuzzer_build
1063 libxz = dependency('liblzma',
1064 required : want_xz == 'true')
1065 have = libxz.found()
1070 conf.set10('HAVE_XZ', have)
1072 want_lz4 = get_option('lz4')
1073 if want_lz4 != 'false' and not fuzzer_build
1074 liblz4 = dependency('liblz4',
1075 required : want_lz4 == 'true')
1076 have = liblz4.found()
1081 conf.set10('HAVE_LZ4', have)
1083 want_xkbcommon = get_option('xkbcommon')
1084 if want_xkbcommon != 'false' and not fuzzer_build
1085 libxkbcommon = dependency('xkbcommon',
1086 version : '>= 0.3.0',
1087 required : want_xkbcommon == 'true')
1088 have = libxkbcommon.found()
1093 conf.set10('HAVE_XKBCOMMON', have)
1095 want_pcre2 = get_option('pcre2')
1096 if want_pcre2 != 'false'
1097 libpcre2 = dependency('libpcre2-8',
1098 required : want_pcre2 == 'true')
1099 have = libpcre2.found()
1104 conf.set10('HAVE_PCRE2', have)
1106 want_glib = get_option('glib')
1107 if want_glib != 'false' and not fuzzer_build
1108 libglib = dependency('glib-2.0',
1109 version : '>= 2.22.0',
1110 required : want_glib == 'true')
1111 libgobject = dependency('gobject-2.0',
1112 version : '>= 2.22.0',
1113 required : want_glib == 'true')
1114 libgio = dependency('gio-2.0',
1115 required : want_glib == 'true')
1116 have = libglib.found() and libgobject.found() and libgio.found()
1123 conf.set10('HAVE_GLIB', have)
1125 want_dbus = get_option('dbus')
1126 if want_dbus != 'false' and not fuzzer_build
1127 libdbus = dependency('dbus-1',
1128 version : '>= 1.3.2',
1129 required : want_dbus == 'true')
1130 have = libdbus.found()
1135 conf.set10('HAVE_DBUS', have)
1137 default_dnssec = get_option('default-dnssec')
1139 default_dnssec = 'no'
1141 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1142 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1143 default_dnssec = 'no'
1145 conf.set('DEFAULT_DNSSEC_MODE',
1146 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1147 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1149 dns_over_tls = get_option('dns-over-tls')
1150 if dns_over_tls != 'false'
1151 have = (conf.get('HAVE_GNUTLS') == 1 and
1152 libgnutls.version().version_compare('>=3.5.3'))
1153 if dns_over_tls == 'true' and not have
1154 error('DNS-over-TLS support was requested, but dependencies are not available')
1159 conf.set10('ENABLE_DNS_OVER_TLS', have)
1161 default_dns_over_tls = get_option('default-dns-over-tls')
1163 default_dns_over_tls = 'no'
1165 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1166 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1167 default_dns_over_tls = 'no'
1169 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1170 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1171 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1173 want_importd = get_option('importd')
1174 if want_importd != 'false'
1175 have = (conf.get('HAVE_LIBCURL') == 1 and
1176 conf.get('HAVE_ZLIB') == 1 and
1177 conf.get('HAVE_BZIP2') == 1 and
1178 conf.get('HAVE_XZ') == 1 and
1179 conf.get('HAVE_GCRYPT') == 1)
1180 if want_importd == 'true' and not have
1181 error('importd support was requested, but dependencies are not available')
1186 conf.set10('ENABLE_IMPORTD', have)
1188 want_remote = get_option('remote')
1189 if want_remote != 'false'
1190 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1191 conf.get('HAVE_LIBCURL') == 1]
1192 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1193 # it's possible to build one without the other. Complain only if
1194 # support was explictly requested. The auxiliary files like sysusers
1195 # config should be installed when any of the programs are built.
1196 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1197 error('remote support was requested, but dependencies are not available')
1199 have = have_deps[0] or have_deps[1]
1203 conf.set10('ENABLE_REMOTE', have)
1205 foreach term : ['utmp',
1237 have = get_option(term)
1238 name = 'ENABLE_' + term.underscorify().to_upper()
1239 conf.set10(name, have)
1242 foreach tuple : [['nss-mymachines', 'machined'],
1243 ['nss-resolve', 'resolve']]
1244 want = get_option(tuple[0])
1246 have = get_option(tuple[1])
1247 if want == 'true' and not have
1248 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1253 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1254 conf.set10(name, have)
1258 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1259 'ENABLE_NSS_MYMACHINES',
1260 'ENABLE_NSS_RESOLVE',
1261 'ENABLE_NSS_SYSTEMD']
1262 if conf.get(term) == 1
1266 conf.set10('ENABLE_NSS', enable_nss)
1268 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1270 want_tests = get_option('tests')
1271 install_tests = get_option('install-tests')
1272 slow_tests = get_option('slow-tests')
1276 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1278 #####################################################################
1280 if get_option('efi')
1281 efi_arch = host_machine.cpu_family()
1283 if efi_arch == 'x86'
1284 EFI_MACHINE_TYPE_NAME = 'ia32'
1285 gnu_efi_arch = 'ia32'
1286 elif efi_arch == 'x86_64'
1287 EFI_MACHINE_TYPE_NAME = 'x64'
1288 gnu_efi_arch = 'x86_64'
1289 elif efi_arch == 'arm'
1290 EFI_MACHINE_TYPE_NAME = 'arm'
1291 gnu_efi_arch = 'arm'
1292 elif efi_arch == 'aarch64'
1293 EFI_MACHINE_TYPE_NAME = 'aa64'
1294 gnu_efi_arch = 'aarch64'
1296 EFI_MACHINE_TYPE_NAME = ''
1301 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1303 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1307 conf.set10('ENABLE_EFI', have)
1309 #####################################################################
1311 config_h = configure_file(
1312 output : 'config.h',
1313 configuration : conf)
1315 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1317 includes = include_directories('src/basic',
1321 'src/journal-remote',
1325 'src/time-wait-sync',
1330 'src/libsystemd/sd-bus',
1331 'src/libsystemd/sd-device',
1332 'src/libsystemd/sd-hwdb',
1333 'src/libsystemd/sd-id128',
1334 'src/libsystemd/sd-netlink',
1335 'src/libsystemd/sd-network',
1336 'src/libsystemd-network',
1339 add_project_arguments('-include', 'config.h', language : 'c')
1343 subdir('src/systemd')
1345 subdir('src/libsystemd')
1346 subdir('src/libsystemd-network')
1347 subdir('src/journal')
1350 libjournal_core = static_library(
1352 libjournal_core_sources,
1354 include_directories : includes,
1357 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1358 libsystemd = shared_library(
1360 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1361 version : libsystemd_version,
1362 include_directories : includes,
1363 link_args : ['-shared',
1364 '-Wl,--version-script=' + libsystemd_sym_path],
1365 link_with : [libbasic,
1367 link_whole : [libsystemd_static,
1369 dependencies : [threads,
1373 link_depends : libsystemd_sym,
1375 install_dir : rootlibdir)
1377 static_libsystemd = get_option('static-libsystemd')
1378 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1380 install_libsystemd_static = static_library(
1383 journal_client_sources,
1385 basic_gcrypt_sources,
1386 include_directories : includes,
1387 build_by_default : static_libsystemd != 'false',
1388 install : static_libsystemd != 'false',
1389 install_dir : rootlibdir,
1390 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1391 dependencies : [threads,
1400 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1402 ############################################################
1404 # binaries that have --help and are intended for use by humans,
1405 # usually, but not always, installed in /bin.
1406 public_programs = []
1408 subdir('src/libudev')
1409 subdir('src/shared')
1412 subdir('src/network')
1414 subdir('src/analyze')
1415 subdir('src/journal-remote')
1416 subdir('src/coredump')
1417 subdir('src/hostname')
1418 subdir('src/import')
1419 subdir('src/kernel-install')
1420 subdir('src/locale')
1421 subdir('src/machine')
1422 subdir('src/portable')
1423 subdir('src/nspawn')
1424 subdir('src/resolve')
1425 subdir('src/timedate')
1426 subdir('src/timesync')
1427 subdir('src/vconsole')
1428 subdir('src/boot/efi')
1435 ############################################################
1437 # only static linking apart from libdl, to make sure that the
1438 # module is linked to all libraries that it uses.
1439 test_dlopen = executable(
1442 include_directories : includes,
1443 link_with : [libbasic],
1444 dependencies : [libdl])
1446 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1447 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1448 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1449 ['resolve', 'ENABLE_NSS_RESOLVE']]
1451 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1455 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1456 version_script_arg = join_paths(meson.current_source_dir(), sym)
1458 nss = shared_library(
1460 'src/nss-@0@/nss-@0@.c'.format(module),
1462 include_directories : includes,
1463 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1464 link_args : ['-Wl,-z,nodelete',
1466 '-Wl,--version-script=' + version_script_arg,
1468 link_with : [libsystemd_static,
1470 dependencies : [threads,
1474 install_dir : rootlibdir)
1476 # We cannot use shared_module because it does not support version suffix.
1477 # Unfortunately shared_library insists on creating the symlink…
1478 meson.add_install_script('sh', '-c',
1479 'rm $DESTDIR@0@/libnss_@1@.so'
1480 .format(rootlibdir, module))
1482 test('dlopen-nss_' + module,
1484 args : [nss.full_path()]) # path to dlopen must include a slash
1488 ############################################################
1490 executable('systemd',
1492 include_directories : includes,
1493 link_with : [libcore,
1495 dependencies : [threads,
1501 install_rpath : rootlibexecdir,
1503 install_dir : rootlibexecdir)
1505 meson.add_install_script(meson_make_symlink,
1506 join_paths(rootlibexecdir, 'systemd'),
1507 join_paths(rootsbindir, 'init'))
1509 exe = executable('systemd-analyze',
1510 systemd_analyze_sources,
1511 include_directories : includes,
1512 link_with : [libcore,
1514 dependencies : [threads,
1520 install_rpath : rootlibexecdir,
1522 public_programs += [exe]
1524 executable('systemd-journald',
1525 systemd_journald_sources,
1526 include_directories : includes,
1527 link_with : [libjournal_core,
1529 dependencies : [threads,
1533 install_rpath : rootlibexecdir,
1535 install_dir : rootlibexecdir)
1537 exe = executable('systemd-cat',
1538 systemd_cat_sources,
1539 include_directories : includes,
1540 link_with : [libjournal_core,
1542 dependencies : [threads],
1543 install_rpath : rootlibexecdir,
1545 public_programs += [exe]
1547 exe = executable('journalctl',
1549 include_directories : includes,
1550 link_with : [libshared],
1551 dependencies : [threads,
1556 install_rpath : rootlibexecdir,
1558 install_dir : rootbindir)
1559 public_programs += [exe]
1561 executable('systemd-getty-generator',
1562 'src/getty-generator/getty-generator.c',
1563 include_directories : includes,
1564 link_with : [libshared],
1565 install_rpath : rootlibexecdir,
1567 install_dir : systemgeneratordir)
1569 executable('systemd-debug-generator',
1570 'src/debug-generator/debug-generator.c',
1571 include_directories : includes,
1572 link_with : [libshared],
1573 install_rpath : rootlibexecdir,
1575 install_dir : systemgeneratordir)
1577 executable('systemd-fstab-generator',
1578 'src/fstab-generator/fstab-generator.c',
1579 'src/core/mount-setup.c',
1580 include_directories : includes,
1581 link_with : [libshared],
1582 install_rpath : rootlibexecdir,
1584 install_dir : systemgeneratordir)
1586 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1587 executable('30-systemd-environment-d-generator',
1588 'src/environment-d-generator/environment-d-generator.c',
1589 include_directories : includes,
1590 link_with : [libshared],
1591 install_rpath : rootlibexecdir,
1593 install_dir : userenvgeneratordir)
1595 meson.add_install_script(meson_make_symlink,
1596 join_paths(sysconfdir, 'environment'),
1597 join_paths(environmentdir, '99-environment.conf'))
1600 if conf.get('ENABLE_HIBERNATE') == 1
1601 executable('systemd-hibernate-resume-generator',
1602 'src/hibernate-resume/hibernate-resume-generator.c',
1603 include_directories : includes,
1604 link_with : [libshared],
1605 install_rpath : rootlibexecdir,
1607 install_dir : systemgeneratordir)
1609 executable('systemd-hibernate-resume',
1610 'src/hibernate-resume/hibernate-resume.c',
1611 include_directories : includes,
1612 link_with : [libshared],
1613 install_rpath : rootlibexecdir,
1615 install_dir : rootlibexecdir)
1618 if conf.get('HAVE_BLKID') == 1
1619 executable('systemd-gpt-auto-generator',
1620 'src/gpt-auto-generator/gpt-auto-generator.c',
1621 'src/basic/blkid-util.h',
1622 include_directories : includes,
1623 link_with : [libshared],
1624 dependencies : libblkid,
1625 install_rpath : rootlibexecdir,
1627 install_dir : systemgeneratordir)
1629 exe = executable('systemd-dissect',
1630 'src/dissect/dissect.c',
1631 include_directories : includes,
1632 link_with : [libshared],
1633 install_rpath : rootlibexecdir,
1635 install_dir : rootlibexecdir)
1636 public_programs += [exe]
1639 if conf.get('ENABLE_RESOLVE') == 1
1640 executable('systemd-resolved',
1641 systemd_resolved_sources,
1642 include_directories : includes,
1643 link_with : [libshared,
1645 libsystemd_resolve_core],
1646 dependencies : systemd_resolved_dependencies,
1647 install_rpath : rootlibexecdir,
1649 install_dir : rootlibexecdir)
1651 exe = executable('resolvectl',
1653 include_directories : includes,
1654 link_with : [libshared,
1656 libsystemd_resolve_core],
1657 dependencies : [threads,
1661 install_rpath : rootlibexecdir,
1663 public_programs += [exe]
1665 meson.add_install_script(meson_make_symlink,
1666 join_paths(bindir, 'resolvectl'),
1667 join_paths(rootsbindir, 'resolvconf'))
1669 meson.add_install_script(meson_make_symlink,
1670 join_paths(bindir, 'resolvectl'),
1671 join_paths(bindir, 'systemd-resolve'))
1674 if conf.get('ENABLE_LOGIND') == 1
1675 executable('systemd-logind',
1676 systemd_logind_sources,
1677 include_directories : includes,
1678 link_with : [liblogind_core,
1680 dependencies : [threads,
1682 install_rpath : rootlibexecdir,
1684 install_dir : rootlibexecdir)
1686 exe = executable('loginctl',
1688 include_directories : includes,
1689 link_with : [libshared],
1690 dependencies : [threads,
1693 install_rpath : rootlibexecdir,
1695 install_dir : rootbindir)
1696 public_programs += [exe]
1698 exe = executable('systemd-inhibit',
1699 'src/login/inhibit.c',
1700 include_directories : includes,
1701 link_with : [libshared],
1702 install_rpath : rootlibexecdir,
1704 install_dir : rootbindir)
1705 public_programs += [exe]
1707 if conf.get('HAVE_PAM') == 1
1708 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1709 pam_systemd = shared_library(
1713 include_directories : includes,
1714 link_args : ['-shared',
1715 '-Wl,--version-script=' + version_script_arg],
1716 link_with : [libsystemd_static,
1718 dependencies : [threads,
1721 link_depends : pam_systemd_sym,
1723 install_dir : pamlibdir)
1725 test('dlopen-pam_systemd',
1727 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1731 executable('systemd-user-runtime-dir',
1732 user_runtime_dir_sources,
1733 include_directories : includes,
1734 link_with : [libshared, liblogind_core],
1735 install_rpath : rootlibexecdir,
1737 install_dir : rootlibexecdir)
1739 if conf.get('HAVE_PAM') == 1
1740 executable('systemd-user-sessions',
1741 'src/user-sessions/user-sessions.c',
1742 include_directories : includes,
1743 link_with : [libshared],
1744 install_rpath : rootlibexecdir,
1746 install_dir : rootlibexecdir)
1749 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1750 exe = executable('bootctl',
1751 'src/boot/bootctl.c',
1752 include_directories : includes,
1753 link_with : [libshared],
1754 dependencies : [libblkid],
1755 install_rpath : rootlibexecdir,
1757 public_programs += [exe]
1760 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1761 include_directories : includes,
1762 link_with : [libshared],
1763 dependencies : [threads],
1764 install_rpath : rootlibexecdir,
1766 public_programs += [exe]
1769 if get_option('link-systemctl-shared')
1770 systemctl_link_with = [libshared]
1772 systemctl_link_with = [libsystemd_static,
1778 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1779 include_directories : includes,
1780 link_with : systemctl_link_with,
1781 dependencies : [threads,
1786 install_rpath : rootlibexecdir,
1788 install_dir : rootbindir)
1789 public_programs += [exe]
1791 if conf.get('ENABLE_PORTABLED') == 1
1792 executable('systemd-portabled',
1793 systemd_portabled_sources,
1794 include_directories : includes,
1795 link_with : [libshared],
1796 dependencies : [threads],
1797 install_rpath : rootlibexecdir,
1799 install_dir : rootlibexecdir)
1801 exe = executable('portablectl', 'src/portable/portablectl.c',
1802 include_directories : includes,
1803 link_with : [libshared],
1804 dependencies : [threads],
1805 install_rpath : rootlibexecdir,
1807 install_dir : rootlibexecdir)
1808 public_programs += [exe]
1811 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1812 meson.add_install_script(meson_make_symlink,
1813 join_paths(rootbindir, 'systemctl'),
1814 join_paths(rootsbindir, alias))
1817 if conf.get('ENABLE_BACKLIGHT') == 1
1818 executable('systemd-backlight',
1819 'src/backlight/backlight.c',
1820 include_directories : includes,
1821 link_with : [libshared],
1822 install_rpath : rootlibexecdir,
1824 install_dir : rootlibexecdir)
1827 if conf.get('ENABLE_RFKILL') == 1
1828 executable('systemd-rfkill',
1829 'src/rfkill/rfkill.c',
1830 include_directories : includes,
1831 link_with : [libshared],
1832 install_rpath : rootlibexecdir,
1834 install_dir : rootlibexecdir)
1837 executable('systemd-system-update-generator',
1838 'src/system-update-generator/system-update-generator.c',
1839 include_directories : includes,
1840 link_with : [libshared],
1841 install_rpath : rootlibexecdir,
1843 install_dir : systemgeneratordir)
1845 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1846 executable('systemd-cryptsetup',
1847 'src/cryptsetup/cryptsetup.c',
1848 include_directories : includes,
1849 link_with : [libshared],
1850 dependencies : [libcryptsetup],
1851 install_rpath : rootlibexecdir,
1853 install_dir : rootlibexecdir)
1855 executable('systemd-cryptsetup-generator',
1856 'src/cryptsetup/cryptsetup-generator.c',
1857 include_directories : includes,
1858 link_with : [libshared],
1859 dependencies : [libcryptsetup],
1860 install_rpath : rootlibexecdir,
1862 install_dir : systemgeneratordir)
1864 executable('systemd-veritysetup',
1865 'src/veritysetup/veritysetup.c',
1866 include_directories : includes,
1867 link_with : [libshared],
1868 dependencies : [libcryptsetup],
1869 install_rpath : rootlibexecdir,
1871 install_dir : rootlibexecdir)
1873 executable('systemd-veritysetup-generator',
1874 'src/veritysetup/veritysetup-generator.c',
1875 include_directories : includes,
1876 link_with : [libshared],
1877 dependencies : [libcryptsetup],
1878 install_rpath : rootlibexecdir,
1880 install_dir : systemgeneratordir)
1883 if conf.get('HAVE_SYSV_COMPAT') == 1
1884 executable('systemd-sysv-generator',
1885 'src/sysv-generator/sysv-generator.c',
1886 include_directories : includes,
1887 link_with : [libshared],
1888 install_rpath : rootlibexecdir,
1890 install_dir : systemgeneratordir)
1892 executable('systemd-rc-local-generator',
1893 'src/rc-local-generator/rc-local-generator.c',
1894 include_directories : includes,
1895 link_with : [libshared],
1896 install_rpath : rootlibexecdir,
1898 install_dir : systemgeneratordir)
1901 if conf.get('ENABLE_HOSTNAMED') == 1
1902 executable('systemd-hostnamed',
1903 'src/hostname/hostnamed.c',
1904 include_directories : includes,
1905 link_with : [libshared],
1906 install_rpath : rootlibexecdir,
1908 install_dir : rootlibexecdir)
1910 exe = executable('hostnamectl',
1911 'src/hostname/hostnamectl.c',
1912 include_directories : includes,
1913 link_with : [libshared],
1914 install_rpath : rootlibexecdir,
1916 public_programs += [exe]
1919 if conf.get('ENABLE_LOCALED') == 1
1920 if conf.get('HAVE_XKBCOMMON') == 1
1921 # logind will load libxkbcommon.so dynamically on its own
1927 executable('systemd-localed',
1928 systemd_localed_sources,
1929 include_directories : includes,
1930 link_with : [libshared],
1931 dependencies : deps,
1932 install_rpath : rootlibexecdir,
1934 install_dir : rootlibexecdir)
1936 exe = executable('localectl',
1938 include_directories : includes,
1939 link_with : [libshared],
1940 install_rpath : rootlibexecdir,
1942 public_programs += [exe]
1945 if conf.get('ENABLE_TIMEDATED') == 1
1946 executable('systemd-timedated',
1947 'src/timedate/timedated.c',
1948 include_directories : includes,
1949 link_with : [libshared],
1950 install_rpath : rootlibexecdir,
1952 install_dir : rootlibexecdir)
1955 if conf.get('ENABLE_TIMEDATECTL') == 1
1956 exe = executable('timedatectl',
1957 'src/timedate/timedatectl.c',
1958 include_directories : includes,
1959 install_rpath : rootlibexecdir,
1960 link_with : [libshared],
1961 dependencies : [libm],
1963 public_programs += [exe]
1966 if conf.get('ENABLE_TIMESYNCD') == 1
1967 executable('systemd-timesyncd',
1968 systemd_timesyncd_sources,
1969 include_directories : includes,
1970 link_with : [libshared],
1971 dependencies : [threads,
1973 install_rpath : rootlibexecdir,
1975 install_dir : rootlibexecdir)
1977 executable('systemd-time-wait-sync',
1978 'src/time-wait-sync/time-wait-sync.c',
1979 include_directories : includes,
1980 link_with : [libshared],
1981 install_rpath : rootlibexecdir,
1983 install_dir : rootlibexecdir)
1986 if conf.get('ENABLE_MACHINED') == 1
1987 executable('systemd-machined',
1988 systemd_machined_sources,
1989 include_directories : includes,
1990 link_with : [libmachine_core,
1992 install_rpath : rootlibexecdir,
1994 install_dir : rootlibexecdir)
1996 exe = executable('machinectl',
1997 'src/machine/machinectl.c',
1998 include_directories : includes,
1999 link_with : [libshared],
2000 dependencies : [threads,
2003 install_rpath : rootlibexecdir,
2005 install_dir : rootbindir)
2006 public_programs += [exe]
2009 if conf.get('ENABLE_IMPORTD') == 1
2010 executable('systemd-importd',
2011 systemd_importd_sources,
2012 include_directories : includes,
2013 link_with : [libshared],
2014 dependencies : [threads],
2015 install_rpath : rootlibexecdir,
2017 install_dir : rootlibexecdir)
2019 systemd_pull = executable('systemd-pull',
2020 systemd_pull_sources,
2021 include_directories : includes,
2022 link_with : [libshared],
2023 dependencies : [libcurl,
2028 install_rpath : rootlibexecdir,
2030 install_dir : rootlibexecdir)
2032 systemd_import = executable('systemd-import',
2033 systemd_import_sources,
2034 include_directories : includes,
2035 link_with : [libshared],
2036 dependencies : [libcurl,
2040 install_rpath : rootlibexecdir,
2042 install_dir : rootlibexecdir)
2044 systemd_export = executable('systemd-export',
2045 systemd_export_sources,
2046 include_directories : includes,
2047 link_with : [libshared],
2048 dependencies : [libcurl,
2052 install_rpath : rootlibexecdir,
2054 install_dir : rootlibexecdir)
2055 public_programs += [systemd_pull, systemd_import, systemd_export]
2058 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2059 exe = executable('systemd-journal-upload',
2060 systemd_journal_upload_sources,
2061 include_directories : includes,
2062 link_with : [libshared],
2063 dependencies : [threads,
2068 install_rpath : rootlibexecdir,
2070 install_dir : rootlibexecdir)
2071 public_programs += [exe]
2074 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2075 s_j_remote = executable('systemd-journal-remote',
2076 systemd_journal_remote_sources,
2077 include_directories : includes,
2078 link_with : [libshared,
2079 libsystemd_journal_remote],
2080 dependencies : [threads,
2085 install_rpath : rootlibexecdir,
2087 install_dir : rootlibexecdir)
2089 s_j_gatewayd = executable('systemd-journal-gatewayd',
2090 systemd_journal_gatewayd_sources,
2091 include_directories : includes,
2092 link_with : [libshared],
2093 dependencies : [threads,
2098 install_rpath : rootlibexecdir,
2100 install_dir : rootlibexecdir)
2101 public_programs += [s_j_remote, s_j_gatewayd]
2104 if conf.get('ENABLE_COREDUMP') == 1
2105 executable('systemd-coredump',
2106 systemd_coredump_sources,
2107 include_directories : includes,
2108 link_with : [libshared],
2109 dependencies : [threads,
2114 install_rpath : rootlibexecdir,
2116 install_dir : rootlibexecdir)
2118 exe = executable('coredumpctl',
2119 coredumpctl_sources,
2120 include_directories : includes,
2121 link_with : [libshared],
2122 dependencies : [threads,
2125 install_rpath : rootlibexecdir,
2127 public_programs += [exe]
2130 if conf.get('ENABLE_BINFMT') == 1
2131 exe = executable('systemd-binfmt',
2132 'src/binfmt/binfmt.c',
2133 include_directories : includes,
2134 link_with : [libshared],
2135 install_rpath : rootlibexecdir,
2137 install_dir : rootlibexecdir)
2138 public_programs += [exe]
2140 meson.add_install_script('sh', '-c',
2141 mkdir_p.format(binfmtdir))
2142 meson.add_install_script('sh', '-c',
2143 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2146 if conf.get('ENABLE_VCONSOLE') == 1
2147 executable('systemd-vconsole-setup',
2148 'src/vconsole/vconsole-setup.c',
2149 include_directories : includes,
2150 link_with : [libshared],
2151 install_rpath : rootlibexecdir,
2153 install_dir : rootlibexecdir)
2156 if conf.get('ENABLE_RANDOMSEED') == 1
2157 executable('systemd-random-seed',
2158 'src/random-seed/random-seed.c',
2159 include_directories : includes,
2160 link_with : [libshared],
2161 install_rpath : rootlibexecdir,
2163 install_dir : rootlibexecdir)
2166 if conf.get('ENABLE_FIRSTBOOT') == 1
2167 executable('systemd-firstboot',
2168 'src/firstboot/firstboot.c',
2169 include_directories : includes,
2170 link_with : [libshared],
2171 dependencies : [libcrypt],
2172 install_rpath : rootlibexecdir,
2174 install_dir : rootbindir)
2177 executable('systemd-remount-fs',
2178 'src/remount-fs/remount-fs.c',
2179 'src/core/mount-setup.c',
2180 'src/core/mount-setup.h',
2181 include_directories : includes,
2182 link_with : [libshared],
2183 install_rpath : rootlibexecdir,
2185 install_dir : rootlibexecdir)
2187 executable('systemd-machine-id-setup',
2188 'src/machine-id-setup/machine-id-setup-main.c',
2189 'src/core/machine-id-setup.c',
2190 'src/core/machine-id-setup.h',
2191 include_directories : includes,
2192 link_with : [libshared],
2193 install_rpath : rootlibexecdir,
2195 install_dir : rootbindir)
2197 executable('systemd-fsck',
2199 include_directories : includes,
2200 link_with : [libshared],
2201 install_rpath : rootlibexecdir,
2203 install_dir : rootlibexecdir)
2205 executable('systemd-growfs',
2206 'src/partition/growfs.c',
2207 include_directories : includes,
2208 link_with : [libshared],
2209 dependencies : [libcryptsetup],
2210 install_rpath : rootlibexecdir,
2212 install_dir : rootlibexecdir)
2214 executable('systemd-makefs',
2215 'src/partition/makefs.c',
2216 include_directories : includes,
2217 link_with : [libshared],
2218 install_rpath : rootlibexecdir,
2220 install_dir : rootlibexecdir)
2222 executable('systemd-sleep',
2223 'src/sleep/sleep.c',
2224 include_directories : includes,
2225 link_with : [libshared],
2226 install_rpath : rootlibexecdir,
2228 install_dir : rootlibexecdir)
2230 exe = executable('systemd-sysctl',
2231 'src/sysctl/sysctl.c',
2232 include_directories : includes,
2233 link_with : [libshared],
2234 install_rpath : rootlibexecdir,
2236 install_dir : rootlibexecdir)
2237 public_programs += [exe]
2239 executable('systemd-ac-power',
2240 'src/ac-power/ac-power.c',
2241 include_directories : includes,
2242 link_with : [libshared],
2243 install_rpath : rootlibexecdir,
2245 install_dir : rootlibexecdir)
2247 exe = executable('systemd-detect-virt',
2248 'src/detect-virt/detect-virt.c',
2249 include_directories : includes,
2250 link_with : [libshared],
2251 install_rpath : rootlibexecdir,
2253 public_programs += [exe]
2255 exe = executable('systemd-delta',
2256 'src/delta/delta.c',
2257 include_directories : includes,
2258 link_with : [libshared],
2259 install_rpath : rootlibexecdir,
2261 public_programs += [exe]
2263 exe = executable('systemd-escape',
2264 'src/escape/escape.c',
2265 include_directories : includes,
2266 link_with : [libshared],
2267 install_rpath : rootlibexecdir,
2269 install_dir : rootbindir)
2270 public_programs += [exe]
2272 exe = executable('systemd-notify',
2273 'src/notify/notify.c',
2274 include_directories : includes,
2275 link_with : [libshared],
2276 install_rpath : rootlibexecdir,
2278 install_dir : rootbindir)
2279 public_programs += [exe]
2281 executable('systemd-volatile-root',
2282 'src/volatile-root/volatile-root.c',
2283 include_directories : includes,
2284 link_with : [libshared],
2285 install_rpath : rootlibexecdir,
2287 install_dir : rootlibexecdir)
2289 executable('systemd-cgroups-agent',
2290 'src/cgroups-agent/cgroups-agent.c',
2291 include_directories : includes,
2292 link_with : [libshared],
2293 install_rpath : rootlibexecdir,
2295 install_dir : rootlibexecdir)
2297 exe = executable('systemd-path',
2299 include_directories : includes,
2300 link_with : [libshared],
2301 install_rpath : rootlibexecdir,
2303 public_programs += [exe]
2305 exe = executable('systemd-ask-password',
2306 'src/ask-password/ask-password.c',
2307 include_directories : includes,
2308 link_with : [libshared],
2309 install_rpath : rootlibexecdir,
2311 install_dir : rootbindir)
2312 public_programs += [exe]
2314 executable('systemd-reply-password',
2315 'src/reply-password/reply-password.c',
2316 include_directories : includes,
2317 link_with : [libshared],
2318 install_rpath : rootlibexecdir,
2320 install_dir : rootlibexecdir)
2322 exe = executable('systemd-tty-ask-password-agent',
2323 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2324 include_directories : includes,
2325 link_with : [libshared],
2326 install_rpath : rootlibexecdir,
2328 install_dir : rootbindir)
2329 public_programs += [exe]
2331 exe = executable('systemd-cgls',
2333 include_directories : includes,
2334 link_with : [libshared],
2335 install_rpath : rootlibexecdir,
2337 public_programs += [exe]
2339 exe = executable('systemd-cgtop',
2340 'src/cgtop/cgtop.c',
2341 include_directories : includes,
2342 link_with : [libshared],
2343 install_rpath : rootlibexecdir,
2345 public_programs += [exe]
2347 executable('systemd-initctl',
2348 'src/initctl/initctl.c',
2349 include_directories : includes,
2350 link_with : [libshared],
2351 install_rpath : rootlibexecdir,
2353 install_dir : rootlibexecdir)
2355 exe = executable('systemd-mount',
2356 'src/mount/mount-tool.c',
2357 include_directories : includes,
2358 link_with : [libshared],
2359 install_rpath : rootlibexecdir,
2361 public_programs += [exe]
2363 meson.add_install_script(meson_make_symlink,
2364 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2366 exe = executable('systemd-run',
2368 include_directories : includes,
2369 link_with : [libshared],
2370 install_rpath : rootlibexecdir,
2372 public_programs += [exe]
2374 exe = executable('systemd-stdio-bridge',
2375 'src/stdio-bridge/stdio-bridge.c',
2376 include_directories : includes,
2377 link_with : [libshared],
2378 install_rpath : rootlibexecdir,
2380 public_programs += [exe]
2382 exe = executable('busctl',
2383 'src/busctl/busctl.c',
2384 'src/busctl/busctl-introspect.c',
2385 'src/busctl/busctl-introspect.h',
2386 include_directories : includes,
2387 link_with : [libshared],
2388 install_rpath : rootlibexecdir,
2390 public_programs += [exe]
2392 if conf.get('ENABLE_SYSUSERS') == 1
2393 exe = executable('systemd-sysusers',
2394 'src/sysusers/sysusers.c',
2395 include_directories : includes,
2396 link_with : [libshared],
2397 install_rpath : rootlibexecdir,
2399 install_dir : rootbindir)
2400 public_programs += [exe]
2403 if conf.get('ENABLE_TMPFILES') == 1
2404 exe = executable('systemd-tmpfiles',
2405 'src/tmpfiles/tmpfiles.c',
2406 include_directories : includes,
2407 link_with : [libshared],
2408 dependencies : [libacl],
2409 install_rpath : rootlibexecdir,
2411 install_dir : rootbindir)
2412 public_programs += [exe]
2414 test('test-systemd-tmpfiles',
2415 test_systemd_tmpfiles_py,
2416 args : exe.full_path())
2417 # https://github.com/mesonbuild/meson/issues/2681
2420 if conf.get('ENABLE_HWDB') == 1
2421 exe = executable('systemd-hwdb',
2423 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2424 include_directories : includes,
2425 link_with : [libudev_static],
2426 install_rpath : udev_rpath,
2428 install_dir : rootbindir)
2429 public_programs += [exe]
2432 if conf.get('ENABLE_QUOTACHECK') == 1
2433 executable('systemd-quotacheck',
2434 'src/quotacheck/quotacheck.c',
2435 include_directories : includes,
2436 link_with : [libshared],
2437 install_rpath : rootlibexecdir,
2439 install_dir : rootlibexecdir)
2442 exe = executable('systemd-socket-proxyd',
2443 'src/socket-proxy/socket-proxyd.c',
2444 include_directories : includes,
2445 link_with : [libshared],
2446 dependencies : [threads],
2447 install_rpath : rootlibexecdir,
2449 install_dir : rootlibexecdir)
2450 public_programs += [exe]
2452 exe = executable('systemd-udevd',
2453 systemd_udevd_sources,
2454 include_directories : includes,
2455 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2456 link_with : [libudev_core,
2459 dependencies : [threads,
2464 install_rpath : udev_rpath,
2466 install_dir : rootlibexecdir)
2467 public_programs += [exe]
2469 exe = executable('udevadm',
2471 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2472 include_directories : includes,
2473 link_with : [libudev_core,
2476 dependencies : [threads,
2481 install_rpath : udev_rpath,
2483 install_dir : rootbindir)
2484 public_programs += [exe]
2486 executable('systemd-shutdown',
2487 systemd_shutdown_sources,
2488 include_directories : includes,
2489 link_with : [libshared],
2490 dependencies : [libmount],
2491 install_rpath : rootlibexecdir,
2493 install_dir : rootlibexecdir)
2495 executable('systemd-update-done',
2496 'src/update-done/update-done.c',
2497 include_directories : includes,
2498 link_with : [libshared],
2499 install_rpath : rootlibexecdir,
2501 install_dir : rootlibexecdir)
2503 executable('systemd-update-utmp',
2504 'src/update-utmp/update-utmp.c',
2505 include_directories : includes,
2506 link_with : [libshared],
2507 dependencies : [libaudit],
2508 install_rpath : rootlibexecdir,
2510 install_dir : rootlibexecdir)
2512 if conf.get('HAVE_KMOD') == 1
2513 executable('systemd-modules-load',
2514 'src/modules-load/modules-load.c',
2515 include_directories : includes,
2516 link_with : [libshared],
2517 dependencies : [libkmod],
2518 install_rpath : rootlibexecdir,
2520 install_dir : rootlibexecdir)
2522 meson.add_install_script('sh', '-c',
2523 mkdir_p.format(modulesloaddir))
2524 meson.add_install_script('sh', '-c',
2525 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2528 exe = executable('systemd-nspawn',
2529 systemd_nspawn_sources,
2530 'src/core/mount-setup.c', # FIXME: use a variable?
2531 'src/core/mount-setup.h',
2532 'src/core/loopback-setup.c',
2533 'src/core/loopback-setup.h',
2534 include_directories : includes,
2535 link_with : [libnspawn_core,
2537 dependencies : [libblkid],
2538 install_rpath : rootlibexecdir,
2540 public_programs += [exe]
2542 if conf.get('ENABLE_NETWORKD') == 1
2543 executable('systemd-networkd',
2544 systemd_networkd_sources,
2545 include_directories : includes,
2546 link_with : [libnetworkd_core,
2550 dependencies : [threads],
2551 install_rpath : rootlibexecdir,
2553 install_dir : rootlibexecdir)
2555 executable('systemd-networkd-wait-online',
2556 systemd_networkd_wait_online_sources,
2557 include_directories : includes,
2558 link_with : [libnetworkd_core,
2560 install_rpath : rootlibexecdir,
2562 install_dir : rootlibexecdir)
2564 exe = executable('networkctl',
2566 include_directories : includes,
2567 link_with : [libsystemd_network,
2569 install_rpath : rootlibexecdir,
2571 install_dir : rootbindir)
2572 public_programs += [exe]
2575 executable('systemd-sulogin-shell',
2576 ['src/sulogin-shell/sulogin-shell.c'],
2577 include_directories : includes,
2578 link_with : [libshared],
2579 install_rpath : rootlibexecdir,
2581 install_dir : rootlibexecdir)
2583 ############################################################
2585 foreach tuple : tests
2587 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2588 dependencies = tuple[2]
2589 condition = tuple.length() >= 4 ? tuple[3] : ''
2590 type = tuple.length() >= 5 ? tuple[4] : ''
2591 defs = tuple.length() >= 6 ? tuple[5] : []
2592 incs = tuple.length() >= 7 ? tuple[6] : includes
2595 name = sources[0].split('/')[-1].split('.')[0]
2596 if type.startswith('timeout=')
2597 timeout = type.split('=')[1].to_int()
2600 if want_tests == 'false'
2601 message('Not compiling @0@ because tests is set to false'.format(name))
2602 elif condition == '' or conf.get(condition) == 1
2606 include_directories : incs,
2607 link_with : link_with,
2608 dependencies : dependencies,
2610 install_rpath : rootlibexecdir,
2611 install : install_tests,
2612 install_dir : join_paths(testsdir, type))
2615 message('@0@ is a manual test'.format(name))
2616 elif type == 'unsafe' and want_tests != 'unsafe'
2617 message('@0@ is an unsafe test'.format(name))
2624 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2629 'test-libsystemd-sym',
2630 test_libsystemd_sym_c,
2631 include_directories : includes,
2632 link_with : [libsystemd],
2633 install : install_tests,
2634 install_dir : testsdir)
2635 test('test-libsystemd-sym', exe)
2638 'test-libsystemd-static-sym',
2639 test_libsystemd_sym_c,
2640 include_directories : includes,
2641 link_with : [install_libsystemd_static],
2642 dependencies : [threads], # threads is already included in dependencies on the library,
2643 # but does not seem to get propagated. Add here as a work-around.
2644 build_by_default : static_libsystemd_pic,
2645 install : install_tests and static_libsystemd_pic,
2646 install_dir : testsdir)
2647 if static_libsystemd_pic
2648 test('test-libsystemd-static-sym', exe)
2654 include_directories : includes,
2655 c_args : ['-Wno-deprecated-declarations'],
2656 link_with : [libudev],
2657 install : install_tests,
2658 install_dir : testsdir)
2659 test('test-libudev-sym', exe)
2662 'test-libudev-static-sym',
2664 include_directories : includes,
2665 c_args : ['-Wno-deprecated-declarations'],
2666 link_with : [install_libudev_static],
2667 build_by_default : static_libudev_pic,
2668 install : install_tests and static_libudev_pic,
2669 install_dir : testsdir)
2670 if static_libudev_pic
2671 test('test-libudev-static-sym', exe)
2674 ############################################################
2678 foreach tuple : fuzzers
2680 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2681 dependencies = tuple[2]
2682 defs = tuple.length() >= 4 ? tuple[3] : []
2683 incs = tuple.length() >= 5 ? tuple[4] : includes
2686 dependencies += fuzzing_engine
2688 sources += 'src/fuzz/fuzz-main.c'
2691 name = sources[0].split('/')[-1].split('.')[0]
2693 fuzzer_exes += executable(
2696 include_directories : [incs, include_directories('src/fuzz')],
2697 link_with : link_with,
2698 dependencies : dependencies,
2703 run_target('fuzzers',
2704 depends : fuzzer_exes,
2707 ############################################################
2709 make_directive_index_py = find_program('tools/make-directive-index.py')
2710 make_man_index_py = find_program('tools/make-man-index.py')
2711 xml_helper_py = find_program('tools/xml_helper.py')
2712 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2716 subdir('sysusers.d')
2717 subdir('tmpfiles.d')
2722 subdir('shell-completion/bash')
2723 subdir('shell-completion/zsh')
2724 subdir('doc/sysvinit')
2725 subdir('doc/var-log')
2727 # FIXME: figure out if the warning is true:
2728 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2729 install_subdir('factory/etc',
2730 install_dir : factorydir)
2733 install_data('xorg/50-systemd-user.sh',
2734 install_dir : xinitrcdir)
2735 install_data('modprobe.d/systemd.conf',
2736 install_dir : modprobedir)
2737 install_data('LICENSE.GPL2',
2742 'doc/DISTRO_PORTING',
2743 'doc/ENVIRONMENT.md',
2745 'doc/TRANSIENT-SETTINGS.md',
2748 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2749 install_dir : docdir)
2751 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2752 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2754 ############################################################
2756 meson_check_help = find_program('tools/meson-check-help.sh')
2758 foreach exec : public_programs
2759 name = exec.full_path().split('/')[-1]
2760 test('check-help-' + name,
2762 args : [exec.full_path()])
2765 ############################################################
2767 # Enable tests for all supported sanitizers
2768 foreach tuple : sanitizers
2769 sanitizer = tuple[0]
2772 have = run_command(check_compilation_sh,
2773 cc.cmd_array(), '-x', 'c',
2774 '-fsanitize=@0@'.format(sanitizer),
2775 '-include', link_test_c).returncode() == 0
2776 message('@0@ sanitizer supported: @1@'.format(sanitizer, have ? 'yes' : 'no'))
2780 foreach p : fuzz_regression_tests
2781 b = p.split('/')[-2]
2782 c = p.split('/')[-1]
2784 name = '@0@:@1@'.format(b, sanitizer)
2787 if want_tests == 'false'
2788 message('Not compiling @0@ because tests is set to false'.format(name))
2790 exe = custom_target(
2794 command : [env, 'ln', '-fs',
2795 join_paths(build.full_path(), b),
2797 build_by_default : true)
2799 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2804 if want_tests != 'false' and slow_tests
2805 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2807 args : [exe.full_path(),
2808 join_paths(meson.source_root(),
2809 'test/fuzz-regressions',
2817 ############################################################
2820 all_files = run_command(
2822 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2825 all_files = files(all_files.stdout().split())
2830 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2833 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2837 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2840 command : [meson_git_contrib_sh])
2844 git_head = run_command(
2846 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2847 'rev-parse', 'HEAD']).stdout().strip()
2848 git_head_short = run_command(
2850 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2851 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2855 command : ['git', 'archive',
2856 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2858 '--prefix', 'systemd-@0@/'.format(git_head),
2862 ############################################################
2864 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2867 depends : [man, libsystemd, libudev],
2868 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2870 ############################################################
2873 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2875 'split /usr: @0@'.format(split_usr),
2876 'split bin-sbin: @0@'.format(split_bin),
2877 'prefix directory: @0@'.format(prefixdir),
2878 'rootprefix directory: @0@'.format(rootprefixdir),
2879 'sysconf directory: @0@'.format(sysconfdir),
2880 'include directory: @0@'.format(includedir),
2881 'lib directory: @0@'.format(libdir),
2882 'rootlib directory: @0@'.format(rootlibdir),
2883 'SysV init scripts: @0@'.format(sysvinit_path),
2884 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2885 'PAM modules directory: @0@'.format(pamlibdir),
2886 'PAM configuration directory: @0@'.format(pamconfdir),
2887 'RPM macros directory: @0@'.format(rpmmacrosdir),
2888 'modprobe.d directory: @0@'.format(modprobedir),
2889 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2890 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2891 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2892 'bash completions directory: @0@'.format(bashcompletiondir),
2893 'zsh completions directory: @0@'.format(zshcompletiondir),
2894 'extra start script: @0@'.format(get_option('rc-local')),
2895 'extra stop script: @0@'.format(get_option('halt-local')),
2896 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2897 get_option('debug-tty')),
2898 'TTY GID: @0@'.format(tty_gid),
2899 'users GID: @0@'.format(users_gid),
2900 'maximum system UID: @0@'.format(system_uid_max),
2901 'maximum system GID: @0@'.format(system_gid_max),
2902 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2903 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2904 'minimum container UID base: @0@'.format(container_uid_base_min),
2905 'maximum container UID base: @0@'.format(container_uid_base_max),
2906 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2907 'render group access mode: @0@'.format(get_option('group-render-mode')),
2908 'certificate root directory: @0@'.format(get_option('certificate-root')),
2909 'support URL: @0@'.format(support_url),
2910 'nobody user name: @0@'.format(nobody_user),
2911 'nobody group name: @0@'.format(nobody_group),
2912 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2913 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2915 'default DNSSEC mode: @0@'.format(default_dnssec),
2916 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
2917 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2918 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2920 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2921 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2923 'default DNS servers: @0@'.format(alt_dns_servers),
2924 'default NTP servers: @0@'.format(alt_ntp_servers)]
2926 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2927 '@@0@'.format(time_epoch)).stdout().strip()
2929 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2932 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2933 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2934 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2936 if conf.get('ENABLE_EFI') == 1
2938 'efi arch: @0@'.format(efi_arch)]
2942 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2943 'EFI CC @0@'.format(efi_cc),
2944 'EFI lib directory: @0@'.format(efi_libdir),
2945 'EFI lds directory: @0@'.format(efi_ldsdir),
2946 'EFI include directory: @0@'.format(efi_incdir)]
3000 ['legacy pkla', install_polkit_pkla],
3002 ['gnu-efi', have_gnu_efi],
3009 ['nss-myhostname', conf.get('ENABLE_NSS_MYHOSTNAME') == 1],
3010 ['nss-mymachines', conf.get('ENABLE_NSS_MYMACHINES') == 1],
3011 ['nss-resolve', conf.get('ENABLE_NSS_RESOLVE') == 1],
3012 ['nss-systemd', conf.get('ENABLE_NSS_SYSTEMD') == 1],
3015 ['man pages', want_man],
3016 ['html pages', want_html],
3017 ['man page indices', want_man and have_lxml],
3022 ['adm group', get_option('adm-group')],
3023 ['wheel group', get_option('wheel-group')],
3026 ['debug mmap cache'],
3027 ['valgrind', conf.get('VALGRIND') == 1],
3030 if tuple.length() >= 2
3033 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3034 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3035 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3040 missing += [tuple[0]]
3046 'enabled features: @0@'.format(', '.join(found)),
3048 'disabled features: @0@'.format(', '.join(missing)),
3050 message('\n '.join(status))
3052 if rootprefixdir != rootprefix_default
3054 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3055 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3056 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))