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