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