]> git.ipfire.org Git - thirdparty/systemd.git/blob - meson.build
boot,shared: share the definitions of EFI_LOADER_FEATURE macros
[thirdparty/systemd.git] / meson.build
1 # SPDX-License-Identifier: LGPL-2.1+
2
3 project('systemd', 'c',
4 version : '242',
5 license : 'LGPLv2+',
6 default_options: [
7 'c_std=gnu99',
8 'prefix=/usr',
9 'sysconfdir=/etc',
10 'localstatedir=/var',
11 ],
12 meson_version : '>= 0.46',
13 )
14
15 libsystemd_version = '0.26.0'
16 libudev_version = '1.6.14'
17
18 # We need the same data in two different formats, ugh!
19 # Also, for hysterical reasons, we use different variable
20 # names, sometimes. Not all variables are included in every
21 # set. Ugh, ugh, ugh!
22 conf = configuration_data()
23 conf.set('PROJECT_VERSION', meson.project_version())
24
25 substs = configuration_data()
26 substs.set('PROJECT_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
27 substs.set('PROJECT_VERSION', meson.project_version())
28
29 # This is to be used instead of meson.source_root(), as the latter will return
30 # the wrong result when systemd is being built as a meson subproject
31 project_source_root = meson.current_source_dir()
32
33 want_ossfuzz = get_option('oss-fuzz')
34 want_libfuzzer = get_option('llvm-fuzz')
35 want_fuzzbuzz = get_option('fuzzbuzz')
36 if want_ossfuzz + want_libfuzzer + want_fuzzbuzz > 1
37 error('only one of oss-fuzz, llvm-fuzz or fuzzbuzz can be specified')
38 endif
39
40 skip_deps = want_ossfuzz or want_libfuzzer
41 fuzzer_build = want_ossfuzz or want_libfuzzer or want_fuzzbuzz
42
43 #####################################################################
44
45 # Try to install the git pre-commit hook
46 git_hook = run_command(join_paths(project_source_root, 'tools/add-git-hook.sh'))
47 if git_hook.returncode() == 0
48 message(git_hook.stdout().strip())
49 endif
50
51 #####################################################################
52
53 if get_option('split-usr') == 'auto'
54 split_usr = run_command('test', '-L', '/bin').returncode() != 0
55 else
56 split_usr = get_option('split-usr') == 'true'
57 endif
58 conf.set10('HAVE_SPLIT_USR', split_usr,
59 description : '/usr/bin and /bin directories are separate')
60
61 if get_option('split-bin') == 'auto'
62 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
63 else
64 split_bin = get_option('split-bin') == 'true'
65 endif
66 conf.set10('HAVE_SPLIT_BIN', split_bin,
67 description : 'bin and sbin directories are separate')
68
69 rootprefixdir = get_option('rootprefix')
70 # Unusual rootprefixdir values are used by some distros
71 # (see https://github.com/systemd/systemd/pull/7461).
72 rootprefix_default = split_usr ? '/' : '/usr'
73 if rootprefixdir == ''
74 rootprefixdir = rootprefix_default
75 endif
76 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
77
78 sysvinit_path = get_option('sysvinit-path')
79 sysvrcnd_path = get_option('sysvrcnd-path')
80 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
81 description : 'SysV init scripts and rcN.d links are supported')
82
83 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
84 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
85 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
86
87 # join_paths ignores the preceding arguments if an absolute component is
88 # encountered, so this should canonicalize various paths when they are
89 # absolute or relative.
90 prefixdir = get_option('prefix')
91 if not prefixdir.startswith('/')
92 error('Prefix is not absolute: "@0@"'.format(prefixdir))
93 endif
94 bindir = join_paths(prefixdir, get_option('bindir'))
95 libdir = join_paths(prefixdir, get_option('libdir'))
96 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
97 includedir = join_paths(prefixdir, get_option('includedir'))
98 datadir = join_paths(prefixdir, get_option('datadir'))
99 localstatedir = join_paths('/', get_option('localstatedir'))
100
101 rootbindir = join_paths(rootprefixdir, 'bin')
102 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
103 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
104
105 rootlibdir = get_option('rootlibdir')
106 if rootlibdir == ''
107 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
108 endif
109
110 # Dirs of external packages
111 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
112 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
113 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
114 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
115 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
116 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
117 rpmmacrosdir = get_option('rpmmacrosdir')
118 if rpmmacrosdir != 'no'
119 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
120 endif
121 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
122
123 # Our own paths
124 pkgdatadir = join_paths(datadir, 'systemd')
125 environmentdir = join_paths(prefixdir, 'lib/environment.d')
126 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
127 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
128 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
129 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
130 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
131 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
132 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
133 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
134 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
135 pkgincludedir = join_paths(includedir, 'systemd')
136 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
137 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
138 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
139 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
140 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
141 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
142 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
143 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
144 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
145 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
146 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
147 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
148 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
149 factorydir = join_paths(datadir, 'factory')
150 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
151 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
152 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
153 catalogstatedir = join_paths(systemdstatedir, 'catalog')
154 randomseeddir = join_paths(localstatedir, 'lib/systemd')
155 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
156
157 docdir = get_option('docdir')
158 if docdir == ''
159 docdir = join_paths(datadir, 'doc/systemd')
160 endif
161
162 dbuspolicydir = get_option('dbuspolicydir')
163 if dbuspolicydir == ''
164 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
165 endif
166
167 dbussessionservicedir = get_option('dbussessionservicedir')
168 if dbussessionservicedir == ''
169 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
170 endif
171
172 dbussystemservicedir = get_option('dbussystemservicedir')
173 if dbussystemservicedir == ''
174 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
175 endif
176
177 pamlibdir = get_option('pamlibdir')
178 if pamlibdir == ''
179 pamlibdir = join_paths(rootlibdir, 'security')
180 endif
181
182 pamconfdir = get_option('pamconfdir')
183 if pamconfdir == ''
184 pamconfdir = join_paths(sysconfdir, 'pam.d')
185 endif
186
187 memory_accounting_default = get_option('memory-accounting-default')
188
189 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
190 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
191 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
192 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
193 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
194 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
195
196 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
197
198 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
199 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
200 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
201 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
202 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
203 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
204 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
205 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
206 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
207 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
208 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
209 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
210 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
211 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
212 conf.set_quoted('ROOTPREFIX', rootprefixdir)
213 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
214 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
215 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
216 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
217 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
218 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
219 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
220 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
221 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
222 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
223 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
224 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
225 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
226 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
227 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
228 conf.set_quoted('LIBDIR', libdir)
229 conf.set_quoted('ROOTLIBDIR', rootlibdir)
230 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
231 conf.set_quoted('BOOTLIBDIR', bootlibdir)
232 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
233 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
234 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
235 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
236 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
237 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
238 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
239 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
240 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
241
242 substs.set('prefix', prefixdir)
243 substs.set('rootprefix', rootprefixdir)
244 substs.set('rootprefix_noslash', rootprefixdir_noslash)
245 substs.set('exec_prefix', prefixdir)
246 substs.set('libdir', libdir)
247 substs.set('rootlibdir', rootlibdir)
248 substs.set('includedir', includedir)
249 substs.set('sysconfdir', sysconfdir)
250 substs.set('bindir', bindir)
251 substs.set('rootbindir', rootbindir)
252 substs.set('rootlibexecdir', rootlibexecdir)
253 substs.set('systemunitdir', systemunitdir)
254 substs.set('userunitdir', userunitdir)
255 substs.set('systempresetdir', systempresetdir)
256 substs.set('userpresetdir', userpresetdir)
257 substs.set('udevhwdbdir', udevhwdbdir)
258 substs.set('udevrulesdir', udevrulesdir)
259 substs.set('udevlibexecdir', udevlibexecdir)
260 substs.set('environmentdir', environmentdir)
261 substs.set('catalogdir', catalogdir)
262 substs.set('tmpfilesdir', tmpfilesdir)
263 substs.set('sysusersdir', sysusersdir)
264 substs.set('sysctldir', sysctldir)
265 substs.set('binfmtdir', binfmtdir)
266 substs.set('modulesloaddir', modulesloaddir)
267 substs.set('modprobedir', modprobedir)
268 substs.set('systemgeneratordir', systemgeneratordir)
269 substs.set('usergeneratordir', usergeneratordir)
270 substs.set('systemenvgeneratordir', systemenvgeneratordir)
271 substs.set('userenvgeneratordir', userenvgeneratordir)
272 substs.set('systemshutdowndir', systemshutdowndir)
273 substs.set('systemsleepdir', systemsleepdir)
274 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
275 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
276 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
277 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
278 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
279 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
280 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
281 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
282 substs.set('BUILD_ROOT', meson.current_build_dir())
283
284 #####################################################################
285
286 cc = meson.get_compiler('c')
287 pkgconfig = import('pkgconfig')
288 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
289 meson_build_sh = find_program('tools/meson-build.sh')
290
291 want_tests = get_option('tests')
292 slow_tests = want_tests != 'false' and get_option('slow-tests')
293 install_tests = get_option('install-tests')
294
295 if add_languages('cpp', required : fuzzer_build)
296 # Used only for tests
297 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
298 else
299 cxx_cmd = ''
300 endif
301
302 if want_libfuzzer
303 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
304 if fuzzing_engine.found()
305 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
306 elif cc.has_argument('-fsanitize=fuzzer-no-link')
307 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
308 else
309 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
310 endif
311 elif want_ossfuzz
312 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
313 elif want_fuzzbuzz
314 fuzzing_engine = meson.get_compiler('cpp').find_library(get_option('fuzzbuzz-engine'), dirs: get_option('fuzzbuzz-engine-dir'))
315 endif
316
317 possible_cc_flags = [
318 '-Wextra',
319 '-Werror=undef',
320 '-Wlogical-op',
321 '-Wmissing-include-dirs',
322 '-Wold-style-definition',
323 '-Wpointer-arith',
324 '-Winit-self',
325 '-Wfloat-equal',
326 '-Wsuggest-attribute=noreturn',
327 '-Werror=missing-prototypes',
328 '-Werror=implicit-function-declaration',
329 '-Werror=missing-declarations',
330 '-Werror=return-type',
331 '-Werror=incompatible-pointer-types',
332 '-Werror=format=2',
333 '-Wstrict-prototypes',
334 '-Wredundant-decls',
335 '-Wmissing-noreturn',
336 '-Wimplicit-fallthrough=5',
337 '-Wshadow',
338 '-Wendif-labels',
339 '-Wstrict-aliasing=2',
340 '-Wwrite-strings',
341 '-Werror=overflow',
342 '-Werror=shift-count-overflow',
343 '-Werror=shift-overflow=2',
344 '-Wdate-time',
345 '-Wnested-externs',
346
347 # negative arguments are correctly detected starting with meson 0.46.
348 '-Wno-unused-parameter',
349 '-Wno-missing-field-initializers',
350 '-Wno-unused-result',
351 '-Wno-format-signedness',
352 '-Wno-error=#warnings', # clang
353 '-Wno-string-plus-int', # clang
354
355 # work-around for gcc 7.1 turning this on on its own.
356 '-Wno-error=nonnull',
357
358 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
359 # optimizations enabled, producing essentially false positives.
360 '-Wno-maybe-uninitialized',
361
362 '-ffast-math',
363 '-fno-common',
364 '-fdiagnostics-show-option',
365 '-fno-strict-aliasing',
366 '-fvisibility=hidden',
367 '-fstack-protector',
368 '-fstack-protector-strong',
369 '--param=ssp-buffer-size=4',
370 ]
371
372 # --as-needed and --no-undefined are provided by meson by default,
373 # run mesonconf to see what is enabled
374 possible_link_flags = [
375 '-Wl,-z,relro',
376 '-Wl,-z,now',
377 ]
378
379 if cc.get_id() == 'clang'
380 possible_cc_flags += [
381 '-Wno-typedef-redefinition',
382 '-Wno-gnu-variable-sized-type-not-at-end',
383 ]
384 endif
385
386 if get_option('buildtype') != 'debug'
387 possible_cc_flags += [
388 '-ffunction-sections',
389 '-fdata-sections',
390 ]
391
392 possible_link_flags += '-Wl,--gc-sections'
393 endif
394
395 if get_option('b_ndebug') == 'true'
396 # With asserts disabled with get a bunch of warnings about variables which
397 # are used only in the asserts. This is not useful at all, so let's just silence
398 # those warnings.
399 possible_cc_flags += [
400 '-Wno-unused-variable',
401 '-Wno-unused-but-set-variable',
402 ]
403 endif
404
405 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
406 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
407
408 if cc.compiles('''
409 #include <time.h>
410 #include <inttypes.h>
411 typedef uint64_t usec_t;
412 usec_t now(clockid_t clock);
413 int main(void) {
414 struct timespec now;
415 return 0;
416 }
417 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
418 add_project_arguments('-Werror=shadow', language : 'c')
419 endif
420
421 cpp = ' '.join(cc.cmd_array()) + ' -E'
422
423 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
424
425 #####################################################################
426 # compilation result tests
427
428 conf.set('_GNU_SOURCE', true)
429 conf.set('__SANE_USERSPACE_TYPES__', true)
430 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
431
432 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
433 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
434 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
435 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
436 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
437 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
438 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
439
440 decl_headers = '''
441 #include <uchar.h>
442 #include <sys/stat.h>
443 '''
444
445 foreach decl : ['char16_t',
446 'char32_t',
447 'struct statx',
448 ]
449
450 # We get -1 if the size cannot be determined
451 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
452
453 if decl == 'struct statx'
454 if have
455 want_linux_stat_h = false
456 else
457 have = cc.sizeof(decl,
458 prefix : decl_headers + '#include <linux/stat.h>',
459 args : '-D_GNU_SOURCE') > 0
460 want_linux_stat_h = have
461 endif
462 endif
463
464 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
465 endforeach
466
467 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
468
469 foreach ident : ['secure_getenv', '__secure_getenv']
470 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
471 endforeach
472
473 foreach ident : [
474 ['memfd_create', '''#include <sys/mman.h>'''],
475 ['gettid', '''#include <sys/types.h>
476 #include <unistd.h>'''],
477 ['pivot_root', '''#include <stdlib.h>
478 #include <unistd.h>'''], # no known header declares pivot_root
479 ['name_to_handle_at', '''#include <sys/types.h>
480 #include <sys/stat.h>
481 #include <fcntl.h>'''],
482 ['setns', '''#include <sched.h>'''],
483 ['renameat2', '''#include <stdio.h>
484 #include <fcntl.h>'''],
485 ['kcmp', '''#include <linux/kcmp.h>'''],
486 ['keyctl', '''#include <sys/types.h>
487 #include <keyutils.h>'''],
488 ['copy_file_range', '''#include <sys/syscall.h>
489 #include <unistd.h>'''],
490 ['bpf', '''#include <sys/syscall.h>
491 #include <unistd.h>'''],
492 ['statx', '''#include <sys/types.h>
493 #include <sys/stat.h>
494 #include <unistd.h>'''],
495 ['explicit_bzero' , '''#include <string.h>'''],
496 ['reallocarray', '''#include <malloc.h>'''],
497 ['set_mempolicy', '''#include <stdlib.h>
498 #include <unistd.h>'''],
499 ['get_mempolicy', '''#include <stdlib.h>
500 #include <unistd.h>'''],
501 ]
502
503 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
504 conf.set10('HAVE_' + ident[0].to_upper(), have)
505 endforeach
506
507 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
508 conf.set10('USE_SYS_RANDOM_H', true)
509 conf.set10('HAVE_GETRANDOM', true)
510 else
511 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
512 conf.set10('USE_SYS_RANDOM_H', false)
513 conf.set10('HAVE_GETRANDOM', have)
514 endif
515
516 #####################################################################
517
518 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
519 project_source_root,
520 get_option('version-tag'),
521 meson.project_version()]
522
523 version_h = vcs_tag(
524 input : 'src/version/version.h.in',
525 output : 'version.h',
526 command: vcs_tagger)
527
528 versiondep = declare_dependency(sources: version_h)
529
530 sed = find_program('sed')
531 awk = find_program('awk')
532 m4 = find_program('m4')
533 stat = find_program('stat')
534 git = find_program('git', required : false)
535 env = find_program('env')
536 perl = find_program('perl', required : false)
537
538 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
539 mkdir_p = 'mkdir -p $DESTDIR/@0@'
540 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
541 splash_bmp = files('test/splash.bmp')
542
543 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
544 # /usr/sbin, /sbin, and fall back to the default from middle column.
545 progs = [['quotaon', '/usr/sbin/quotaon' ],
546 ['quotacheck', '/usr/sbin/quotacheck' ],
547 ['kmod', '/usr/bin/kmod' ],
548 ['kexec', '/usr/sbin/kexec' ],
549 ['sulogin', '/usr/sbin/sulogin' ],
550 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
551 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
552 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
553 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
554 ]
555 foreach prog : progs
556 path = get_option(prog[0] + '-path')
557 if path != ''
558 message('Using @1@ for @0@'.format(prog[0], path))
559 else
560 exe = find_program(prog[0],
561 '/usr/sbin/' + prog[0],
562 '/sbin/' + prog[0],
563 required: false)
564 path = exe.found() ? exe.path() : prog[1]
565 endif
566 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
567 conf.set_quoted(name, path)
568 substs.set(name, path)
569 endforeach
570
571 conf.set_quoted('TELINIT', get_option('telinit-path'))
572
573 if run_command('ln', '--relative', '--help').returncode() != 0
574 error('ln does not support --relative (added in coreutils 8.16)')
575 endif
576
577 ############################################################
578
579 gperf = find_program('gperf')
580
581 gperf_test_format = '''
582 #include <string.h>
583 const char * in_word_set(const char *, @0@);
584 @1@
585 '''
586 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
587 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
588 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
589 if cc.compiles(gperf_test)
590 gperf_len_type = 'size_t'
591 else
592 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
593 if cc.compiles(gperf_test)
594 gperf_len_type = 'unsigned'
595 else
596 error('unable to determine gperf len type')
597 endif
598 endif
599 message('gperf len type is @0@'.format(gperf_len_type))
600 conf.set('GPERF_LEN_TYPE', gperf_len_type,
601 description : 'The type of gperf "len" parameter')
602
603 ############################################################
604
605 if not cc.has_header('sys/capability.h')
606 error('POSIX caps headers not found')
607 endif
608 foreach header : ['crypt.h',
609 'linux/memfd.h',
610 'linux/vm_sockets.h',
611 'sys/auxv.h',
612 'valgrind/memcheck.h',
613 'valgrind/valgrind.h',
614 ]
615
616 conf.set10('HAVE_' + header.underscorify().to_upper(),
617 cc.has_header(header))
618 endforeach
619
620 ############################################################
621
622 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
623 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
624 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
625
626 default_hierarchy = get_option('default-hierarchy')
627 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
628 description : 'default cgroup hierarchy as string')
629 if default_hierarchy == 'legacy'
630 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
631 elif default_hierarchy == 'hybrid'
632 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
633 else
634 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
635 endif
636
637 default_net_naming_scheme = get_option('default-net-naming-scheme')
638 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
639
640 time_epoch = get_option('time-epoch')
641 if time_epoch == -1
642 NEWS = files('NEWS')
643 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
644 endif
645 conf.set('TIME_EPOCH', time_epoch)
646
647 system_uid_max = get_option('system-uid-max')
648 if system_uid_max == -1
649 system_uid_max = run_command(
650 awk,
651 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
652 '/etc/login.defs').stdout().strip()
653 if system_uid_max == ''
654 system_uid_max = 999
655 else
656 system_uid_max = system_uid_max.to_int()
657 endif
658 endif
659 conf.set('SYSTEM_UID_MAX', system_uid_max)
660 substs.set('systemuidmax', system_uid_max)
661
662 system_gid_max = get_option('system-gid-max')
663 if system_gid_max == -1
664 system_gid_max = run_command(
665 awk,
666 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
667 '/etc/login.defs').stdout().strip()
668 if system_gid_max == ''
669 system_gid_max = 999
670 else
671 system_gid_max = system_gid_max.to_int()
672 endif
673 endif
674 conf.set('SYSTEM_GID_MAX', system_gid_max)
675 substs.set('systemgidmax', system_gid_max)
676
677 dynamic_uid_min = get_option('dynamic-uid-min')
678 dynamic_uid_max = get_option('dynamic-uid-max')
679 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
680 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
681 substs.set('dynamicuidmin', dynamic_uid_min)
682 substs.set('dynamicuidmax', dynamic_uid_max)
683
684 container_uid_base_min = get_option('container-uid-base-min')
685 container_uid_base_max = get_option('container-uid-base-max')
686 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
687 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
688 substs.set('containeruidbasemin', container_uid_base_min)
689 substs.set('containeruidbasemax', container_uid_base_max)
690
691 nobody_user = get_option('nobody-user')
692 nobody_group = get_option('nobody-group')
693
694 if not meson.is_cross_build()
695 getent_result = run_command('getent', 'passwd', '65534')
696 if getent_result.returncode() == 0
697 name = getent_result.stdout().split(':')[0]
698 if name != nobody_user
699 warning('\n' +
700 'The local user with the UID 65534 does not match the configured user name "@0@" of the nobody user (its name is @1@).\n'.format(nobody_user, name) +
701 'Your build will result in an user table setup that is incompatible with the local system.')
702 endif
703 endif
704 id_result = run_command('id', '-u', nobody_user)
705 if id_result.returncode() == 0
706 id = id_result.stdout().to_int()
707 if id != 65534
708 warning('\n' +
709 'The local user with the configured user name "@0@" of the nobody user does not have UID 65534 (it has @1@).\n'.format(nobody_user, id) +
710 'Your build will result in an user table setup that is incompatible with the local system.')
711 endif
712 endif
713
714 getent_result = run_command('getent', 'group', '65534')
715 if getent_result.returncode() == 0
716 name = getent_result.stdout().split(':')[0]
717 if name != nobody_group
718 warning('\n' +
719 'The local group with the GID 65534 does not match the configured group name "@0@" of the nobody group (its name is @1@).\n'.format(nobody_group, name) +
720 'Your build will result in an group table setup that is incompatible with the local system.')
721 endif
722 endif
723 id_result = run_command('id', '-g', nobody_group)
724 if id_result.returncode() == 0
725 id = id_result.stdout().to_int()
726 if id != 65534
727 warning('\n' +
728 'The local group with the configured group name "@0@" of the nobody group does not have UID 65534 (it has @1@).\n'.format(nobody_group, id) +
729 'Your build will result in an group table setup that is incompatible with the local system.')
730 endif
731 endif
732 endif
733 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
734 warning('\n' +
735 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
736 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
737 endif
738
739 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
740 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
741 substs.set('NOBODY_USER_NAME', nobody_user)
742 substs.set('NOBODY_GROUP_NAME', nobody_group)
743
744 tty_gid = get_option('tty-gid')
745 conf.set('TTY_GID', tty_gid)
746 substs.set('TTY_GID', tty_gid)
747
748 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
749 users_gid = get_option('users-gid')
750 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
751
752 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
753 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
754
755 dev_kvm_mode = get_option('dev-kvm-mode')
756 substs.set('DEV_KVM_MODE', dev_kvm_mode)
757 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
758 group_render_mode = get_option('group-render-mode')
759 substs.set('GROUP_RENDER_MODE', group_render_mode)
760 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
761
762 kill_user_processes = get_option('default-kill-user-processes')
763 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
764 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
765 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
766
767 dns_servers = get_option('dns-servers')
768 conf.set_quoted('DNS_SERVERS', dns_servers)
769 substs.set('DNS_SERVERS', dns_servers)
770
771 ntp_servers = get_option('ntp-servers')
772 conf.set_quoted('NTP_SERVERS', ntp_servers)
773 substs.set('NTP_SERVERS', ntp_servers)
774
775 default_locale = get_option('default-locale')
776 if default_locale == ''
777 if not meson.is_cross_build()
778 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
779 default_locale = run_command(choose_default_locale_sh).stdout().strip()
780 else
781 default_locale = 'C.UTF-8'
782 endif
783 endif
784 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
785
786 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
787
788 substs.set('SUSHELL', get_option('debug-shell'))
789 substs.set('DEBUGTTY', get_option('debug-tty'))
790 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
791
792 enable_debug_hashmap = false
793 enable_debug_mmap_cache = false
794 enable_debug_siphash = false
795 foreach name : get_option('debug-extra')
796 if name == 'hashmap'
797 enable_debug_hashmap = true
798 elif name == 'mmap-cache'
799 enable_debug_mmap_cache = true
800 elif name == 'siphash'
801 enable_debug_siphash = true
802 else
803 message('unknown debug option "@0@", ignoring'.format(name))
804 endif
805 endforeach
806 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
807 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
808 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
809
810 conf.set10('VALGRIND', get_option('valgrind'))
811 conf.set10('LOG_TRACE', get_option('log-trace'))
812
813 #####################################################################
814
815 threads = dependency('threads')
816 librt = cc.find_library('rt')
817 libm = cc.find_library('m')
818 libdl = cc.find_library('dl')
819 libcrypt = cc.find_library('crypt')
820
821 libcap = dependency('libcap', required : false)
822 if not libcap.found()
823 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
824 libcap = cc.find_library('cap')
825 endif
826
827 libmount = dependency('mount',
828 version : fuzzer_build ? '>= 0' : '>= 2.30')
829
830 want_seccomp = get_option('seccomp')
831 if want_seccomp != 'false' and not skip_deps
832 libseccomp = dependency('libseccomp',
833 version : '>= 2.3.1',
834 required : want_seccomp == 'true')
835 have = libseccomp.found()
836 else
837 have = false
838 libseccomp = []
839 endif
840 conf.set10('HAVE_SECCOMP', have)
841
842 want_selinux = get_option('selinux')
843 if want_selinux != 'false' and not skip_deps
844 libselinux = dependency('libselinux',
845 version : '>= 2.1.9',
846 required : want_selinux == 'true')
847 have = libselinux.found()
848 else
849 have = false
850 libselinux = []
851 endif
852 conf.set10('HAVE_SELINUX', have)
853
854 want_apparmor = get_option('apparmor')
855 if want_apparmor != 'false' and not skip_deps
856 libapparmor = dependency('libapparmor',
857 required : want_apparmor == 'true')
858 have = libapparmor.found()
859 else
860 have = false
861 libapparmor = []
862 endif
863 conf.set10('HAVE_APPARMOR', have)
864
865 smack_run_label = get_option('smack-run-label')
866 if smack_run_label != ''
867 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
868 endif
869
870 want_polkit = get_option('polkit')
871 install_polkit = false
872 install_polkit_pkla = false
873 if want_polkit != 'false' and not skip_deps
874 install_polkit = true
875
876 libpolkit = dependency('polkit-gobject-1',
877 required : false)
878 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
879 message('Old polkit detected, will install pkla files')
880 install_polkit_pkla = true
881 endif
882 endif
883 conf.set10('ENABLE_POLKIT', install_polkit)
884
885 want_acl = get_option('acl')
886 if want_acl != 'false' and not skip_deps
887 libacl = cc.find_library('acl', required : want_acl == 'true')
888 have = libacl.found()
889 else
890 have = false
891 libacl = []
892 endif
893 conf.set10('HAVE_ACL', have)
894
895 want_audit = get_option('audit')
896 if want_audit != 'false' and not skip_deps
897 libaudit = dependency('audit', required : want_audit == 'true')
898 have = libaudit.found()
899 else
900 have = false
901 libaudit = []
902 endif
903 conf.set10('HAVE_AUDIT', have)
904
905 want_blkid = get_option('blkid')
906 if want_blkid != 'false' and not skip_deps
907 libblkid = dependency('blkid', required : want_blkid == 'true')
908 have = libblkid.found()
909 else
910 have = false
911 libblkid = []
912 endif
913 conf.set10('HAVE_BLKID', have)
914
915 want_kmod = get_option('kmod')
916 if want_kmod != 'false' and not skip_deps
917 libkmod = dependency('libkmod',
918 version : '>= 15',
919 required : want_kmod == 'true')
920 have = libkmod.found()
921 else
922 have = false
923 libkmod = []
924 endif
925 conf.set10('HAVE_KMOD', have)
926
927 want_pam = get_option('pam')
928 if want_pam != 'false' and not skip_deps
929 libpam = cc.find_library('pam', required : want_pam == 'true')
930 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
931 have = libpam.found() and libpam_misc.found()
932 else
933 have = false
934 libpam = []
935 libpam_misc = []
936 endif
937 conf.set10('HAVE_PAM', have)
938
939 want_microhttpd = get_option('microhttpd')
940 if want_microhttpd != 'false' and not skip_deps
941 libmicrohttpd = dependency('libmicrohttpd',
942 version : '>= 0.9.33',
943 required : want_microhttpd == 'true')
944 have = libmicrohttpd.found()
945 else
946 have = false
947 libmicrohttpd = []
948 endif
949 conf.set10('HAVE_MICROHTTPD', have)
950
951 want_libcryptsetup = get_option('libcryptsetup')
952 if want_libcryptsetup != 'false' and not skip_deps
953 libcryptsetup = dependency('libcryptsetup',
954 version : '>= 1.6.0',
955 required : want_libcryptsetup == 'true')
956 have = libcryptsetup.found()
957 have_sector = cc.has_member(
958 'struct crypt_params_plain',
959 'sector_size',
960 prefix : '#include <libcryptsetup.h>')
961 else
962 have = false
963 have_sector = false
964 libcryptsetup = []
965 endif
966 conf.set10('HAVE_LIBCRYPTSETUP', have)
967 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
968
969 want_libcurl = get_option('libcurl')
970 if want_libcurl != 'false' and not skip_deps
971 libcurl = dependency('libcurl',
972 version : '>= 7.32.0',
973 required : want_libcurl == 'true')
974 have = libcurl.found()
975 else
976 have = false
977 libcurl = []
978 endif
979 conf.set10('HAVE_LIBCURL', have)
980
981 want_libidn = get_option('libidn')
982 want_libidn2 = get_option('libidn2')
983 if want_libidn == 'true' and want_libidn2 == 'true'
984 error('libidn and libidn2 cannot be requested simultaneously')
985 endif
986
987 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
988 libidn = dependency('libidn2',
989 required : want_libidn2 == 'true')
990 have = libidn.found()
991 else
992 have = false
993 libidn = []
994 endif
995 conf.set10('HAVE_LIBIDN2', have)
996 if not have and want_libidn != 'false' and not skip_deps
997 # libidn is used for both libidn and libidn2 objects
998 libidn = dependency('libidn',
999 required : want_libidn == 'true')
1000 have = libidn.found()
1001 else
1002 have = false
1003 endif
1004 conf.set10('HAVE_LIBIDN', have)
1005
1006 want_libiptc = get_option('libiptc')
1007 if want_libiptc != 'false' and not skip_deps
1008 libiptc = dependency('libiptc',
1009 required : want_libiptc == 'true')
1010 have = libiptc.found()
1011 else
1012 have = false
1013 libiptc = []
1014 endif
1015 conf.set10('HAVE_LIBIPTC', have)
1016
1017 want_qrencode = get_option('qrencode')
1018 if want_qrencode != 'false' and not skip_deps
1019 libqrencode = dependency('libqrencode',
1020 required : want_qrencode == 'true')
1021 have = libqrencode.found()
1022 else
1023 have = false
1024 libqrencode = []
1025 endif
1026 conf.set10('HAVE_QRENCODE', have)
1027
1028 want_gcrypt = get_option('gcrypt')
1029 if want_gcrypt != 'false' and not skip_deps
1030 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1031 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1032 have = libgcrypt.found() and libgpg_error.found()
1033 else
1034 have = false
1035 endif
1036 if not have
1037 # link to neither of the libs if one is not found
1038 libgcrypt = []
1039 libgpg_error = []
1040 endif
1041 conf.set10('HAVE_GCRYPT', have)
1042
1043 want_gnutls = get_option('gnutls')
1044 if want_gnutls != 'false' and not skip_deps
1045 libgnutls = dependency('gnutls',
1046 version : '>= 3.1.4',
1047 required : want_gnutls == 'true')
1048 have = libgnutls.found()
1049 else
1050 have = false
1051 libgnutls = []
1052 endif
1053 conf.set10('HAVE_GNUTLS', have)
1054
1055 want_openssl = get_option('openssl')
1056 if want_openssl != 'false' and not skip_deps
1057 libopenssl = dependency('openssl',
1058 version : '>= 1.1.0',
1059 required : want_openssl == 'true')
1060 have = libopenssl.found()
1061 else
1062 have = false
1063 libopenssl = []
1064 endif
1065 conf.set10('HAVE_OPENSSL', have)
1066
1067 want_elfutils = get_option('elfutils')
1068 if want_elfutils != 'false' and not skip_deps
1069 libdw = dependency('libdw',
1070 required : want_elfutils == 'true')
1071 have = libdw.found()
1072 else
1073 have = false
1074 libdw = []
1075 endif
1076 conf.set10('HAVE_ELFUTILS', have)
1077
1078 want_zlib = get_option('zlib')
1079 if want_zlib != 'false' and not skip_deps
1080 libz = dependency('zlib',
1081 required : want_zlib == 'true')
1082 have = libz.found()
1083 else
1084 have = false
1085 libz = []
1086 endif
1087 conf.set10('HAVE_ZLIB', have)
1088
1089 want_bzip2 = get_option('bzip2')
1090 if want_bzip2 != 'false' and not skip_deps
1091 libbzip2 = cc.find_library('bz2',
1092 required : want_bzip2 == 'true')
1093 have = libbzip2.found()
1094 else
1095 have = false
1096 libbzip2 = []
1097 endif
1098 conf.set10('HAVE_BZIP2', have)
1099
1100 want_xz = get_option('xz')
1101 if want_xz != 'false' and not skip_deps
1102 libxz = dependency('liblzma',
1103 required : want_xz == 'true')
1104 have = libxz.found()
1105 else
1106 have = false
1107 libxz = []
1108 endif
1109 conf.set10('HAVE_XZ', have)
1110
1111 want_lz4 = get_option('lz4')
1112 if want_lz4 != 'false' and not skip_deps
1113 liblz4 = dependency('liblz4',
1114 version : '>= 1.3.0',
1115 required : want_lz4 == 'true')
1116 have = liblz4.found()
1117 else
1118 have = false
1119 liblz4 = []
1120 endif
1121 conf.set10('HAVE_LZ4', have)
1122
1123 want_xkbcommon = get_option('xkbcommon')
1124 if want_xkbcommon != 'false' and not skip_deps
1125 libxkbcommon = dependency('xkbcommon',
1126 version : '>= 0.3.0',
1127 required : want_xkbcommon == 'true')
1128 have = libxkbcommon.found()
1129 else
1130 have = false
1131 libxkbcommon = []
1132 endif
1133 conf.set10('HAVE_XKBCOMMON', have)
1134
1135 want_pcre2 = get_option('pcre2')
1136 if want_pcre2 != 'false'
1137 libpcre2 = dependency('libpcre2-8',
1138 required : want_pcre2 == 'true')
1139 have = libpcre2.found()
1140 else
1141 have = false
1142 libpcre2 = []
1143 endif
1144 conf.set10('HAVE_PCRE2', have)
1145
1146 want_glib = get_option('glib')
1147 if want_glib != 'false' and not skip_deps
1148 libglib = dependency('glib-2.0',
1149 version : '>= 2.22.0',
1150 required : want_glib == 'true')
1151 libgobject = dependency('gobject-2.0',
1152 version : '>= 2.22.0',
1153 required : want_glib == 'true')
1154 libgio = dependency('gio-2.0',
1155 required : want_glib == 'true')
1156 have = libglib.found() and libgobject.found() and libgio.found()
1157 else
1158 have = false
1159 libglib = []
1160 libgobject = []
1161 libgio = []
1162 endif
1163 conf.set10('HAVE_GLIB', have)
1164
1165 want_dbus = get_option('dbus')
1166 if want_dbus != 'false' and not skip_deps
1167 libdbus = dependency('dbus-1',
1168 version : '>= 1.3.2',
1169 required : want_dbus == 'true')
1170 have = libdbus.found()
1171 else
1172 have = false
1173 libdbus = []
1174 endif
1175 conf.set10('HAVE_DBUS', have)
1176
1177 default_dnssec = get_option('default-dnssec')
1178 if skip_deps
1179 default_dnssec = 'no'
1180 endif
1181 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1182 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1183 default_dnssec = 'no'
1184 endif
1185 conf.set('DEFAULT_DNSSEC_MODE',
1186 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1187 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1188
1189 dns_over_tls = get_option('dns-over-tls')
1190 if dns_over_tls != 'false'
1191 if dns_over_tls == 'openssl'
1192 have_gnutls = false
1193 else
1194 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1195 if dns_over_tls == 'gnutls' and not have_gnutls
1196 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1197 endif
1198 endif
1199 if dns_over_tls == 'gnutls' or have_gnutls
1200 have_openssl = false
1201 else
1202 have_openssl = conf.get('HAVE_OPENSSL') == 1
1203 if dns_over_tls != 'auto' and not have_openssl
1204 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1205 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1206 endif
1207 endif
1208 have = have_gnutls or have_openssl
1209 else
1210 have = false
1211 have_gnutls = false
1212 have_openssl = false
1213 endif
1214 conf.set10('ENABLE_DNS_OVER_TLS', have)
1215 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1216 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1217
1218 default_dns_over_tls = get_option('default-dns-over-tls')
1219 if skip_deps
1220 default_dns_over_tls = 'no'
1221 endif
1222 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1223 message('default-dns-over-tls cannot be enabled or set to opportunistic when DNS-over-TLS support is disabled. Setting default-dns-over-tls to no.')
1224 default_dns_over_tls = 'no'
1225 endif
1226 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1227 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1228 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1229
1230 want_importd = get_option('importd')
1231 if want_importd != 'false'
1232 have = (conf.get('HAVE_LIBCURL') == 1 and
1233 conf.get('HAVE_ZLIB') == 1 and
1234 conf.get('HAVE_XZ') == 1 and
1235 conf.get('HAVE_GCRYPT') == 1)
1236 if want_importd == 'true' and not have
1237 error('importd support was requested, but dependencies are not available')
1238 endif
1239 else
1240 have = false
1241 endif
1242 conf.set10('ENABLE_IMPORTD', have)
1243
1244 want_remote = get_option('remote')
1245 if want_remote != 'false'
1246 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1247 conf.get('HAVE_LIBCURL') == 1]
1248 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1249 # it's possible to build one without the other. Complain only if
1250 # support was explicitly requested. The auxiliary files like sysusers
1251 # config should be installed when any of the programs are built.
1252 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1253 error('remote support was requested, but dependencies are not available')
1254 endif
1255 have = have_deps[0] or have_deps[1]
1256 else
1257 have = false
1258 endif
1259 conf.set10('ENABLE_REMOTE', have)
1260
1261 foreach term : ['utmp',
1262 'hibernate',
1263 'environment-d',
1264 'binfmt',
1265 'coredump',
1266 'resolve',
1267 'logind',
1268 'hostnamed',
1269 'localed',
1270 'machined',
1271 'portabled',
1272 'networkd',
1273 'timedated',
1274 'timesyncd',
1275 'firstboot',
1276 'randomseed',
1277 'backlight',
1278 'vconsole',
1279 'quotacheck',
1280 'sysusers',
1281 'tmpfiles',
1282 'hwdb',
1283 'rfkill',
1284 'ldconfig',
1285 'efi',
1286 'tpm',
1287 'ima',
1288 'smack',
1289 'gshadow',
1290 'idn',
1291 'nss-myhostname',
1292 'nss-systemd']
1293 have = get_option(term)
1294 name = 'ENABLE_' + term.underscorify().to_upper()
1295 conf.set10(name, have)
1296 endforeach
1297
1298 foreach tuple : [['nss-mymachines', 'machined'],
1299 ['nss-resolve', 'resolve']]
1300 want = get_option(tuple[0])
1301 if want != 'false'
1302 have = get_option(tuple[1])
1303 if want == 'true' and not have
1304 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1305 endif
1306 else
1307 have = false
1308 endif
1309 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1310 conf.set10(name, have)
1311 endforeach
1312
1313 enable_nss = false
1314 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1315 'ENABLE_NSS_MYMACHINES',
1316 'ENABLE_NSS_RESOLVE',
1317 'ENABLE_NSS_SYSTEMD']
1318 if conf.get(term) == 1
1319 enable_nss = true
1320 endif
1321 endforeach
1322 conf.set10('ENABLE_NSS', enable_nss)
1323
1324 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1325
1326 tests = []
1327 fuzzers = []
1328
1329 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1330
1331 #####################################################################
1332
1333 if get_option('efi')
1334 efi_arch = host_machine.cpu_family()
1335
1336 if efi_arch == 'x86'
1337 EFI_MACHINE_TYPE_NAME = 'ia32'
1338 gnu_efi_arch = 'ia32'
1339 elif efi_arch == 'x86_64'
1340 EFI_MACHINE_TYPE_NAME = 'x64'
1341 gnu_efi_arch = 'x86_64'
1342 elif efi_arch == 'arm'
1343 EFI_MACHINE_TYPE_NAME = 'arm'
1344 gnu_efi_arch = 'arm'
1345 elif efi_arch == 'aarch64'
1346 EFI_MACHINE_TYPE_NAME = 'aa64'
1347 gnu_efi_arch = 'aarch64'
1348 else
1349 EFI_MACHINE_TYPE_NAME = ''
1350 gnu_efi_arch = ''
1351 endif
1352
1353 have = true
1354 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1355
1356 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1357 else
1358 have = false
1359 endif
1360 conf.set10('ENABLE_EFI', have)
1361
1362 #####################################################################
1363
1364 config_h = configure_file(
1365 output : 'config.h',
1366 configuration : conf)
1367
1368 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1369
1370 includes = include_directories('src/basic',
1371 'src/boot',
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 ['valgrind', conf.get('VALGRIND') == 1],
3199 ['trace logging', conf.get('LOG_TRACE') == 1],
3200 ['link-udev-shared', get_option('link-udev-shared')],
3201 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3202 ]
3203
3204 if tuple.length() >= 2
3205 cond = tuple[1]
3206 else
3207 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3208 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3209 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3210 endif
3211 if cond
3212 found += tuple[0]
3213 else
3214 missing += tuple[0]
3215 endif
3216 endforeach
3217
3218 status += [
3219 '',
3220 'enabled features: @0@'.format(', '.join(found)),
3221 '',
3222 'disabled features: @0@'.format(', '.join(missing)),
3223 '']
3224 message('\n '.join(status))
3225
3226 if rootprefixdir != rootprefix_default
3227 warning('\n' +
3228 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3229 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3230 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
3231 endif