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 dev_kvm_mode = get_option('dev-kvm-mode')
756 substs.set('DEV_KVM_MODE', dev_kvm_mode)
757 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
758 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
760 kill_user_processes = get_option('default-kill-user-processes')
761 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
762 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
763 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
765 dns_servers = get_option('dns-servers')
766 conf.set_quoted('DNS_SERVERS', dns_servers)
767 substs.set('DNS_SERVERS', dns_servers)
769 ntp_servers = get_option('ntp-servers')
770 conf.set_quoted('NTP_SERVERS', ntp_servers)
771 substs.set('NTP_SERVERS', ntp_servers)
773 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
775 substs.set('SUSHELL', get_option('debug-shell'))
776 substs.set('DEBUGTTY', get_option('debug-tty'))
778 enable_debug_hashmap = false
779 enable_debug_mmap_cache = false
780 foreach name : get_option('debug')
782 enable_debug_hashmap = true
783 elif name == 'mmap-cache'
784 enable_debug_mmap_cache = true
786 message('unknown debug option "@0@", ignoring'.format(name))
789 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
790 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
792 conf.set10('VALGRIND', get_option('valgrind'))
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()
942 conf.set10('HAVE_LIBCRYPTSETUP', have)
944 want_libcurl = get_option('libcurl')
945 if want_libcurl != 'false' and not fuzzer_build
946 libcurl = dependency('libcurl',
947 version : '>= 7.32.0',
948 required : want_libcurl == 'true')
949 have = libcurl.found()
954 conf.set10('HAVE_LIBCURL', have)
956 want_libidn = get_option('libidn')
957 want_libidn2 = get_option('libidn2')
958 if want_libidn == 'true' and want_libidn2 == 'true'
959 error('libidn and libidn2 cannot be requested simultaneously')
962 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
963 libidn = dependency('libidn',
964 required : want_libidn == 'true')
965 have = libidn.found()
970 conf.set10('HAVE_LIBIDN', have)
971 if not have and want_libidn2 != 'false' and not fuzzer_build
972 # libidn is used for both libidn and libidn2 objects
973 libidn = dependency('libidn2',
974 required : want_libidn2 == 'true')
975 have = libidn.found()
979 conf.set10('HAVE_LIBIDN2', have)
981 want_libiptc = get_option('libiptc')
982 if want_libiptc != 'false' and not fuzzer_build
983 libiptc = dependency('libiptc',
984 required : want_libiptc == 'true')
985 have = libiptc.found()
990 conf.set10('HAVE_LIBIPTC', have)
992 want_qrencode = get_option('qrencode')
993 if want_qrencode != 'false' and not fuzzer_build
994 libqrencode = dependency('libqrencode',
995 required : want_qrencode == 'true')
996 have = libqrencode.found()
1001 conf.set10('HAVE_QRENCODE', have)
1003 want_gcrypt = get_option('gcrypt')
1004 if want_gcrypt != 'false' and not fuzzer_build
1005 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1006 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1007 have = libgcrypt.found() and libgpg_error.found()
1012 # link to neither of the libs if one is not found
1016 conf.set10('HAVE_GCRYPT', have)
1018 want_gnutls = get_option('gnutls')
1019 if want_gnutls != 'false' and not fuzzer_build
1020 libgnutls = dependency('gnutls',
1021 version : '>= 3.1.4',
1022 required : want_gnutls == 'true')
1023 have = libgnutls.found()
1028 conf.set10('HAVE_GNUTLS', have)
1030 want_elfutils = get_option('elfutils')
1031 if want_elfutils != 'false' and not fuzzer_build
1032 libdw = dependency('libdw',
1033 required : want_elfutils == 'true')
1034 have = libdw.found()
1039 conf.set10('HAVE_ELFUTILS', have)
1041 want_zlib = get_option('zlib')
1042 if want_zlib != 'false' and not fuzzer_build
1043 libz = dependency('zlib',
1044 required : want_zlib == 'true')
1050 conf.set10('HAVE_ZLIB', have)
1052 want_bzip2 = get_option('bzip2')
1053 if want_bzip2 != 'false' and not fuzzer_build
1054 libbzip2 = cc.find_library('bz2',
1055 required : want_bzip2 == 'true')
1056 have = libbzip2.found()
1061 conf.set10('HAVE_BZIP2', have)
1063 want_xz = get_option('xz')
1064 if want_xz != 'false' and not fuzzer_build
1065 libxz = dependency('liblzma',
1066 required : want_xz == 'true')
1067 have = libxz.found()
1072 conf.set10('HAVE_XZ', have)
1074 want_lz4 = get_option('lz4')
1075 if want_lz4 != 'false' and not fuzzer_build
1076 liblz4 = dependency('liblz4',
1077 required : want_lz4 == 'true')
1078 have = liblz4.found()
1083 conf.set10('HAVE_LZ4', have)
1085 want_xkbcommon = get_option('xkbcommon')
1086 if want_xkbcommon != 'false' and not fuzzer_build
1087 libxkbcommon = dependency('xkbcommon',
1088 version : '>= 0.3.0',
1089 required : want_xkbcommon == 'true')
1090 have = libxkbcommon.found()
1095 conf.set10('HAVE_XKBCOMMON', have)
1097 want_pcre2 = get_option('pcre2')
1098 if want_pcre2 != 'false'
1099 libpcre2 = dependency('libpcre2-8',
1100 required : want_pcre2 == 'true')
1101 have = libpcre2.found()
1106 conf.set10('HAVE_PCRE2', have)
1108 want_glib = get_option('glib')
1109 if want_glib != 'false' and not fuzzer_build
1110 libglib = dependency('glib-2.0',
1111 version : '>= 2.22.0',
1112 required : want_glib == 'true')
1113 libgobject = dependency('gobject-2.0',
1114 version : '>= 2.22.0',
1115 required : want_glib == 'true')
1116 libgio = dependency('gio-2.0',
1117 required : want_glib == 'true')
1118 have = libglib.found() and libgobject.found() and libgio.found()
1125 conf.set10('HAVE_GLIB', have)
1127 want_dbus = get_option('dbus')
1128 if want_dbus != 'false' and not fuzzer_build
1129 libdbus = dependency('dbus-1',
1130 version : '>= 1.3.2',
1131 required : want_dbus == 'true')
1132 have = libdbus.found()
1137 conf.set10('HAVE_DBUS', have)
1139 default_dnssec = get_option('default-dnssec')
1141 default_dnssec = 'no'
1143 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1144 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1145 default_dnssec = 'no'
1147 conf.set('DEFAULT_DNSSEC_MODE',
1148 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1149 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1151 dns_over_tls = get_option('dns-over-tls')
1152 if dns_over_tls != 'false'
1153 have = (conf.get('HAVE_GNUTLS') == 1 and
1154 libgnutls.version().version_compare('>=3.5.3'))
1155 if dns_over_tls == 'true' and not have
1156 error('DNS-over-TLS support was requested, but dependencies are not available')
1161 conf.set10('ENABLE_DNS_OVER_TLS', have)
1163 default_dns_over_tls = get_option('default-dns-over-tls')
1165 default_dns_over_tls = 'no'
1167 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1168 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1169 default_dns_over_tls = 'no'
1171 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1172 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1173 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1175 want_importd = get_option('importd')
1176 if want_importd != 'false'
1177 have = (conf.get('HAVE_LIBCURL') == 1 and
1178 conf.get('HAVE_ZLIB') == 1 and
1179 conf.get('HAVE_BZIP2') == 1 and
1180 conf.get('HAVE_XZ') == 1 and
1181 conf.get('HAVE_GCRYPT') == 1)
1182 if want_importd == 'true' and not have
1183 error('importd support was requested, but dependencies are not available')
1188 conf.set10('ENABLE_IMPORTD', have)
1190 want_remote = get_option('remote')
1191 if want_remote != 'false'
1192 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1193 conf.get('HAVE_LIBCURL') == 1]
1194 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1195 # it's possible to build one without the other. Complain only if
1196 # support was explictly requested. The auxiliary files like sysusers
1197 # config should be installed when any of the programs are built.
1198 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1199 error('remote support was requested, but dependencies are not available')
1201 have = have_deps[0] or have_deps[1]
1205 conf.set10('ENABLE_REMOTE', have)
1207 foreach term : ['utmp',
1239 have = get_option(term)
1240 name = 'ENABLE_' + term.underscorify().to_upper()
1241 conf.set10(name, have)
1244 foreach tuple : [['nss-mymachines', 'machined'],
1245 ['nss-resolve', 'resolve']]
1246 want = get_option(tuple[0])
1248 have = get_option(tuple[1])
1249 if want == 'true' and not have
1250 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1255 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1256 conf.set10(name, have)
1260 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1261 'ENABLE_NSS_MYMACHINES',
1262 'ENABLE_NSS_RESOLVE',
1263 'ENABLE_NSS_SYSTEMD']
1264 if conf.get(term) == 1
1268 conf.set10('ENABLE_NSS', enable_nss)
1270 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1272 want_tests = get_option('tests')
1273 install_tests = get_option('install-tests')
1274 slow_tests = get_option('slow-tests')
1278 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1280 #####################################################################
1282 if get_option('efi')
1283 efi_arch = host_machine.cpu_family()
1285 if efi_arch == 'x86'
1286 EFI_MACHINE_TYPE_NAME = 'ia32'
1287 gnu_efi_arch = 'ia32'
1288 elif efi_arch == 'x86_64'
1289 EFI_MACHINE_TYPE_NAME = 'x64'
1290 gnu_efi_arch = 'x86_64'
1291 elif efi_arch == 'arm'
1292 EFI_MACHINE_TYPE_NAME = 'arm'
1293 gnu_efi_arch = 'arm'
1294 elif efi_arch == 'aarch64'
1295 EFI_MACHINE_TYPE_NAME = 'aa64'
1296 gnu_efi_arch = 'aarch64'
1298 EFI_MACHINE_TYPE_NAME = ''
1303 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1305 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex').to_int())
1309 conf.set10('ENABLE_EFI', have)
1311 #####################################################################
1313 config_h = configure_file(
1314 output : 'config.h',
1315 configuration : conf)
1317 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1319 includes = include_directories('src/basic',
1323 'src/journal-remote',
1327 'src/time-wait-sync',
1332 'src/libsystemd/sd-bus',
1333 'src/libsystemd/sd-device',
1334 'src/libsystemd/sd-hwdb',
1335 'src/libsystemd/sd-id128',
1336 'src/libsystemd/sd-netlink',
1337 'src/libsystemd/sd-network',
1338 'src/libsystemd-network',
1341 add_project_arguments('-include', 'config.h', language : 'c')
1345 subdir('src/systemd')
1347 subdir('src/libsystemd')
1348 subdir('src/libsystemd-network')
1349 subdir('src/journal')
1352 libjournal_core = static_library(
1354 libjournal_core_sources,
1356 include_directories : includes,
1359 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1360 libsystemd = shared_library(
1362 'src/systemd/sd-id128.h', # pick a header file at random to work around old meson bug
1363 version : libsystemd_version,
1364 include_directories : includes,
1365 link_args : ['-shared',
1366 '-Wl,--version-script=' + libsystemd_sym_path],
1367 link_with : [libbasic,
1369 link_whole : [libsystemd_static,
1371 dependencies : [threads,
1375 link_depends : libsystemd_sym,
1377 install_dir : rootlibdir)
1379 static_libsystemd = get_option('static-libsystemd')
1380 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1382 install_libsystemd_static = static_library(
1385 journal_client_sources,
1387 basic_gcrypt_sources,
1388 include_directories : includes,
1389 build_by_default : static_libsystemd != 'false',
1390 install : static_libsystemd != 'false',
1391 install_dir : rootlibdir,
1392 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1393 dependencies : [threads,
1402 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1404 ############################################################
1406 # binaries that have --help and are intended for use by humans,
1407 # usually, but not always, installed in /bin.
1408 public_programs = []
1410 subdir('src/libudev')
1411 subdir('src/shared')
1414 subdir('src/network')
1416 subdir('src/analyze')
1417 subdir('src/journal-remote')
1418 subdir('src/coredump')
1419 subdir('src/hostname')
1420 subdir('src/import')
1421 subdir('src/kernel-install')
1422 subdir('src/locale')
1423 subdir('src/machine')
1424 subdir('src/portable')
1425 subdir('src/nspawn')
1426 subdir('src/resolve')
1427 subdir('src/timedate')
1428 subdir('src/timesync')
1429 subdir('src/vconsole')
1430 subdir('src/boot/efi')
1437 ############################################################
1439 # only static linking apart from libdl, to make sure that the
1440 # module is linked to all libraries that it uses.
1441 test_dlopen = executable(
1444 include_directories : includes,
1445 link_with : [libbasic],
1446 dependencies : [libdl])
1448 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1449 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1450 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1451 ['resolve', 'ENABLE_NSS_RESOLVE']]
1453 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1457 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1458 version_script_arg = join_paths(meson.current_source_dir(), sym)
1460 nss = shared_library(
1462 'src/nss-@0@/nss-@0@.c'.format(module),
1464 include_directories : includes,
1465 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1466 link_args : ['-Wl,-z,nodelete',
1468 '-Wl,--version-script=' + version_script_arg,
1470 link_with : [libsystemd_static,
1472 dependencies : [threads,
1476 install_dir : rootlibdir)
1478 # We cannot use shared_module because it does not support version suffix.
1479 # Unfortunately shared_library insists on creating the symlink…
1480 meson.add_install_script('sh', '-c',
1481 'rm $DESTDIR@0@/libnss_@1@.so'
1482 .format(rootlibdir, module))
1484 test('dlopen-nss_' + module,
1486 args : [nss.full_path()]) # path to dlopen must include a slash
1490 ############################################################
1492 executable('systemd',
1494 include_directories : includes,
1495 link_with : [libcore,
1497 dependencies : [threads,
1503 install_rpath : rootlibexecdir,
1505 install_dir : rootlibexecdir)
1507 meson.add_install_script(meson_make_symlink,
1508 join_paths(rootlibexecdir, 'systemd'),
1509 join_paths(rootsbindir, 'init'))
1511 exe = executable('systemd-analyze',
1512 systemd_analyze_sources,
1513 include_directories : includes,
1514 link_with : [libcore,
1516 dependencies : [threads,
1522 install_rpath : rootlibexecdir,
1524 public_programs += [exe]
1526 executable('systemd-journald',
1527 systemd_journald_sources,
1528 include_directories : includes,
1529 link_with : [libjournal_core,
1531 dependencies : [threads,
1535 install_rpath : rootlibexecdir,
1537 install_dir : rootlibexecdir)
1539 exe = executable('systemd-cat',
1540 systemd_cat_sources,
1541 include_directories : includes,
1542 link_with : [libjournal_core,
1544 dependencies : [threads],
1545 install_rpath : rootlibexecdir,
1547 public_programs += [exe]
1549 exe = executable('journalctl',
1551 include_directories : includes,
1552 link_with : [libshared],
1553 dependencies : [threads,
1558 install_rpath : rootlibexecdir,
1560 install_dir : rootbindir)
1561 public_programs += [exe]
1563 executable('systemd-getty-generator',
1564 'src/getty-generator/getty-generator.c',
1565 include_directories : includes,
1566 link_with : [libshared],
1567 install_rpath : rootlibexecdir,
1569 install_dir : systemgeneratordir)
1571 executable('systemd-debug-generator',
1572 'src/debug-generator/debug-generator.c',
1573 include_directories : includes,
1574 link_with : [libshared],
1575 install_rpath : rootlibexecdir,
1577 install_dir : systemgeneratordir)
1579 executable('systemd-fstab-generator',
1580 'src/fstab-generator/fstab-generator.c',
1581 'src/core/mount-setup.c',
1582 include_directories : includes,
1583 link_with : [libshared],
1584 install_rpath : rootlibexecdir,
1586 install_dir : systemgeneratordir)
1588 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1589 executable('30-systemd-environment-d-generator',
1590 'src/environment-d-generator/environment-d-generator.c',
1591 include_directories : includes,
1592 link_with : [libshared],
1593 install_rpath : rootlibexecdir,
1595 install_dir : userenvgeneratordir)
1597 meson.add_install_script(meson_make_symlink,
1598 join_paths(sysconfdir, 'environment'),
1599 join_paths(environmentdir, '99-environment.conf'))
1602 if conf.get('ENABLE_HIBERNATE') == 1
1603 executable('systemd-hibernate-resume-generator',
1604 'src/hibernate-resume/hibernate-resume-generator.c',
1605 include_directories : includes,
1606 link_with : [libshared],
1607 install_rpath : rootlibexecdir,
1609 install_dir : systemgeneratordir)
1611 executable('systemd-hibernate-resume',
1612 'src/hibernate-resume/hibernate-resume.c',
1613 include_directories : includes,
1614 link_with : [libshared],
1615 install_rpath : rootlibexecdir,
1617 install_dir : rootlibexecdir)
1620 if conf.get('HAVE_BLKID') == 1
1621 executable('systemd-gpt-auto-generator',
1622 'src/gpt-auto-generator/gpt-auto-generator.c',
1623 'src/basic/blkid-util.h',
1624 include_directories : includes,
1625 link_with : [libshared],
1626 dependencies : libblkid,
1627 install_rpath : rootlibexecdir,
1629 install_dir : systemgeneratordir)
1631 exe = executable('systemd-dissect',
1632 'src/dissect/dissect.c',
1633 include_directories : includes,
1634 link_with : [libshared],
1635 install_rpath : rootlibexecdir,
1637 install_dir : rootlibexecdir)
1638 public_programs += [exe]
1641 if conf.get('ENABLE_RESOLVE') == 1
1642 executable('systemd-resolved',
1643 systemd_resolved_sources,
1644 include_directories : includes,
1645 link_with : [libshared,
1647 libsystemd_resolve_core],
1648 dependencies : systemd_resolved_dependencies,
1649 install_rpath : rootlibexecdir,
1651 install_dir : rootlibexecdir)
1653 exe = executable('resolvectl',
1655 include_directories : includes,
1656 link_with : [libshared,
1658 libsystemd_resolve_core],
1659 dependencies : [threads,
1663 install_rpath : rootlibexecdir,
1665 public_programs += [exe]
1667 meson.add_install_script(meson_make_symlink,
1668 join_paths(bindir, 'resolvectl'),
1669 join_paths(rootsbindir, 'resolvconf'))
1671 meson.add_install_script(meson_make_symlink,
1672 join_paths(bindir, 'resolvectl'),
1673 join_paths(bindir, 'systemd-resolve'))
1676 if conf.get('ENABLE_LOGIND') == 1
1677 executable('systemd-logind',
1678 systemd_logind_sources,
1679 include_directories : includes,
1680 link_with : [liblogind_core,
1682 dependencies : [threads,
1684 install_rpath : rootlibexecdir,
1686 install_dir : rootlibexecdir)
1688 exe = executable('loginctl',
1690 include_directories : includes,
1691 link_with : [libshared],
1692 dependencies : [threads,
1695 install_rpath : rootlibexecdir,
1697 install_dir : rootbindir)
1698 public_programs += [exe]
1700 exe = executable('systemd-inhibit',
1701 'src/login/inhibit.c',
1702 include_directories : includes,
1703 link_with : [libshared],
1704 install_rpath : rootlibexecdir,
1706 install_dir : rootbindir)
1707 public_programs += [exe]
1709 if conf.get('HAVE_PAM') == 1
1710 version_script_arg = join_paths(meson.current_source_dir(), pam_systemd_sym)
1711 pam_systemd = shared_library(
1715 include_directories : includes,
1716 link_args : ['-shared',
1717 '-Wl,--version-script=' + version_script_arg],
1718 link_with : [libsystemd_static,
1720 dependencies : [threads,
1723 link_depends : pam_systemd_sym,
1725 install_dir : pamlibdir)
1727 test('dlopen-pam_systemd',
1729 args : [pam_systemd.full_path()]) # path to dlopen must include a slash
1733 executable('systemd-user-runtime-dir',
1734 user_runtime_dir_sources,
1735 include_directories : includes,
1736 link_with : [libshared, liblogind_core],
1737 install_rpath : rootlibexecdir,
1739 install_dir : rootlibexecdir)
1741 if conf.get('HAVE_PAM') == 1
1742 executable('systemd-user-sessions',
1743 'src/user-sessions/user-sessions.c',
1744 include_directories : includes,
1745 link_with : [libshared],
1746 install_rpath : rootlibexecdir,
1748 install_dir : rootlibexecdir)
1751 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1752 exe = executable('bootctl',
1753 'src/boot/bootctl.c',
1754 include_directories : includes,
1755 link_with : [libshared],
1756 dependencies : [libblkid],
1757 install_rpath : rootlibexecdir,
1759 public_programs += [exe]
1762 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1763 include_directories : includes,
1764 link_with : [libshared],
1765 dependencies : [threads],
1766 install_rpath : rootlibexecdir,
1768 public_programs += [exe]
1771 if get_option('link-systemctl-shared')
1772 systemctl_link_with = [libshared]
1774 systemctl_link_with = [libsystemd_static,
1780 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1781 include_directories : includes,
1782 link_with : systemctl_link_with,
1783 dependencies : [threads,
1788 install_rpath : rootlibexecdir,
1790 install_dir : rootbindir)
1791 public_programs += [exe]
1793 if conf.get('ENABLE_PORTABLED') == 1
1794 executable('systemd-portabled',
1795 systemd_portabled_sources,
1796 include_directories : includes,
1797 link_with : [libshared],
1798 dependencies : [threads],
1799 install_rpath : rootlibexecdir,
1801 install_dir : rootlibexecdir)
1803 exe = executable('portablectl', 'src/portable/portablectl.c',
1804 include_directories : includes,
1805 link_with : [libshared],
1806 dependencies : [threads],
1807 install_rpath : rootlibexecdir,
1809 install_dir : rootlibexecdir)
1810 public_programs += [exe]
1813 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1814 meson.add_install_script(meson_make_symlink,
1815 join_paths(rootbindir, 'systemctl'),
1816 join_paths(rootsbindir, alias))
1819 if conf.get('ENABLE_BACKLIGHT') == 1
1820 executable('systemd-backlight',
1821 'src/backlight/backlight.c',
1822 include_directories : includes,
1823 link_with : [libshared],
1824 install_rpath : rootlibexecdir,
1826 install_dir : rootlibexecdir)
1829 if conf.get('ENABLE_RFKILL') == 1
1830 executable('systemd-rfkill',
1831 'src/rfkill/rfkill.c',
1832 include_directories : includes,
1833 link_with : [libshared],
1834 install_rpath : rootlibexecdir,
1836 install_dir : rootlibexecdir)
1839 executable('systemd-system-update-generator',
1840 'src/system-update-generator/system-update-generator.c',
1841 include_directories : includes,
1842 link_with : [libshared],
1843 install_rpath : rootlibexecdir,
1845 install_dir : systemgeneratordir)
1847 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1848 executable('systemd-cryptsetup',
1849 'src/cryptsetup/cryptsetup.c',
1850 include_directories : includes,
1851 link_with : [libshared],
1852 dependencies : [libcryptsetup],
1853 install_rpath : rootlibexecdir,
1855 install_dir : rootlibexecdir)
1857 executable('systemd-cryptsetup-generator',
1858 'src/cryptsetup/cryptsetup-generator.c',
1859 include_directories : includes,
1860 link_with : [libshared],
1861 dependencies : [libcryptsetup],
1862 install_rpath : rootlibexecdir,
1864 install_dir : systemgeneratordir)
1866 executable('systemd-veritysetup',
1867 'src/veritysetup/veritysetup.c',
1868 include_directories : includes,
1869 link_with : [libshared],
1870 dependencies : [libcryptsetup],
1871 install_rpath : rootlibexecdir,
1873 install_dir : rootlibexecdir)
1875 executable('systemd-veritysetup-generator',
1876 'src/veritysetup/veritysetup-generator.c',
1877 include_directories : includes,
1878 link_with : [libshared],
1879 dependencies : [libcryptsetup],
1880 install_rpath : rootlibexecdir,
1882 install_dir : systemgeneratordir)
1885 if conf.get('HAVE_SYSV_COMPAT') == 1
1886 executable('systemd-sysv-generator',
1887 'src/sysv-generator/sysv-generator.c',
1888 include_directories : includes,
1889 link_with : [libshared],
1890 install_rpath : rootlibexecdir,
1892 install_dir : systemgeneratordir)
1894 executable('systemd-rc-local-generator',
1895 'src/rc-local-generator/rc-local-generator.c',
1896 include_directories : includes,
1897 link_with : [libshared],
1898 install_rpath : rootlibexecdir,
1900 install_dir : systemgeneratordir)
1903 if conf.get('ENABLE_HOSTNAMED') == 1
1904 executable('systemd-hostnamed',
1905 'src/hostname/hostnamed.c',
1906 include_directories : includes,
1907 link_with : [libshared],
1908 install_rpath : rootlibexecdir,
1910 install_dir : rootlibexecdir)
1912 exe = executable('hostnamectl',
1913 'src/hostname/hostnamectl.c',
1914 include_directories : includes,
1915 link_with : [libshared],
1916 install_rpath : rootlibexecdir,
1918 public_programs += [exe]
1921 if conf.get('ENABLE_LOCALED') == 1
1922 if conf.get('HAVE_XKBCOMMON') == 1
1923 # logind will load libxkbcommon.so dynamically on its own
1929 executable('systemd-localed',
1930 systemd_localed_sources,
1931 include_directories : includes,
1932 link_with : [libshared],
1933 dependencies : deps,
1934 install_rpath : rootlibexecdir,
1936 install_dir : rootlibexecdir)
1938 exe = executable('localectl',
1940 include_directories : includes,
1941 link_with : [libshared],
1942 install_rpath : rootlibexecdir,
1944 public_programs += [exe]
1947 if conf.get('ENABLE_TIMEDATED') == 1
1948 executable('systemd-timedated',
1949 'src/timedate/timedated.c',
1950 include_directories : includes,
1951 link_with : [libshared],
1952 install_rpath : rootlibexecdir,
1954 install_dir : rootlibexecdir)
1957 if conf.get('ENABLE_TIMEDATECTL') == 1
1958 exe = executable('timedatectl',
1959 'src/timedate/timedatectl.c',
1960 include_directories : includes,
1961 install_rpath : rootlibexecdir,
1962 link_with : [libshared],
1963 dependencies : [libm],
1965 public_programs += [exe]
1968 if conf.get('ENABLE_TIMESYNCD') == 1
1969 executable('systemd-timesyncd',
1970 systemd_timesyncd_sources,
1971 include_directories : includes,
1972 link_with : [libshared],
1973 dependencies : [threads,
1975 install_rpath : rootlibexecdir,
1977 install_dir : rootlibexecdir)
1979 executable('systemd-time-wait-sync',
1980 'src/time-wait-sync/time-wait-sync.c',
1981 include_directories : includes,
1982 link_with : [libshared],
1983 install_rpath : rootlibexecdir,
1985 install_dir : rootlibexecdir)
1988 if conf.get('ENABLE_MACHINED') == 1
1989 executable('systemd-machined',
1990 systemd_machined_sources,
1991 include_directories : includes,
1992 link_with : [libmachine_core,
1994 install_rpath : rootlibexecdir,
1996 install_dir : rootlibexecdir)
1998 exe = executable('machinectl',
1999 'src/machine/machinectl.c',
2000 include_directories : includes,
2001 link_with : [libshared],
2002 dependencies : [threads,
2005 install_rpath : rootlibexecdir,
2007 install_dir : rootbindir)
2008 public_programs += [exe]
2011 if conf.get('ENABLE_IMPORTD') == 1
2012 executable('systemd-importd',
2013 systemd_importd_sources,
2014 include_directories : includes,
2015 link_with : [libshared],
2016 dependencies : [threads],
2017 install_rpath : rootlibexecdir,
2019 install_dir : rootlibexecdir)
2021 systemd_pull = executable('systemd-pull',
2022 systemd_pull_sources,
2023 include_directories : includes,
2024 link_with : [libshared],
2025 dependencies : [libcurl,
2030 install_rpath : rootlibexecdir,
2032 install_dir : rootlibexecdir)
2034 systemd_import = executable('systemd-import',
2035 systemd_import_sources,
2036 include_directories : includes,
2037 link_with : [libshared],
2038 dependencies : [libcurl,
2042 install_rpath : rootlibexecdir,
2044 install_dir : rootlibexecdir)
2046 systemd_export = executable('systemd-export',
2047 systemd_export_sources,
2048 include_directories : includes,
2049 link_with : [libshared],
2050 dependencies : [libcurl,
2054 install_rpath : rootlibexecdir,
2056 install_dir : rootlibexecdir)
2057 public_programs += [systemd_pull, systemd_import, systemd_export]
2060 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2061 exe = executable('systemd-journal-upload',
2062 systemd_journal_upload_sources,
2063 include_directories : includes,
2064 link_with : [libshared],
2065 dependencies : [threads,
2070 install_rpath : rootlibexecdir,
2072 install_dir : rootlibexecdir)
2073 public_programs += [exe]
2076 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2077 s_j_remote = executable('systemd-journal-remote',
2078 systemd_journal_remote_sources,
2079 include_directories : includes,
2080 link_with : [libshared,
2081 libsystemd_journal_remote],
2082 dependencies : [threads,
2087 install_rpath : rootlibexecdir,
2089 install_dir : rootlibexecdir)
2091 s_j_gatewayd = executable('systemd-journal-gatewayd',
2092 systemd_journal_gatewayd_sources,
2093 include_directories : includes,
2094 link_with : [libshared],
2095 dependencies : [threads,
2100 install_rpath : rootlibexecdir,
2102 install_dir : rootlibexecdir)
2103 public_programs += [s_j_remote, s_j_gatewayd]
2106 if conf.get('ENABLE_COREDUMP') == 1
2107 executable('systemd-coredump',
2108 systemd_coredump_sources,
2109 include_directories : includes,
2110 link_with : [libshared],
2111 dependencies : [threads,
2116 install_rpath : rootlibexecdir,
2118 install_dir : rootlibexecdir)
2120 exe = executable('coredumpctl',
2121 coredumpctl_sources,
2122 include_directories : includes,
2123 link_with : [libshared],
2124 dependencies : [threads,
2127 install_rpath : rootlibexecdir,
2129 public_programs += [exe]
2132 if conf.get('ENABLE_BINFMT') == 1
2133 exe = executable('systemd-binfmt',
2134 'src/binfmt/binfmt.c',
2135 include_directories : includes,
2136 link_with : [libshared],
2137 install_rpath : rootlibexecdir,
2139 install_dir : rootlibexecdir)
2140 public_programs += [exe]
2142 meson.add_install_script('sh', '-c',
2143 mkdir_p.format(binfmtdir))
2144 meson.add_install_script('sh', '-c',
2145 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2148 if conf.get('ENABLE_VCONSOLE') == 1
2149 executable('systemd-vconsole-setup',
2150 'src/vconsole/vconsole-setup.c',
2151 include_directories : includes,
2152 link_with : [libshared],
2153 install_rpath : rootlibexecdir,
2155 install_dir : rootlibexecdir)
2158 if conf.get('ENABLE_RANDOMSEED') == 1
2159 executable('systemd-random-seed',
2160 'src/random-seed/random-seed.c',
2161 include_directories : includes,
2162 link_with : [libshared],
2163 install_rpath : rootlibexecdir,
2165 install_dir : rootlibexecdir)
2168 if conf.get('ENABLE_FIRSTBOOT') == 1
2169 executable('systemd-firstboot',
2170 'src/firstboot/firstboot.c',
2171 include_directories : includes,
2172 link_with : [libshared],
2173 dependencies : [libcrypt],
2174 install_rpath : rootlibexecdir,
2176 install_dir : rootbindir)
2179 executable('systemd-remount-fs',
2180 'src/remount-fs/remount-fs.c',
2181 'src/core/mount-setup.c',
2182 'src/core/mount-setup.h',
2183 include_directories : includes,
2184 link_with : [libshared],
2185 install_rpath : rootlibexecdir,
2187 install_dir : rootlibexecdir)
2189 executable('systemd-machine-id-setup',
2190 'src/machine-id-setup/machine-id-setup-main.c',
2191 'src/core/machine-id-setup.c',
2192 'src/core/machine-id-setup.h',
2193 include_directories : includes,
2194 link_with : [libshared],
2195 install_rpath : rootlibexecdir,
2197 install_dir : rootbindir)
2199 executable('systemd-fsck',
2201 include_directories : includes,
2202 link_with : [libshared],
2203 install_rpath : rootlibexecdir,
2205 install_dir : rootlibexecdir)
2207 executable('systemd-growfs',
2208 'src/partition/growfs.c',
2209 include_directories : includes,
2210 link_with : [libshared],
2211 dependencies : [libcryptsetup],
2212 install_rpath : rootlibexecdir,
2214 install_dir : rootlibexecdir)
2216 executable('systemd-makefs',
2217 'src/partition/makefs.c',
2218 include_directories : includes,
2219 link_with : [libshared],
2220 install_rpath : rootlibexecdir,
2222 install_dir : rootlibexecdir)
2224 executable('systemd-sleep',
2225 'src/sleep/sleep.c',
2226 include_directories : includes,
2227 link_with : [libshared],
2228 install_rpath : rootlibexecdir,
2230 install_dir : rootlibexecdir)
2232 exe = executable('systemd-sysctl',
2233 'src/sysctl/sysctl.c',
2234 include_directories : includes,
2235 link_with : [libshared],
2236 install_rpath : rootlibexecdir,
2238 install_dir : rootlibexecdir)
2239 public_programs += [exe]
2241 executable('systemd-ac-power',
2242 'src/ac-power/ac-power.c',
2243 include_directories : includes,
2244 link_with : [libshared],
2245 install_rpath : rootlibexecdir,
2247 install_dir : rootlibexecdir)
2249 exe = executable('systemd-detect-virt',
2250 'src/detect-virt/detect-virt.c',
2251 include_directories : includes,
2252 link_with : [libshared],
2253 install_rpath : rootlibexecdir,
2255 public_programs += [exe]
2257 exe = executable('systemd-delta',
2258 'src/delta/delta.c',
2259 include_directories : includes,
2260 link_with : [libshared],
2261 install_rpath : rootlibexecdir,
2263 public_programs += [exe]
2265 exe = executable('systemd-escape',
2266 'src/escape/escape.c',
2267 include_directories : includes,
2268 link_with : [libshared],
2269 install_rpath : rootlibexecdir,
2271 install_dir : rootbindir)
2272 public_programs += [exe]
2274 exe = executable('systemd-notify',
2275 'src/notify/notify.c',
2276 include_directories : includes,
2277 link_with : [libshared],
2278 install_rpath : rootlibexecdir,
2280 install_dir : rootbindir)
2281 public_programs += [exe]
2283 executable('systemd-volatile-root',
2284 'src/volatile-root/volatile-root.c',
2285 include_directories : includes,
2286 link_with : [libshared],
2287 install_rpath : rootlibexecdir,
2289 install_dir : rootlibexecdir)
2291 executable('systemd-cgroups-agent',
2292 'src/cgroups-agent/cgroups-agent.c',
2293 include_directories : includes,
2294 link_with : [libshared],
2295 install_rpath : rootlibexecdir,
2297 install_dir : rootlibexecdir)
2299 exe = executable('systemd-path',
2301 include_directories : includes,
2302 link_with : [libshared],
2303 install_rpath : rootlibexecdir,
2305 public_programs += [exe]
2307 exe = executable('systemd-ask-password',
2308 'src/ask-password/ask-password.c',
2309 include_directories : includes,
2310 link_with : [libshared],
2311 install_rpath : rootlibexecdir,
2313 install_dir : rootbindir)
2314 public_programs += [exe]
2316 executable('systemd-reply-password',
2317 'src/reply-password/reply-password.c',
2318 include_directories : includes,
2319 link_with : [libshared],
2320 install_rpath : rootlibexecdir,
2322 install_dir : rootlibexecdir)
2324 exe = executable('systemd-tty-ask-password-agent',
2325 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2326 include_directories : includes,
2327 link_with : [libshared],
2328 install_rpath : rootlibexecdir,
2330 install_dir : rootbindir)
2331 public_programs += [exe]
2333 exe = executable('systemd-cgls',
2335 include_directories : includes,
2336 link_with : [libshared],
2337 install_rpath : rootlibexecdir,
2339 public_programs += [exe]
2341 exe = executable('systemd-cgtop',
2342 'src/cgtop/cgtop.c',
2343 include_directories : includes,
2344 link_with : [libshared],
2345 install_rpath : rootlibexecdir,
2347 public_programs += [exe]
2349 executable('systemd-initctl',
2350 'src/initctl/initctl.c',
2351 include_directories : includes,
2352 link_with : [libshared],
2353 install_rpath : rootlibexecdir,
2355 install_dir : rootlibexecdir)
2357 exe = executable('systemd-mount',
2358 'src/mount/mount-tool.c',
2359 include_directories : includes,
2360 link_with : [libshared],
2361 install_rpath : rootlibexecdir,
2363 public_programs += [exe]
2365 meson.add_install_script(meson_make_symlink,
2366 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2368 exe = executable('systemd-run',
2370 include_directories : includes,
2371 link_with : [libshared],
2372 install_rpath : rootlibexecdir,
2374 public_programs += [exe]
2376 exe = executable('systemd-stdio-bridge',
2377 'src/stdio-bridge/stdio-bridge.c',
2378 include_directories : includes,
2379 link_with : [libshared],
2380 install_rpath : rootlibexecdir,
2382 public_programs += [exe]
2384 exe = executable('busctl',
2385 'src/busctl/busctl.c',
2386 'src/busctl/busctl-introspect.c',
2387 'src/busctl/busctl-introspect.h',
2388 include_directories : includes,
2389 link_with : [libshared],
2390 install_rpath : rootlibexecdir,
2392 public_programs += [exe]
2394 if conf.get('ENABLE_SYSUSERS') == 1
2395 exe = executable('systemd-sysusers',
2396 'src/sysusers/sysusers.c',
2397 include_directories : includes,
2398 link_with : [libshared],
2399 install_rpath : rootlibexecdir,
2401 install_dir : rootbindir)
2402 public_programs += [exe]
2405 if conf.get('ENABLE_TMPFILES') == 1
2406 exe = executable('systemd-tmpfiles',
2407 'src/tmpfiles/tmpfiles.c',
2408 include_directories : includes,
2409 link_with : [libshared],
2410 dependencies : [libacl],
2411 install_rpath : rootlibexecdir,
2413 install_dir : rootbindir)
2414 public_programs += [exe]
2416 test('test-systemd-tmpfiles',
2417 test_systemd_tmpfiles_py,
2418 args : exe.full_path())
2419 # https://github.com/mesonbuild/meson/issues/2681
2422 if conf.get('ENABLE_HWDB') == 1
2423 exe = executable('systemd-hwdb',
2425 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2426 include_directories : includes,
2427 link_with : [libudev_static],
2428 install_rpath : udev_rpath,
2430 install_dir : rootbindir)
2431 public_programs += [exe]
2434 if conf.get('ENABLE_QUOTACHECK') == 1
2435 executable('systemd-quotacheck',
2436 'src/quotacheck/quotacheck.c',
2437 include_directories : includes,
2438 link_with : [libshared],
2439 install_rpath : rootlibexecdir,
2441 install_dir : rootlibexecdir)
2444 exe = executable('systemd-socket-proxyd',
2445 'src/socket-proxy/socket-proxyd.c',
2446 include_directories : includes,
2447 link_with : [libshared],
2448 dependencies : [threads],
2449 install_rpath : rootlibexecdir,
2451 install_dir : rootlibexecdir)
2452 public_programs += [exe]
2454 exe = executable('systemd-udevd',
2455 systemd_udevd_sources,
2456 include_directories : includes,
2457 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2458 link_with : [libudev_core,
2461 dependencies : [threads,
2466 install_rpath : udev_rpath,
2468 install_dir : rootlibexecdir)
2469 public_programs += [exe]
2471 exe = executable('udevadm',
2473 c_args : ['-DLOG_REALM=LOG_REALM_UDEV'],
2474 include_directories : includes,
2475 link_with : [libudev_core,
2478 dependencies : [threads,
2483 install_rpath : udev_rpath,
2485 install_dir : rootbindir)
2486 public_programs += [exe]
2488 executable('systemd-shutdown',
2489 systemd_shutdown_sources,
2490 include_directories : includes,
2491 link_with : [libshared],
2492 dependencies : [libmount],
2493 install_rpath : rootlibexecdir,
2495 install_dir : rootlibexecdir)
2497 executable('systemd-update-done',
2498 'src/update-done/update-done.c',
2499 include_directories : includes,
2500 link_with : [libshared],
2501 install_rpath : rootlibexecdir,
2503 install_dir : rootlibexecdir)
2505 executable('systemd-update-utmp',
2506 'src/update-utmp/update-utmp.c',
2507 include_directories : includes,
2508 link_with : [libshared],
2509 dependencies : [libaudit],
2510 install_rpath : rootlibexecdir,
2512 install_dir : rootlibexecdir)
2514 if conf.get('HAVE_KMOD') == 1
2515 executable('systemd-modules-load',
2516 'src/modules-load/modules-load.c',
2517 include_directories : includes,
2518 link_with : [libshared],
2519 dependencies : [libkmod],
2520 install_rpath : rootlibexecdir,
2522 install_dir : rootlibexecdir)
2524 meson.add_install_script('sh', '-c',
2525 mkdir_p.format(modulesloaddir))
2526 meson.add_install_script('sh', '-c',
2527 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2530 exe = executable('systemd-nspawn',
2531 systemd_nspawn_sources,
2532 'src/core/mount-setup.c', # FIXME: use a variable?
2533 'src/core/mount-setup.h',
2534 'src/core/loopback-setup.c',
2535 'src/core/loopback-setup.h',
2536 include_directories : includes,
2537 link_with : [libnspawn_core,
2539 dependencies : [libblkid],
2540 install_rpath : rootlibexecdir,
2542 public_programs += [exe]
2544 if conf.get('ENABLE_NETWORKD') == 1
2545 executable('systemd-networkd',
2546 systemd_networkd_sources,
2547 include_directories : includes,
2548 link_with : [libnetworkd_core,
2552 dependencies : [threads],
2553 install_rpath : rootlibexecdir,
2555 install_dir : rootlibexecdir)
2557 executable('systemd-networkd-wait-online',
2558 systemd_networkd_wait_online_sources,
2559 include_directories : includes,
2560 link_with : [libnetworkd_core,
2562 install_rpath : rootlibexecdir,
2564 install_dir : rootlibexecdir)
2566 exe = executable('networkctl',
2568 include_directories : includes,
2569 link_with : [libsystemd_network,
2571 install_rpath : rootlibexecdir,
2573 install_dir : rootbindir)
2574 public_programs += [exe]
2577 executable('systemd-sulogin-shell',
2578 ['src/sulogin-shell/sulogin-shell.c'],
2579 include_directories : includes,
2580 link_with : [libshared],
2581 install_rpath : rootlibexecdir,
2583 install_dir : rootlibexecdir)
2585 ############################################################
2587 foreach tuple : tests
2589 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2590 dependencies = tuple[2]
2591 condition = tuple.length() >= 4 ? tuple[3] : ''
2592 type = tuple.length() >= 5 ? tuple[4] : ''
2593 defs = tuple.length() >= 6 ? tuple[5] : []
2594 incs = tuple.length() >= 7 ? tuple[6] : includes
2597 name = sources[0].split('/')[-1].split('.')[0]
2598 if type.startswith('timeout=')
2599 timeout = type.split('=')[1].to_int()
2602 if want_tests == 'false'
2603 message('Not compiling @0@ because tests is set to false'.format(name))
2604 elif condition == '' or conf.get(condition) == 1
2608 include_directories : incs,
2609 link_with : link_with,
2610 dependencies : dependencies,
2612 install_rpath : rootlibexecdir,
2613 install : install_tests,
2614 install_dir : join_paths(testsdir, type))
2617 message('@0@ is a manual test'.format(name))
2618 elif type == 'unsafe' and want_tests != 'unsafe'
2619 message('@0@ is an unsafe test'.format(name))
2626 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2631 'test-libsystemd-sym',
2632 test_libsystemd_sym_c,
2633 include_directories : includes,
2634 link_with : [libsystemd],
2635 install : install_tests,
2636 install_dir : testsdir)
2637 test('test-libsystemd-sym', exe)
2640 'test-libsystemd-static-sym',
2641 test_libsystemd_sym_c,
2642 include_directories : includes,
2643 link_with : [install_libsystemd_static],
2644 dependencies : [threads], # threads is already included in dependencies on the library,
2645 # but does not seem to get propagated. Add here as a work-around.
2646 build_by_default : static_libsystemd_pic,
2647 install : install_tests and static_libsystemd_pic,
2648 install_dir : testsdir)
2649 if static_libsystemd_pic
2650 test('test-libsystemd-static-sym', exe)
2656 include_directories : includes,
2657 c_args : ['-Wno-deprecated-declarations'],
2658 link_with : [libudev],
2659 install : install_tests,
2660 install_dir : testsdir)
2661 test('test-libudev-sym', exe)
2664 'test-libudev-static-sym',
2666 include_directories : includes,
2667 c_args : ['-Wno-deprecated-declarations'],
2668 link_with : [install_libudev_static],
2669 build_by_default : static_libudev_pic,
2670 install : install_tests and static_libudev_pic,
2671 install_dir : testsdir)
2672 if static_libudev_pic
2673 test('test-libudev-static-sym', exe)
2676 ############################################################
2680 foreach tuple : fuzzers
2682 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2683 dependencies = tuple[2]
2684 defs = tuple.length() >= 4 ? tuple[3] : []
2685 incs = tuple.length() >= 5 ? tuple[4] : includes
2688 dependencies += fuzzing_engine
2690 sources += 'src/fuzz/fuzz-main.c'
2693 name = sources[0].split('/')[-1].split('.')[0]
2695 fuzzer_exes += executable(
2698 include_directories : [incs, include_directories('src/fuzz')],
2699 link_with : link_with,
2700 dependencies : dependencies,
2705 run_target('fuzzers',
2706 depends : fuzzer_exes,
2709 ############################################################
2711 make_directive_index_py = find_program('tools/make-directive-index.py')
2712 make_man_index_py = find_program('tools/make-man-index.py')
2713 xml_helper_py = find_program('tools/xml_helper.py')
2714 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2718 subdir('sysusers.d')
2719 subdir('tmpfiles.d')
2724 subdir('shell-completion/bash')
2725 subdir('shell-completion/zsh')
2726 subdir('doc/sysvinit')
2727 subdir('doc/var-log')
2729 # FIXME: figure out if the warning is true:
2730 # https://github.com/mesonbuild/meson/wiki/Reference-manual#install_subdir
2731 install_subdir('factory/etc',
2732 install_dir : factorydir)
2735 install_data('xorg/50-systemd-user.sh',
2736 install_dir : xinitrcdir)
2737 install_data('modprobe.d/systemd.conf',
2738 install_dir : modprobedir)
2739 install_data('LICENSE.GPL2',
2744 'doc/DISTRO_PORTING',
2745 'doc/ENVIRONMENT.md',
2747 'doc/TRANSIENT-SETTINGS.md',
2750 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2751 install_dir : docdir)
2753 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2754 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2756 ############################################################
2758 meson_check_help = find_program('tools/meson-check-help.sh')
2760 foreach exec : public_programs
2761 name = exec.full_path().split('/')[-1]
2762 test('check-help-' + name,
2764 args : [exec.full_path()])
2767 ############################################################
2769 # Enable tests for all supported sanitizers
2770 foreach tuple : sanitizers
2771 sanitizer = tuple[0]
2774 have = run_command(check_compilation_sh,
2775 cc.cmd_array(), '-x', 'c',
2776 '-fsanitize=@0@'.format(sanitizer),
2777 '-include', link_test_c).returncode() == 0
2778 message('@0@ sanitizer supported: @1@'.format(sanitizer, have ? 'yes' : 'no'))
2782 foreach p : fuzz_regression_tests
2783 b = p.split('/')[-2]
2784 c = p.split('/')[-1]
2786 name = '@0@:@1@'.format(b, sanitizer)
2789 if want_tests == 'false'
2790 message('Not compiling @0@ because tests is set to false'.format(name))
2792 exe = custom_target(
2796 command : [env, 'ln', '-fs',
2797 join_paths(build.full_path(), b),
2799 build_by_default : true)
2801 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2806 if want_tests != 'false' and slow_tests
2807 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2809 args : [exe.full_path(),
2810 join_paths(meson.source_root(),
2811 'test/fuzz-regressions',
2819 ############################################################
2822 all_files = run_command(
2824 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2827 all_files = files(all_files.stdout().split())
2832 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.current_source_dir())] + all_files)
2835 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.current_source_dir())] + all_files)
2839 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2842 command : [meson_git_contrib_sh])
2846 git_head = run_command(
2848 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2849 'rev-parse', 'HEAD']).stdout().strip()
2850 git_head_short = run_command(
2852 ['--git-dir=@0@/.git'.format(meson.current_source_dir()),
2853 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2857 command : ['git', 'archive',
2858 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.current_source_dir(),
2860 '--prefix', 'systemd-@0@/'.format(git_head),
2864 ############################################################
2866 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2869 depends : [man, libsystemd, libudev],
2870 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2872 ############################################################
2875 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2877 'split /usr: @0@'.format(split_usr),
2878 'split bin-sbin: @0@'.format(split_bin),
2879 'prefix directory: @0@'.format(prefixdir),
2880 'rootprefix directory: @0@'.format(rootprefixdir),
2881 'sysconf directory: @0@'.format(sysconfdir),
2882 'include directory: @0@'.format(includedir),
2883 'lib directory: @0@'.format(libdir),
2884 'rootlib directory: @0@'.format(rootlibdir),
2885 'SysV init scripts: @0@'.format(sysvinit_path),
2886 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2887 'PAM modules directory: @0@'.format(pamlibdir),
2888 'PAM configuration directory: @0@'.format(pamconfdir),
2889 'RPM macros directory: @0@'.format(rpmmacrosdir),
2890 'modprobe.d directory: @0@'.format(modprobedir),
2891 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2892 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2893 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2894 'bash completions directory: @0@'.format(bashcompletiondir),
2895 'zsh completions directory: @0@'.format(zshcompletiondir),
2896 'extra start script: @0@'.format(get_option('rc-local')),
2897 'extra stop script: @0@'.format(get_option('halt-local')),
2898 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
2899 get_option('debug-tty')),
2900 'TTY GID: @0@'.format(tty_gid),
2901 'users GID: @0@'.format(users_gid),
2902 'maximum system UID: @0@'.format(system_uid_max),
2903 'maximum system GID: @0@'.format(system_gid_max),
2904 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
2905 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
2906 'minimum container UID base: @0@'.format(container_uid_base_min),
2907 'maximum container UID base: @0@'.format(container_uid_base_max),
2908 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
2909 'render group access mode: @0@'.format(get_option('group-render-mode')),
2910 'certificate root directory: @0@'.format(get_option('certificate-root')),
2911 'support URL: @0@'.format(support_url),
2912 'nobody user name: @0@'.format(nobody_user),
2913 'nobody group name: @0@'.format(nobody_group),
2914 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
2915 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
2917 'default DNSSEC mode: @0@'.format(default_dnssec),
2918 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
2919 'default cgroup hierarchy: @0@'.format(default_hierarchy),
2920 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
2922 alt_dns_servers = '\n '.join(dns_servers.split(' '))
2923 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
2925 'default DNS servers: @0@'.format(alt_dns_servers),
2926 'default NTP servers: @0@'.format(alt_ntp_servers)]
2928 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
2929 '@@0@'.format(time_epoch)).stdout().strip()
2931 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
2934 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
2935 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
2936 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
2938 if conf.get('ENABLE_EFI') == 1
2940 'efi arch: @0@'.format(efi_arch)]
2944 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
2945 'EFI CC @0@'.format(efi_cc),
2946 'EFI lib directory: @0@'.format(efi_libdir),
2947 'EFI lds directory: @0@'.format(efi_ldsdir),
2948 'EFI include directory: @0@'.format(efi_incdir)]
3002 ['legacy pkla', install_polkit_pkla],
3004 ['gnu-efi', have_gnu_efi],
3011 ['nss-myhostname', conf.get('ENABLE_NSS_MYHOSTNAME') == 1],
3012 ['nss-mymachines', conf.get('ENABLE_NSS_MYMACHINES') == 1],
3013 ['nss-resolve', conf.get('ENABLE_NSS_RESOLVE') == 1],
3014 ['nss-systemd', conf.get('ENABLE_NSS_SYSTEMD') == 1],
3017 ['man pages', want_man],
3018 ['html pages', want_html],
3019 ['man page indices', want_man and have_lxml],
3024 ['adm group', get_option('adm-group')],
3025 ['wheel group', get_option('wheel-group')],
3028 ['debug mmap cache'],
3029 ['valgrind', conf.get('VALGRIND') == 1],
3032 if tuple.length() >= 2
3035 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3036 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3037 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3042 missing += [tuple[0]]
3048 'enabled features: @0@'.format(', '.join(found)),
3050 'disabled features: @0@'.format(', '.join(missing)),
3052 message('\n '.join(status))
3054 if rootprefixdir != rootprefix_default
3056 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3057 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3058 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))