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