]> git.ipfire.org Git - thirdparty/systemd.git/blob - meson.build
tests: add a fuzzer for the udev rules parser (#10929)
[thirdparty/systemd.git] / meson.build
1 # SPDX-License-Identifier: LGPL-2.1+
2
3 project('systemd', 'c',
4 version : '239',
5 license : 'LGPLv2+',
6 default_options: [
7 'c_std=gnu99',
8 'prefix=/usr',
9 'sysconfdir=/etc',
10 'localstatedir=/var',
11 ],
12 meson_version : '>= 0.46',
13 )
14
15 libsystemd_version = '0.23.0'
16 libudev_version = '1.6.11'
17
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
21 # set. Ugh, ugh, ugh!
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())
25
26 substs = configuration_data()
27 substs.set('PACKAGE_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
28 substs.set('PACKAGE_VERSION', meson.project_version())
29
30 want_ossfuzz = get_option('oss-fuzz')
31 want_libfuzzer = get_option('llvm-fuzz')
32 if want_ossfuzz and want_libfuzzer
33 error('only one of oss-fuzz and llvm-fuzz can be specified')
34 endif
35 fuzzer_build = want_ossfuzz or want_libfuzzer
36
37 #####################################################################
38
39 # Try to install the git pre-commit hook
40 git_hook = run_command(join_paths(meson.source_root(), 'tools/add-git-hook.sh'))
41 if git_hook.returncode() == 0
42 message(git_hook.stdout().strip())
43 endif
44
45 #####################################################################
46
47 if get_option('split-usr') == 'auto'
48 split_usr = run_command('test', '-L', '/bin').returncode() != 0
49 else
50 split_usr = get_option('split-usr') == 'true'
51 endif
52 conf.set10('HAVE_SPLIT_USR', split_usr,
53 description : '/usr/bin and /bin directories are separate')
54
55 if get_option('split-bin') == 'auto'
56 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
57 else
58 split_bin = get_option('split-bin') == 'true'
59 endif
60 conf.set10('HAVE_SPLIT_BIN', split_bin,
61 description : 'bin and sbin directories are separate')
62
63 rootprefixdir = get_option('rootprefix')
64 # Unusual rootprefixdir values are used by some distros
65 # (see https://github.com/systemd/systemd/pull/7461).
66 rootprefix_default = split_usr ? '/' : '/usr'
67 if rootprefixdir == ''
68 rootprefixdir = rootprefix_default
69 endif
70
71 sysvinit_path = get_option('sysvinit-path')
72 sysvrcnd_path = get_option('sysvrcnd-path')
73 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
74 description : 'SysV init scripts and rcN.d links are supported')
75
76 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
77 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
78 conf.set('HIGH_RLIMIT_NOFILE', 256*1024)
79
80 # join_paths ignore the preceding arguments if an absolute component is
81 # encountered, so this should canonicalize various paths when they are
82 # absolute or relative.
83 prefixdir = get_option('prefix')
84 if not prefixdir.startswith('/')
85 error('Prefix is not absolute: "@0@"'.format(prefixdir))
86 endif
87 bindir = join_paths(prefixdir, get_option('bindir'))
88 libdir = join_paths(prefixdir, get_option('libdir'))
89 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
90 includedir = join_paths(prefixdir, get_option('includedir'))
91 datadir = join_paths(prefixdir, get_option('datadir'))
92 localstatedir = join_paths('/', get_option('localstatedir'))
93
94 rootbindir = join_paths(rootprefixdir, 'bin')
95 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
96 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
97
98 rootlibdir = get_option('rootlibdir')
99 if rootlibdir == ''
100 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
101 endif
102
103 # Dirs of external packages
104 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
105 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
106 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
107 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
108 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
109 varlogdir = join_paths(localstatedir, 'log')
110 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
111 rpmmacrosdir = get_option('rpmmacrosdir')
112 if rpmmacrosdir != 'no'
113 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
114 endif
115 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
116
117 # Our own paths
118 pkgdatadir = join_paths(datadir, 'systemd')
119 environmentdir = join_paths(prefixdir, 'lib/environment.d')
120 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
121 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
122 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
123 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
124 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
125 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
126 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
127 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
128 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
129 pkgincludedir = join_paths(includedir, 'systemd')
130 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
131 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
132 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
133 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
134 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
135 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
136 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
137 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
138 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
139 udevhomedir = udevlibexecdir
140 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
141 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
142 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
143 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
144 factorydir = join_paths(datadir, 'factory')
145 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
146 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
147 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
148 catalogstatedir = join_paths(systemdstatedir, 'catalog')
149 randomseeddir = join_paths(localstatedir, 'lib/systemd')
150 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
151
152 docdir = get_option('docdir')
153 if docdir == ''
154 docdir = join_paths(datadir, 'doc/systemd')
155 endif
156
157 dbuspolicydir = get_option('dbuspolicydir')
158 if dbuspolicydir == ''
159 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
160 endif
161
162 dbussessionservicedir = get_option('dbussessionservicedir')
163 if dbussessionservicedir == ''
164 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
165 endif
166
167 dbussystemservicedir = get_option('dbussystemservicedir')
168 if dbussystemservicedir == ''
169 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
170 endif
171
172 pamlibdir = get_option('pamlibdir')
173 if pamlibdir == ''
174 pamlibdir = join_paths(rootlibdir, 'security')
175 endif
176
177 pamconfdir = get_option('pamconfdir')
178 if pamconfdir == ''
179 pamconfdir = join_paths(sysconfdir, 'pam.d')
180 endif
181
182 memory_accounting_default = get_option('memory-accounting-default')
183
184 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
185 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
186 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
187 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
188 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
189 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
190 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
191
192 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
193
194 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
195 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
196 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
197 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
198 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
199 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
200 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
201 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
202 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
203 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
204 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
205 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
206 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
207 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
208 conf.set_quoted('ROOTPREFIX', rootprefixdir)
209 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
210 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
211 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
212 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
213 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
214 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
215 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
216 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
217 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
218 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
219 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
220 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
221 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
222 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
223 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
224 conf.set_quoted('LIBDIR', libdir)
225 conf.set_quoted('ROOTLIBDIR', rootlibdir)
226 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
227 conf.set_quoted('BOOTLIBDIR', bootlibdir)
228 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
229 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
230 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
231 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
232 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
233 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
234 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
235 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
236
237 substs.set('prefix', prefixdir)
238 substs.set('exec_prefix', prefixdir)
239 substs.set('libdir', libdir)
240 substs.set('rootlibdir', rootlibdir)
241 substs.set('includedir', includedir)
242 substs.set('pkgsysconfdir', pkgsysconfdir)
243 substs.set('bindir', bindir)
244 substs.set('rootbindir', rootbindir)
245 substs.set('rootlibexecdir', rootlibexecdir)
246 substs.set('systemunitdir', systemunitdir)
247 substs.set('userunitdir', userunitdir)
248 substs.set('systempresetdir', systempresetdir)
249 substs.set('userpresetdir', userpresetdir)
250 substs.set('udevhwdbdir', udevhwdbdir)
251 substs.set('udevrulesdir', udevrulesdir)
252 substs.set('udevlibexecdir', udevlibexecdir)
253 substs.set('environmentdir', environmentdir)
254 substs.set('catalogdir', catalogdir)
255 substs.set('tmpfilesdir', tmpfilesdir)
256 substs.set('sysusersdir', sysusersdir)
257 substs.set('sysctldir', sysctldir)
258 substs.set('binfmtdir', binfmtdir)
259 substs.set('modulesloaddir', modulesloaddir)
260 substs.set('modprobedir', modprobedir)
261 substs.set('systemgeneratordir', systemgeneratordir)
262 substs.set('usergeneratordir', usergeneratordir)
263 substs.set('systemenvgeneratordir', systemenvgeneratordir)
264 substs.set('userenvgeneratordir', userenvgeneratordir)
265 substs.set('systemshutdowndir', systemshutdowndir)
266 substs.set('systemsleepdir', systemsleepdir)
267 substs.set('VARLOGDIR', varlogdir)
268 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
269 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
270 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
271 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
272 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
273 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
274 substs.set('RC_LOCAL_SCRIPT_PATH_STOP', get_option('halt-local'))
275 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
276 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
277
278 #####################################################################
279
280 cc = meson.get_compiler('c')
281 pkgconfig = import('pkgconfig')
282 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
283 meson_build_sh = find_program('tools/meson-build.sh')
284
285 want_tests = get_option('tests')
286 slow_tests = want_tests != 'false' and get_option('slow-tests')
287 install_tests = get_option('install-tests')
288
289 cxx = find_program('c++', required : fuzzer_build)
290 if cxx.found()
291 # Used only for tests
292 add_languages('cpp')
293 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
294 else
295 cxx_cmd = ''
296 endif
297
298 if want_libfuzzer
299 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer')
300 elif want_ossfuzz
301 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
302 endif
303
304 possible_cc_flags = [
305 '-Wextra',
306 '-Werror=undef',
307 '-Wlogical-op',
308 '-Wmissing-include-dirs',
309 '-Wold-style-definition',
310 '-Wpointer-arith',
311 '-Winit-self',
312 '-Wfloat-equal',
313 '-Wsuggest-attribute=noreturn',
314 '-Werror=missing-prototypes',
315 '-Werror=implicit-function-declaration',
316 '-Werror=missing-declarations',
317 '-Werror=return-type',
318 '-Werror=incompatible-pointer-types',
319 '-Werror=format=2',
320 '-Wstrict-prototypes',
321 '-Wredundant-decls',
322 '-Wmissing-noreturn',
323 '-Wimplicit-fallthrough=5',
324 '-Wshadow',
325 '-Wendif-labels',
326 '-Wstrict-aliasing=2',
327 '-Wwrite-strings',
328 '-Werror=overflow',
329 '-Werror=shift-count-overflow',
330 '-Werror=shift-overflow=2',
331 '-Wdate-time',
332 '-Wnested-externs',
333
334 # negative arguments are correctly detected starting with meson 0.46.
335 '-Wno-unused-parameter',
336 '-Wno-missing-field-initializers',
337 '-Wno-unused-result',
338 '-Wno-format-signedness',
339
340 # work-around for gcc 7.1 turning this on on its own.
341 '-Wno-error=nonnull',
342
343 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
344 # optimizations enabled, producing essentially false positives.
345 '-Wno-maybe-uninitialized',
346
347 '-ffast-math',
348 '-fno-common',
349 '-fdiagnostics-show-option',
350 '-fno-strict-aliasing',
351 '-fvisibility=hidden',
352 '-fstack-protector',
353 '-fstack-protector-strong',
354 '--param=ssp-buffer-size=4',
355 ]
356
357 # --as-needed and --no-undefined are provided by meson by default,
358 # run mesonconf to see what is enabled
359 possible_link_flags = [
360 '-Wl,-z,relro',
361 '-Wl,-z,now',
362 ]
363
364 # the oss-fuzz fuzzers are not built with -fPIE, so don't
365 # enable it when we are linking against them
366 if not fuzzer_build
367 possible_cc_flags += '-fPIE'
368 possible_link_flags += '-pie'
369 endif
370
371 if cc.get_id() == 'clang'
372 possible_cc_flags += [
373 '-Wno-typedef-redefinition',
374 '-Wno-gnu-variable-sized-type-not-at-end',
375 ]
376 endif
377
378 if get_option('buildtype') != 'debug'
379 possible_cc_flags += [
380 '-ffunction-sections',
381 '-fdata-sections',
382 ]
383
384 possible_link_flags += '-Wl,--gc-sections'
385 endif
386
387 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
388 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
389
390 if cc.compiles('''
391 #include <time.h>
392 #include <inttypes.h>
393 typedef uint64_t usec_t;
394 usec_t now(clockid_t clock);
395 int main(void) {
396 struct timespec now;
397 return 0;
398 }
399 ''', name : '-Werror=shadow with local shadowing')
400 add_project_arguments('-Werror=shadow', language : 'c')
401 endif
402
403 cpp = ' '.join(cc.cmd_array()) + ' -E'
404
405 #####################################################################
406 # compilation result tests
407
408 conf.set('_GNU_SOURCE', true)
409 conf.set('__SANE_USERSPACE_TYPES__', true)
410
411 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
412 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
413 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
414 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
415 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
416 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
417 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
418
419 decl_headers = '''
420 #include <uchar.h>
421 #include <linux/ethtool.h>
422 #include <linux/fib_rules.h>
423 #include <sys/stat.h>
424 '''
425
426 foreach decl : ['char16_t',
427 'char32_t',
428 'struct ethtool_link_settings',
429 'struct fib_rule_uid_range',
430 'struct statx',
431 ]
432
433 # We get -1 if the size cannot be determined
434 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
435
436 if decl == 'struct statx'
437 if have
438 want_linux_stat_h = false
439 else
440 have = cc.sizeof(decl,
441 prefix : decl_headers + '#include <linux/stat.h>',
442 args : '-D_GNU_SOURCE') > 0
443 want_linux_stat_h = have
444 endif
445 endif
446
447 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
448 endforeach
449
450 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
451
452 foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'],
453 ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'],
454 ['IFLA_VRF_TABLE', 'linux/if_link.h'],
455 ['IFLA_MACVLAN_FLAGS', 'linux/if_link.h'],
456 ['IFLA_IPVLAN_FLAGS', 'linux/if_link.h'],
457 ['IFLA_PHYS_PORT_ID', 'linux/if_link.h'],
458 ['IFLA_BOND_AD_ACTOR_SYSTEM', 'linux/if_link.h'],
459 ['IFLA_VLAN_PROTOCOL', 'linux/if_link.h'],
460 ['IFLA_VXLAN_REMCSUM_NOPARTIAL', 'linux/if_link.h'],
461 ['IFLA_VXLAN_GPE', 'linux/if_link.h'],
462 ['IFLA_GENEVE_LABEL', 'linux/if_link.h'],
463 # if_tunnel.h is buggy and cannot be included on its own
464 ['IFLA_VTI_REMOTE', 'linux/if_tunnel.h', '#include <net/if.h>'],
465 ['IFLA_IPTUN_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
466 ['IFLA_GRE_ENCAP_DPORT', 'linux/if_tunnel.h', '#include <net/if.h>'],
467 ['IFLA_BRIDGE_VLAN_INFO', 'linux/if_bridge.h'],
468 ['IFLA_BRPORT_PROXYARP', 'linux/if_link.h'],
469 ['IFLA_BRPORT_LEARNING_SYNC', 'linux/if_link.h'],
470 ['IFLA_BR_VLAN_DEFAULT_PVID', 'linux/if_link.h'],
471 ['IPVLAN_F_PRIVATE', 'linux/if_link.h'],
472 ['NDA_IFINDEX', 'linux/neighbour.h'],
473 ['IFA_FLAGS', 'linux/if_addr.h'],
474 ['FRA_UID_RANGE', 'linux/fib_rules.h'],
475 ['LO_FLAGS_PARTSCAN', 'linux/loop.h'],
476 ['VXCAN_INFO_PEER', 'linux/can/vxcan.h'],
477 ['FOU_ATTR_REMCSUM_NOPARTIAL', 'linux/fou.h'],
478 ['FOU_CMD_GET', 'linux/fou.h'],
479 ['ETHTOOL_LINK_MODE_10baseT_Half_BIT', 'linux/ethtool.h'],
480 ['ETHTOOL_LINK_MODE_25000baseCR_Full_BIT', 'linux/ethtool.h'],
481 ['ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT', 'linux/ethtool.h'],
482 ['ETHTOOL_LINK_MODE_1000baseX_Full_BIT', 'linux/ethtool.h'],
483 ['ETHTOOL_LINK_MODE_2500baseT_Full_BIT', 'linux/ethtool.h'],
484 ['ETHTOOL_LINK_MODE_FEC_NONE_BIT', 'linux/ethtool.h'],
485 ]
486 prefix = decl.length() > 2 ? decl[2] : ''
487 have = cc.has_header_symbol(decl[1], decl[0], prefix : prefix)
488 conf.set10('HAVE_' + decl[0], have)
489 endforeach
490
491 foreach ident : ['secure_getenv', '__secure_getenv']
492 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
493 endforeach
494
495 foreach ident : [
496 ['memfd_create', '''#include <sys/mman.h>'''],
497 ['gettid', '''#include <sys/types.h>
498 #include <unistd.h>'''],
499 ['pivot_root', '''#include <stdlib.h>
500 #include <unistd.h>'''], # no known header declares pivot_root
501 ['name_to_handle_at', '''#include <sys/types.h>
502 #include <sys/stat.h>
503 #include <fcntl.h>'''],
504 ['setns', '''#include <sched.h>'''],
505 ['renameat2', '''#include <stdio.h>
506 #include <fcntl.h>'''],
507 ['kcmp', '''#include <linux/kcmp.h>'''],
508 ['keyctl', '''#include <sys/types.h>
509 #include <keyutils.h>'''],
510 ['copy_file_range', '''#include <sys/syscall.h>
511 #include <unistd.h>'''],
512 ['bpf', '''#include <sys/syscall.h>
513 #include <unistd.h>'''],
514 ['statx', '''#include <sys/types.h>
515 #include <sys/stat.h>
516 #include <unistd.h>'''],
517 ['explicit_bzero' , '''#include <string.h>'''],
518 ['reallocarray', '''#include <malloc.h>'''],
519 ]
520
521 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
522 conf.set10('HAVE_' + ident[0].to_upper(), have)
523 endforeach
524
525 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
526 conf.set10('USE_SYS_RANDOM_H', true)
527 conf.set10('HAVE_GETRANDOM', true)
528 else
529 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
530 conf.set10('USE_SYS_RANDOM_H', false)
531 conf.set10('HAVE_GETRANDOM', have)
532 endif
533
534 #####################################################################
535
536 sed = find_program('sed')
537 awk = find_program('awk')
538 m4 = find_program('m4')
539 stat = find_program('stat')
540 git = find_program('git', required : false)
541 env = find_program('env')
542 perl = find_program('perl', required : false)
543
544 meson_make_symlink = meson.source_root() + '/tools/meson-make-symlink.sh'
545 mkdir_p = 'mkdir -p $DESTDIR/@0@'
546 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
547 splash_bmp = files('test/splash.bmp')
548
549 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
550 # /usr/sbin, /sbin, and fall back to the default from middle column.
551 progs = [['quotaon', '/usr/sbin/quotaon' ],
552 ['quotacheck', '/usr/sbin/quotacheck' ],
553 ['kmod', '/usr/bin/kmod' ],
554 ['kexec', '/usr/sbin/kexec' ],
555 ['sulogin', '/usr/sbin/sulogin' ],
556 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
557 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
558 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
559 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
560 ]
561 foreach prog : progs
562 path = get_option(prog[0] + '-path')
563 if path != ''
564 message('Using @1@ for @0@'.format(prog[0], path))
565 else
566 exe = find_program(prog[0],
567 '/usr/sbin/' + prog[0],
568 '/sbin/' + prog[0],
569 required: false)
570 path = exe.found() ? exe.path() : prog[1]
571 endif
572 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
573 conf.set_quoted(name, path)
574 substs.set(name, path)
575 endforeach
576
577 conf.set_quoted('TELINIT', get_option('telinit-path'))
578
579 if run_command('ln', '--relative', '--help').returncode() != 0
580 error('ln does not support --relative (added in coreutils 8.16)')
581 endif
582
583 ############################################################
584
585 gperf = find_program('gperf')
586
587 gperf_test_format = '''
588 #include <string.h>
589 const char * in_word_set(const char *, @0@);
590 @1@
591 '''
592 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
593 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
594 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
595 if cc.compiles(gperf_test)
596 gperf_len_type = 'size_t'
597 else
598 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
599 if cc.compiles(gperf_test)
600 gperf_len_type = 'unsigned'
601 else
602 error('unable to determine gperf len type')
603 endif
604 endif
605 message('gperf len type is @0@'.format(gperf_len_type))
606 conf.set('GPERF_LEN_TYPE', gperf_len_type,
607 description : 'The type of gperf "len" parameter')
608
609 ############################################################
610
611 if not cc.has_header('sys/capability.h')
612 error('POSIX caps headers not found')
613 endif
614 foreach header : ['crypt.h',
615 'linux/btrfs.h',
616 'linux/fou.h',
617 'linux/memfd.h',
618 'linux/vm_sockets.h',
619 'sys/auxv.h',
620 'valgrind/memcheck.h',
621 'valgrind/valgrind.h',
622 ]
623
624 conf.set10('HAVE_' + header.underscorify().to_upper(),
625 cc.has_header(header))
626 endforeach
627
628 ############################################################
629
630 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
631 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
632 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
633
634 default_hierarchy = get_option('default-hierarchy')
635 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
636 description : 'default cgroup hierarchy as string')
637 if default_hierarchy == 'legacy'
638 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
639 elif default_hierarchy == 'hybrid'
640 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
641 else
642 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
643 endif
644
645 time_epoch = get_option('time-epoch')
646 if time_epoch == -1
647 NEWS = files('NEWS')
648 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
649 endif
650 conf.set('TIME_EPOCH', time_epoch)
651
652 system_uid_max = get_option('system-uid-max')
653 if system_uid_max == -1
654 system_uid_max = run_command(
655 awk,
656 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
657 '/etc/login.defs').stdout().strip()
658 if system_uid_max == ''
659 system_uid_max = 999
660 else
661 system_uid_max = system_uid_max.to_int()
662 endif
663 endif
664 conf.set('SYSTEM_UID_MAX', system_uid_max)
665 substs.set('systemuidmax', system_uid_max)
666
667 system_gid_max = get_option('system-gid-max')
668 if system_gid_max == -1
669 system_gid_max = run_command(
670 awk,
671 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
672 '/etc/login.defs').stdout().strip()
673 if system_gid_max == ''
674 system_gid_max = 999
675 else
676 system_gid_max = system_gid_max.to_int()
677 endif
678 endif
679 conf.set('SYSTEM_GID_MAX', system_gid_max)
680 substs.set('systemgidmax', system_gid_max)
681
682 dynamic_uid_min = get_option('dynamic-uid-min')
683 dynamic_uid_max = get_option('dynamic-uid-max')
684 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
685 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
686 substs.set('dynamicuidmin', dynamic_uid_min)
687 substs.set('dynamicuidmax', dynamic_uid_max)
688
689 container_uid_base_min = get_option('container-uid-base-min')
690 container_uid_base_max = get_option('container-uid-base-max')
691 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
692 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
693 substs.set('containeruidbasemin', container_uid_base_min)
694 substs.set('containeruidbasemax', container_uid_base_max)
695
696 nobody_user = get_option('nobody-user')
697 nobody_group = get_option('nobody-group')
698
699 if not meson.is_cross_build()
700 getent_result = run_command('getent', 'passwd', '65534')
701 if getent_result.returncode() == 0
702 name = getent_result.stdout().split(':')[0]
703 if name != nobody_user
704 warning('\n' +
705 '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) +
706 'Your build will result in an user table setup that is incompatible with the local system.')
707 endif
708 endif
709 id_result = run_command('id', '-u', nobody_user)
710 if id_result.returncode() == 0
711 id = id_result.stdout().to_int()
712 if id != 65534
713 warning('\n' +
714 '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) +
715 'Your build will result in an user table setup that is incompatible with the local system.')
716 endif
717 endif
718
719 getent_result = run_command('getent', 'group', '65534')
720 if getent_result.returncode() == 0
721 name = getent_result.stdout().split(':')[0]
722 if name != nobody_group
723 warning('\n' +
724 '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) +
725 'Your build will result in an group table setup that is incompatible with the local system.')
726 endif
727 endif
728 id_result = run_command('id', '-g', nobody_group)
729 if id_result.returncode() == 0
730 id = id_result.stdout().to_int()
731 if id != 65534
732 warning('\n' +
733 '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) +
734 'Your build will result in an group table setup that is incompatible with the local system.')
735 endif
736 endif
737 endif
738 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
739 warning('\n' +
740 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
741 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
742 endif
743
744 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
745 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
746 substs.set('NOBODY_USER_NAME', nobody_user)
747 substs.set('NOBODY_GROUP_NAME', nobody_group)
748
749 tty_gid = get_option('tty-gid')
750 conf.set('TTY_GID', tty_gid)
751 substs.set('TTY_GID', tty_gid)
752
753 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
754 users_gid = get_option('users-gid')
755 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
756
757 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
758 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
759
760 dev_kvm_mode = get_option('dev-kvm-mode')
761 substs.set('DEV_KVM_MODE', dev_kvm_mode)
762 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
763 substs.set('GROUP_RENDER_MODE', get_option('group-render-mode'))
764
765 kill_user_processes = get_option('default-kill-user-processes')
766 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
767 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
768 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
769
770 dns_servers = get_option('dns-servers')
771 conf.set_quoted('DNS_SERVERS', dns_servers)
772 substs.set('DNS_SERVERS', dns_servers)
773
774 ntp_servers = get_option('ntp-servers')
775 conf.set_quoted('NTP_SERVERS', ntp_servers)
776 substs.set('NTP_SERVERS', ntp_servers)
777
778 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
779
780 substs.set('SUSHELL', get_option('debug-shell'))
781 substs.set('DEBUGTTY', get_option('debug-tty'))
782
783 enable_debug_hashmap = false
784 enable_debug_mmap_cache = false
785 enable_debug_siphash = false
786 enable_debug_udev = false
787 foreach name : get_option('debug-extra')
788 if name == 'hashmap'
789 enable_debug_hashmap = true
790 elif name == 'mmap-cache'
791 enable_debug_mmap_cache = true
792 elif name == 'siphash'
793 enable_debug_siphash = true
794 elif name == 'udev'
795 enable_debug_udev = true
796 else
797 message('unknown debug option "@0@", ignoring'.format(name))
798 endif
799 endforeach
800 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
801 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
802 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
803 conf.set10('ENABLE_DEBUG_UDEV', enable_debug_udev)
804
805 conf.set10('VALGRIND', get_option('valgrind'))
806 conf.set10('LOG_TRACE', get_option('log-trace'))
807
808 #####################################################################
809
810 threads = dependency('threads')
811 librt = cc.find_library('rt')
812 libm = cc.find_library('m')
813 libdl = cc.find_library('dl')
814 libcrypt = cc.find_library('crypt')
815
816 libcap = dependency('libcap', required : false)
817 if not libcap.found()
818 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
819 libcap = cc.find_library('cap')
820 endif
821
822 libmount = dependency('mount',
823 version : fuzzer_build ? '>= 0' : '>= 2.30')
824
825 want_seccomp = get_option('seccomp')
826 if want_seccomp != 'false' and not fuzzer_build
827 libseccomp = dependency('libseccomp',
828 version : '>= 2.3.1',
829 required : want_seccomp == 'true')
830 have = libseccomp.found()
831 else
832 have = false
833 libseccomp = []
834 endif
835 conf.set10('HAVE_SECCOMP', have)
836
837 want_selinux = get_option('selinux')
838 if want_selinux != 'false' and not fuzzer_build
839 libselinux = dependency('libselinux',
840 version : '>= 2.1.9',
841 required : want_selinux == 'true')
842 have = libselinux.found()
843 else
844 have = false
845 libselinux = []
846 endif
847 conf.set10('HAVE_SELINUX', have)
848
849 want_apparmor = get_option('apparmor')
850 if want_apparmor != 'false' and not fuzzer_build
851 libapparmor = dependency('libapparmor',
852 required : want_apparmor == 'true')
853 have = libapparmor.found()
854 else
855 have = false
856 libapparmor = []
857 endif
858 conf.set10('HAVE_APPARMOR', have)
859
860 smack_run_label = get_option('smack-run-label')
861 if smack_run_label != ''
862 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
863 endif
864
865 want_polkit = get_option('polkit')
866 install_polkit = false
867 install_polkit_pkla = false
868 if want_polkit != 'false' and not fuzzer_build
869 install_polkit = true
870
871 libpolkit = dependency('polkit-gobject-1',
872 required : false)
873 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
874 message('Old polkit detected, will install pkla files')
875 install_polkit_pkla = true
876 endif
877 endif
878 conf.set10('ENABLE_POLKIT', install_polkit)
879
880 want_acl = get_option('acl')
881 if want_acl != 'false' and not fuzzer_build
882 libacl = cc.find_library('acl', required : want_acl == 'true')
883 have = libacl.found()
884 else
885 have = false
886 libacl = []
887 endif
888 conf.set10('HAVE_ACL', have)
889
890 want_audit = get_option('audit')
891 if want_audit != 'false' and not fuzzer_build
892 libaudit = dependency('audit', required : want_audit == 'true')
893 have = libaudit.found()
894 else
895 have = false
896 libaudit = []
897 endif
898 conf.set10('HAVE_AUDIT', have)
899
900 want_blkid = get_option('blkid')
901 if want_blkid != 'false' and not fuzzer_build
902 libblkid = dependency('blkid', required : want_blkid == 'true')
903 have = libblkid.found()
904 else
905 have = false
906 libblkid = []
907 endif
908 conf.set10('HAVE_BLKID', have)
909
910 want_kmod = get_option('kmod')
911 if want_kmod != 'false' and not fuzzer_build
912 libkmod = dependency('libkmod',
913 version : '>= 15',
914 required : want_kmod == 'true')
915 have = libkmod.found()
916 else
917 have = false
918 libkmod = []
919 endif
920 conf.set10('HAVE_KMOD', have)
921
922 want_pam = get_option('pam')
923 if want_pam != 'false' and not fuzzer_build
924 libpam = cc.find_library('pam', required : want_pam == 'true')
925 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
926 have = libpam.found() and libpam_misc.found()
927 else
928 have = false
929 libpam = []
930 libpam_misc = []
931 endif
932 conf.set10('HAVE_PAM', have)
933
934 want_microhttpd = get_option('microhttpd')
935 if want_microhttpd != 'false' and not fuzzer_build
936 libmicrohttpd = dependency('libmicrohttpd',
937 version : '>= 0.9.33',
938 required : want_microhttpd == 'true')
939 have = libmicrohttpd.found()
940 else
941 have = false
942 libmicrohttpd = []
943 endif
944 conf.set10('HAVE_MICROHTTPD', have)
945
946 want_libcryptsetup = get_option('libcryptsetup')
947 if want_libcryptsetup != 'false' and not fuzzer_build
948 libcryptsetup = dependency('libcryptsetup',
949 version : '>= 1.6.0',
950 required : want_libcryptsetup == 'true')
951 have = libcryptsetup.found()
952 have_sector = cc.has_member(
953 'struct crypt_params_plain',
954 'sector_size',
955 prefix : '#include <libcryptsetup.h>')
956 else
957 have = false
958 have_sector = false
959 libcryptsetup = []
960 endif
961 conf.set10('HAVE_LIBCRYPTSETUP', have)
962 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
963
964 want_libcurl = get_option('libcurl')
965 if want_libcurl != 'false' and not fuzzer_build
966 libcurl = dependency('libcurl',
967 version : '>= 7.32.0',
968 required : want_libcurl == 'true')
969 have = libcurl.found()
970 else
971 have = false
972 libcurl = []
973 endif
974 conf.set10('HAVE_LIBCURL', have)
975
976 want_libidn = get_option('libidn')
977 want_libidn2 = get_option('libidn2')
978 if want_libidn == 'true' and want_libidn2 == 'true'
979 error('libidn and libidn2 cannot be requested simultaneously')
980 endif
981
982 if want_libidn != 'false' and want_libidn2 != 'true' and not fuzzer_build
983 libidn = dependency('libidn',
984 required : want_libidn == 'true')
985 have = libidn.found()
986 else
987 have = false
988 libidn = []
989 endif
990 conf.set10('HAVE_LIBIDN', have)
991 if not have and want_libidn2 != 'false' and not fuzzer_build
992 # libidn is used for both libidn and libidn2 objects
993 libidn = dependency('libidn2',
994 required : want_libidn2 == 'true')
995 have = libidn.found()
996 else
997 have = false
998 endif
999 conf.set10('HAVE_LIBIDN2', have)
1000
1001 want_libiptc = get_option('libiptc')
1002 if want_libiptc != 'false' and not fuzzer_build
1003 libiptc = dependency('libiptc',
1004 required : want_libiptc == 'true')
1005 have = libiptc.found()
1006 else
1007 have = false
1008 libiptc = []
1009 endif
1010 conf.set10('HAVE_LIBIPTC', have)
1011
1012 want_qrencode = get_option('qrencode')
1013 if want_qrencode != 'false' and not fuzzer_build
1014 libqrencode = dependency('libqrencode',
1015 required : want_qrencode == 'true')
1016 have = libqrencode.found()
1017 else
1018 have = false
1019 libqrencode = []
1020 endif
1021 conf.set10('HAVE_QRENCODE', have)
1022
1023 want_gcrypt = get_option('gcrypt')
1024 if want_gcrypt != 'false' and not fuzzer_build
1025 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1026 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1027 have = libgcrypt.found() and libgpg_error.found()
1028 else
1029 have = false
1030 endif
1031 if not have
1032 # link to neither of the libs if one is not found
1033 libgcrypt = []
1034 libgpg_error = []
1035 endif
1036 conf.set10('HAVE_GCRYPT', have)
1037
1038 want_gnutls = get_option('gnutls')
1039 if want_gnutls != 'false' and not fuzzer_build
1040 libgnutls = dependency('gnutls',
1041 version : '>= 3.1.4',
1042 required : want_gnutls == 'true')
1043 have = libgnutls.found()
1044 else
1045 have = false
1046 libgnutls = []
1047 endif
1048 conf.set10('HAVE_GNUTLS', have)
1049
1050 want_openssl = get_option('openssl')
1051 if want_openssl != 'false' and not fuzzer_build
1052 libopenssl = dependency('openssl',
1053 version : '>= 1.1.0',
1054 required : want_openssl == 'true')
1055 have = libopenssl.found()
1056 else
1057 have = false
1058 libopenssl = []
1059 endif
1060 conf.set10('HAVE_OPENSSL', have)
1061
1062 want_elfutils = get_option('elfutils')
1063 if want_elfutils != 'false' and not fuzzer_build
1064 libdw = dependency('libdw',
1065 required : want_elfutils == 'true')
1066 have = libdw.found()
1067 else
1068 have = false
1069 libdw = []
1070 endif
1071 conf.set10('HAVE_ELFUTILS', have)
1072
1073 want_zlib = get_option('zlib')
1074 if want_zlib != 'false' and not fuzzer_build
1075 libz = dependency('zlib',
1076 required : want_zlib == 'true')
1077 have = libz.found()
1078 else
1079 have = false
1080 libz = []
1081 endif
1082 conf.set10('HAVE_ZLIB', have)
1083
1084 want_bzip2 = get_option('bzip2')
1085 if want_bzip2 != 'false' and not fuzzer_build
1086 libbzip2 = cc.find_library('bz2',
1087 required : want_bzip2 == 'true')
1088 have = libbzip2.found()
1089 else
1090 have = false
1091 libbzip2 = []
1092 endif
1093 conf.set10('HAVE_BZIP2', have)
1094
1095 want_xz = get_option('xz')
1096 if want_xz != 'false' and not fuzzer_build
1097 libxz = dependency('liblzma',
1098 required : want_xz == 'true')
1099 have = libxz.found()
1100 else
1101 have = false
1102 libxz = []
1103 endif
1104 conf.set10('HAVE_XZ', have)
1105
1106 want_lz4 = get_option('lz4')
1107 if want_lz4 != 'false' and not fuzzer_build
1108 liblz4 = dependency('liblz4',
1109 version : '>= 1.3.0',
1110 required : want_lz4 == 'true')
1111 have = liblz4.found()
1112 else
1113 have = false
1114 liblz4 = []
1115 endif
1116 conf.set10('HAVE_LZ4', have)
1117
1118 want_xkbcommon = get_option('xkbcommon')
1119 if want_xkbcommon != 'false' and not fuzzer_build
1120 libxkbcommon = dependency('xkbcommon',
1121 version : '>= 0.3.0',
1122 required : want_xkbcommon == 'true')
1123 have = libxkbcommon.found()
1124 else
1125 have = false
1126 libxkbcommon = []
1127 endif
1128 conf.set10('HAVE_XKBCOMMON', have)
1129
1130 want_pcre2 = get_option('pcre2')
1131 if want_pcre2 != 'false'
1132 libpcre2 = dependency('libpcre2-8',
1133 required : want_pcre2 == 'true')
1134 have = libpcre2.found()
1135 else
1136 have = false
1137 libpcre2 = []
1138 endif
1139 conf.set10('HAVE_PCRE2', have)
1140
1141 want_glib = get_option('glib')
1142 if want_glib != 'false' and not fuzzer_build
1143 libglib = dependency('glib-2.0',
1144 version : '>= 2.22.0',
1145 required : want_glib == 'true')
1146 libgobject = dependency('gobject-2.0',
1147 version : '>= 2.22.0',
1148 required : want_glib == 'true')
1149 libgio = dependency('gio-2.0',
1150 required : want_glib == 'true')
1151 have = libglib.found() and libgobject.found() and libgio.found()
1152 else
1153 have = false
1154 libglib = []
1155 libgobject = []
1156 libgio = []
1157 endif
1158 conf.set10('HAVE_GLIB', have)
1159
1160 want_dbus = get_option('dbus')
1161 if want_dbus != 'false' and not fuzzer_build
1162 libdbus = dependency('dbus-1',
1163 version : '>= 1.3.2',
1164 required : want_dbus == 'true')
1165 have = libdbus.found()
1166 else
1167 have = false
1168 libdbus = []
1169 endif
1170 conf.set10('HAVE_DBUS', have)
1171
1172 default_dnssec = get_option('default-dnssec')
1173 if fuzzer_build
1174 default_dnssec = 'no'
1175 endif
1176 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1177 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1178 default_dnssec = 'no'
1179 endif
1180 conf.set('DEFAULT_DNSSEC_MODE',
1181 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1182 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1183
1184 dns_over_tls = get_option('dns-over-tls')
1185 if dns_over_tls != 'false'
1186 if dns_over_tls == 'openssl'
1187 have_gnutls = false
1188 else
1189 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1190 if dns_over_tls == 'gnutls' and not have_gnutls
1191 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1192 endif
1193 endif
1194 if dns_over_tls == 'gnutls' or have_gnutls
1195 have_openssl = false
1196 else
1197 have_openssl = conf.get('HAVE_OPENSSL') == 1
1198 if dns_over_tls != 'auto' and not have_openssl
1199 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1200 error('DNS-over-TLS support was requested$0$, but dependencies are not available'.format(str))
1201 endif
1202 endif
1203 have = have_gnutls or have_openssl
1204 else
1205 have = false
1206 have_gnutls = false
1207 have_openssl = false
1208 endif
1209 conf.set10('ENABLE_DNS_OVER_TLS', have)
1210 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1211 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1212
1213 default_dns_over_tls = get_option('default-dns-over-tls')
1214 if fuzzer_build
1215 default_dns_over_tls = 'no'
1216 endif
1217 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1218 message('default-dns-over-tls cannot be set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1219 default_dns_over_tls = 'no'
1220 endif
1221 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1222 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1223 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1224
1225 want_importd = get_option('importd')
1226 if want_importd != 'false'
1227 have = (conf.get('HAVE_LIBCURL') == 1 and
1228 conf.get('HAVE_ZLIB') == 1 and
1229 conf.get('HAVE_XZ') == 1 and
1230 conf.get('HAVE_GCRYPT') == 1)
1231 if want_importd == 'true' and not have
1232 error('importd support was requested, but dependencies are not available')
1233 endif
1234 else
1235 have = false
1236 endif
1237 conf.set10('ENABLE_IMPORTD', have)
1238
1239 want_remote = get_option('remote')
1240 if want_remote != 'false'
1241 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1242 conf.get('HAVE_LIBCURL') == 1]
1243 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1244 # it's possible to build one without the other. Complain only if
1245 # support was explictly requested. The auxiliary files like sysusers
1246 # config should be installed when any of the programs are built.
1247 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1248 error('remote support was requested, but dependencies are not available')
1249 endif
1250 have = have_deps[0] or have_deps[1]
1251 else
1252 have = false
1253 endif
1254 conf.set10('ENABLE_REMOTE', have)
1255
1256 foreach term : ['utmp',
1257 'hibernate',
1258 'environment-d',
1259 'binfmt',
1260 'coredump',
1261 'resolve',
1262 'logind',
1263 'hostnamed',
1264 'localed',
1265 'machined',
1266 'portabled',
1267 'networkd',
1268 'timedated',
1269 'timesyncd',
1270 'firstboot',
1271 'randomseed',
1272 'backlight',
1273 'vconsole',
1274 'quotacheck',
1275 'sysusers',
1276 'tmpfiles',
1277 'hwdb',
1278 'rfkill',
1279 'ldconfig',
1280 'efi',
1281 'tpm',
1282 'ima',
1283 'smack',
1284 'gshadow',
1285 'idn',
1286 'nss-myhostname',
1287 'nss-systemd']
1288 have = get_option(term)
1289 name = 'ENABLE_' + term.underscorify().to_upper()
1290 conf.set10(name, have)
1291 endforeach
1292
1293 foreach tuple : [['nss-mymachines', 'machined'],
1294 ['nss-resolve', 'resolve']]
1295 want = get_option(tuple[0])
1296 if want != 'false'
1297 have = get_option(tuple[1])
1298 if want == 'true' and not have
1299 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1300 endif
1301 else
1302 have = false
1303 endif
1304 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1305 conf.set10(name, have)
1306 endforeach
1307
1308 enable_nss = false
1309 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1310 'ENABLE_NSS_MYMACHINES',
1311 'ENABLE_NSS_RESOLVE',
1312 'ENABLE_NSS_SYSTEMD']
1313 if conf.get(term) == 1
1314 enable_nss = true
1315 endif
1316 endforeach
1317 conf.set10('ENABLE_NSS', enable_nss)
1318
1319 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1320
1321 tests = []
1322 fuzzers = []
1323
1324 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1325
1326 #####################################################################
1327
1328 if get_option('efi')
1329 efi_arch = host_machine.cpu_family()
1330
1331 if efi_arch == 'x86'
1332 EFI_MACHINE_TYPE_NAME = 'ia32'
1333 gnu_efi_arch = 'ia32'
1334 elif efi_arch == 'x86_64'
1335 EFI_MACHINE_TYPE_NAME = 'x64'
1336 gnu_efi_arch = 'x86_64'
1337 elif efi_arch == 'arm'
1338 EFI_MACHINE_TYPE_NAME = 'arm'
1339 gnu_efi_arch = 'arm'
1340 elif efi_arch == 'aarch64'
1341 EFI_MACHINE_TYPE_NAME = 'aa64'
1342 gnu_efi_arch = 'aarch64'
1343 else
1344 EFI_MACHINE_TYPE_NAME = ''
1345 gnu_efi_arch = ''
1346 endif
1347
1348 have = true
1349 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1350
1351 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1352 else
1353 have = false
1354 endif
1355 conf.set10('ENABLE_EFI', have)
1356
1357 #####################################################################
1358
1359 config_h = configure_file(
1360 output : 'config.h',
1361 configuration : conf)
1362
1363 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1364
1365 includes = include_directories('src/basic',
1366 'src/shared',
1367 'src/systemd',
1368 'src/journal',
1369 'src/journal-remote',
1370 'src/nspawn',
1371 'src/resolve',
1372 'src/timesync',
1373 'src/time-wait-sync',
1374 'src/login',
1375 'src/udev',
1376 'src/libudev',
1377 'src/core',
1378 'src/libsystemd/sd-bus',
1379 'src/libsystemd/sd-device',
1380 'src/libsystemd/sd-event',
1381 'src/libsystemd/sd-hwdb',
1382 'src/libsystemd/sd-id128',
1383 'src/libsystemd/sd-netlink',
1384 'src/libsystemd/sd-network',
1385 'src/libsystemd-network',
1386 '.')
1387
1388 add_project_arguments('-include', 'config.h', language : 'c')
1389
1390 subdir('po')
1391 subdir('catalog')
1392 subdir('src/systemd')
1393 subdir('src/basic')
1394 subdir('src/libsystemd')
1395 subdir('src/libsystemd-network')
1396 subdir('src/journal')
1397 subdir('src/login')
1398
1399 libjournal_core = static_library(
1400 'journal-core',
1401 libjournal_core_sources,
1402 journald_gperf_c,
1403 include_directories : includes,
1404 install : false)
1405
1406 libsystemd_sym_path = '@0@/@1@'.format(meson.current_source_dir(), libsystemd_sym)
1407 libsystemd = shared_library(
1408 'systemd',
1409 disable_mempool_c,
1410 version : libsystemd_version,
1411 include_directories : includes,
1412 link_args : ['-shared',
1413 '-Wl,--version-script=' + libsystemd_sym_path],
1414 link_with : [libbasic,
1415 libbasic_gcrypt],
1416 link_whole : [libsystemd_static,
1417 libjournal_client],
1418 dependencies : [threads,
1419 librt,
1420 libxz,
1421 liblz4],
1422 link_depends : libsystemd_sym,
1423 install : true,
1424 install_dir : rootlibdir)
1425
1426 static_libsystemd = get_option('static-libsystemd')
1427 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1428
1429 install_libsystemd_static = static_library(
1430 'systemd',
1431 libsystemd_sources,
1432 journal_client_sources,
1433 basic_sources,
1434 basic_gcrypt_sources,
1435 disable_mempool_c,
1436 include_directories : includes,
1437 build_by_default : static_libsystemd != 'false',
1438 install : static_libsystemd != 'false',
1439 install_dir : rootlibdir,
1440 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1441 dependencies : [threads,
1442 librt,
1443 libxz,
1444 liblz4,
1445 libcap,
1446 libblkid,
1447 libmount,
1448 libselinux,
1449 libgcrypt],
1450 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1451
1452 ############################################################
1453
1454 # binaries that have --help and are intended for use by humans,
1455 # usually, but not always, installed in /bin.
1456 public_programs = []
1457
1458 subdir('src/libudev')
1459 subdir('src/shared')
1460 subdir('src/core')
1461 subdir('src/udev')
1462 subdir('src/network')
1463
1464 subdir('src/analyze')
1465 subdir('src/journal-remote')
1466 subdir('src/coredump')
1467 subdir('src/hostname')
1468 subdir('src/import')
1469 subdir('src/kernel-install')
1470 subdir('src/locale')
1471 subdir('src/machine')
1472 subdir('src/portable')
1473 subdir('src/nspawn')
1474 subdir('src/resolve')
1475 subdir('src/timedate')
1476 subdir('src/timesync')
1477 subdir('src/vconsole')
1478 subdir('src/boot/efi')
1479
1480 subdir('src/test')
1481 subdir('src/fuzz')
1482 subdir('rules')
1483 subdir('test')
1484
1485 ############################################################
1486
1487 # only static linking apart from libdl, to make sure that the
1488 # module is linked to all libraries that it uses.
1489 test_dlopen = executable(
1490 'test-dlopen',
1491 test_dlopen_c,
1492 disable_mempool_c,
1493 include_directories : includes,
1494 link_with : [libbasic],
1495 dependencies : [libdl],
1496 build_by_default : want_tests != 'false')
1497
1498 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1499 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1500 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1501 ['resolve', 'ENABLE_NSS_RESOLVE']]
1502
1503 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1504 if condition
1505 module = tuple[0]
1506
1507 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1508 version_script_arg = join_paths(meson.source_root(), sym)
1509
1510 nss = shared_library(
1511 'nss_' + module,
1512 'src/nss-@0@/nss-@0@.c'.format(module),
1513 disable_mempool_c,
1514 version : '2',
1515 include_directories : includes,
1516 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1517 link_args : ['-Wl,-z,nodelete',
1518 '-shared',
1519 '-Wl,--version-script=' + version_script_arg,
1520 '-Wl,--undefined'],
1521 link_with : [libsystemd_static,
1522 libbasic],
1523 dependencies : [threads,
1524 librt],
1525 link_depends : sym,
1526 install : true,
1527 install_dir : rootlibdir)
1528
1529 # We cannot use shared_module because it does not support version suffix.
1530 # Unfortunately shared_library insists on creating the symlink…
1531 meson.add_install_script('sh', '-c',
1532 'rm $DESTDIR@0@/libnss_@1@.so'
1533 .format(rootlibdir, module))
1534
1535 if want_tests != 'false'
1536 test('dlopen-nss_' + module,
1537 test_dlopen,
1538 # path to dlopen must include a slash
1539 args : nss.full_path())
1540 endif
1541 endif
1542 endforeach
1543
1544 ############################################################
1545
1546 executable('systemd',
1547 systemd_sources,
1548 include_directories : includes,
1549 link_with : [libcore,
1550 libshared],
1551 dependencies : [threads,
1552 librt,
1553 libseccomp,
1554 libselinux,
1555 libmount,
1556 libblkid],
1557 install_rpath : rootlibexecdir,
1558 install : true,
1559 install_dir : rootlibexecdir)
1560
1561 meson.add_install_script(meson_make_symlink,
1562 join_paths(rootlibexecdir, 'systemd'),
1563 join_paths(rootsbindir, 'init'))
1564
1565 exe = executable('systemd-analyze',
1566 systemd_analyze_sources,
1567 include_directories : includes,
1568 link_with : [libcore,
1569 libshared],
1570 dependencies : [threads,
1571 librt,
1572 libseccomp,
1573 libselinux,
1574 libmount,
1575 libblkid],
1576 install_rpath : rootlibexecdir,
1577 install : true)
1578 public_programs += exe
1579
1580 executable('systemd-journald',
1581 systemd_journald_sources,
1582 include_directories : includes,
1583 link_with : [libjournal_core,
1584 libshared],
1585 dependencies : [threads,
1586 libxz,
1587 liblz4,
1588 libselinux],
1589 install_rpath : rootlibexecdir,
1590 install : true,
1591 install_dir : rootlibexecdir)
1592
1593 exe = executable('systemd-cat',
1594 systemd_cat_sources,
1595 include_directories : includes,
1596 link_with : [libjournal_core,
1597 libshared],
1598 dependencies : [threads],
1599 install_rpath : rootlibexecdir,
1600 install : true)
1601 public_programs += exe
1602
1603 exe = executable('journalctl',
1604 journalctl_sources,
1605 include_directories : includes,
1606 link_with : [libshared],
1607 dependencies : [threads,
1608 libqrencode,
1609 libxz,
1610 liblz4,
1611 libpcre2],
1612 install_rpath : rootlibexecdir,
1613 install : true,
1614 install_dir : rootbindir)
1615 public_programs += exe
1616
1617 executable('systemd-getty-generator',
1618 'src/getty-generator/getty-generator.c',
1619 include_directories : includes,
1620 link_with : [libshared],
1621 install_rpath : rootlibexecdir,
1622 install : true,
1623 install_dir : systemgeneratordir)
1624
1625 executable('systemd-debug-generator',
1626 'src/debug-generator/debug-generator.c',
1627 include_directories : includes,
1628 link_with : [libshared],
1629 install_rpath : rootlibexecdir,
1630 install : true,
1631 install_dir : systemgeneratordir)
1632
1633 executable('systemd-fstab-generator',
1634 'src/fstab-generator/fstab-generator.c',
1635 'src/core/mount-setup.c',
1636 include_directories : includes,
1637 link_with : [libshared],
1638 install_rpath : rootlibexecdir,
1639 install : true,
1640 install_dir : systemgeneratordir)
1641
1642 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1643 executable('30-systemd-environment-d-generator',
1644 'src/environment-d-generator/environment-d-generator.c',
1645 include_directories : includes,
1646 link_with : [libshared],
1647 install_rpath : rootlibexecdir,
1648 install : true,
1649 install_dir : userenvgeneratordir)
1650
1651 meson.add_install_script(meson_make_symlink,
1652 join_paths(sysconfdir, 'environment'),
1653 join_paths(environmentdir, '99-environment.conf'))
1654 endif
1655
1656 if conf.get('ENABLE_HIBERNATE') == 1
1657 executable('systemd-hibernate-resume-generator',
1658 'src/hibernate-resume/hibernate-resume-generator.c',
1659 include_directories : includes,
1660 link_with : [libshared],
1661 install_rpath : rootlibexecdir,
1662 install : true,
1663 install_dir : systemgeneratordir)
1664
1665 executable('systemd-hibernate-resume',
1666 'src/hibernate-resume/hibernate-resume.c',
1667 include_directories : includes,
1668 link_with : [libshared],
1669 install_rpath : rootlibexecdir,
1670 install : true,
1671 install_dir : rootlibexecdir)
1672 endif
1673
1674 if conf.get('HAVE_BLKID') == 1
1675 executable('systemd-gpt-auto-generator',
1676 'src/gpt-auto-generator/gpt-auto-generator.c',
1677 'src/shared/blkid-util.h',
1678 include_directories : includes,
1679 link_with : [libshared],
1680 dependencies : libblkid,
1681 install_rpath : rootlibexecdir,
1682 install : true,
1683 install_dir : systemgeneratordir)
1684
1685 exe = executable('systemd-dissect',
1686 'src/dissect/dissect.c',
1687 include_directories : includes,
1688 link_with : [libshared],
1689 install_rpath : rootlibexecdir,
1690 install : true,
1691 install_dir : rootlibexecdir)
1692 public_programs += exe
1693 endif
1694
1695 if conf.get('ENABLE_RESOLVE') == 1
1696 executable('systemd-resolved',
1697 systemd_resolved_sources,
1698 include_directories : includes,
1699 link_with : [libshared,
1700 libbasic_gcrypt,
1701 libsystemd_resolve_core],
1702 dependencies : systemd_resolved_dependencies,
1703 install_rpath : rootlibexecdir,
1704 install : true,
1705 install_dir : rootlibexecdir)
1706
1707 exe = executable('resolvectl',
1708 resolvectl_sources,
1709 include_directories : includes,
1710 link_with : [libshared,
1711 libbasic_gcrypt,
1712 libsystemd_resolve_core],
1713 dependencies : [threads,
1714 libgpg_error,
1715 libm,
1716 libidn],
1717 install_rpath : rootlibexecdir,
1718 install : true)
1719 public_programs += exe
1720
1721 meson.add_install_script(meson_make_symlink,
1722 join_paths(bindir, 'resolvectl'),
1723 join_paths(rootsbindir, 'resolvconf'))
1724
1725 meson.add_install_script(meson_make_symlink,
1726 join_paths(bindir, 'resolvectl'),
1727 join_paths(bindir, 'systemd-resolve'))
1728 endif
1729
1730 if conf.get('ENABLE_LOGIND') == 1
1731 executable('systemd-logind',
1732 systemd_logind_sources,
1733 include_directories : includes,
1734 link_with : [liblogind_core,
1735 libshared],
1736 dependencies : [threads,
1737 libacl],
1738 install_rpath : rootlibexecdir,
1739 install : true,
1740 install_dir : rootlibexecdir)
1741
1742 exe = executable('loginctl',
1743 loginctl_sources,
1744 include_directories : includes,
1745 link_with : [libshared],
1746 dependencies : [threads,
1747 liblz4,
1748 libxz],
1749 install_rpath : rootlibexecdir,
1750 install : true,
1751 install_dir : rootbindir)
1752 public_programs += exe
1753
1754 exe = executable('systemd-inhibit',
1755 'src/login/inhibit.c',
1756 include_directories : includes,
1757 link_with : [libshared],
1758 install_rpath : rootlibexecdir,
1759 install : true,
1760 install_dir : rootbindir)
1761 public_programs += exe
1762
1763 if conf.get('HAVE_PAM') == 1
1764 version_script_arg = join_paths(meson.source_root(), pam_systemd_sym)
1765 pam_systemd = shared_library(
1766 'pam_systemd',
1767 pam_systemd_c,
1768 name_prefix : '',
1769 include_directories : includes,
1770 link_args : ['-shared',
1771 '-Wl,--version-script=' + version_script_arg],
1772 link_with : [libsystemd_static,
1773 libshared_static],
1774 dependencies : [threads,
1775 libpam,
1776 libpam_misc],
1777 link_depends : pam_systemd_sym,
1778 install : true,
1779 install_dir : pamlibdir)
1780
1781 if want_tests != 'false'
1782 test('dlopen-pam_systemd',
1783 test_dlopen,
1784 # path to dlopen must include a slash
1785 args : pam_systemd.full_path())
1786 endif
1787 endif
1788
1789 executable('systemd-user-runtime-dir',
1790 user_runtime_dir_sources,
1791 include_directories : includes,
1792 link_with : [libshared],
1793 install_rpath : rootlibexecdir,
1794 install : true,
1795 install_dir : rootlibexecdir)
1796 endif
1797
1798 if conf.get('HAVE_PAM') == 1
1799 executable('systemd-user-sessions',
1800 'src/user-sessions/user-sessions.c',
1801 include_directories : includes,
1802 link_with : [libshared],
1803 install_rpath : rootlibexecdir,
1804 install : true,
1805 install_dir : rootlibexecdir)
1806 endif
1807
1808 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1809 exe = executable('bootctl',
1810 'src/boot/bootctl.c',
1811 include_directories : includes,
1812 link_with : [libshared],
1813 dependencies : [libblkid],
1814 install_rpath : rootlibexecdir,
1815 install : true)
1816 public_programs += exe
1817
1818 executable('systemd-bless-boot',
1819 'src/boot/bless-boot.c',
1820 include_directories : includes,
1821 link_with : [libshared],
1822 dependencies : [libblkid],
1823 install_rpath : rootlibexecdir,
1824 install : true,
1825 install_dir : rootlibexecdir)
1826
1827 executable('systemd-bless-boot-generator',
1828 'src/boot/bless-boot-generator.c',
1829 include_directories : includes,
1830 link_with : [libshared],
1831 install_rpath : rootlibexecdir,
1832 install : true,
1833 install_dir : systemgeneratordir)
1834 endif
1835
1836 executable('systemd-boot-check-no-failures',
1837 'src/boot/boot-check-no-failures.c',
1838 include_directories : includes,
1839 link_with : [libshared],
1840 dependencies : [libblkid],
1841 install_rpath : rootlibexecdir,
1842 install : true,
1843 install_dir : rootlibexecdir)
1844
1845 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1846 include_directories : includes,
1847 link_with : [libshared],
1848 dependencies : [threads],
1849 install_rpath : rootlibexecdir,
1850 install : true)
1851 public_programs += exe
1852
1853
1854 if get_option('link-systemctl-shared')
1855 systemctl_link_with = [libshared]
1856 else
1857 systemctl_link_with = [libsystemd_static,
1858 libshared_static,
1859 libjournal_client,
1860 libbasic_gcrypt]
1861 endif
1862
1863 exe = executable('systemctl', 'src/systemctl/systemctl.c',
1864 include_directories : includes,
1865 link_with : systemctl_link_with,
1866 dependencies : [threads,
1867 libcap,
1868 libselinux,
1869 libxz,
1870 liblz4],
1871 install_rpath : rootlibexecdir,
1872 install : true,
1873 install_dir : rootbindir)
1874 public_programs += exe
1875
1876 if conf.get('ENABLE_PORTABLED') == 1
1877 executable('systemd-portabled',
1878 systemd_portabled_sources,
1879 include_directories : includes,
1880 link_with : [libshared],
1881 dependencies : [threads],
1882 install_rpath : rootlibexecdir,
1883 install : true,
1884 install_dir : rootlibexecdir)
1885
1886 exe = executable('portablectl', 'src/portable/portablectl.c',
1887 include_directories : includes,
1888 link_with : [libshared],
1889 dependencies : [threads],
1890 install_rpath : rootlibexecdir,
1891 install : true,
1892 install_dir : rootbindir)
1893 public_programs += exe
1894 endif
1895
1896 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1897 meson.add_install_script(meson_make_symlink,
1898 join_paths(rootbindir, 'systemctl'),
1899 join_paths(rootsbindir, alias))
1900 endforeach
1901
1902 if conf.get('ENABLE_BACKLIGHT') == 1
1903 executable('systemd-backlight',
1904 'src/backlight/backlight.c',
1905 include_directories : includes,
1906 link_with : [libshared],
1907 install_rpath : rootlibexecdir,
1908 install : true,
1909 install_dir : rootlibexecdir)
1910 endif
1911
1912 if conf.get('ENABLE_RFKILL') == 1
1913 executable('systemd-rfkill',
1914 'src/rfkill/rfkill.c',
1915 include_directories : includes,
1916 link_with : [libshared],
1917 install_rpath : rootlibexecdir,
1918 install : true,
1919 install_dir : rootlibexecdir)
1920 endif
1921
1922 executable('systemd-system-update-generator',
1923 'src/system-update-generator/system-update-generator.c',
1924 include_directories : includes,
1925 link_with : [libshared],
1926 install_rpath : rootlibexecdir,
1927 install : true,
1928 install_dir : systemgeneratordir)
1929
1930 if conf.get('HAVE_LIBCRYPTSETUP') == 1
1931 executable('systemd-cryptsetup',
1932 'src/cryptsetup/cryptsetup.c',
1933 include_directories : includes,
1934 link_with : [libshared],
1935 dependencies : [libcryptsetup],
1936 install_rpath : rootlibexecdir,
1937 install : true,
1938 install_dir : rootlibexecdir)
1939
1940 executable('systemd-cryptsetup-generator',
1941 'src/cryptsetup/cryptsetup-generator.c',
1942 include_directories : includes,
1943 link_with : [libshared],
1944 dependencies : [libcryptsetup],
1945 install_rpath : rootlibexecdir,
1946 install : true,
1947 install_dir : systemgeneratordir)
1948
1949 executable('systemd-veritysetup',
1950 'src/veritysetup/veritysetup.c',
1951 include_directories : includes,
1952 link_with : [libshared],
1953 dependencies : [libcryptsetup],
1954 install_rpath : rootlibexecdir,
1955 install : true,
1956 install_dir : rootlibexecdir)
1957
1958 executable('systemd-veritysetup-generator',
1959 'src/veritysetup/veritysetup-generator.c',
1960 include_directories : includes,
1961 link_with : [libshared],
1962 dependencies : [libcryptsetup],
1963 install_rpath : rootlibexecdir,
1964 install : true,
1965 install_dir : systemgeneratordir)
1966 endif
1967
1968 if conf.get('HAVE_SYSV_COMPAT') == 1
1969 executable('systemd-sysv-generator',
1970 'src/sysv-generator/sysv-generator.c',
1971 include_directories : includes,
1972 link_with : [libshared],
1973 install_rpath : rootlibexecdir,
1974 install : true,
1975 install_dir : systemgeneratordir)
1976
1977 executable('systemd-rc-local-generator',
1978 'src/rc-local-generator/rc-local-generator.c',
1979 include_directories : includes,
1980 link_with : [libshared],
1981 install_rpath : rootlibexecdir,
1982 install : true,
1983 install_dir : systemgeneratordir)
1984 endif
1985
1986 if conf.get('ENABLE_HOSTNAMED') == 1
1987 executable('systemd-hostnamed',
1988 'src/hostname/hostnamed.c',
1989 include_directories : includes,
1990 link_with : [libshared],
1991 install_rpath : rootlibexecdir,
1992 install : true,
1993 install_dir : rootlibexecdir)
1994
1995 exe = executable('hostnamectl',
1996 'src/hostname/hostnamectl.c',
1997 include_directories : includes,
1998 link_with : [libshared],
1999 install_rpath : rootlibexecdir,
2000 install : true)
2001 public_programs += exe
2002 endif
2003
2004 if conf.get('ENABLE_LOCALED') == 1
2005 if conf.get('HAVE_XKBCOMMON') == 1
2006 # logind will load libxkbcommon.so dynamically on its own
2007 deps = [libdl]
2008 else
2009 deps = []
2010 endif
2011
2012 executable('systemd-localed',
2013 systemd_localed_sources,
2014 include_directories : includes,
2015 link_with : [libshared],
2016 dependencies : deps,
2017 install_rpath : rootlibexecdir,
2018 install : true,
2019 install_dir : rootlibexecdir)
2020
2021 exe = executable('localectl',
2022 localectl_sources,
2023 include_directories : includes,
2024 link_with : [libshared],
2025 install_rpath : rootlibexecdir,
2026 install : true)
2027 public_programs += exe
2028 endif
2029
2030 if conf.get('ENABLE_TIMEDATED') == 1
2031 executable('systemd-timedated',
2032 'src/timedate/timedated.c',
2033 include_directories : includes,
2034 link_with : [libshared],
2035 install_rpath : rootlibexecdir,
2036 install : true,
2037 install_dir : rootlibexecdir)
2038 endif
2039
2040 if conf.get('ENABLE_TIMEDATECTL') == 1
2041 exe = executable('timedatectl',
2042 'src/timedate/timedatectl.c',
2043 include_directories : includes,
2044 install_rpath : rootlibexecdir,
2045 link_with : [libshared],
2046 dependencies : [libm],
2047 install : true)
2048 public_programs += exe
2049 endif
2050
2051 if conf.get('ENABLE_TIMESYNCD') == 1
2052 executable('systemd-timesyncd',
2053 systemd_timesyncd_sources,
2054 include_directories : includes,
2055 link_with : [libshared],
2056 dependencies : [threads,
2057 libm],
2058 install_rpath : rootlibexecdir,
2059 install : true,
2060 install_dir : rootlibexecdir)
2061
2062 executable('systemd-time-wait-sync',
2063 'src/time-wait-sync/time-wait-sync.c',
2064 include_directories : includes,
2065 link_with : [libshared],
2066 install_rpath : rootlibexecdir,
2067 install : true,
2068 install_dir : rootlibexecdir)
2069 endif
2070
2071 if conf.get('ENABLE_MACHINED') == 1
2072 executable('systemd-machined',
2073 systemd_machined_sources,
2074 include_directories : includes,
2075 link_with : [libmachine_core,
2076 libshared],
2077 install_rpath : rootlibexecdir,
2078 install : true,
2079 install_dir : rootlibexecdir)
2080
2081 exe = executable('machinectl',
2082 'src/machine/machinectl.c',
2083 include_directories : includes,
2084 link_with : [libshared],
2085 dependencies : [threads,
2086 libxz,
2087 liblz4],
2088 install_rpath : rootlibexecdir,
2089 install : true,
2090 install_dir : rootbindir)
2091 public_programs += exe
2092 endif
2093
2094 if conf.get('ENABLE_IMPORTD') == 1
2095 executable('systemd-importd',
2096 systemd_importd_sources,
2097 include_directories : includes,
2098 link_with : [libshared],
2099 dependencies : [threads],
2100 install_rpath : rootlibexecdir,
2101 install : true,
2102 install_dir : rootlibexecdir)
2103
2104 systemd_pull = executable('systemd-pull',
2105 systemd_pull_sources,
2106 include_directories : includes,
2107 link_with : [libshared],
2108 dependencies : [libcurl,
2109 libz,
2110 libbzip2,
2111 libxz,
2112 libgcrypt],
2113 install_rpath : rootlibexecdir,
2114 install : true,
2115 install_dir : rootlibexecdir)
2116
2117 systemd_import = executable('systemd-import',
2118 systemd_import_sources,
2119 include_directories : includes,
2120 link_with : [libshared],
2121 dependencies : [libcurl,
2122 libz,
2123 libbzip2,
2124 libxz],
2125 install_rpath : rootlibexecdir,
2126 install : true,
2127 install_dir : rootlibexecdir)
2128
2129 systemd_export = executable('systemd-export',
2130 systemd_export_sources,
2131 include_directories : includes,
2132 link_with : [libshared],
2133 dependencies : [libcurl,
2134 libz,
2135 libbzip2,
2136 libxz],
2137 install_rpath : rootlibexecdir,
2138 install : true,
2139 install_dir : rootlibexecdir)
2140 public_programs += [systemd_pull, systemd_import, systemd_export]
2141 endif
2142
2143 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2144 exe = executable('systemd-journal-upload',
2145 systemd_journal_upload_sources,
2146 include_directories : includes,
2147 link_with : [libshared],
2148 dependencies : [threads,
2149 libcurl,
2150 libgnutls,
2151 libxz,
2152 liblz4],
2153 install_rpath : rootlibexecdir,
2154 install : true,
2155 install_dir : rootlibexecdir)
2156 public_programs += exe
2157 endif
2158
2159 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2160 s_j_remote = executable('systemd-journal-remote',
2161 systemd_journal_remote_sources,
2162 include_directories : includes,
2163 link_with : [libshared,
2164 libsystemd_journal_remote],
2165 dependencies : [threads,
2166 libmicrohttpd,
2167 libgnutls,
2168 libxz,
2169 liblz4],
2170 install_rpath : rootlibexecdir,
2171 install : true,
2172 install_dir : rootlibexecdir)
2173
2174 s_j_gatewayd = executable('systemd-journal-gatewayd',
2175 systemd_journal_gatewayd_sources,
2176 include_directories : includes,
2177 link_with : [libshared],
2178 dependencies : [threads,
2179 libmicrohttpd,
2180 libgnutls,
2181 libxz,
2182 liblz4],
2183 install_rpath : rootlibexecdir,
2184 install : true,
2185 install_dir : rootlibexecdir)
2186 public_programs += [s_j_remote, s_j_gatewayd]
2187 endif
2188
2189 if conf.get('ENABLE_COREDUMP') == 1
2190 executable('systemd-coredump',
2191 systemd_coredump_sources,
2192 include_directories : includes,
2193 link_with : [libshared],
2194 dependencies : [threads,
2195 libacl,
2196 libdw,
2197 libxz,
2198 liblz4],
2199 install_rpath : rootlibexecdir,
2200 install : true,
2201 install_dir : rootlibexecdir)
2202
2203 exe = executable('coredumpctl',
2204 coredumpctl_sources,
2205 include_directories : includes,
2206 link_with : [libshared],
2207 dependencies : [threads,
2208 libxz,
2209 liblz4],
2210 install_rpath : rootlibexecdir,
2211 install : true)
2212 public_programs += exe
2213 endif
2214
2215 if conf.get('ENABLE_BINFMT') == 1
2216 exe = executable('systemd-binfmt',
2217 'src/binfmt/binfmt.c',
2218 include_directories : includes,
2219 link_with : [libshared],
2220 install_rpath : rootlibexecdir,
2221 install : true,
2222 install_dir : rootlibexecdir)
2223 public_programs += exe
2224
2225 meson.add_install_script('sh', '-c',
2226 mkdir_p.format(binfmtdir))
2227 meson.add_install_script('sh', '-c',
2228 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2229 endif
2230
2231 if conf.get('ENABLE_VCONSOLE') == 1
2232 executable('systemd-vconsole-setup',
2233 'src/vconsole/vconsole-setup.c',
2234 include_directories : includes,
2235 link_with : [libshared],
2236 install_rpath : rootlibexecdir,
2237 install : true,
2238 install_dir : rootlibexecdir)
2239 endif
2240
2241 if conf.get('ENABLE_RANDOMSEED') == 1
2242 executable('systemd-random-seed',
2243 'src/random-seed/random-seed.c',
2244 include_directories : includes,
2245 link_with : [libshared],
2246 install_rpath : rootlibexecdir,
2247 install : true,
2248 install_dir : rootlibexecdir)
2249 endif
2250
2251 if conf.get('ENABLE_FIRSTBOOT') == 1
2252 executable('systemd-firstboot',
2253 'src/firstboot/firstboot.c',
2254 include_directories : includes,
2255 link_with : [libshared],
2256 dependencies : [libcrypt],
2257 install_rpath : rootlibexecdir,
2258 install : true,
2259 install_dir : rootbindir)
2260 endif
2261
2262 executable('systemd-remount-fs',
2263 'src/remount-fs/remount-fs.c',
2264 'src/core/mount-setup.c',
2265 'src/core/mount-setup.h',
2266 include_directories : includes,
2267 link_with : [libshared],
2268 install_rpath : rootlibexecdir,
2269 install : true,
2270 install_dir : rootlibexecdir)
2271
2272 executable('systemd-machine-id-setup',
2273 'src/machine-id-setup/machine-id-setup-main.c',
2274 'src/core/machine-id-setup.c',
2275 'src/core/machine-id-setup.h',
2276 include_directories : includes,
2277 link_with : [libshared],
2278 install_rpath : rootlibexecdir,
2279 install : true,
2280 install_dir : rootbindir)
2281
2282 executable('systemd-fsck',
2283 'src/fsck/fsck.c',
2284 include_directories : includes,
2285 link_with : [libshared],
2286 install_rpath : rootlibexecdir,
2287 install : true,
2288 install_dir : rootlibexecdir)
2289
2290 executable('systemd-growfs',
2291 'src/partition/growfs.c',
2292 include_directories : includes,
2293 link_with : [libshared],
2294 dependencies : [libcryptsetup],
2295 install_rpath : rootlibexecdir,
2296 install : true,
2297 install_dir : rootlibexecdir)
2298
2299 executable('systemd-makefs',
2300 'src/partition/makefs.c',
2301 include_directories : includes,
2302 link_with : [libshared],
2303 install_rpath : rootlibexecdir,
2304 install : true,
2305 install_dir : rootlibexecdir)
2306
2307 executable('systemd-sleep',
2308 'src/sleep/sleep.c',
2309 include_directories : includes,
2310 link_with : [libshared],
2311 install_rpath : rootlibexecdir,
2312 install : true,
2313 install_dir : rootlibexecdir)
2314
2315 exe = executable('systemd-sysctl',
2316 'src/sysctl/sysctl.c',
2317 include_directories : includes,
2318 link_with : [libshared],
2319 install_rpath : rootlibexecdir,
2320 install : true,
2321 install_dir : rootlibexecdir)
2322 public_programs += exe
2323
2324 executable('systemd-ac-power',
2325 'src/ac-power/ac-power.c',
2326 include_directories : includes,
2327 link_with : [libshared],
2328 install_rpath : rootlibexecdir,
2329 install : true,
2330 install_dir : rootlibexecdir)
2331
2332 exe = executable('systemd-detect-virt',
2333 'src/detect-virt/detect-virt.c',
2334 include_directories : includes,
2335 link_with : [libshared],
2336 install_rpath : rootlibexecdir,
2337 install : true)
2338 public_programs += exe
2339
2340 exe = executable('systemd-delta',
2341 'src/delta/delta.c',
2342 include_directories : includes,
2343 link_with : [libshared],
2344 install_rpath : rootlibexecdir,
2345 install : true)
2346 public_programs += exe
2347
2348 exe = executable('systemd-escape',
2349 'src/escape/escape.c',
2350 include_directories : includes,
2351 link_with : [libshared],
2352 install_rpath : rootlibexecdir,
2353 install : true,
2354 install_dir : rootbindir)
2355 public_programs += exe
2356
2357 exe = executable('systemd-notify',
2358 'src/notify/notify.c',
2359 include_directories : includes,
2360 link_with : [libshared],
2361 install_rpath : rootlibexecdir,
2362 install : true,
2363 install_dir : rootbindir)
2364 public_programs += exe
2365
2366 executable('systemd-volatile-root',
2367 'src/volatile-root/volatile-root.c',
2368 include_directories : includes,
2369 link_with : [libshared],
2370 install_rpath : rootlibexecdir,
2371 install : true,
2372 install_dir : rootlibexecdir)
2373
2374 executable('systemd-cgroups-agent',
2375 'src/cgroups-agent/cgroups-agent.c',
2376 include_directories : includes,
2377 link_with : [libshared],
2378 install_rpath : rootlibexecdir,
2379 install : true,
2380 install_dir : rootlibexecdir)
2381
2382 exe = executable('systemd-id128',
2383 'src/id128/id128.c',
2384 include_directories : includes,
2385 link_with : [libshared],
2386 install_rpath : rootlibexecdir,
2387 install : true)
2388 public_programs += exe
2389
2390 exe = executable('systemd-path',
2391 'src/path/path.c',
2392 include_directories : includes,
2393 link_with : [libshared],
2394 install_rpath : rootlibexecdir,
2395 install : true)
2396 public_programs += exe
2397
2398 exe = executable('systemd-ask-password',
2399 'src/ask-password/ask-password.c',
2400 include_directories : includes,
2401 link_with : [libshared],
2402 install_rpath : rootlibexecdir,
2403 install : true,
2404 install_dir : rootbindir)
2405 public_programs += exe
2406
2407 executable('systemd-reply-password',
2408 'src/reply-password/reply-password.c',
2409 include_directories : includes,
2410 link_with : [libshared],
2411 install_rpath : rootlibexecdir,
2412 install : true,
2413 install_dir : rootlibexecdir)
2414
2415 exe = executable('systemd-tty-ask-password-agent',
2416 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2417 include_directories : includes,
2418 link_with : [libshared],
2419 install_rpath : rootlibexecdir,
2420 install : true,
2421 install_dir : rootbindir)
2422 public_programs += exe
2423
2424 exe = executable('systemd-cgls',
2425 'src/cgls/cgls.c',
2426 include_directories : includes,
2427 link_with : [libshared],
2428 install_rpath : rootlibexecdir,
2429 install : true)
2430 public_programs += exe
2431
2432 exe = executable('systemd-cgtop',
2433 'src/cgtop/cgtop.c',
2434 include_directories : includes,
2435 link_with : [libshared],
2436 install_rpath : rootlibexecdir,
2437 install : true)
2438 public_programs += exe
2439
2440 executable('systemd-initctl',
2441 'src/initctl/initctl.c',
2442 include_directories : includes,
2443 link_with : [libshared],
2444 install_rpath : rootlibexecdir,
2445 install : true,
2446 install_dir : rootlibexecdir)
2447
2448 exe = executable('systemd-mount',
2449 'src/mount/mount-tool.c',
2450 include_directories : includes,
2451 link_with : [libshared],
2452 install_rpath : rootlibexecdir,
2453 install : true)
2454 public_programs += exe
2455
2456 meson.add_install_script(meson_make_symlink,
2457 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2458
2459 exe = executable('systemd-run',
2460 'src/run/run.c',
2461 include_directories : includes,
2462 link_with : [libshared],
2463 install_rpath : rootlibexecdir,
2464 install : true)
2465 public_programs += exe
2466
2467 exe = executable('systemd-stdio-bridge',
2468 'src/stdio-bridge/stdio-bridge.c',
2469 include_directories : includes,
2470 link_with : [libshared],
2471 install_rpath : rootlibexecdir,
2472 install : true)
2473 public_programs += exe
2474
2475 exe = executable('busctl',
2476 'src/busctl/busctl.c',
2477 'src/busctl/busctl-introspect.c',
2478 'src/busctl/busctl-introspect.h',
2479 include_directories : includes,
2480 link_with : [libshared],
2481 install_rpath : rootlibexecdir,
2482 install : true)
2483 public_programs += exe
2484
2485 if conf.get('ENABLE_SYSUSERS') == 1
2486 exe = executable('systemd-sysusers',
2487 'src/sysusers/sysusers.c',
2488 include_directories : includes,
2489 link_with : [libshared],
2490 install_rpath : rootlibexecdir,
2491 install : true,
2492 install_dir : rootbindir)
2493 public_programs += exe
2494 endif
2495
2496 if conf.get('ENABLE_TMPFILES') == 1
2497 exe = executable('systemd-tmpfiles',
2498 'src/tmpfiles/tmpfiles.c',
2499 include_directories : includes,
2500 link_with : [libshared],
2501 dependencies : [libacl],
2502 install_rpath : rootlibexecdir,
2503 install : true,
2504 install_dir : rootbindir)
2505 public_programs += exe
2506
2507 if want_tests != 'false'
2508 test('test-systemd-tmpfiles',
2509 test_systemd_tmpfiles_py,
2510 # https://github.com/mesonbuild/meson/issues/2681
2511 args : exe.full_path())
2512 endif
2513 endif
2514
2515 if conf.get('ENABLE_HWDB') == 1
2516 exe = executable('systemd-hwdb',
2517 'src/hwdb/hwdb.c',
2518 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2519 include_directories : includes,
2520 link_with : [libudev_static],
2521 install_rpath : udev_rpath,
2522 install : true,
2523 install_dir : rootbindir)
2524 public_programs += exe
2525 endif
2526
2527 if conf.get('ENABLE_QUOTACHECK') == 1
2528 executable('systemd-quotacheck',
2529 'src/quotacheck/quotacheck.c',
2530 include_directories : includes,
2531 link_with : [libshared],
2532 install_rpath : rootlibexecdir,
2533 install : true,
2534 install_dir : rootlibexecdir)
2535 endif
2536
2537 exe = executable('systemd-socket-proxyd',
2538 'src/socket-proxy/socket-proxyd.c',
2539 include_directories : includes,
2540 link_with : [libshared],
2541 dependencies : [threads],
2542 install_rpath : rootlibexecdir,
2543 install : true,
2544 install_dir : rootlibexecdir)
2545 public_programs += exe
2546
2547 exe = executable('systemd-udevd',
2548 systemd_udevd_sources,
2549 include_directories : includes,
2550 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2551 link_with : [libudev_core,
2552 libsystemd_network,
2553 libudev_static],
2554 dependencies : [threads,
2555 libkmod,
2556 libidn,
2557 libacl,
2558 libblkid],
2559 install_rpath : udev_rpath,
2560 install : true,
2561 install_dir : rootlibexecdir)
2562 public_programs += exe
2563
2564 exe = executable('udevadm',
2565 udevadm_sources,
2566 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2567 include_directories : includes,
2568 link_with : [libudev_core,
2569 libsystemd_network,
2570 libudev_static],
2571 dependencies : [threads,
2572 libkmod,
2573 libidn,
2574 libacl,
2575 libblkid],
2576 install_rpath : udev_rpath,
2577 install : true,
2578 install_dir : rootbindir)
2579 public_programs += exe
2580
2581 executable('systemd-shutdown',
2582 systemd_shutdown_sources,
2583 include_directories : includes,
2584 link_with : [libshared],
2585 dependencies : [libmount],
2586 install_rpath : rootlibexecdir,
2587 install : true,
2588 install_dir : rootlibexecdir)
2589
2590 executable('systemd-update-done',
2591 'src/update-done/update-done.c',
2592 include_directories : includes,
2593 link_with : [libshared],
2594 install_rpath : rootlibexecdir,
2595 install : true,
2596 install_dir : rootlibexecdir)
2597
2598 executable('systemd-update-utmp',
2599 'src/update-utmp/update-utmp.c',
2600 include_directories : includes,
2601 link_with : [libshared],
2602 dependencies : [libaudit],
2603 install_rpath : rootlibexecdir,
2604 install : true,
2605 install_dir : rootlibexecdir)
2606
2607 if conf.get('HAVE_KMOD') == 1
2608 executable('systemd-modules-load',
2609 'src/modules-load/modules-load.c',
2610 include_directories : includes,
2611 link_with : [libshared],
2612 dependencies : [libkmod],
2613 install_rpath : rootlibexecdir,
2614 install : true,
2615 install_dir : rootlibexecdir)
2616
2617 meson.add_install_script('sh', '-c',
2618 mkdir_p.format(modulesloaddir))
2619 meson.add_install_script('sh', '-c',
2620 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2621 endif
2622
2623 exe = executable('systemd-nspawn',
2624 systemd_nspawn_sources,
2625 'src/core/mount-setup.c', # FIXME: use a variable?
2626 'src/core/mount-setup.h',
2627 'src/core/loopback-setup.c',
2628 'src/core/loopback-setup.h',
2629 include_directories : includes,
2630 link_with : [libnspawn_core,
2631 libshared],
2632 dependencies : [libblkid],
2633 install_rpath : rootlibexecdir,
2634 install : true)
2635 public_programs += exe
2636
2637 if conf.get('ENABLE_NETWORKD') == 1
2638 executable('systemd-networkd',
2639 systemd_networkd_sources,
2640 include_directories : includes,
2641 link_with : [libnetworkd_core,
2642 libsystemd_network,
2643 libudev_static,
2644 libshared],
2645 dependencies : [threads],
2646 install_rpath : rootlibexecdir,
2647 install : true,
2648 install_dir : rootlibexecdir)
2649
2650 executable('systemd-networkd-wait-online',
2651 systemd_networkd_wait_online_sources,
2652 include_directories : includes,
2653 link_with : [libnetworkd_core,
2654 libshared],
2655 install_rpath : rootlibexecdir,
2656 install : true,
2657 install_dir : rootlibexecdir)
2658
2659 exe = executable('networkctl',
2660 networkctl_sources,
2661 include_directories : includes,
2662 link_with : [libsystemd_network,
2663 libshared],
2664 install_rpath : rootlibexecdir,
2665 install : true,
2666 install_dir : rootbindir)
2667 public_programs += exe
2668 endif
2669
2670 executable('systemd-sulogin-shell',
2671 ['src/sulogin-shell/sulogin-shell.c'],
2672 include_directories : includes,
2673 link_with : [libshared],
2674 install_rpath : rootlibexecdir,
2675 install : true,
2676 install_dir : rootlibexecdir)
2677
2678 ############################################################
2679
2680 custom_target(
2681 'systemd-runtest.env',
2682 output : 'systemd-runtest.env',
2683 command : ['sh', '-c', '{ ' +
2684 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(meson.current_source_dir(), 'test')) +
2685 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2686 '} >@OUTPUT@'],
2687 build_by_default : true)
2688
2689 foreach tuple : tests
2690 sources = tuple[0]
2691 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2692 dependencies = tuple[2]
2693 condition = tuple.length() >= 4 ? tuple[3] : ''
2694 type = tuple.length() >= 5 ? tuple[4] : ''
2695 defs = tuple.length() >= 6 ? tuple[5] : []
2696 incs = tuple.length() >= 7 ? tuple[6] : includes
2697 timeout = 30
2698
2699 name = sources[0].split('/')[-1].split('.')[0]
2700 if type.startswith('timeout=')
2701 timeout = type.split('=')[1].to_int()
2702 type = ''
2703 endif
2704
2705 if condition == '' or conf.get(condition) == 1
2706 exe = executable(
2707 name,
2708 sources,
2709 include_directories : incs,
2710 link_with : link_with,
2711 dependencies : dependencies,
2712 c_args : defs,
2713 build_by_default : want_tests != 'false',
2714 install_rpath : rootlibexecdir,
2715 install : install_tests,
2716 install_dir : join_paths(testsdir, type))
2717
2718 if type == 'manual'
2719 message('@0@ is a manual test'.format(name))
2720 elif type == 'unsafe' and want_tests != 'unsafe'
2721 message('@0@ is an unsafe test'.format(name))
2722 elif want_tests != 'false'
2723 test(name, exe,
2724 env : test_env,
2725 timeout : timeout)
2726 endif
2727 else
2728 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2729 endif
2730 endforeach
2731
2732 exe = executable(
2733 'test-libsystemd-sym',
2734 test_libsystemd_sym_c,
2735 include_directories : includes,
2736 link_with : [libsystemd],
2737 build_by_default : want_tests != 'false',
2738 install : install_tests,
2739 install_dir : testsdir)
2740 if want_tests != 'false'
2741 test('test-libsystemd-sym', exe)
2742 endif
2743
2744 exe = executable(
2745 'test-libsystemd-static-sym',
2746 test_libsystemd_sym_c,
2747 include_directories : includes,
2748 link_with : [install_libsystemd_static],
2749 dependencies : [threads], # threads is already included in dependencies on the library,
2750 # but does not seem to get propagated. Add here as a work-around.
2751 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2752 install : install_tests and static_libsystemd_pic,
2753 install_dir : testsdir)
2754 if want_tests != 'false' and static_libsystemd_pic
2755 test('test-libsystemd-static-sym', exe)
2756 endif
2757
2758 exe = executable(
2759 'test-libudev-sym',
2760 test_libudev_sym_c,
2761 include_directories : includes,
2762 c_args : '-Wno-deprecated-declarations',
2763 link_with : [libudev],
2764 build_by_default : want_tests != 'false',
2765 install : install_tests,
2766 install_dir : testsdir)
2767 if want_tests != 'false'
2768 test('test-libudev-sym', exe)
2769 endif
2770
2771 exe = executable(
2772 'test-libudev-static-sym',
2773 test_libudev_sym_c,
2774 include_directories : includes,
2775 c_args : '-Wno-deprecated-declarations',
2776 link_with : [install_libudev_static],
2777 build_by_default : want_tests != 'false' and static_libudev_pic,
2778 install : install_tests and static_libudev_pic,
2779 install_dir : testsdir)
2780 if want_tests != 'false' and static_libudev_pic
2781 test('test-libudev-static-sym', exe)
2782 endif
2783
2784 ############################################################
2785
2786 fuzzer_exes = []
2787
2788 if get_option('tests') != 'false'
2789 foreach tuple : fuzzers
2790 sources = tuple[0]
2791 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2792 dependencies = tuple[2]
2793 defs = tuple.length() >= 4 ? tuple[3] : []
2794 incs = tuple.length() >= 5 ? tuple[4] : includes
2795
2796 if fuzzer_build
2797 dependencies += fuzzing_engine
2798 else
2799 sources += 'src/fuzz/fuzz-main.c'
2800 endif
2801
2802 name = sources[0].split('/')[-1].split('.')[0]
2803
2804 fuzzer_exes += executable(
2805 name,
2806 sources,
2807 include_directories : [incs, include_directories('src/fuzz')],
2808 link_with : link_with,
2809 dependencies : dependencies,
2810 c_args : defs,
2811 install : false)
2812 endforeach
2813 endif
2814
2815 run_target('fuzzers',
2816 depends : fuzzer_exes,
2817 command : ['true'])
2818
2819 ############################################################
2820
2821 make_directive_index_py = find_program('tools/make-directive-index.py')
2822 make_man_index_py = find_program('tools/make-man-index.py')
2823 xml_helper_py = find_program('tools/xml_helper.py')
2824 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2825
2826 subdir('units')
2827 subdir('sysctl.d')
2828 subdir('sysusers.d')
2829 subdir('tmpfiles.d')
2830 subdir('presets')
2831 subdir('hwdb')
2832 subdir('network')
2833 subdir('man')
2834 subdir('shell-completion/bash')
2835 subdir('shell-completion/zsh')
2836 subdir('docs/sysvinit')
2837 subdir('docs/var-log')
2838
2839 install_subdir('factory/etc',
2840 install_dir : factorydir)
2841
2842 install_data('xorg/50-systemd-user.sh',
2843 install_dir : xinitrcdir)
2844 install_data('modprobe.d/systemd.conf',
2845 install_dir : modprobedir)
2846 install_data('LICENSE.GPL2',
2847 'LICENSE.LGPL2.1',
2848 'NEWS',
2849 'README',
2850 'docs/CODING_STYLE.md',
2851 'docs/DISTRO_PORTING.md',
2852 'docs/ENVIRONMENT.md',
2853 'docs/HACKING.md',
2854 'docs/TRANSIENT-SETTINGS.md',
2855 'docs/TRANSLATORS.md',
2856 'docs/UIDS-GIDS.md',
2857 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
2858 install_dir : docdir)
2859
2860 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
2861 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
2862
2863 ############################################################
2864
2865 meson_check_help = find_program('tools/meson-check-help.sh')
2866
2867 foreach exec : public_programs
2868 name = exec.full_path().split('/')[-1]
2869 if want_tests != 'false'
2870 test('check-help-' + name,
2871 meson_check_help,
2872 args : exec.full_path())
2873 endif
2874 endforeach
2875
2876 ############################################################
2877
2878 # Enable tests for all supported sanitizers
2879 foreach tuple : sanitizers
2880 sanitizer = tuple[0]
2881 build = tuple[1]
2882
2883 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
2884 prev = ''
2885 foreach p : fuzz_regression_tests
2886 b = p.split('/')[-2]
2887 c = p.split('/')[-1]
2888
2889 name = '@0@:@1@'.format(b, sanitizer)
2890
2891 if name != prev
2892 if want_tests == 'false'
2893 message('Not compiling @0@ because tests is set to false'.format(name))
2894 elif slow_tests
2895 exe = custom_target(
2896 name,
2897 output : name,
2898 depends : build,
2899 command : [env, 'ln', '-fs',
2900 join_paths(build.full_path(), b),
2901 '@OUTPUT@'],
2902 build_by_default : true)
2903 else
2904 message('Not compiling @0@ because slow-tests is set to false'.format(name))
2905 endif
2906 endif
2907 prev = name
2908
2909 if want_tests != 'false' and slow_tests
2910 test('@0@:@1@:@2@'.format(b, c, sanitizer),
2911 env,
2912 args : [exe.full_path(),
2913 join_paths(meson.source_root(), p)])
2914 endif
2915 endforeach
2916 endif
2917 endforeach
2918
2919
2920 ############################################################
2921
2922 if git.found()
2923 all_files = run_command(
2924 git,
2925 ['--git-dir=@0@/.git'.format(meson.source_root()),
2926 'ls-files',
2927 ':/*.[ch]'])
2928 all_files = files(all_files.stdout().split())
2929
2930 custom_target(
2931 'tags',
2932 output : 'tags',
2933 command : [env, 'etags', '-o', '@0@/TAGS'.format(meson.source_root())] + all_files)
2934 run_target(
2935 'ctags',
2936 command : [env, 'ctags', '-o', '@0@/tags'.format(meson.source_root())] + all_files)
2937 endif
2938
2939 if git.found()
2940 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
2941 run_target(
2942 'git-contrib',
2943 command : [meson_git_contrib_sh])
2944 endif
2945
2946 if git.found()
2947 git_head = run_command(
2948 git,
2949 ['--git-dir=@0@/.git'.format(meson.source_root()),
2950 'rev-parse', 'HEAD']).stdout().strip()
2951 git_head_short = run_command(
2952 git,
2953 ['--git-dir=@0@/.git'.format(meson.source_root()),
2954 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
2955
2956 run_target(
2957 'git-snapshot',
2958 command : ['git', 'archive',
2959 '-o', '@0@/systemd-@1@.tar.gz'.format(meson.source_root(),
2960 git_head_short),
2961 '--prefix', 'systemd-@0@/'.format(git_head),
2962 'HEAD'])
2963 endif
2964
2965 ############################################################
2966
2967 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
2968 run_target(
2969 'check-api-docs',
2970 depends : [man, libsystemd, libudev],
2971 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
2972
2973 run_target(
2974 'make-index-md',
2975 command : ['sh', '@0@/tools/make-index-md.sh'.format(meson.source_root()), meson.source_root()])
2976
2977 ############################################################
2978
2979 status = [
2980 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
2981
2982 'split /usr: @0@'.format(split_usr),
2983 'split bin-sbin: @0@'.format(split_bin),
2984 'prefix directory: @0@'.format(prefixdir),
2985 'rootprefix directory: @0@'.format(rootprefixdir),
2986 'sysconf directory: @0@'.format(sysconfdir),
2987 'include directory: @0@'.format(includedir),
2988 'lib directory: @0@'.format(libdir),
2989 'rootlib directory: @0@'.format(rootlibdir),
2990 'SysV init scripts: @0@'.format(sysvinit_path),
2991 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
2992 'PAM modules directory: @0@'.format(pamlibdir),
2993 'PAM configuration directory: @0@'.format(pamconfdir),
2994 'RPM macros directory: @0@'.format(rpmmacrosdir),
2995 'modprobe.d directory: @0@'.format(modprobedir),
2996 'D-Bus policy directory: @0@'.format(dbuspolicydir),
2997 'D-Bus session directory: @0@'.format(dbussessionservicedir),
2998 'D-Bus system directory: @0@'.format(dbussystemservicedir),
2999 'bash completions directory: @0@'.format(bashcompletiondir),
3000 'zsh completions directory: @0@'.format(zshcompletiondir),
3001 'extra start script: @0@'.format(get_option('rc-local')),
3002 'extra stop script: @0@'.format(get_option('halt-local')),
3003 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3004 get_option('debug-tty')),
3005 'TTY GID: @0@'.format(tty_gid),
3006 'users GID: @0@'.format(substs.get('USERS_GID')),
3007 'maximum system UID: @0@'.format(system_uid_max),
3008 'maximum system GID: @0@'.format(system_gid_max),
3009 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3010 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3011 'minimum container UID base: @0@'.format(container_uid_base_min),
3012 'maximum container UID base: @0@'.format(container_uid_base_max),
3013 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3014 'render group access mode: @0@'.format(get_option('group-render-mode')),
3015 'certificate root directory: @0@'.format(get_option('certificate-root')),
3016 'support URL: @0@'.format(support_url),
3017 'nobody user name: @0@'.format(nobody_user),
3018 'nobody group name: @0@'.format(nobody_group),
3019 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3020 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3021
3022 'default DNSSEC mode: @0@'.format(default_dnssec),
3023 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3024 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3025 'default KillUserProcesses setting: @0@'.format(kill_user_processes)]
3026
3027 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3028 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3029 status += [
3030 'default DNS servers: @0@'.format(alt_dns_servers),
3031 'default NTP servers: @0@'.format(alt_ntp_servers)]
3032
3033 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3034 '@@0@'.format(time_epoch)).stdout().strip()
3035 status += [
3036 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3037
3038 status += [
3039 'static libsystemd: @0@'.format(static_libsystemd),
3040 'static libudev: @0@'.format(static_libudev)]
3041
3042 # TODO:
3043 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3044 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3045 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3046
3047 if conf.get('ENABLE_EFI') == 1
3048 status += 'efi arch: @0@'.format(efi_arch)
3049
3050 if have_gnu_efi
3051 status += [
3052 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3053 'EFI CC @0@'.format(efi_cc),
3054 'EFI lib directory: @0@'.format(efi_libdir),
3055 'EFI lds directory: @0@'.format(efi_ldsdir),
3056 'EFI include directory: @0@'.format(efi_incdir)]
3057 endif
3058 endif
3059
3060 found = []
3061 missing = []
3062
3063 foreach tuple : [
3064 ['libcryptsetup'],
3065 ['PAM'],
3066 ['AUDIT'],
3067 ['IMA'],
3068 ['AppArmor'],
3069 ['SELinux'],
3070 ['SECCOMP'],
3071 ['SMACK'],
3072 ['zlib'],
3073 ['xz'],
3074 ['lz4'],
3075 ['bzip2'],
3076 ['ACL'],
3077 ['gcrypt'],
3078 ['qrencode'],
3079 ['microhttpd'],
3080 ['gnutls'],
3081 ['openssl'],
3082 ['libcurl'],
3083 ['idn'],
3084 ['libidn2'],
3085 ['libidn'],
3086 ['libiptc'],
3087 ['elfutils'],
3088 ['binfmt'],
3089 ['vconsole'],
3090 ['quotacheck'],
3091 ['tmpfiles'],
3092 ['environment.d'],
3093 ['sysusers'],
3094 ['firstboot'],
3095 ['randomseed'],
3096 ['backlight'],
3097 ['rfkill'],
3098 ['logind'],
3099 ['machined'],
3100 ['portabled'],
3101 ['importd'],
3102 ['hostnamed'],
3103 ['timedated'],
3104 ['timesyncd'],
3105 ['localed'],
3106 ['networkd'],
3107 ['resolve'],
3108 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3109 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3110 ['coredump'],
3111 ['polkit'],
3112 ['legacy pkla', install_polkit_pkla],
3113 ['efi'],
3114 ['gnu-efi', have_gnu_efi],
3115 ['kmod'],
3116 ['xkbcommon'],
3117 ['pcre2'],
3118 ['blkid'],
3119 ['dbus'],
3120 ['glib'],
3121 ['nss-myhostname'],
3122 ['nss-mymachines'],
3123 ['nss-resolve'],
3124 ['nss-systemd'],
3125 ['hwdb'],
3126 ['tpm'],
3127 ['man pages', want_man],
3128 ['html pages', want_html],
3129 ['man page indices', want_man and have_lxml],
3130 ['SysV compat'],
3131 ['utmp'],
3132 ['ldconfig'],
3133 ['hibernate'],
3134 ['adm group', get_option('adm-group')],
3135 ['wheel group', get_option('wheel-group')],
3136 ['gshadow'],
3137 ['debug hashmap'],
3138 ['debug mmap cache'],
3139 ['debug siphash'],
3140 ['debug udev'],
3141 ['valgrind', conf.get('VALGRIND') == 1],
3142 ['trace logging', conf.get('LOG_TRACE') == 1],
3143 ['link-udev-shared', get_option('link-udev-shared')],
3144 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3145 ]
3146
3147 if tuple.length() >= 2
3148 cond = tuple[1]
3149 else
3150 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3151 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3152 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3153 endif
3154 if cond
3155 found += tuple[0]
3156 else
3157 missing += tuple[0]
3158 endif
3159 endforeach
3160
3161 status += [
3162 '',
3163 'enabled features: @0@'.format(', '.join(found)),
3164 '',
3165 'disabled features: @0@'.format(', '.join(missing)),
3166 '']
3167 message('\n '.join(status))
3168
3169 if rootprefixdir != rootprefix_default
3170 warning('\n' +
3171 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3172 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3173 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
3174 endif