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