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