]> git.ipfire.org Git - thirdparty/systemd.git/blob - meson.build
openssl: supress warnings about functions deprecated by openssl 3.0
[thirdparty/systemd.git] / meson.build
1 # SPDX-License-Identifier: LGPL-2.1-or-later
2
3 project('systemd', 'c',
4 version : '249',
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.53.2',
14 )
15
16 libsystemd_version = '0.32.0'
17 libudev_version = '1.7.2'
18
19 conf = configuration_data()
20 conf.set_quoted('PROJECT_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
21 conf.set('PROJECT_VERSION', meson.project_version(),
22 description : 'Numerical project version (used where a simple number is expected)')
23
24 # This is to be used instead of meson.source_root(), as the latter will return
25 # the wrong result when systemd is being built as a meson subproject
26 project_source_root = meson.current_source_dir()
27 project_build_root = meson.current_build_dir()
28 relative_source_path = run_command('realpath',
29 '--relative-to=@0@'.format(project_build_root),
30 project_source_root,
31 check : true).stdout().strip()
32 conf.set_quoted('RELATIVE_SOURCE_PATH', relative_source_path)
33
34 conf.set10('BUILD_MODE_DEVELOPER', get_option('mode') == 'developer',
35 description : 'tailor build to development or release builds')
36
37 want_ossfuzz = get_option('oss-fuzz')
38 want_libfuzzer = get_option('llvm-fuzz')
39 if want_ossfuzz and want_libfuzzer
40 error('only one of oss-fuzz or llvm-fuzz can be specified')
41 endif
42
43 skip_deps = want_ossfuzz or want_libfuzzer
44 fuzzer_build = want_ossfuzz or want_libfuzzer
45
46 #####################################################################
47
48 # Try to install the git pre-commit hook
49 add_git_hook_sh = find_program('tools/add-git-hook.sh', required : false)
50 if add_git_hook_sh.found()
51 git_hook = run_command(add_git_hook_sh, check : false)
52 if git_hook.returncode() == 0
53 message(git_hook.stdout().strip())
54 endif
55 endif
56
57 #####################################################################
58
59 fs = import('fs')
60 if get_option('split-usr') == 'auto'
61 split_usr = not fs.is_symlink('/bin')
62 else
63 split_usr = get_option('split-usr') == 'true'
64 endif
65 if split_usr
66 warning('\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n\n'
67 + ' split-usr mode is going to be removed\n' +
68 '\n\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
69 endif
70 conf.set10('HAVE_SPLIT_USR', split_usr,
71 description : '/usr/bin and /bin directories are separate')
72
73 if get_option('split-bin') == 'auto'
74 split_bin = not fs.is_symlink('/usr/sbin')
75 else
76 split_bin = get_option('split-bin') == 'true'
77 endif
78 conf.set10('HAVE_SPLIT_BIN', split_bin,
79 description : 'bin and sbin directories are separate')
80
81 rootprefixdir = get_option('rootprefix')
82 # Unusual rootprefixdir values are used by some distros
83 # (see https://github.com/systemd/systemd/pull/7461).
84 rootprefix_default = split_usr ? '/' : '/usr'
85 if rootprefixdir == ''
86 rootprefixdir = rootprefix_default
87 endif
88 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
89
90 have_standalone_binaries = get_option('standalone-binaries')
91
92 sysvinit_path = get_option('sysvinit-path')
93 sysvrcnd_path = get_option('sysvrcnd-path')
94 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
95 description : 'SysV init scripts and rcN.d links are supported')
96 conf.set10('CREATE_LOG_DIRS', get_option('create-log-dirs'))
97
98 if get_option('hibernate') and not get_option('initrd')
99 error('hibernate depends on initrd')
100 endif
101
102 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
103 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
104 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
105
106 # Meson ignores the preceding arguments when joining paths if an absolute
107 # component is encountered, so this should canonicalize various paths when they
108 # are absolute or relative.
109 prefixdir = get_option('prefix')
110 if not prefixdir.startswith('/')
111 error('Prefix is not absolute: "@0@"'.format(prefixdir))
112 endif
113 if prefixdir != rootprefixdir and rootprefixdir != '/' and not prefixdir.strip('/').startswith(rootprefixdir.strip('/') + '/')
114 error('Prefix is not below root prefix (now rootprefix=@0@ prefix=@1@)'.format(
115 rootprefixdir, prefixdir))
116 endif
117
118 bindir = prefixdir / get_option('bindir')
119 libdir = prefixdir / get_option('libdir')
120 sysconfdir = prefixdir / get_option('sysconfdir')
121 includedir = prefixdir / get_option('includedir')
122 datadir = prefixdir / get_option('datadir')
123 localstatedir = '/' / get_option('localstatedir')
124
125 rootbindir = rootprefixdir / 'bin'
126 rootsbindir = rootprefixdir / (split_bin ? 'sbin' : 'bin')
127 rootlibexecdir = rootprefixdir / 'lib/systemd'
128
129 rootlibdir = get_option('rootlibdir')
130 if rootlibdir == ''
131 rootlibdir = rootprefixdir / libdir.split('/')[-1]
132 endif
133
134 install_sysconfdir = get_option('install-sysconfdir') != 'false'
135 install_sysconfdir_samples = get_option('install-sysconfdir') == 'true'
136 # Dirs of external packages
137 pkgconfigdatadir = get_option('pkgconfigdatadir') != '' ? get_option('pkgconfigdatadir') : datadir / 'pkgconfig'
138 pkgconfiglibdir = get_option('pkgconfiglibdir') != '' ? get_option('pkgconfiglibdir') : libdir / 'pkgconfig'
139 polkitpolicydir = datadir / 'polkit-1/actions'
140 polkitrulesdir = datadir / 'polkit-1/rules.d'
141 polkitpkladir = localstatedir / 'lib/polkit-1/localauthority/10-vendor.d'
142 xinitrcdir = get_option('xinitrcdir') != '' ? get_option('xinitrcdir') : sysconfdir / 'X11/xinit/xinitrc.d'
143 rpmmacrosdir = get_option('rpmmacrosdir')
144 if rpmmacrosdir != 'no'
145 rpmmacrosdir = prefixdir / rpmmacrosdir
146 endif
147 modprobedir = rootprefixdir / 'lib/modprobe.d'
148
149 # Our own paths
150 pkgdatadir = datadir / 'systemd'
151 environmentdir = prefixdir / 'lib/environment.d'
152 pkgsysconfdir = sysconfdir / 'systemd'
153 userunitdir = prefixdir / 'lib/systemd/user'
154 userpresetdir = prefixdir / 'lib/systemd/user-preset'
155 tmpfilesdir = prefixdir / 'lib/tmpfiles.d'
156 sysusersdir = prefixdir / 'lib/sysusers.d'
157 sysctldir = prefixdir / 'lib/sysctl.d'
158 binfmtdir = prefixdir / 'lib/binfmt.d'
159 modulesloaddir = prefixdir / 'lib/modules-load.d'
160 networkdir = rootprefixdir / 'lib/systemd/network'
161 pkgincludedir = includedir / 'systemd'
162 systemgeneratordir = rootlibexecdir / 'system-generators'
163 usergeneratordir = prefixdir / 'lib/systemd/user-generators'
164 systemenvgeneratordir = prefixdir / 'lib/systemd/system-environment-generators'
165 userenvgeneratordir = prefixdir / 'lib/systemd/user-environment-generators'
166 systemshutdowndir = rootlibexecdir / 'system-shutdown'
167 systemsleepdir = rootlibexecdir / 'system-sleep'
168 systemunitdir = rootprefixdir / 'lib/systemd/system'
169 systempresetdir = rootprefixdir / 'lib/systemd/system-preset'
170 udevlibexecdir = rootprefixdir / 'lib/udev'
171 udevrulesdir = udevlibexecdir / 'rules.d'
172 udevhwdbdir = udevlibexecdir / 'hwdb.d'
173 catalogdir = prefixdir / 'lib/systemd/catalog'
174 kernelinstalldir = prefixdir / 'lib/kernel/install.d'
175 factorydir = datadir / 'factory'
176 bootlibdir = prefixdir / 'lib/systemd/boot/efi'
177 testsdir = prefixdir / 'lib/systemd/tests'
178 systemdstatedir = localstatedir / 'lib/systemd'
179 catalogstatedir = systemdstatedir / 'catalog'
180 randomseeddir = localstatedir / 'lib/systemd'
181 profiledir = rootlibexecdir / 'portable' / 'profile'
182 ntpservicelistdir = rootprefixdir / 'lib/systemd/ntp-units.d'
183
184 docdir = get_option('docdir')
185 if docdir == ''
186 docdir = datadir / 'doc/systemd'
187 endif
188
189 dbuspolicydir = get_option('dbuspolicydir')
190 if dbuspolicydir == ''
191 dbuspolicydir = datadir / 'dbus-1/system.d'
192 endif
193
194 dbussessionservicedir = get_option('dbussessionservicedir')
195 if dbussessionservicedir == ''
196 dbussessionservicedir = datadir / 'dbus-1/services'
197 endif
198
199 dbussystemservicedir = get_option('dbussystemservicedir')
200 if dbussystemservicedir == ''
201 dbussystemservicedir = datadir / 'dbus-1/system-services'
202 endif
203
204 pamlibdir = get_option('pamlibdir')
205 if pamlibdir == ''
206 pamlibdir = rootlibdir / 'security'
207 endif
208
209 pamconfdir = get_option('pamconfdir')
210 if pamconfdir == ''
211 pamconfdir = prefixdir / 'lib/pam.d'
212 endif
213
214 libcryptsetup_plugins_dir = get_option('libcryptsetup-plugins-dir')
215 if libcryptsetup_plugins_dir == ''
216 libcryptsetup_plugins_dir = rootlibdir / 'cryptsetup'
217 endif
218
219 memory_accounting_default = get_option('memory-accounting-default')
220 status_unit_format_default = get_option('status-unit-format-default')
221
222 conf.set_quoted('BINFMT_DIR', binfmtdir)
223 conf.set_quoted('BOOTLIBDIR', bootlibdir)
224 conf.set_quoted('CATALOG_DATABASE', catalogstatedir / 'database')
225 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
226 conf.set_quoted('DOC_DIR', docdir)
227 conf.set_quoted('DOCUMENT_ROOT', pkgdatadir / 'gatewayd')
228 conf.set_quoted('ENVIRONMENT_DIR', environmentdir)
229 conf.set_quoted('INCLUDE_DIR', includedir)
230 conf.set_quoted('LIBDIR', libdir)
231 conf.set_quoted('MODPROBE_DIR', modprobedir)
232 conf.set_quoted('MODULESLOAD_DIR', modulesloaddir)
233 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
234 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', bindir / 'pkttyagent')
235 conf.set_quoted('PREFIX', prefixdir)
236 conf.set_quoted('RANDOM_SEED', randomseeddir / 'random-seed')
237 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
238 conf.set_quoted('RC_LOCAL_PATH', get_option('rc-local'))
239 conf.set_quoted('ROOTBINDIR', rootbindir)
240 conf.set_quoted('ROOTLIBDIR', rootlibdir)
241 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
242 conf.set_quoted('ROOTPREFIX', rootprefixdir)
243 conf.set_quoted('ROOTPREFIX_NOSLASH', rootprefixdir_noslash)
244 conf.set_quoted('SYSCONF_DIR', sysconfdir)
245 conf.set_quoted('SYSCTL_DIR', sysctldir)
246 conf.set_quoted('SYSTEMCTL_BINARY_PATH', rootbindir / 'systemctl')
247 conf.set_quoted('SYSTEMD_BINARY_PATH', rootlibexecdir / 'systemd')
248 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
249 conf.set_quoted('SYSTEMD_CGROUPS_AGENT_PATH', rootlibexecdir / 'systemd-cgroups-agent')
250 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', rootlibexecdir / 'systemd-cryptsetup')
251 conf.set_quoted('SYSTEMD_EXPORT_PATH', rootlibexecdir / 'systemd-export')
252 conf.set_quoted('SYSTEMD_FSCK_PATH', rootlibexecdir / 'systemd-fsck')
253 conf.set_quoted('SYSTEMD_GROWFS_PATH', rootlibexecdir / 'systemd-growfs')
254 conf.set_quoted('SYSTEMD_HOMEWORK_PATH', rootlibexecdir / 'systemd-homework')
255 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', rootlibexecdir / 'systemd-import-fs')
256 conf.set_quoted('SYSTEMD_IMPORT_PATH', rootlibexecdir / 'systemd-import')
257 conf.set_quoted('SYSTEMD_INTEGRITYSETUP_PATH', rootlibexecdir / 'systemd-integritysetup')
258 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', pkgdatadir / 'kbd-model-map')
259 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', pkgdatadir / 'language-fallback-map')
260 conf.set_quoted('SYSTEMD_MAKEFS_PATH', rootlibexecdir / 'systemd-makefs')
261 conf.set_quoted('SYSTEMD_PULL_PATH', rootlibexecdir / 'systemd-pull')
262 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', rootlibexecdir / 'systemd-shutdown')
263 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', bindir / 'systemd-stdio-bridge')
264 conf.set_quoted('SYSTEMD_TEST_DATA', testsdir / 'testdata')
265 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', rootbindir / 'systemd-tty-ask-password-agent')
266 conf.set_quoted('SYSTEMD_UPDATE_HELPER_PATH', rootlibexecdir / 'systemd-update-helper')
267 conf.set_quoted('SYSTEMD_USERWORK_PATH', rootlibexecdir / 'systemd-userwork')
268 conf.set_quoted('SYSTEMD_VERITYSETUP_PATH', rootlibexecdir / 'systemd-veritysetup')
269 conf.set_quoted('SYSTEM_CONFIG_UNIT_DIR', pkgsysconfdir / 'system')
270 conf.set_quoted('SYSTEM_DATA_UNIT_DIR', systemunitdir)
271 conf.set_quoted('SYSTEM_ENV_GENERATOR_DIR', systemenvgeneratordir)
272 conf.set_quoted('SYSTEM_GENERATOR_DIR', systemgeneratordir)
273 conf.set_quoted('SYSTEM_PRESET_DIR', systempresetdir)
274 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
275 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
276 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
277 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
278 conf.set_quoted('SYSUSERS_DIR', sysusersdir)
279 conf.set_quoted('TMPFILES_DIR', tmpfilesdir)
280 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
281 conf.set_quoted('UDEV_HWDB_DIR', udevhwdbdir)
282 conf.set_quoted('UDEV_RULES_DIR', udevrulesdir)
283 conf.set_quoted('UPDATE_HELPER_USER_TIMEOUT', get_option('update-helper-user-timeout'))
284 conf.set_quoted('USER_CONFIG_UNIT_DIR', pkgsysconfdir / 'user')
285 conf.set_quoted('USER_DATA_UNIT_DIR', userunitdir)
286 conf.set_quoted('USER_ENV_GENERATOR_DIR', userenvgeneratordir)
287 conf.set_quoted('USER_GENERATOR_DIR', usergeneratordir)
288 conf.set_quoted('USER_KEYRING_PATH', pkgsysconfdir / 'import-pubring.gpg')
289 conf.set_quoted('USER_PRESET_DIR', userpresetdir)
290 conf.set_quoted('VENDOR_KEYRING_PATH', rootlibexecdir / 'import-pubring.gpg')
291
292 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
293 conf.set10('ENABLE_URLIFY', get_option('urlify'))
294 conf.set10('ENABLE_FEXECVE', get_option('fexecve'))
295 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
296 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
297 conf.set_quoted('STATUS_UNIT_FORMAT_DEFAULT_STR', status_unit_format_default)
298
299 #####################################################################
300
301 cc = meson.get_compiler('c')
302 pkgconfig = import('pkgconfig')
303 check_compilation_sh = find_program('tools/check-compilation.sh')
304 meson_build_sh = find_program('tools/meson-build.sh')
305
306 want_tests = get_option('tests')
307 slow_tests = want_tests != 'false' and get_option('slow-tests')
308 fuzz_tests = want_tests != 'false' and get_option('fuzz-tests')
309 install_tests = get_option('install-tests')
310
311 if add_languages('cpp', required : fuzzer_build)
312 # Used only for tests
313 cxx = meson.get_compiler('cpp')
314 cxx_cmd = ' '.join(cxx.cmd_array())
315 else
316 cxx_cmd = ''
317 endif
318
319 if want_libfuzzer
320 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
321 if fuzzing_engine.found()
322 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
323 elif cc.has_argument('-fsanitize=fuzzer-no-link')
324 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
325 else
326 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
327 endif
328 elif want_ossfuzz
329 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
330 endif
331
332 # Those generate many false positives, and we do not want to change the code to
333 # avoid them.
334 basic_disabled_warnings = [
335 '-Wno-format-signedness',
336 '-Wno-missing-field-initializers',
337 '-Wno-unused-parameter',
338 ]
339
340 possible_common_cc_flags = [
341 '-Wdate-time',
342 '-Wendif-labels',
343 '-Werror=format=2',
344 '-Werror=implicit-function-declaration',
345 '-Werror=incompatible-pointer-types',
346 '-Werror=int-conversion',
347 '-Werror=overflow',
348 '-Werror=override-init',
349 '-Werror=return-type',
350 '-Werror=shift-count-overflow',
351 '-Werror=shift-overflow=2',
352 '-Werror=undef',
353 '-Wfloat-equal',
354 '-Wimplicit-fallthrough=5',
355 '-Winit-self',
356 '-Wlogical-op',
357 '-Wmissing-include-dirs',
358 '-Wmissing-noreturn',
359 '-Wnested-externs',
360 '-Wold-style-definition',
361 '-Wpointer-arith',
362 '-Wredundant-decls',
363 '-Wshadow',
364 '-Wstrict-aliasing=2',
365 '-Wstrict-prototypes',
366 '-Wsuggest-attribute=noreturn',
367 '-Wunused-function',
368 '-Wwrite-strings',
369
370 # negative arguments are correctly detected starting with meson 0.46.
371 '-Wno-error=#warnings', # clang
372 '-Wno-string-plus-int', # clang
373 ]
374
375 # Disable -Wmaybe-unitialized when compiling with -Os/-O1/-O3/etc. There are
376 # too many false positives with gcc >= 8. Effectively, we only test with -O0
377 # and -O2; this should be enough to catch most important cases without too much
378 # busywork. See https://github.com/systemd/systemd/pull/19226.
379 if cc.get_id() == 'gcc' and (not '02'.contains(get_option('optimization')) or
380 cc.version().version_compare('<10'))
381 possible_common_cc_flags += '-Wno-maybe-uninitialized'
382 endif
383
384 # Disable -Wno-unused-result with gcc, see
385 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66425.
386 if cc.get_id() == 'gcc'
387 possible_common_cc_flags += '-Wno-unused-result'
388 endif
389
390 # --as-needed and --no-undefined are provided by meson by default,
391 # run 'meson configure' to see what is enabled
392 possible_link_flags = [
393 '-Wl,--fatal-warnings',
394 '-Wl,-z,now',
395 '-Wl,-z,relro',
396 '-fstack-protector',
397 ]
398
399 if get_option('b_sanitize') == 'none'
400 possible_link_flags += '-Wl,--warn-common'
401 endif
402
403 if cc.get_id() == 'clang'
404 possible_common_cc_flags += [
405 '-Wno-typedef-redefinition',
406 '-Wno-gnu-variable-sized-type-not-at-end',
407 ]
408 endif
409
410 possible_cc_flags = possible_common_cc_flags + [
411 '-Werror=missing-declarations',
412 '-Werror=missing-prototypes',
413 '-fdiagnostics-show-option',
414 '-fno-common',
415 '-fno-strict-aliasing',
416 '-fstack-protector',
417 '-fstack-protector-strong',
418 '-fvisibility=hidden',
419 '--param=ssp-buffer-size=4',
420 ]
421
422 if get_option('buildtype') != 'debug'
423 possible_cc_flags += [
424 '-ffunction-sections',
425 '-fdata-sections',
426 ]
427
428 possible_link_flags += '-Wl,--gc-sections'
429 endif
430
431 add_project_arguments(cc.get_supported_arguments(basic_disabled_warnings), language : 'c')
432 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
433 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
434
435 have = cc.has_argument('-Wzero-length-bounds')
436 conf.set10('HAVE_ZERO_LENGTH_BOUNDS', have)
437
438 if cc.compiles('''
439 #include <time.h>
440 #include <inttypes.h>
441 typedef uint64_t usec_t;
442 usec_t now(clockid_t clock);
443 int main(void) {
444 struct timespec now;
445 return 0;
446 }
447 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
448 add_project_arguments('-Werror=shadow', language : 'c')
449 endif
450
451 if cxx_cmd != ''
452 add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp')
453 endif
454
455 cpp = ' '.join(cc.cmd_array()) + ' -E'
456
457 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
458
459 #####################################################################
460 # compilation result tests
461
462 conf.set('_GNU_SOURCE', true)
463 conf.set('__SANE_USERSPACE_TYPES__', true)
464 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
465
466 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
467 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
468 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
469 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
470
471 decl_headers = '''
472 #include <uchar.h>
473 #include <sys/mount.h>
474 #include <sys/stat.h>
475 #include <linux/fs.h>
476 '''
477
478 foreach decl : ['char16_t',
479 'char32_t',
480 'struct mount_attr',
481 'struct statx',
482 ]
483
484 # We get -1 if the size cannot be determined
485 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
486
487 if decl == 'struct statx'
488 if have
489 want_linux_stat_h = false
490 else
491 have = cc.sizeof(decl,
492 prefix : decl_headers + '#include <linux/stat.h>',
493 args : '-D_GNU_SOURCE') > 0
494 want_linux_stat_h = have
495 endif
496 endif
497
498 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
499 endforeach
500
501 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
502
503 foreach ident : ['secure_getenv', '__secure_getenv']
504 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
505 endforeach
506
507 foreach ident : [
508 ['memfd_create', '''#include <sys/mman.h>'''],
509 ['gettid', '''#include <sys/types.h>
510 #include <unistd.h>'''],
511 ['pivot_root', '''#include <stdlib.h>
512 #include <unistd.h>'''], # no known header declares pivot_root
513 ['ioprio_get', '''#include <sched.h>'''], # no known header declares ioprio_get
514 ['ioprio_set', '''#include <sched.h>'''], # no known header declares ioprio_set
515 ['name_to_handle_at', '''#include <sys/types.h>
516 #include <sys/stat.h>
517 #include <fcntl.h>'''],
518 ['setns', '''#include <sched.h>'''],
519 ['renameat2', '''#include <stdio.h>
520 #include <fcntl.h>'''],
521 ['kcmp', '''#include <linux/kcmp.h>'''],
522 ['keyctl', '''#include <sys/types.h>
523 #include <keyutils.h>'''],
524 ['copy_file_range', '''#include <sys/syscall.h>
525 #include <unistd.h>'''],
526 ['bpf', '''#include <sys/syscall.h>
527 #include <unistd.h>'''],
528 ['statx', '''#include <sys/types.h>
529 #include <sys/stat.h>
530 #include <unistd.h>'''],
531 ['explicit_bzero' , '''#include <string.h>'''],
532 ['reallocarray', '''#include <stdlib.h>'''],
533 ['set_mempolicy', '''#include <stdlib.h>
534 #include <unistd.h>'''],
535 ['get_mempolicy', '''#include <stdlib.h>
536 #include <unistd.h>'''],
537 ['pidfd_send_signal', '''#include <stdlib.h>
538 #include <unistd.h>
539 #include <signal.h>
540 #include <sys/wait.h>'''],
541 ['pidfd_open', '''#include <stdlib.h>
542 #include <unistd.h>
543 #include <signal.h>
544 #include <sys/wait.h>'''],
545 ['rt_sigqueueinfo', '''#include <stdlib.h>
546 #include <unistd.h>
547 #include <signal.h>
548 #include <sys/wait.h>'''],
549 ['mallinfo', '''#include <malloc.h>'''],
550 ['mallinfo2', '''#include <malloc.h>'''],
551 ['execveat', '''#include <unistd.h>'''],
552 ['close_range', '''#include <unistd.h>'''],
553 ['epoll_pwait2', '''#include <sys/epoll.h>'''],
554 ['mount_setattr', '''#include <sys/mount.h>'''],
555 ['move_mount', '''#include <sys/mount.h>'''],
556 ['open_tree', '''#include <sys/mount.h>'''],
557 ['getdents64', '''#include <dirent.h>'''],
558 ]
559
560 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
561 conf.set10('HAVE_' + ident[0].to_upper(), have)
562 endforeach
563
564 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
565 conf.set10('USE_SYS_RANDOM_H', true)
566 conf.set10('HAVE_GETRANDOM', true)
567 else
568 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
569 conf.set10('USE_SYS_RANDOM_H', false)
570 conf.set10('HAVE_GETRANDOM', have)
571 endif
572
573 #####################################################################
574
575 version_tag = get_option('version-tag')
576 if version_tag != ''
577 vcs_data = configuration_data()
578 vcs_data.set('VCS_TAG', version_tag)
579 version_h = configure_file(configuration : vcs_data,
580 input : 'src/version/version.h.in',
581 output : 'version.h')
582 else
583 vcs_tagger = [
584 project_source_root + '/tools/meson-vcs-tag.sh',
585 project_source_root,
586 meson.project_version()]
587
588 version_h = vcs_tag(
589 input : 'src/version/version.h.in',
590 output : 'version.h',
591 command: vcs_tagger)
592 endif
593
594 versiondep = declare_dependency(sources: version_h)
595
596 sh = find_program('sh')
597 echo = find_program('echo')
598 sed = find_program('sed')
599 awk = find_program('awk')
600 stat = find_program('stat')
601 ln = find_program('ln')
602 git = find_program('git', required : false)
603 env = find_program('env')
604 perl = find_program('perl', required : false)
605 rsync = find_program('rsync', required : false)
606 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
607 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
608
609 mkdir_p = 'mkdir -p $DESTDIR/@0@'
610 splash_bmp = files('test/splash.bmp')
611
612 # If -Dxxx-path option is found, use that. Otherwise, check in $PATH,
613 # /usr/sbin, /sbin, and fall back to the default from middle column.
614 progs = [['quotaon', '/usr/sbin/quotaon' ],
615 ['quotacheck', '/usr/sbin/quotacheck' ],
616 ['kmod', '/usr/bin/kmod' ],
617 ['kexec', '/usr/sbin/kexec' ],
618 ['sulogin', '/usr/sbin/sulogin' ],
619 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
620 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
621 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
622 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
623 ['nologin', '/usr/sbin/nologin', ],
624 ]
625 foreach prog : progs
626 path = get_option(prog[0] + '-path')
627 if path != ''
628 message('Using @1@ for @0@'.format(prog[0], path))
629 else
630 exe = find_program(prog[0],
631 '/usr/sbin/' + prog[0],
632 '/sbin/' + prog[0],
633 required: false)
634 path = exe.found() ? exe.path() : prog[1]
635 endif
636 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
637 conf.set_quoted(name, path)
638 endforeach
639
640 conf.set_quoted('TELINIT', get_option('telinit-path'))
641
642 if run_command(ln, '--relative', '--help', check : false).returncode() != 0
643 error('ln does not support --relative (added in coreutils 8.16)')
644 endif
645
646 ############################################################
647
648 if run_command('python3', '-c', 'import jinja2', check : false).returncode() != 0
649 error('python3 jinja2 missing')
650 endif
651
652 ############################################################
653
654 gperf = find_program('gperf')
655
656 gperf_test_format = '''
657 #include <string.h>
658 const char * in_word_set(const char *, @0@);
659 @1@
660 '''
661 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
662 gperf_snippet = run_command(sh, '-c', gperf_snippet_format.format(gperf.path()),
663 check : true)
664 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
665 if cc.compiles(gperf_test)
666 gperf_len_type = 'size_t'
667 else
668 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
669 if cc.compiles(gperf_test)
670 gperf_len_type = 'unsigned'
671 else
672 error('unable to determine gperf len type')
673 endif
674 endif
675 message('gperf len type is @0@'.format(gperf_len_type))
676 conf.set('GPERF_LEN_TYPE', gperf_len_type,
677 description : 'The type of gperf "len" parameter')
678
679 ############################################################
680
681 if not cc.has_header('sys/capability.h')
682 error('POSIX caps headers not found')
683 endif
684 foreach header : ['crypt.h',
685 'linux/memfd.h',
686 'linux/vm_sockets.h',
687 'sys/auxv.h',
688 'valgrind/memcheck.h',
689 'valgrind/valgrind.h',
690 'linux/time_types.h',
691 'sys/sdt.h',
692 ]
693
694 conf.set10('HAVE_' + header.underscorify().to_upper(),
695 cc.has_header(header))
696 endforeach
697
698 ############################################################
699
700 fallback_hostname = get_option('fallback-hostname')
701 if fallback_hostname == '' or fallback_hostname[0] == '.' or fallback_hostname[0] == '-'
702 error('Invalid fallback-hostname configuration')
703 # A more extensive test is done in test-hostname-util. Let's catch
704 # the most obvious errors here so we don't fail with an assert later.
705 endif
706 conf.set_quoted('FALLBACK_HOSTNAME', fallback_hostname)
707
708 default_hierarchy = get_option('default-hierarchy')
709 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
710 description : 'default cgroup hierarchy as string')
711 if default_hierarchy == 'legacy'
712 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
713 elif default_hierarchy == 'hybrid'
714 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
715 else
716 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
717 endif
718
719 extra_net_naming_schemes = []
720 extra_net_naming_map = []
721 foreach scheme: get_option('extra-net-naming-schemes').split(',')
722 if scheme != ''
723 name = scheme.split('=')[0]
724 value = scheme.split('=')[1]
725 NAME = name.underscorify().to_upper()
726 VALUE = []
727 foreach field: value.split('+')
728 VALUE += 'NAMING_' + field.underscorify().to_upper()
729 endforeach
730 extra_net_naming_schemes += 'NAMING_@0@ = @1@,'.format(NAME, '|'.join(VALUE))
731 extra_net_naming_map += '{ "@0@", NAMING_@1@ },'.format(name, NAME)
732 endif
733 endforeach
734 conf.set('EXTRA_NET_NAMING_SCHEMES', ' '.join(extra_net_naming_schemes))
735 conf.set('EXTRA_NET_NAMING_MAP', ' '.join(extra_net_naming_map))
736
737 default_net_naming_scheme = get_option('default-net-naming-scheme')
738 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
739 if default_net_naming_scheme != 'latest'
740 conf.set('_DEFAULT_NET_NAMING_SCHEME_TEST',
741 'NAMING_' + default_net_naming_scheme.underscorify().to_upper())
742 endif
743
744 time_epoch = get_option('time-epoch')
745 if time_epoch == -1
746 time_epoch = run_command(sh, '-c', 'echo "$SOURCE_DATE_EPOCH"', check : true).stdout().strip()
747 if time_epoch == '' and git.found() and fs.exists('.git')
748 # If we're in a git repository, use the creation time of the latest git tag.
749 latest_tag = run_command(git, 'describe', '--abbrev=0', '--tags',
750 check : false)
751 if latest_tag.returncode() == 0
752 time_epoch = run_command(
753 git, 'log', '--no-show-signature', '-1', '--format=%at',
754 latest_tag.stdout().strip(),
755 check : false).stdout()
756 endif
757 endif
758 if time_epoch == ''
759 NEWS = files('NEWS')
760 time_epoch = run_command(stat, '-c', '%Y', NEWS,
761 check : true).stdout()
762 endif
763 time_epoch = time_epoch.to_int()
764 endif
765 conf.set('TIME_EPOCH', time_epoch)
766
767 conf.set('CLOCK_VALID_RANGE_USEC_MAX', get_option('clock-valid-range-usec-max'))
768
769 foreach tuple : [['system-alloc-uid-min', 'SYS_UID_MIN', 1], # Also see login.defs(5).
770 ['system-uid-max', 'SYS_UID_MAX', 999],
771 ['system-alloc-gid-min', 'SYS_GID_MIN', 1],
772 ['system-gid-max', 'SYS_GID_MAX', 999]]
773 v = get_option(tuple[0])
774 if v == -1
775 v = run_command(
776 awk,
777 '/^\s*@0@\s+/ { uid=$2 } END { print uid }'.format(tuple[1]),
778 '/etc/login.defs',
779 check : false).stdout().strip()
780 if v == ''
781 v = tuple[2]
782 else
783 v = v.to_int()
784 endif
785 endif
786 conf.set(tuple[0].underscorify().to_upper(), v)
787 endforeach
788 if conf.get('SYSTEM_ALLOC_UID_MIN') >= conf.get('SYSTEM_UID_MAX')
789 error('Invalid uid allocation range')
790 endif
791 if conf.get('SYSTEM_ALLOC_GID_MIN') >= conf.get('SYSTEM_GID_MAX')
792 error('Invalid gid allocation range')
793 endif
794
795 dynamic_uid_min = get_option('dynamic-uid-min')
796 dynamic_uid_max = get_option('dynamic-uid-max')
797 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
798 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
799
800 container_uid_base_min = get_option('container-uid-base-min')
801 container_uid_base_max = get_option('container-uid-base-max')
802 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
803 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
804
805 nobody_user = get_option('nobody-user')
806 nobody_group = get_option('nobody-group')
807
808 if not meson.is_cross_build()
809 getent_result = run_command('getent', 'passwd', '65534', check : false)
810 if getent_result.returncode() == 0
811 name = getent_result.stdout().split(':')[0]
812 if name != nobody_user
813 warning('\n' +
814 '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) +
815 'Your build will result in an user table setup that is incompatible with the local system.')
816 endif
817 endif
818 id_result = run_command('id', '-u', nobody_user, check : false)
819 if id_result.returncode() == 0
820 id = id_result.stdout().to_int()
821 if id != 65534
822 warning('\n' +
823 '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) +
824 'Your build will result in an user table setup that is incompatible with the local system.')
825 endif
826 endif
827
828 getent_result = run_command('getent', 'group', '65534', check : false)
829 if getent_result.returncode() == 0
830 name = getent_result.stdout().split(':')[0]
831 if name != nobody_group
832 warning('\n' +
833 '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) +
834 'Your build will result in an group table setup that is incompatible with the local system.')
835 endif
836 endif
837 id_result = run_command('id', '-g', nobody_group, check : false)
838 if id_result.returncode() == 0
839 id = id_result.stdout().to_int()
840 if id != 65534
841 warning('\n' +
842 'The local group with the configured group name "@0@" of the nobody group does not have GID 65534 (it has @1@).\n'.format(nobody_group, id) +
843 'Your build will result in an group table setup that is incompatible with the local system.')
844 endif
845 endif
846 endif
847 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
848 warning('\n' +
849 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
850 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
851 endif
852
853 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
854 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
855
856 static_ugids = []
857 foreach option : ['adm-gid',
858 'audio-gid',
859 'cdrom-gid',
860 'dialout-gid',
861 'disk-gid',
862 'input-gid',
863 'kmem-gid',
864 'kvm-gid',
865 'lp-gid',
866 'render-gid',
867 'sgx-gid',
868 'tape-gid',
869 'tty-gid',
870 'users-gid',
871 'utmp-gid',
872 'video-gid',
873 'wheel-gid',
874 'systemd-journal-gid',
875 'systemd-network-uid',
876 'systemd-resolve-uid',
877 'systemd-timesync-uid']
878 name = option.underscorify().to_upper()
879 val = get_option(option)
880
881 # Ensure provided GID argument is numeric, otherwise fall back to default assignment
882 conf.set(name, val >= 0 ? val : '-')
883 if val >= 0
884 static_ugids += '@0@:@1@'.format(option, val)
885 endif
886 endforeach
887
888 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
889 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
890
891 dev_kvm_mode = get_option('dev-kvm-mode')
892 conf.set_quoted('DEV_KVM_MODE', dev_kvm_mode) # FIXME: convert to 0o… notation
893 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
894 group_render_mode = get_option('group-render-mode')
895 conf.set_quoted('GROUP_RENDER_MODE', group_render_mode)
896 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
897
898 kill_user_processes = get_option('default-kill-user-processes')
899 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
900
901 dns_servers = get_option('dns-servers')
902 conf.set_quoted('DNS_SERVERS', dns_servers)
903
904 ntp_servers = get_option('ntp-servers')
905 conf.set_quoted('NTP_SERVERS', ntp_servers)
906
907 default_locale = get_option('default-locale')
908 if default_locale == ''
909 if not meson.is_cross_build()
910 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
911 default_locale = run_command(choose_default_locale_sh,
912 check : true).stdout().strip()
913 else
914 default_locale = 'C.UTF-8'
915 endif
916 endif
917 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
918
919 localegen_path = get_option('localegen-path')
920 if localegen_path != ''
921 conf.set_quoted('LOCALEGEN_PATH', localegen_path)
922 endif
923 conf.set10('HAVE_LOCALEGEN', localegen_path != '')
924
925 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
926
927 service_watchdog = get_option('service-watchdog')
928 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
929 conf.set_quoted('SERVICE_WATCHDOG', watchdog_value)
930
931 conf.set_quoted('SUSHELL', get_option('debug-shell'))
932 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
933
934 enable_debug_hashmap = false
935 enable_debug_mmap_cache = false
936 enable_debug_siphash = false
937 foreach name : get_option('debug-extra')
938 if name == 'hashmap'
939 enable_debug_hashmap = true
940 elif name == 'mmap-cache'
941 enable_debug_mmap_cache = true
942 elif name == 'siphash'
943 enable_debug_siphash = true
944 else
945 message('unknown debug option "@0@", ignoring'.format(name))
946 endif
947 endforeach
948 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
949 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
950 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
951
952 conf.set10('VALGRIND', get_option('valgrind'))
953 conf.set10('LOG_TRACE', get_option('log-trace'))
954
955 default_user_path = get_option('user-path')
956 if default_user_path != ''
957 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
958 endif
959
960
961 #####################################################################
962
963 threads = dependency('threads')
964 librt = cc.find_library('rt')
965 libm = cc.find_library('m')
966 libdl = cc.find_library('dl')
967 libcrypt = cc.find_library('crypt')
968
969 crypt_header = conf.get('HAVE_CRYPT_H') == 1 ? '''#include <crypt.h>''' : '''#include <unistd.h>'''
970 foreach ident : [
971 ['crypt_ra', crypt_header],
972 ['crypt_preferred_method', crypt_header],
973 ['crypt_gensalt_ra', crypt_header]]
974
975 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE',
976 dependencies : libcrypt)
977 conf.set10('HAVE_' + ident[0].to_upper(), have)
978 endforeach
979
980 libcap = dependency('libcap', required : false)
981 if not libcap.found()
982 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
983 libcap = cc.find_library('cap')
984 endif
985
986 want_bpf_framework = get_option('bpf-framework')
987 bpf_framework_required = want_bpf_framework == 'true'
988
989 libbpf = dependency('libbpf', required : bpf_framework_required, version : '>= 0.2')
990 conf.set10('HAVE_LIBBPF', libbpf.found())
991
992 if want_bpf_framework == 'false'
993 conf.set10('BPF_FRAMEWORK', 0)
994 else
995 # Support 'versioned' clang/llvm-strip binaries, as seen on Debian/Ubuntu
996 # (like clang-10/llvm-strip-10)
997 clang_bin = cc.get_id() == 'clang' ? cc.cmd_array()[0] : 'clang'
998 clang = find_program(clang_bin, required : bpf_framework_required)
999 if clang.found()
1000 llvm_strip_bin = run_command(clang, '--print-prog-name', 'llvm-strip',
1001 check : true).stdout().strip()
1002 else
1003 llvm_strip_bin = 'llvm-strip'
1004 endif
1005 llvm_strip = find_program(llvm_strip_bin, required : bpf_framework_required)
1006
1007 # Debian installs this in /usr/sbin/ which is not in $PATH.
1008 # We check for 'bpftool' first, honouring $PATH, and in /usr/sbin/ for Debian.
1009 bpftool = find_program('bpftool', '/usr/sbin/bpftool', required : bpf_framework_required)
1010
1011 deps_found = libbpf.found() and clang.found() and llvm_strip.found() and bpftool.found()
1012 # Can build BPF program from source code in restricted C
1013 conf.set10('BPF_FRAMEWORK', deps_found)
1014 endif
1015
1016 libmount = dependency('mount',
1017 version : fuzzer_build ? '>= 0' : '>= 2.30')
1018
1019 want_libfdisk = get_option('fdisk')
1020 if want_libfdisk != 'false' and not skip_deps
1021 libfdisk = dependency('fdisk',
1022 version : '>= 2.33',
1023 required : want_libfdisk == 'true')
1024 have = libfdisk.found()
1025 else
1026 have = false
1027 libfdisk = []
1028 endif
1029 conf.set10('HAVE_LIBFDISK', have)
1030
1031 want_pwquality = get_option('pwquality')
1032 if want_pwquality != 'false' and not skip_deps
1033 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
1034 have = libpwquality.found()
1035 else
1036 have = false
1037 libpwquality = []
1038 endif
1039 conf.set10('HAVE_PWQUALITY', have)
1040
1041 want_seccomp = get_option('seccomp')
1042 if want_seccomp != 'false' and not skip_deps
1043 libseccomp = dependency('libseccomp',
1044 version : '>= 2.3.1',
1045 required : want_seccomp == 'true')
1046 have = libseccomp.found()
1047 else
1048 have = false
1049 libseccomp = []
1050 endif
1051 conf.set10('HAVE_SECCOMP', have)
1052
1053 want_selinux = get_option('selinux')
1054 if want_selinux != 'false' and not skip_deps
1055 libselinux = dependency('libselinux',
1056 version : '>= 2.1.9',
1057 required : want_selinux == 'true')
1058 have = libselinux.found()
1059 else
1060 have = false
1061 libselinux = []
1062 endif
1063 conf.set10('HAVE_SELINUX', have)
1064
1065 want_apparmor = get_option('apparmor')
1066 if want_apparmor != 'false' and not skip_deps
1067 libapparmor = dependency('libapparmor',
1068 version : '>= 2.13',
1069 required : want_apparmor == 'true')
1070 have = libapparmor.found()
1071 else
1072 have = false
1073 libapparmor = []
1074 endif
1075 conf.set10('HAVE_APPARMOR', have)
1076
1077 have = get_option('smack') and get_option('smack-run-label') != ''
1078 conf.set10('HAVE_SMACK_RUN_LABEL', have)
1079 if have
1080 conf.set_quoted('SMACK_RUN_LABEL', get_option('smack-run-label'))
1081 endif
1082
1083 want_polkit = get_option('polkit')
1084 install_polkit = false
1085 install_polkit_pkla = false
1086 if want_polkit != 'false' and not skip_deps
1087 install_polkit = true
1088
1089 libpolkit = dependency('polkit-gobject-1',
1090 required : false)
1091 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
1092 message('Old polkit detected, will install pkla files')
1093 install_polkit_pkla = true
1094 endif
1095 endif
1096 conf.set10('ENABLE_POLKIT', install_polkit)
1097
1098 want_acl = get_option('acl')
1099 if want_acl != 'false' and not skip_deps
1100 libacl = cc.find_library('acl', required : want_acl == 'true')
1101 have = libacl.found()
1102 else
1103 have = false
1104 libacl = []
1105 endif
1106 conf.set10('HAVE_ACL', have)
1107
1108 want_audit = get_option('audit')
1109 if want_audit != 'false' and not skip_deps
1110 libaudit = dependency('audit', required : want_audit == 'true')
1111 have = libaudit.found()
1112 else
1113 have = false
1114 libaudit = []
1115 endif
1116 conf.set10('HAVE_AUDIT', have)
1117
1118 want_blkid = get_option('blkid')
1119 if want_blkid != 'false' and not skip_deps
1120 libblkid = dependency('blkid', required : want_blkid == 'true')
1121 have = libblkid.found()
1122
1123 conf.set10('HAVE_BLKID_PROBE_SET_HINT',
1124 have and cc.has_function('blkid_probe_set_hint', dependencies : libblkid))
1125 else
1126 have = false
1127 libblkid = []
1128 endif
1129 conf.set10('HAVE_BLKID', have)
1130
1131 want_kmod = get_option('kmod')
1132 if want_kmod != 'false' and not skip_deps
1133 libkmod = dependency('libkmod',
1134 version : '>= 15',
1135 required : want_kmod == 'true')
1136 have = libkmod.found()
1137 else
1138 have = false
1139 libkmod = []
1140 endif
1141 conf.set10('HAVE_KMOD', have)
1142
1143 want_pam = get_option('pam')
1144 if want_pam != 'false' and not skip_deps
1145 libpam = cc.find_library('pam', required : want_pam == 'true')
1146 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
1147 have = libpam.found() and libpam_misc.found()
1148 else
1149 have = false
1150 libpam = []
1151 libpam_misc = []
1152 endif
1153 conf.set10('HAVE_PAM', have)
1154
1155 want_microhttpd = get_option('microhttpd')
1156 if want_microhttpd != 'false' and not skip_deps
1157 libmicrohttpd = dependency('libmicrohttpd',
1158 version : '>= 0.9.33',
1159 required : want_microhttpd == 'true')
1160 have = libmicrohttpd.found()
1161 else
1162 have = false
1163 libmicrohttpd = []
1164 endif
1165 conf.set10('HAVE_MICROHTTPD', have)
1166
1167 want_libcryptsetup = get_option('libcryptsetup')
1168 want_libcryptsetup_plugins = get_option('libcryptsetup-plugins')
1169
1170 if want_libcryptsetup_plugins == 'true' and want_libcryptsetup == 'false'
1171 error('libcryptsetup-plugins can not be requested without libcryptsetup')
1172 endif
1173
1174 if want_libcryptsetup != 'false' and not skip_deps
1175 libcryptsetup = dependency('libcryptsetup',
1176 version : want_libcryptsetup_plugins == 'true' ? '>= 2.4.0' : '>= 2.0.1',
1177 required : want_libcryptsetup == 'true' or want_libcryptsetup_plugins == 'true')
1178 have = libcryptsetup.found()
1179
1180 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1181 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
1182 conf.set10('HAVE_CRYPT_ACTIVATE_BY_SIGNED_KEY',
1183 have and cc.has_function('crypt_activate_by_signed_key', dependencies : libcryptsetup))
1184 conf.set10('HAVE_CRYPT_TOKEN_MAX',
1185 have and cc.has_function('crypt_token_max', dependencies : libcryptsetup))
1186 else
1187 have = false
1188 libcryptsetup = []
1189 endif
1190 conf.set10('HAVE_LIBCRYPTSETUP', have)
1191
1192 if want_libcryptsetup_plugins != 'false' and not skip_deps
1193 have = (cc.has_function('crypt_activate_by_token_pin', dependencies : libcryptsetup) and
1194 cc.has_function('crypt_token_external_path', dependencies : libcryptsetup))
1195 else
1196 have = false
1197 endif
1198 conf.set10('HAVE_LIBCRYPTSETUP_PLUGINS', have)
1199
1200 want_libcurl = get_option('libcurl')
1201 if want_libcurl != 'false' and not skip_deps
1202 libcurl = dependency('libcurl',
1203 version : '>= 7.32.0',
1204 required : want_libcurl == 'true')
1205 have = libcurl.found()
1206 else
1207 have = false
1208 libcurl = []
1209 endif
1210 conf.set10('HAVE_LIBCURL', have)
1211 conf.set10('CURL_NO_OLDIES', conf.get('BUILD_MODE_DEVELOPER') == 1)
1212
1213 want_libidn = get_option('libidn')
1214 want_libidn2 = get_option('libidn2')
1215 if want_libidn == 'true' and want_libidn2 == 'true'
1216 error('libidn and libidn2 cannot be requested simultaneously')
1217 endif
1218
1219 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1220 libidn = dependency('libidn2',
1221 required : want_libidn2 == 'true')
1222 have = libidn.found()
1223 else
1224 have = false
1225 libidn = []
1226 endif
1227 conf.set10('HAVE_LIBIDN2', have)
1228 if not have and want_libidn != 'false' and not skip_deps
1229 # libidn is used for both libidn and libidn2 objects
1230 libidn = dependency('libidn',
1231 required : want_libidn == 'true')
1232 have = libidn.found()
1233 else
1234 have = false
1235 endif
1236 conf.set10('HAVE_LIBIDN', have)
1237
1238 want_libiptc = get_option('libiptc')
1239 if want_libiptc != 'false' and not skip_deps
1240 libiptc = dependency('libiptc',
1241 required : want_libiptc == 'true')
1242 have = libiptc.found()
1243 else
1244 have = false
1245 libiptc = []
1246 endif
1247 conf.set10('HAVE_LIBIPTC', have)
1248
1249 want_qrencode = get_option('qrencode')
1250 if want_qrencode != 'false' and not skip_deps
1251 libqrencode = dependency('libqrencode',
1252 version : '>= 4',
1253 required : want_qrencode == 'true')
1254 have = libqrencode.found()
1255 else
1256 have = false
1257 libqrencode = []
1258 endif
1259 conf.set10('HAVE_QRENCODE', have)
1260
1261 want_gcrypt = get_option('gcrypt')
1262 if want_gcrypt != 'false' and not skip_deps
1263 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1264 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1265 have = libgcrypt.found() and libgpg_error.found()
1266 else
1267 have = false
1268 endif
1269 if not have
1270 # link to neither of the libs if one is not found
1271 libgcrypt = []
1272 libgpg_error = []
1273 endif
1274 conf.set10('HAVE_GCRYPT', have)
1275
1276 want_gnutls = get_option('gnutls')
1277 if want_gnutls != 'false' and not skip_deps
1278 libgnutls = dependency('gnutls',
1279 version : '>= 3.1.4',
1280 required : want_gnutls == 'true')
1281 have = libgnutls.found()
1282 else
1283 have = false
1284 libgnutls = []
1285 endif
1286 conf.set10('HAVE_GNUTLS', have)
1287
1288 want_openssl = get_option('openssl')
1289 if want_openssl != 'false' and not skip_deps
1290 libopenssl = dependency('openssl',
1291 version : '>= 1.1.0',
1292 required : want_openssl == 'true')
1293 have = libopenssl.found()
1294 else
1295 have = false
1296 libopenssl = []
1297 endif
1298 conf.set10('HAVE_OPENSSL', have)
1299
1300 want_p11kit = get_option('p11kit')
1301 if want_p11kit != 'false' and not skip_deps
1302 libp11kit = dependency('p11-kit-1',
1303 version : '>= 0.23.3',
1304 required : want_p11kit == 'true')
1305 have = libp11kit.found()
1306 else
1307 have = false
1308 libp11kit = []
1309 endif
1310 conf.set10('HAVE_P11KIT', have)
1311
1312 want_libfido2 = get_option('libfido2')
1313 if want_libfido2 != 'false' and not skip_deps
1314 libfido2 = dependency('libfido2',
1315 required : want_libfido2 == 'true')
1316 have = libfido2.found()
1317 else
1318 have = false
1319 libfido2 = []
1320 endif
1321 conf.set10('HAVE_LIBFIDO2', have)
1322
1323 want_tpm2 = get_option('tpm2')
1324 if want_tpm2 != 'false' and not skip_deps
1325 tpm2 = dependency('tss2-esys tss2-rc tss2-mu',
1326 required : want_tpm2 == 'true')
1327 have = tpm2.found()
1328 else
1329 have = false
1330 tpm2 = []
1331 endif
1332 conf.set10('HAVE_TPM2', have)
1333
1334 want_elfutils = get_option('elfutils')
1335 if want_elfutils != 'false' and not skip_deps
1336 libdw = dependency('libdw',
1337 required : want_elfutils == 'true')
1338 have = libdw.found()
1339
1340 # New in elfutils 0.177
1341 conf.set10('HAVE_DWELF_ELF_E_MACHINE_STRING',
1342 have and cc.has_function('dwelf_elf_e_machine_string', dependencies : libdw))
1343 else
1344 have = false
1345 libdw = []
1346 endif
1347 conf.set10('HAVE_ELFUTILS', have)
1348
1349 want_zlib = get_option('zlib')
1350 if want_zlib != 'false' and not skip_deps
1351 libz = dependency('zlib',
1352 required : want_zlib == 'true')
1353 have = libz.found()
1354 else
1355 have = false
1356 libz = []
1357 endif
1358 conf.set10('HAVE_ZLIB', have)
1359
1360 want_bzip2 = get_option('bzip2')
1361 if want_bzip2 != 'false' and not skip_deps
1362 libbzip2 = cc.find_library('bz2',
1363 required : want_bzip2 == 'true')
1364 have = libbzip2.found()
1365 else
1366 have = false
1367 libbzip2 = []
1368 endif
1369 conf.set10('HAVE_BZIP2', have)
1370
1371 want_xz = get_option('xz')
1372 if want_xz != 'false' and not skip_deps
1373 libxz = dependency('liblzma',
1374 required : want_xz == 'true')
1375 have_xz = libxz.found()
1376 else
1377 have_xz = false
1378 libxz = []
1379 endif
1380 conf.set10('HAVE_XZ', have_xz)
1381
1382 want_lz4 = get_option('lz4')
1383 if want_lz4 != 'false' and not skip_deps
1384 liblz4 = dependency('liblz4',
1385 version : '>= 1.3.0',
1386 required : want_lz4 == 'true')
1387 have_lz4 = liblz4.found()
1388 else
1389 have_lz4 = false
1390 liblz4 = []
1391 endif
1392 conf.set10('HAVE_LZ4', have_lz4)
1393
1394 want_zstd = get_option('zstd')
1395 if want_zstd != 'false' and not skip_deps
1396 libzstd = dependency('libzstd',
1397 required : want_zstd == 'true',
1398 version : '>= 1.4.0')
1399 have_zstd = libzstd.found()
1400 else
1401 have_zstd = false
1402 libzstd = []
1403 endif
1404 conf.set10('HAVE_ZSTD', have_zstd)
1405
1406 conf.set10('HAVE_COMPRESSION', have_xz or have_lz4 or have_zstd)
1407
1408 want_xkbcommon = get_option('xkbcommon')
1409 if want_xkbcommon != 'false' and not skip_deps
1410 libxkbcommon = dependency('xkbcommon',
1411 version : '>= 0.3.0',
1412 required : want_xkbcommon == 'true')
1413 have = libxkbcommon.found()
1414 else
1415 have = false
1416 libxkbcommon = []
1417 endif
1418 conf.set10('HAVE_XKBCOMMON', have)
1419
1420 want_pcre2 = get_option('pcre2')
1421 if want_pcre2 != 'false'
1422 libpcre2 = dependency('libpcre2-8',
1423 required : want_pcre2 == 'true')
1424 have = libpcre2.found()
1425 else
1426 have = false
1427 libpcre2 = []
1428 endif
1429 conf.set10('HAVE_PCRE2', have)
1430
1431 want_glib = get_option('glib')
1432 if want_glib != 'false' and not skip_deps
1433 libglib = dependency('glib-2.0',
1434 version : '>= 2.22.0',
1435 required : want_glib == 'true')
1436 libgobject = dependency('gobject-2.0',
1437 version : '>= 2.22.0',
1438 required : want_glib == 'true')
1439 libgio = dependency('gio-2.0',
1440 required : want_glib == 'true')
1441 have = libglib.found() and libgobject.found() and libgio.found()
1442 else
1443 have = false
1444 libglib = []
1445 libgobject = []
1446 libgio = []
1447 endif
1448 conf.set10('HAVE_GLIB', have)
1449
1450 want_dbus = get_option('dbus')
1451 if want_dbus != 'false' and not skip_deps
1452 libdbus = dependency('dbus-1',
1453 version : '>= 1.3.2',
1454 required : want_dbus == 'true')
1455 have = libdbus.found()
1456 else
1457 have = false
1458 libdbus = []
1459 endif
1460 conf.set10('HAVE_DBUS', have)
1461
1462 # We support one or the other. If gcrypt is available, we assume it's there to
1463 # be used, and use it in preference.
1464 opt = get_option('cryptolib')
1465 if opt == 'openssl' and conf.get('HAVE_OPENSSL') == 0
1466 error('openssl requested as the default cryptolib, but not available')
1467 endif
1468 conf.set10('PREFER_OPENSSL',
1469 opt == 'openssl' or (opt == 'auto' and conf.get('HAVE_OPENSSL') == 1 and conf.get('HAVE_GCRYPT') == 0))
1470 conf.set10('HAVE_OPENSSL_OR_GCRYPT',
1471 conf.get('HAVE_OPENSSL') == 1 or conf.get('HAVE_GCRYPT') == 1)
1472 lib_openssl_or_gcrypt = conf.get('PREFER_OPENSSL') == 1 ? libopenssl : libgcrypt
1473
1474 dns_over_tls = get_option('dns-over-tls')
1475 if dns_over_tls != 'false'
1476 if dns_over_tls == 'gnutls' and conf.get('PREFER_OPENSSL') == 1
1477 error('Sorry, -Ddns-over-tls=gnutls is not supported when openssl is used as the cryptolib')
1478 endif
1479
1480 if dns_over_tls == 'openssl' or conf.get('PREFER_OPENSSL') == 1
1481 have_gnutls = false
1482 else
1483 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1484 if dns_over_tls == 'gnutls' and not have_gnutls
1485 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1486 endif
1487 endif
1488 if dns_over_tls == 'gnutls' or have_gnutls
1489 have_openssl = false
1490 else
1491 have_openssl = conf.get('HAVE_OPENSSL') == 1
1492 if dns_over_tls != 'auto' and not have_openssl
1493 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1494 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1495 endif
1496 endif
1497 have = have_gnutls or have_openssl
1498 else
1499 have = false
1500 have_gnutls = false
1501 have_openssl = false
1502 endif
1503 conf.set10('ENABLE_DNS_OVER_TLS', have)
1504 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1505 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1506
1507 default_dns_over_tls = get_option('default-dns-over-tls')
1508 if skip_deps
1509 default_dns_over_tls = 'no'
1510 endif
1511 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1512 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.')
1513 default_dns_over_tls = 'no'
1514 endif
1515 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1516 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1517 conf.set_quoted('DEFAULT_DNS_OVER_TLS_MODE_STR', default_dns_over_tls)
1518
1519 default_mdns = get_option('default-mdns')
1520 conf.set('DEFAULT_MDNS_MODE',
1521 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
1522 conf.set_quoted('DEFAULT_MDNS_MODE_STR', default_mdns)
1523
1524 default_llmnr = get_option('default-llmnr')
1525 conf.set('DEFAULT_LLMNR_MODE',
1526 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
1527 conf.set_quoted('DEFAULT_LLMNR_MODE_STR', default_llmnr)
1528
1529 want_repart = get_option('repart')
1530 if want_repart != 'false'
1531 have = conf.get('HAVE_LIBFDISK') == 1
1532 if want_repart == 'true' and not have
1533 error('repart support was requested, but dependencies are not available')
1534 endif
1535 else
1536 have = false
1537 endif
1538 conf.set10('ENABLE_REPART', have)
1539
1540 default_dnssec = get_option('default-dnssec')
1541 if skip_deps
1542 default_dnssec = 'no'
1543 endif
1544 if default_dnssec != 'no' and conf.get('HAVE_OPENSSL_OR_GCRYPT') == 0
1545 message('default-dnssec cannot be set to yes or allow-downgrade openssl and gcrypt are disabled. Setting default-dnssec to no.')
1546 default_dnssec = 'no'
1547 endif
1548 conf.set('DEFAULT_DNSSEC_MODE',
1549 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1550 conf.set_quoted('DEFAULT_DNSSEC_MODE_STR', default_dnssec)
1551
1552 want_importd = get_option('importd')
1553 if want_importd != 'false'
1554 have = (conf.get('HAVE_LIBCURL') == 1 and
1555 conf.get('HAVE_OPENSSL_OR_GCRYPT') == 1 and
1556 conf.get('HAVE_ZLIB') == 1 and
1557 conf.get('HAVE_XZ') == 1)
1558 if want_importd == 'true' and not have
1559 error('importd support was requested, but dependencies are not available')
1560 endif
1561 else
1562 have = false
1563 endif
1564 conf.set10('ENABLE_IMPORTD', have)
1565
1566 want_homed = get_option('homed')
1567 if want_homed != 'false'
1568 have = (conf.get('HAVE_OPENSSL') == 1 and
1569 conf.get('HAVE_LIBFDISK') == 1 and
1570 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1571 if want_homed == 'true' and not have
1572 error('homed support was requested, but dependencies are not available')
1573 endif
1574 else
1575 have = false
1576 endif
1577 conf.set10('ENABLE_HOMED', have)
1578
1579 have = have and conf.get('HAVE_PAM') == 1
1580 conf.set10('ENABLE_PAM_HOME', have)
1581
1582 have = get_option('oomd')
1583 conf.set10('ENABLE_OOMD', have)
1584
1585 want_remote = get_option('remote')
1586 if want_remote != 'false'
1587 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1588 conf.get('HAVE_LIBCURL') == 1]
1589 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1590 # it's possible to build one without the other. Complain only if
1591 # support was explicitly requested. The auxiliary files like sysusers
1592 # config should be installed when any of the programs are built.
1593 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1594 error('remote support was requested, but dependencies are not available')
1595 endif
1596 have = have_deps[0] or have_deps[1]
1597 else
1598 have = false
1599 endif
1600 conf.set10('ENABLE_REMOTE', have)
1601
1602 foreach term : ['analyze',
1603 'backlight',
1604 'binfmt',
1605 'coredump',
1606 'efi',
1607 'environment-d',
1608 'firstboot',
1609 'gshadow',
1610 'hibernate',
1611 'hostnamed',
1612 'hwdb',
1613 'idn',
1614 'ima',
1615 'initrd',
1616 'compat-mutable-uid-boundaries',
1617 'nscd',
1618 'ldconfig',
1619 'localed',
1620 'logind',
1621 'machined',
1622 'networkd',
1623 'nss-myhostname',
1624 'nss-systemd',
1625 'portabled',
1626 'sysext',
1627 'pstore',
1628 'quotacheck',
1629 'randomseed',
1630 'resolve',
1631 'rfkill',
1632 'smack',
1633 'sysusers',
1634 'timedated',
1635 'timesyncd',
1636 'tmpfiles',
1637 'tpm',
1638 'userdb',
1639 'utmp',
1640 'vconsole',
1641 'xdg-autostart']
1642 have = get_option(term)
1643 name = 'ENABLE_' + term.underscorify().to_upper()
1644 conf.set10(name, have)
1645 endforeach
1646
1647 enable_sysusers = conf.get('ENABLE_SYSUSERS') == 1
1648
1649 foreach tuple : [['nss-mymachines', 'machined'],
1650 ['nss-resolve', 'resolve']]
1651 want = get_option(tuple[0])
1652 if want != 'false'
1653 have = get_option(tuple[1])
1654 if want == 'true' and not have
1655 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1656 endif
1657 else
1658 have = false
1659 endif
1660 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1661 conf.set10(name, have)
1662 endforeach
1663
1664 enable_nss = false
1665 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1666 'ENABLE_NSS_MYMACHINES',
1667 'ENABLE_NSS_RESOLVE',
1668 'ENABLE_NSS_SYSTEMD']
1669 if conf.get(term) == 1
1670 enable_nss = true
1671 endif
1672 endforeach
1673 conf.set10('ENABLE_NSS', enable_nss)
1674
1675 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1676
1677 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1678
1679 #####################################################################
1680
1681 subdir('src/fundamental')
1682 subdir('src/boot/efi')
1683
1684 ############################################################
1685
1686 generate_gperfs = find_program('tools/generate-gperfs.py')
1687 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1688 make_directive_index_py = find_program('tools/make-directive-index.py')
1689 make_man_index_py = find_program('tools/make-man-index.py')
1690 meson_render_jinja2 = find_program('tools/meson-render-jinja2.py')
1691 update_dbus_docs_py = find_program('tools/update-dbus-docs.py')
1692 update_hwdb_sh = find_program('tools/update-hwdb.sh')
1693 update_hwdb_autosuspend_sh = find_program('tools/update-hwdb-autosuspend.sh')
1694 update_syscall_tables_sh = find_program('tools/update-syscall-tables.sh')
1695 xml_helper_py = find_program('tools/xml_helper.py')
1696
1697 #####################################################################
1698
1699 config_h = configure_file(
1700 output : 'config.h',
1701 configuration : conf)
1702
1703 add_project_arguments('-include', 'config.h', language : 'c')
1704
1705 ############################################################
1706
1707 # binaries that have --help and are intended for use by humans,
1708 # usually, but not always, installed in /bin.
1709 public_programs = []
1710
1711 tests = []
1712 fuzzers = []
1713
1714 basic_includes = include_directories(
1715 'src/basic',
1716 'src/fundamental',
1717 'src/systemd',
1718 '.')
1719
1720 libsystemd_includes = [basic_includes, include_directories(
1721 'src/libsystemd/sd-bus',
1722 'src/libsystemd/sd-device',
1723 'src/libsystemd/sd-event',
1724 'src/libsystemd/sd-hwdb',
1725 'src/libsystemd/sd-id128',
1726 'src/libsystemd/sd-journal',
1727 'src/libsystemd/sd-netlink',
1728 'src/libsystemd/sd-network',
1729 'src/libsystemd/sd-resolve')]
1730
1731 includes = [libsystemd_includes, include_directories('src/shared')]
1732
1733 subdir('po')
1734 subdir('catalog')
1735 subdir('src/basic')
1736 subdir('src/libsystemd')
1737 subdir('src/shared')
1738 subdir('src/udev')
1739 subdir('src/libudev')
1740 subdir('src/cryptsetup/cryptsetup-tokens')
1741
1742 libsystemd = shared_library(
1743 'systemd',
1744 disable_mempool_c,
1745 version : libsystemd_version,
1746 include_directories : libsystemd_includes,
1747 link_args : ['-shared',
1748 '-Wl,--version-script=' + libsystemd_sym_path],
1749 link_with : [libbasic,
1750 libbasic_gcrypt],
1751 link_whole : [libsystemd_static],
1752 dependencies : [threads,
1753 librt,
1754 libxz,
1755 libzstd,
1756 liblz4],
1757 link_depends : libsystemd_sym,
1758 install : true,
1759 install_dir : rootlibdir)
1760
1761 install_libsystemd_static = static_library(
1762 'systemd',
1763 libsystemd_sources,
1764 basic_sources,
1765 basic_gcrypt_sources,
1766 fundamental_sources,
1767 disable_mempool_c,
1768 include_directories : libsystemd_includes,
1769 build_by_default : static_libsystemd != 'false',
1770 install : static_libsystemd != 'false',
1771 install_dir : rootlibdir,
1772 pic : static_libsystemd_pic,
1773 dependencies : [threads,
1774 librt,
1775 libxz,
1776 libzstd,
1777 liblz4,
1778 libdl,
1779 libcap,
1780 libblkid,
1781 libmount,
1782 libgcrypt,
1783 libopenssl],
1784 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1785
1786 libudev = shared_library(
1787 'udev',
1788 disable_mempool_c,
1789 version : libudev_version,
1790 include_directories : includes,
1791 link_args : ['-shared',
1792 '-Wl,--version-script=' + libudev_sym_path],
1793 link_with : [libsystemd_static, libshared_static],
1794 link_whole : libudev_basic,
1795 dependencies : [threads],
1796 link_depends : libudev_sym,
1797 install : true,
1798 install_dir : rootlibdir)
1799
1800 install_libudev_static = static_library(
1801 'udev',
1802 basic_sources,
1803 fundamental_sources,
1804 shared_sources,
1805 libsystemd_sources,
1806 libudev_sources,
1807 disable_mempool_c,
1808 include_directories : includes,
1809 build_by_default : static_libudev != 'false',
1810 install : static_libudev != 'false',
1811 install_dir : rootlibdir,
1812 link_depends : libudev_sym,
1813 dependencies : libshared_deps + [libmount],
1814 c_args : static_libudev_pic ? [] : ['-fno-PIC'],
1815 pic : static_libudev_pic)
1816
1817 if conf.get('HAVE_LIBCRYPTSETUP_PLUGINS') == 1
1818 if conf.get('HAVE_TPM2') == 1
1819 cryptsetup_token_systemd_tpm2 = shared_library(
1820 'cryptsetup-token-systemd-tpm2',
1821 link_args : ['-shared',
1822 '-Wl,--version-script=' + cryptsetup_token_sym_path],
1823 dependencies : libshared_deps + [libcryptsetup, versiondep],
1824 link_with : [libshared],
1825 link_whole : [cryptsetup_token_systemd_tpm2_static],
1826 link_depends : cryptsetup_token_sym,
1827 install_rpath : rootlibexecdir,
1828 install : true,
1829 install_dir : libcryptsetup_plugins_dir)
1830 endif
1831
1832 if conf.get('HAVE_LIBFIDO2') == 1
1833 cryptsetup_token_systemd_fido2 = shared_library(
1834 'cryptsetup-token-systemd-fido2',
1835 link_args : ['-shared',
1836 '-Wl,--version-script=' + cryptsetup_token_sym_path],
1837 dependencies : libshared_deps + [libcryptsetup, versiondep],
1838 link_with : [libshared],
1839 link_whole : [cryptsetup_token_systemd_fido2_static],
1840 link_depends : cryptsetup_token_sym,
1841 install_rpath : rootlibexecdir,
1842 install : true,
1843 install_dir : libcryptsetup_plugins_dir)
1844 endif
1845
1846 if conf.get('HAVE_P11KIT') == 1
1847 cryptsetup_token_systemd_pkcs11 = shared_library(
1848 'cryptsetup-token-systemd-pkcs11',
1849 link_args : ['-shared',
1850 '-Wl,--version-script=' + cryptsetup_token_sym_path],
1851 dependencies : libshared_deps + [libcryptsetup, versiondep],
1852 link_with : [libshared],
1853 link_whole : [cryptsetup_token_systemd_pkcs11_static],
1854 link_depends : cryptsetup_token_sym,
1855 install_rpath : rootlibexecdir,
1856 install : true,
1857 install_dir : libcryptsetup_plugins_dir)
1858 endif
1859 endif
1860
1861 ############################################################
1862
1863 # systemd-analyze requires 'libcore'
1864 subdir('src/core')
1865 # systemd-journal-remote requires 'libjournal_core'
1866 subdir('src/journal')
1867 # systemd-networkd requires 'libsystemd_network'
1868 subdir('src/libsystemd-network')
1869
1870 subdir('src/analyze')
1871 subdir('src/busctl')
1872 subdir('src/coredump')
1873 subdir('src/cryptenroll')
1874 subdir('src/cryptsetup')
1875 subdir('src/home')
1876 subdir('src/hostname')
1877 subdir('src/import')
1878 subdir('src/journal-remote')
1879 subdir('src/kernel-install')
1880 subdir('src/locale')
1881 subdir('src/login')
1882 subdir('src/machine')
1883 subdir('src/network')
1884 subdir('src/nspawn')
1885 subdir('src/oom')
1886 subdir('src/partition')
1887 subdir('src/portable')
1888 subdir('src/pstore')
1889 subdir('src/resolve')
1890 subdir('src/rpm')
1891 subdir('src/shutdown')
1892 subdir('src/sysext')
1893 subdir('src/systemctl')
1894 subdir('src/timedate')
1895 subdir('src/timesync')
1896 subdir('src/tmpfiles')
1897 subdir('src/userdb')
1898 subdir('src/vconsole')
1899 subdir('src/xdg-autostart-generator')
1900
1901 subdir('src/systemd')
1902
1903 subdir('src/test')
1904 subdir('src/fuzz')
1905 subdir('rules.d')
1906 subdir('test')
1907
1908 ############################################################
1909
1910 # only static linking apart from libdl, to make sure that the
1911 # module is linked to all libraries that it uses.
1912 test_dlopen = executable(
1913 'test-dlopen',
1914 test_dlopen_c,
1915 disable_mempool_c,
1916 include_directories : includes,
1917 link_with : [libbasic],
1918 dependencies : [libdl],
1919 build_by_default : want_tests != 'false')
1920
1921 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1922 ['systemd', 'ENABLE_NSS_SYSTEMD', ['nss-systemd.h', 'userdb-glue.c', 'userdb-glue.h']],
1923 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1924 ['resolve', 'ENABLE_NSS_RESOLVE', [], resolve_includes]]
1925
1926 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1927 if condition
1928 module = tuple[0]
1929
1930 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1931 version_script_arg = project_source_root / sym
1932
1933 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1934 if tuple.length() > 2
1935 foreach s : tuple[2]
1936 sources += ['src/nss-@0@/@1@'.format(module, s)]
1937 endforeach
1938 endif
1939
1940 incs = tuple.length() > 3 ? tuple[3] : includes
1941
1942 nss = shared_library(
1943 'nss_' + module,
1944 sources,
1945 disable_mempool_c,
1946 version : '2',
1947 include_directories : incs,
1948 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1949 link_args : ['-Wl,-z,nodelete',
1950 '-shared',
1951 '-Wl,--version-script=' + version_script_arg],
1952 link_with : [libsystemd_static,
1953 libshared_static,
1954 libbasic],
1955 dependencies : [threads,
1956 librt],
1957 link_depends : sym,
1958 install : true,
1959 install_dir : rootlibdir)
1960
1961 # We cannot use shared_module because it does not support version suffix.
1962 # Unfortunately shared_library insists on creating the symlink…
1963 meson.add_install_script('sh', '-c',
1964 'rm $DESTDIR@0@/libnss_@1@.so'
1965 .format(rootlibdir, module))
1966
1967 if want_tests != 'false'
1968 test('dlopen-nss_' + module,
1969 test_dlopen,
1970 # path to dlopen must include a slash
1971 args : nss.full_path())
1972 endif
1973 endif
1974 endforeach
1975
1976 ############################################################
1977
1978 executable(
1979 'systemd',
1980 systemd_sources,
1981 include_directories : includes,
1982 link_with : [libcore,
1983 libshared],
1984 dependencies : [versiondep,
1985 threads,
1986 librt,
1987 libseccomp,
1988 libselinux,
1989 libmount,
1990 libblkid],
1991 install_rpath : rootlibexecdir,
1992 install : true,
1993 install_dir : rootlibexecdir)
1994
1995 meson.add_install_script(meson_make_symlink,
1996 rootlibexecdir / 'systemd',
1997 rootsbindir / 'init')
1998
1999 public_programs += executable(
2000 'systemd-analyze',
2001 systemd_analyze_sources,
2002 include_directories : core_includes,
2003 link_with : [libcore,
2004 libshared],
2005 dependencies : [versiondep,
2006 threads,
2007 librt,
2008 libseccomp,
2009 libselinux,
2010 libmount,
2011 libblkid],
2012 install_rpath : rootlibexecdir,
2013 install : conf.get('ENABLE_ANALYZE'))
2014
2015 executable(
2016 'systemd-journald',
2017 systemd_journald_sources,
2018 include_directories : includes,
2019 link_with : [libjournal_core,
2020 libshared],
2021 dependencies : [threads,
2022 libxz,
2023 liblz4,
2024 libselinux,
2025 libzstd],
2026 install_rpath : rootlibexecdir,
2027 install : true,
2028 install_dir : rootlibexecdir)
2029
2030 public_programs += executable(
2031 'systemd-cat',
2032 systemd_cat_sources,
2033 include_directories : includes,
2034 link_with : [libjournal_core,
2035 libshared],
2036 dependencies : [threads],
2037 install_rpath : rootlibexecdir,
2038 install : true)
2039
2040 public_programs += executable(
2041 'journalctl',
2042 journalctl_sources,
2043 include_directories : includes,
2044 link_with : [libshared],
2045 dependencies : [threads,
2046 libdl,
2047 libxz,
2048 liblz4,
2049 libzstd,
2050 libdl],
2051 install_rpath : rootlibexecdir,
2052 install : true,
2053 install_dir : rootbindir)
2054
2055 executable(
2056 'systemd-getty-generator',
2057 'src/getty-generator/getty-generator.c',
2058 include_directories : includes,
2059 link_with : [libshared],
2060 install_rpath : rootlibexecdir,
2061 install : true,
2062 install_dir : systemgeneratordir)
2063
2064 executable(
2065 'systemd-debug-generator',
2066 'src/debug-generator/debug-generator.c',
2067 include_directories : includes,
2068 link_with : [libshared],
2069 install_rpath : rootlibexecdir,
2070 install : true,
2071 install_dir : systemgeneratordir)
2072
2073 executable(
2074 'systemd-run-generator',
2075 'src/run-generator/run-generator.c',
2076 include_directories : includes,
2077 link_with : [libshared],
2078 install_rpath : rootlibexecdir,
2079 install : true,
2080 install_dir : systemgeneratordir)
2081
2082 executable(
2083 'systemd-fstab-generator',
2084 'src/fstab-generator/fstab-generator.c',
2085 include_directories : includes,
2086 link_with : [libshared],
2087 install_rpath : rootlibexecdir,
2088 install : true,
2089 install_dir : systemgeneratordir)
2090
2091 if conf.get('ENABLE_ENVIRONMENT_D') == 1
2092 executable(
2093 '30-systemd-environment-d-generator',
2094 'src/environment-d-generator/environment-d-generator.c',
2095 include_directories : includes,
2096 link_with : [libshared],
2097 install_rpath : rootlibexecdir,
2098 install : true,
2099 install_dir : userenvgeneratordir)
2100
2101 meson.add_install_script(meson_make_symlink,
2102 sysconfdir / 'environment',
2103 environmentdir / '99-environment.conf')
2104 endif
2105
2106 if conf.get('ENABLE_HIBERNATE') == 1
2107 executable(
2108 'systemd-hibernate-resume-generator',
2109 'src/hibernate-resume/hibernate-resume-generator.c',
2110 include_directories : includes,
2111 link_with : [libshared],
2112 install_rpath : rootlibexecdir,
2113 install : true,
2114 install_dir : systemgeneratordir)
2115
2116 executable(
2117 'systemd-hibernate-resume',
2118 'src/hibernate-resume/hibernate-resume.c',
2119 include_directories : includes,
2120 link_with : [libshared],
2121 install_rpath : rootlibexecdir,
2122 install : true,
2123 install_dir : rootlibexecdir)
2124 endif
2125
2126 if conf.get('HAVE_BLKID') == 1
2127 executable(
2128 'systemd-gpt-auto-generator',
2129 'src/gpt-auto-generator/gpt-auto-generator.c',
2130 include_directories : includes,
2131 link_with : [libshared],
2132 dependencies : libblkid,
2133 install_rpath : rootlibexecdir,
2134 install : true,
2135 install_dir : systemgeneratordir)
2136
2137 public_programs += executable(
2138 'systemd-dissect',
2139 'src/dissect/dissect.c',
2140 include_directories : includes,
2141 link_with : [libshared],
2142 install_rpath : rootlibexecdir,
2143 install : true)
2144 endif
2145
2146 if conf.get('ENABLE_RESOLVE') == 1
2147 executable(
2148 'systemd-resolved',
2149 systemd_resolved_sources,
2150 include_directories : resolve_includes,
2151 link_with : [libshared,
2152 libbasic_gcrypt,
2153 libsystemd_resolve_core],
2154 dependencies : systemd_resolved_dependencies,
2155 install_rpath : rootlibexecdir,
2156 install : true,
2157 install_dir : rootlibexecdir)
2158
2159 public_programs += executable(
2160 'resolvectl',
2161 resolvectl_sources,
2162 include_directories : includes,
2163 link_with : [libshared,
2164 libbasic_gcrypt,
2165 libsystemd_resolve_core],
2166 dependencies : [threads,
2167 lib_openssl_or_gcrypt,
2168 libgpg_error,
2169 libm,
2170 libidn],
2171 install_rpath : rootlibexecdir,
2172 install : true)
2173
2174 meson.add_install_script(meson_make_symlink,
2175 bindir / 'resolvectl',
2176 rootsbindir / 'resolvconf')
2177
2178 meson.add_install_script(meson_make_symlink,
2179 bindir / 'resolvectl',
2180 bindir / 'systemd-resolve')
2181 endif
2182
2183 if conf.get('ENABLE_LOGIND') == 1
2184 executable(
2185 'systemd-logind',
2186 systemd_logind_sources,
2187 include_directories : includes,
2188 link_with : [liblogind_core,
2189 libshared],
2190 dependencies : [threads,
2191 libacl],
2192 install_rpath : rootlibexecdir,
2193 install : true,
2194 install_dir : rootlibexecdir)
2195
2196 public_programs += executable(
2197 'loginctl',
2198 loginctl_sources,
2199 include_directories : includes,
2200 link_with : [libshared],
2201 dependencies : [threads,
2202 liblz4,
2203 libxz,
2204 libzstd],
2205 install_rpath : rootlibexecdir,
2206 install : true,
2207 install_dir : rootbindir)
2208
2209 public_programs += executable(
2210 'systemd-inhibit',
2211 'src/login/inhibit.c',
2212 include_directories : includes,
2213 link_with : [libshared],
2214 install_rpath : rootlibexecdir,
2215 install : true,
2216 install_dir : rootbindir)
2217
2218 if conf.get('HAVE_PAM') == 1
2219 version_script_arg = project_source_root / pam_systemd_sym
2220 pam_systemd = shared_library(
2221 'pam_systemd',
2222 pam_systemd_c,
2223 name_prefix : '',
2224 include_directories : includes,
2225 link_args : ['-shared',
2226 '-Wl,--version-script=' + version_script_arg],
2227 link_with : [libsystemd_static,
2228 libshared_static],
2229 dependencies : [threads,
2230 libpam,
2231 libpam_misc],
2232 link_depends : pam_systemd_sym,
2233 install : true,
2234 install_dir : pamlibdir)
2235
2236 if want_tests != 'false'
2237 test('dlopen-pam_systemd',
2238 test_dlopen,
2239 # path to dlopen must include a slash
2240 args : pam_systemd.full_path())
2241 endif
2242 endif
2243
2244 executable(
2245 'systemd-user-runtime-dir',
2246 user_runtime_dir_sources,
2247 include_directories : includes,
2248 link_with : [libshared],
2249 install_rpath : rootlibexecdir,
2250 install : true,
2251 install_dir : rootlibexecdir)
2252 endif
2253
2254 if conf.get('HAVE_PAM') == 1
2255 executable(
2256 'systemd-user-sessions',
2257 'src/user-sessions/user-sessions.c',
2258 include_directories : includes,
2259 link_with : [libshared],
2260 install_rpath : rootlibexecdir,
2261 install : true,
2262 install_dir : rootlibexecdir)
2263 endif
2264
2265 if conf.get('HAVE_BLKID') == 1 and conf.get('HAVE_GNU_EFI') == 1
2266 public_programs += executable(
2267 'bootctl',
2268 'src/boot/bootctl.c',
2269 include_directories : includes,
2270 link_with : [libshared],
2271 dependencies : [libblkid],
2272 install_rpath : rootlibexecdir,
2273 install : true)
2274
2275 public_programs += executable(
2276 'systemd-bless-boot',
2277 'src/boot/bless-boot.c',
2278 include_directories : includes,
2279 link_with : [libshared],
2280 dependencies : [libblkid],
2281 install_rpath : rootlibexecdir,
2282 install : true,
2283 install_dir : rootlibexecdir)
2284
2285 executable(
2286 'systemd-bless-boot-generator',
2287 'src/boot/bless-boot-generator.c',
2288 include_directories : includes,
2289 link_with : [libshared],
2290 install_rpath : rootlibexecdir,
2291 install : true,
2292 install_dir : systemgeneratordir)
2293 endif
2294
2295 executable(
2296 'systemd-boot-check-no-failures',
2297 'src/boot/boot-check-no-failures.c',
2298 include_directories : includes,
2299 link_with : [libshared],
2300 dependencies : [libblkid],
2301 install_rpath : rootlibexecdir,
2302 install : true,
2303 install_dir : rootlibexecdir)
2304
2305 public_programs += executable(
2306 'systemd-socket-activate',
2307 'src/activate/activate.c',
2308 include_directories : includes,
2309 link_with : [libshared],
2310 dependencies : [threads],
2311 install_rpath : rootlibexecdir,
2312 install : true)
2313
2314 public_programs += executable(
2315 'systemctl',
2316 systemctl_sources,
2317 include_directories : includes,
2318 link_with : systemctl_link_with,
2319 dependencies : [threads,
2320 libcap,
2321 libselinux,
2322 libxz,
2323 liblz4,
2324 libzstd],
2325 install_rpath : rootlibexecdir,
2326 install : true,
2327 install_dir : rootbindir)
2328
2329 if conf.get('ENABLE_PORTABLED') == 1
2330 executable(
2331 'systemd-portabled',
2332 systemd_portabled_sources,
2333 include_directories : includes,
2334 link_with : [libshared],
2335 dependencies : [threads, libselinux],
2336 install_rpath : rootlibexecdir,
2337 install : true,
2338 install_dir : rootlibexecdir)
2339
2340 public_programs += executable(
2341 'portablectl',
2342 'src/portable/portablectl.c',
2343 include_directories : includes,
2344 link_with : [libshared],
2345 dependencies : [threads],
2346 install_rpath : rootlibexecdir,
2347 install : true,
2348 install_dir : rootbindir)
2349 endif
2350
2351 if conf.get('ENABLE_SYSEXT') == 1
2352 public_programs += executable(
2353 'systemd-sysext',
2354 systemd_sysext_sources,
2355 include_directories : includes,
2356 link_with : [libshared],
2357 install_rpath : rootlibexecdir,
2358 install : true,
2359 install_dir : rootbindir)
2360 endif
2361
2362 if conf.get('ENABLE_USERDB') == 1
2363 executable(
2364 'systemd-userwork',
2365 systemd_userwork_sources,
2366 include_directories : includes,
2367 link_with : [libshared],
2368 dependencies : [threads],
2369 install_rpath : rootlibexecdir,
2370 install : true,
2371 install_dir : rootlibexecdir)
2372
2373 executable(
2374 'systemd-userdbd',
2375 systemd_userdbd_sources,
2376 include_directories : includes,
2377 link_with : [libshared],
2378 dependencies : [threads],
2379 install_rpath : rootlibexecdir,
2380 install : true,
2381 install_dir : rootlibexecdir)
2382
2383 public_programs += executable(
2384 'userdbctl',
2385 userdbctl_sources,
2386 include_directories : includes,
2387 link_with : [libshared],
2388 dependencies : [threads],
2389 install_rpath : rootlibexecdir,
2390 install : true,
2391 install_dir : rootbindir)
2392 endif
2393
2394 if conf.get('ENABLE_HOMED') == 1
2395 executable(
2396 'systemd-homework',
2397 systemd_homework_sources,
2398 include_directories : includes,
2399 link_with : [libshared],
2400 dependencies : [threads,
2401 libblkid,
2402 libcrypt,
2403 libopenssl,
2404 libfdisk,
2405 libp11kit],
2406 install_rpath : rootlibexecdir,
2407 install : true,
2408 install_dir : rootlibexecdir)
2409
2410 executable(
2411 'systemd-homed',
2412 systemd_homed_sources,
2413 include_directories : home_includes,
2414 link_with : [libshared],
2415 dependencies : [threads,
2416 libcrypt,
2417 libopenssl,
2418 libm],
2419 install_rpath : rootlibexecdir,
2420 install : true,
2421 install_dir : rootlibexecdir)
2422
2423 public_programs += executable(
2424 'homectl',
2425 homectl_sources,
2426 include_directories : includes,
2427 link_with : [libshared],
2428 dependencies : [threads,
2429 libcrypt,
2430 libopenssl,
2431 libp11kit,
2432 libdl],
2433 install_rpath : rootlibexecdir,
2434 install : true,
2435 install_dir : rootbindir)
2436
2437 if conf.get('HAVE_PAM') == 1
2438 version_script_arg = project_source_root / pam_systemd_home_sym
2439 pam_systemd = shared_library(
2440 'pam_systemd_home',
2441 pam_systemd_home_c,
2442 name_prefix : '',
2443 include_directories : includes,
2444 link_args : ['-shared',
2445 '-Wl,--version-script=' + version_script_arg],
2446 link_with : [libsystemd_static,
2447 libshared_static],
2448 dependencies : [threads,
2449 libpam,
2450 libpam_misc,
2451 libcrypt],
2452 link_depends : pam_systemd_home_sym,
2453 install : true,
2454 install_dir : pamlibdir)
2455 endif
2456 endif
2457
2458 foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
2459 (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
2460 meson.add_install_script(meson_make_symlink,
2461 rootbindir / 'systemctl',
2462 rootsbindir / alias)
2463 endforeach
2464
2465 meson.add_install_script(meson_make_symlink,
2466 rootbindir / 'udevadm',
2467 rootlibexecdir / 'systemd-udevd')
2468
2469 if conf.get('ENABLE_BACKLIGHT') == 1
2470 executable(
2471 'systemd-backlight',
2472 'src/backlight/backlight.c',
2473 include_directories : includes,
2474 link_with : [libshared],
2475 install_rpath : rootlibexecdir,
2476 install : true,
2477 install_dir : rootlibexecdir)
2478 endif
2479
2480 if conf.get('ENABLE_RFKILL') == 1
2481 executable(
2482 'systemd-rfkill',
2483 'src/rfkill/rfkill.c',
2484 include_directories : includes,
2485 link_with : [libshared],
2486 install_rpath : rootlibexecdir,
2487 install : true,
2488 install_dir : rootlibexecdir)
2489 endif
2490
2491 executable(
2492 'systemd-system-update-generator',
2493 'src/system-update-generator/system-update-generator.c',
2494 include_directories : includes,
2495 link_with : [libshared],
2496 install_rpath : rootlibexecdir,
2497 install : true,
2498 install_dir : systemgeneratordir)
2499
2500 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2501 executable(
2502 'systemd-cryptsetup',
2503 systemd_cryptsetup_sources,
2504 include_directories : includes,
2505 link_with : [libshared],
2506 dependencies : [libcryptsetup,
2507 libp11kit],
2508 install_rpath : rootlibexecdir,
2509 install : true,
2510 install_dir : rootlibexecdir)
2511
2512 executable(
2513 'systemd-cryptsetup-generator',
2514 'src/cryptsetup/cryptsetup-generator.c',
2515 include_directories : includes,
2516 link_with : [libshared],
2517 install_rpath : rootlibexecdir,
2518 install : true,
2519 install_dir : systemgeneratordir)
2520
2521 executable(
2522 'systemd-veritysetup',
2523 'src/veritysetup/veritysetup.c',
2524 include_directories : includes,
2525 link_with : [libshared],
2526 dependencies : [libcryptsetup],
2527 install_rpath : rootlibexecdir,
2528 install : true,
2529 install_dir : rootlibexecdir)
2530
2531 executable(
2532 'systemd-veritysetup-generator',
2533 'src/veritysetup/veritysetup-generator.c',
2534 include_directories : includes,
2535 link_with : [libshared],
2536 install_rpath : rootlibexecdir,
2537 install : true,
2538 install_dir : systemgeneratordir)
2539
2540 executable(
2541 'systemd-cryptenroll',
2542 systemd_cryptenroll_sources,
2543 include_directories : includes,
2544 link_with : [libshared],
2545 dependencies : [libcryptsetup,
2546 libdl,
2547 libopenssl,
2548 libp11kit],
2549 install_rpath : rootlibexecdir,
2550 install : true)
2551
2552 executable(
2553 'systemd-integritysetup',
2554 ['src/integritysetup/integritysetup.c', 'src/integritysetup/integrity-util.c'],
2555 include_directories : includes,
2556 link_with : [libshared],
2557 dependencies : [libcryptsetup],
2558 install_rpath : rootlibexecdir,
2559 install : true,
2560 install_dir : rootlibexecdir)
2561
2562 executable(
2563 'systemd-integritysetup-generator',
2564 ['src/integritysetup/integritysetup-generator.c', 'src/integritysetup/integrity-util.c'],
2565 include_directories : includes,
2566 link_with : [libshared],
2567 install_rpath : rootlibexecdir,
2568 install : true,
2569 install_dir : systemgeneratordir)
2570 endif
2571
2572 if conf.get('HAVE_SYSV_COMPAT') == 1
2573 executable(
2574 'systemd-sysv-generator',
2575 'src/sysv-generator/sysv-generator.c',
2576 include_directories : includes,
2577 link_with : [libshared],
2578 install_rpath : rootlibexecdir,
2579 install : true,
2580 install_dir : systemgeneratordir)
2581
2582 executable(
2583 'systemd-rc-local-generator',
2584 'src/rc-local-generator/rc-local-generator.c',
2585 include_directories : includes,
2586 link_with : [libshared],
2587 install_rpath : rootlibexecdir,
2588 install : true,
2589 install_dir : systemgeneratordir)
2590 endif
2591
2592 if conf.get('ENABLE_XDG_AUTOSTART') == 1
2593 executable(
2594 'systemd-xdg-autostart-generator',
2595 systemd_xdg_autostart_generator_sources,
2596 include_directories : includes,
2597 link_with : [libshared],
2598 install_rpath : rootlibexecdir,
2599 install : true,
2600 install_dir : usergeneratordir)
2601
2602 executable(
2603 'systemd-xdg-autostart-condition',
2604 'src/xdg-autostart-generator/xdg-autostart-condition.c',
2605 include_directories : includes,
2606 link_with : [libshared],
2607 install_rpath : rootlibexecdir,
2608 install : true,
2609 install_dir : rootlibexecdir)
2610 endif
2611
2612 if conf.get('ENABLE_HOSTNAMED') == 1
2613 executable(
2614 'systemd-hostnamed',
2615 'src/hostname/hostnamed.c',
2616 include_directories : includes,
2617 link_with : [libshared],
2618 install_rpath : rootlibexecdir,
2619 install : true,
2620 install_dir : rootlibexecdir)
2621
2622 public_programs += executable(
2623 'hostnamectl',
2624 'src/hostname/hostnamectl.c',
2625 include_directories : includes,
2626 link_with : [libshared],
2627 install_rpath : rootlibexecdir,
2628 install : true)
2629 endif
2630
2631 if conf.get('ENABLE_LOCALED') == 1
2632 if conf.get('HAVE_XKBCOMMON') == 1
2633 # logind will load libxkbcommon.so dynamically on its own, but we still
2634 # need to specify where the headers are
2635 deps = [libdl, libxkbcommon.partial_dependency(compile_args: true)]
2636 else
2637 deps = []
2638 endif
2639
2640 executable(
2641 'systemd-localed',
2642 systemd_localed_sources,
2643 include_directories : includes,
2644 link_with : [libshared],
2645 dependencies : deps,
2646 install_rpath : rootlibexecdir,
2647 install : true,
2648 install_dir : rootlibexecdir)
2649
2650 public_programs += executable(
2651 'localectl',
2652 localectl_sources,
2653 include_directories : includes,
2654 link_with : [libshared],
2655 install_rpath : rootlibexecdir,
2656 install : true)
2657 endif
2658
2659 if conf.get('ENABLE_TIMEDATED') == 1
2660 executable(
2661 'systemd-timedated',
2662 'src/timedate/timedated.c',
2663 include_directories : includes,
2664 link_with : [libshared],
2665 install_rpath : rootlibexecdir,
2666 install : true,
2667 install_dir : rootlibexecdir)
2668 endif
2669
2670 if conf.get('ENABLE_TIMEDATECTL') == 1
2671 public_programs += executable(
2672 'timedatectl',
2673 'src/timedate/timedatectl.c',
2674 include_directories : includes,
2675 install_rpath : rootlibexecdir,
2676 link_with : [libshared],
2677 dependencies : [libm],
2678 install : true)
2679 endif
2680
2681 if conf.get('ENABLE_TIMESYNCD') == 1
2682 executable(
2683 'systemd-timesyncd',
2684 systemd_timesyncd_sources,
2685 include_directories : includes,
2686 link_with : [libtimesyncd_core],
2687 dependencies : [threads,
2688 libm],
2689 install_rpath : rootlibexecdir,
2690 install : true,
2691 install_dir : rootlibexecdir)
2692
2693 executable(
2694 'systemd-time-wait-sync',
2695 'src/timesync/wait-sync.c',
2696 include_directories : includes,
2697 link_with : [libtimesyncd_core],
2698 install_rpath : rootlibexecdir,
2699 install : true,
2700 install_dir : rootlibexecdir)
2701 endif
2702
2703 if conf.get('ENABLE_MACHINED') == 1
2704 executable(
2705 'systemd-machined',
2706 systemd_machined_sources,
2707 include_directories : includes,
2708 link_with : [libmachine_core,
2709 libshared],
2710 install_rpath : rootlibexecdir,
2711 install : true,
2712 install_dir : rootlibexecdir)
2713
2714 public_programs += executable(
2715 'machinectl',
2716 'src/machine/machinectl.c',
2717 include_directories : includes,
2718 link_with : [libshared],
2719 dependencies : [threads,
2720 libxz,
2721 liblz4,
2722 libzstd],
2723 install_rpath : rootlibexecdir,
2724 install : true,
2725 install_dir : rootbindir)
2726 endif
2727
2728 if conf.get('ENABLE_IMPORTD') == 1
2729 executable(
2730 'systemd-importd',
2731 systemd_importd_sources,
2732 include_directories : includes,
2733 link_with : [libshared],
2734 dependencies : [threads],
2735 install_rpath : rootlibexecdir,
2736 install : true,
2737 install_dir : rootlibexecdir)
2738
2739 systemd_pull = executable(
2740 'systemd-pull',
2741 systemd_pull_sources,
2742 include_directories : includes,
2743 link_with : [libshared],
2744 dependencies : [versiondep,
2745 libcurl,
2746 lib_openssl_or_gcrypt,
2747 libz,
2748 libbzip2,
2749 libxz],
2750 install_rpath : rootlibexecdir,
2751 install : true,
2752 install_dir : rootlibexecdir)
2753
2754 systemd_import = executable(
2755 'systemd-import',
2756 systemd_import_sources,
2757 include_directories : includes,
2758 link_with : [libshared],
2759 dependencies : [libcurl,
2760 libz,
2761 libbzip2,
2762 libxz],
2763 install_rpath : rootlibexecdir,
2764 install : true,
2765 install_dir : rootlibexecdir)
2766
2767 systemd_import_fs = executable(
2768 'systemd-import-fs',
2769 systemd_import_fs_sources,
2770 include_directories : includes,
2771 link_with : [libshared],
2772 install_rpath : rootlibexecdir,
2773 install : true,
2774 install_dir : rootlibexecdir)
2775
2776 systemd_export = executable(
2777 'systemd-export',
2778 systemd_export_sources,
2779 include_directories : includes,
2780 link_with : [libshared],
2781 dependencies : [libcurl,
2782 libz,
2783 libbzip2,
2784 libxz],
2785 install_rpath : rootlibexecdir,
2786 install : true,
2787 install_dir : rootlibexecdir)
2788
2789 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2790 endif
2791
2792 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2793 public_programs += executable(
2794 'systemd-journal-upload',
2795 systemd_journal_upload_sources,
2796 include_directories : includes,
2797 link_with : [libshared],
2798 dependencies : [versiondep,
2799 threads,
2800 libcurl,
2801 libgnutls,
2802 libxz,
2803 liblz4,
2804 libzstd],
2805 install_rpath : rootlibexecdir,
2806 install : true,
2807 install_dir : rootlibexecdir)
2808 endif
2809
2810 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2811 public_programs += executable(
2812 'systemd-journal-remote',
2813 systemd_journal_remote_sources,
2814 include_directories : journal_includes,
2815 link_with : [libshared,
2816 libsystemd_journal_remote],
2817 dependencies : [threads,
2818 libmicrohttpd,
2819 libgnutls,
2820 libxz,
2821 liblz4,
2822 libzstd],
2823 install_rpath : rootlibexecdir,
2824 install : true,
2825 install_dir : rootlibexecdir)
2826
2827 public_programs += executable(
2828 'systemd-journal-gatewayd',
2829 systemd_journal_gatewayd_sources,
2830 include_directories : journal_includes,
2831 link_with : [libshared],
2832 dependencies : [threads,
2833 libmicrohttpd,
2834 libgnutls,
2835 libxz,
2836 liblz4,
2837 libzstd],
2838 install_rpath : rootlibexecdir,
2839 install : true,
2840 install_dir : rootlibexecdir)
2841 endif
2842
2843 if conf.get('ENABLE_COREDUMP') == 1
2844 executable(
2845 'systemd-coredump',
2846 systemd_coredump_sources,
2847 include_directories : includes,
2848 link_with : [libshared],
2849 dependencies : [threads,
2850 libacl,
2851 libxz,
2852 liblz4,
2853 libzstd],
2854 install_rpath : rootlibexecdir,
2855 install : true,
2856 install_dir : rootlibexecdir)
2857
2858 public_programs += executable(
2859 'coredumpctl',
2860 coredumpctl_sources,
2861 include_directories : includes,
2862 link_with : [libshared],
2863 dependencies : [threads,
2864 libxz,
2865 liblz4,
2866 libzstd],
2867 install_rpath : rootlibexecdir,
2868 install : true)
2869 endif
2870
2871 if conf.get('ENABLE_PSTORE') == 1
2872 executable(
2873 'systemd-pstore',
2874 systemd_pstore_sources,
2875 include_directories : includes,
2876 link_with : [libshared],
2877 dependencies : [threads,
2878 libacl,
2879 libxz,
2880 liblz4,
2881 libzstd],
2882 install_rpath : rootlibexecdir,
2883 install : true,
2884 install_dir : rootlibexecdir)
2885 endif
2886
2887 if conf.get('ENABLE_OOMD') == 1
2888 executable('systemd-oomd',
2889 systemd_oomd_sources,
2890 include_directories : includes,
2891 link_with : [libshared],
2892 dependencies : [],
2893 install_rpath : rootlibexecdir,
2894 install : true,
2895 install_dir : rootlibexecdir)
2896
2897 public_programs += executable(
2898 'oomctl',
2899 oomctl_sources,
2900 include_directories : includes,
2901 link_with : [libshared],
2902 dependencies : [],
2903 install_rpath : rootlibexecdir,
2904 install : true,
2905 install_dir : rootbindir)
2906 endif
2907
2908 if conf.get('ENABLE_BINFMT') == 1
2909 public_programs += executable(
2910 'systemd-binfmt',
2911 'src/binfmt/binfmt.c',
2912 include_directories : includes,
2913 link_with : [libshared],
2914 install_rpath : rootlibexecdir,
2915 install : true,
2916 install_dir : rootlibexecdir)
2917
2918 meson.add_install_script('sh', '-c',
2919 mkdir_p.format(binfmtdir))
2920 if install_sysconfdir
2921 meson.add_install_script('sh', '-c',
2922 mkdir_p.format(sysconfdir / 'binfmt.d'))
2923 endif
2924 endif
2925
2926 if conf.get('ENABLE_REPART') == 1
2927 exe = executable(
2928 'systemd-repart',
2929 systemd_repart_sources,
2930 include_directories : includes,
2931 link_with : [libshared],
2932 dependencies : [threads,
2933 libblkid,
2934 libfdisk],
2935 install_rpath : rootlibexecdir,
2936 install : true,
2937 install_dir : rootbindir)
2938 public_programs += exe
2939
2940 if want_tests != 'false'
2941 test('test-repart',
2942 test_repart_sh,
2943 args : exe.full_path())
2944 endif
2945 endif
2946
2947 if conf.get('ENABLE_VCONSOLE') == 1
2948 executable(
2949 'systemd-vconsole-setup',
2950 'src/vconsole/vconsole-setup.c',
2951 include_directories : includes,
2952 link_with : [libshared],
2953 install_rpath : rootlibexecdir,
2954 install : true,
2955 install_dir : rootlibexecdir)
2956 endif
2957
2958 if conf.get('ENABLE_RANDOMSEED') == 1
2959 executable(
2960 'systemd-random-seed',
2961 'src/random-seed/random-seed.c',
2962 include_directories : includes,
2963 link_with : [libshared],
2964 install_rpath : rootlibexecdir,
2965 install : true,
2966 install_dir : rootlibexecdir)
2967 endif
2968
2969 if conf.get('ENABLE_FIRSTBOOT') == 1
2970 executable(
2971 'systemd-firstboot',
2972 'src/firstboot/firstboot.c',
2973 include_directories : includes,
2974 link_with : [libshared],
2975 dependencies : [libcrypt],
2976 install_rpath : rootlibexecdir,
2977 install : true,
2978 install_dir : rootbindir)
2979 endif
2980
2981 executable(
2982 'systemd-remount-fs',
2983 'src/remount-fs/remount-fs.c',
2984 include_directories : includes,
2985 link_with : [libshared],
2986 install_rpath : rootlibexecdir,
2987 install : true,
2988 install_dir : rootlibexecdir)
2989
2990 executable(
2991 'systemd-machine-id-setup',
2992 'src/machine-id-setup/machine-id-setup-main.c',
2993 include_directories : includes,
2994 link_with : [libshared],
2995 install_rpath : rootlibexecdir,
2996 install : true,
2997 install_dir : rootbindir)
2998
2999 executable(
3000 'systemd-fsck',
3001 'src/fsck/fsck.c',
3002 include_directories : includes,
3003 link_with : [libshared],
3004 install_rpath : rootlibexecdir,
3005 install : true,
3006 install_dir : rootlibexecdir)
3007
3008 executable('systemd-growfs',
3009 'src/partition/growfs.c',
3010 include_directories : includes,
3011 link_with : [libshared],
3012 install_rpath : rootlibexecdir,
3013 install : true,
3014 install_dir : rootlibexecdir)
3015
3016 executable(
3017 'systemd-makefs',
3018 'src/partition/makefs.c',
3019 include_directories : includes,
3020 link_with : [libshared],
3021 install_rpath : rootlibexecdir,
3022 install : true,
3023 install_dir : rootlibexecdir)
3024
3025 executable(
3026 'systemd-sleep',
3027 'src/sleep/sleep.c',
3028 include_directories : includes,
3029 link_with : [libshared],
3030 install_rpath : rootlibexecdir,
3031 install : true,
3032 install_dir : rootlibexecdir)
3033
3034 if install_sysconfdir_samples
3035 install_data('src/sleep/sleep.conf',
3036 install_dir : pkgsysconfdir)
3037 endif
3038
3039 public_programs += executable(
3040 'systemd-sysctl',
3041 'src/sysctl/sysctl.c',
3042 include_directories : includes,
3043 link_with : [libshared],
3044 install_rpath : rootlibexecdir,
3045 install : true,
3046 install_dir : rootlibexecdir)
3047
3048 executable(
3049 'systemd-ac-power',
3050 'src/ac-power/ac-power.c',
3051 include_directories : includes,
3052 link_with : [libshared],
3053 install_rpath : rootlibexecdir,
3054 install : true,
3055 install_dir : rootlibexecdir)
3056
3057 public_programs += executable(
3058 'systemd-detect-virt',
3059 'src/detect-virt/detect-virt.c',
3060 include_directories : includes,
3061 link_with : [libshared],
3062 install_rpath : rootlibexecdir,
3063 install : true)
3064
3065 public_programs += executable(
3066 'systemd-delta',
3067 'src/delta/delta.c',
3068 include_directories : includes,
3069 link_with : [libshared],
3070 install_rpath : rootlibexecdir,
3071 install : true)
3072
3073 public_programs += executable(
3074 'systemd-escape',
3075 'src/escape/escape.c',
3076 include_directories : includes,
3077 link_with : [libshared],
3078 install_rpath : rootlibexecdir,
3079 install : true,
3080 install_dir : rootbindir)
3081
3082 public_programs += executable(
3083 'systemd-notify',
3084 'src/notify/notify.c',
3085 include_directories : includes,
3086 link_with : [libshared],
3087 install_rpath : rootlibexecdir,
3088 install : true,
3089 install_dir : rootbindir)
3090
3091 public_programs += executable(
3092 'systemd-creds',
3093 'src/creds/creds.c',
3094 include_directories : includes,
3095 link_with : [libshared],
3096 dependencies : [threads,
3097 libopenssl],
3098 install_rpath : rootlibexecdir,
3099 install : true,
3100 install_dir : rootbindir)
3101
3102 executable(
3103 'systemd-volatile-root',
3104 'src/volatile-root/volatile-root.c',
3105 include_directories : includes,
3106 link_with : [libshared],
3107 install_rpath : rootlibexecdir,
3108 install : conf.get('ENABLE_INITRD') == 1,
3109 install_dir : rootlibexecdir)
3110
3111 executable(
3112 'systemd-cgroups-agent',
3113 'src/cgroups-agent/cgroups-agent.c',
3114 include_directories : includes,
3115 link_with : [libshared],
3116 install_rpath : rootlibexecdir,
3117 install : true,
3118 install_dir : rootlibexecdir)
3119
3120 public_programs += executable(
3121 'systemd-id128',
3122 'src/id128/id128.c',
3123 include_directories : includes,
3124 link_with : [libshared],
3125 install_rpath : rootlibexecdir,
3126 install : true)
3127
3128 public_programs += executable(
3129 'systemd-path',
3130 'src/path/path.c',
3131 include_directories : includes,
3132 link_with : [libshared],
3133 install_rpath : rootlibexecdir,
3134 install : true)
3135
3136 public_programs += executable(
3137 'systemd-ask-password',
3138 'src/ask-password/ask-password.c',
3139 include_directories : includes,
3140 link_with : [libshared],
3141 install_rpath : rootlibexecdir,
3142 install : true,
3143 install_dir : rootbindir)
3144
3145 executable(
3146 'systemd-reply-password',
3147 'src/reply-password/reply-password.c',
3148 include_directories : includes,
3149 link_with : [libshared],
3150 install_rpath : rootlibexecdir,
3151 install : true,
3152 install_dir : rootlibexecdir)
3153
3154 public_programs += executable(
3155 'systemd-tty-ask-password-agent',
3156 'src/tty-ask-password-agent/tty-ask-password-agent.c',
3157 include_directories : includes,
3158 link_with : [libshared],
3159 install_rpath : rootlibexecdir,
3160 install : true,
3161 install_dir : rootbindir)
3162
3163 public_programs += executable(
3164 'systemd-cgls',
3165 'src/cgls/cgls.c',
3166 include_directories : includes,
3167 link_with : [libshared],
3168 install_rpath : rootlibexecdir,
3169 install : true)
3170
3171 public_programs += executable(
3172 'systemd-cgtop',
3173 'src/cgtop/cgtop.c',
3174 include_directories : includes,
3175 link_with : [libshared],
3176 install_rpath : rootlibexecdir,
3177 install : true)
3178
3179 executable(
3180 'systemd-initctl',
3181 'src/initctl/initctl.c',
3182 include_directories : includes,
3183 link_with : [libshared],
3184 install_rpath : rootlibexecdir,
3185 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
3186 install_dir : rootlibexecdir)
3187
3188 public_programs += executable(
3189 'systemd-mount',
3190 'src/mount/mount-tool.c',
3191 include_directories : includes,
3192 link_with : [libshared],
3193 dependencies: [libmount],
3194 install_rpath : rootlibexecdir,
3195 install : true)
3196
3197 meson.add_install_script(meson_make_symlink,
3198 'systemd-mount', bindir / 'systemd-umount')
3199
3200 public_programs += executable(
3201 'systemd-run',
3202 'src/run/run.c',
3203 include_directories : includes,
3204 link_with : [libshared],
3205 install_rpath : rootlibexecdir,
3206 install : true)
3207
3208 public_programs += executable(
3209 'systemd-stdio-bridge',
3210 'src/stdio-bridge/stdio-bridge.c',
3211 include_directories : includes,
3212 link_with : [libshared],
3213 dependencies : [versiondep],
3214 install_rpath : rootlibexecdir,
3215 install : true)
3216
3217 public_programs += executable(
3218 'busctl',
3219 busctl_sources,
3220 include_directories : includes,
3221 link_with : [libshared],
3222 install_rpath : rootlibexecdir,
3223 install : true)
3224
3225 if enable_sysusers
3226 exe = executable(
3227 'systemd-sysusers',
3228 'src/sysusers/sysusers.c',
3229 include_directories : includes,
3230 link_with : [libshared],
3231 install_rpath : rootlibexecdir,
3232 install : true,
3233 install_dir : rootbindir)
3234 public_programs += exe
3235
3236 if want_tests != 'false'
3237 test('test-sysusers',
3238 test_sysusers_sh,
3239 # https://github.com/mesonbuild/meson/issues/2681
3240 args : exe.full_path())
3241 endif
3242
3243 if have_standalone_binaries
3244 exe = executable(
3245 'systemd-sysusers.standalone',
3246 'src/sysusers/sysusers.c',
3247 include_directories : includes,
3248 c_args : '-DSTANDALONE',
3249 link_with : [libshared_static,
3250 libbasic,
3251 libbasic_gcrypt,
3252 libsystemd_static],
3253 install : true,
3254 install_dir : rootbindir)
3255 public_programs += exe
3256
3257 if want_tests != 'false'
3258 test('test-sysusers.standalone',
3259 test_sysusers_sh,
3260 # https://github.com/mesonbuild/meson/issues/2681
3261 args : exe.full_path())
3262 endif
3263 endif
3264 endif
3265
3266 if conf.get('ENABLE_TMPFILES') == 1
3267 exe = executable(
3268 'systemd-tmpfiles',
3269 systemd_tmpfiles_sources,
3270 include_directories : includes,
3271 link_with : [libshared],
3272 dependencies : [libacl],
3273 install_rpath : rootlibexecdir,
3274 install : true,
3275 install_dir : rootbindir)
3276 public_programs += exe
3277
3278 if want_tests != 'false'
3279 test('test-systemd-tmpfiles',
3280 test_systemd_tmpfiles_py,
3281 # https://github.com/mesonbuild/meson/issues/2681
3282 args : exe.full_path())
3283 endif
3284
3285 if have_standalone_binaries
3286 public_programs += executable(
3287 'systemd-tmpfiles.standalone',
3288 systemd_tmpfiles_sources,
3289 include_directories : includes,
3290 c_args : '-DSTANDALONE',
3291 link_with : [libshared_static,
3292 libbasic,
3293 libbasic_gcrypt,
3294 libsystemd_static],
3295 dependencies : [libacl],
3296 install : true,
3297 install_dir : rootbindir)
3298 endif
3299 endif
3300
3301 if conf.get('ENABLE_HWDB') == 1
3302 systemd_hwdb = executable(
3303 'systemd-hwdb',
3304 'src/hwdb/hwdb.c',
3305 include_directories : includes,
3306 link_with : udev_link_with,
3307 install_rpath : udev_rpath,
3308 install : true,
3309 install_dir : rootbindir)
3310 public_programs += systemd_hwdb
3311
3312 if want_tests != 'false'
3313 test('hwdb-test',
3314 hwdb_test_sh,
3315 args : [systemd_hwdb.full_path()],
3316 timeout : 90)
3317 endif
3318 endif
3319
3320 if conf.get('ENABLE_QUOTACHECK') == 1
3321 executable(
3322 'systemd-quotacheck',
3323 'src/quotacheck/quotacheck.c',
3324 include_directories : includes,
3325 link_with : [libshared],
3326 install_rpath : rootlibexecdir,
3327 install : true,
3328 install_dir : rootlibexecdir)
3329 endif
3330
3331 public_programs += executable(
3332 'systemd-socket-proxyd',
3333 'src/socket-proxy/socket-proxyd.c',
3334 include_directories : includes,
3335 link_with : [libshared],
3336 dependencies : [threads],
3337 install_rpath : rootlibexecdir,
3338 install : true,
3339 install_dir : rootlibexecdir)
3340
3341 public_programs += executable(
3342 'udevadm',
3343 udevadm_sources,
3344 include_directories : includes,
3345 link_with : [libudevd_core],
3346 dependencies : [versiondep,
3347 threads,
3348 libkmod,
3349 libidn,
3350 libacl,
3351 libblkid],
3352 install_rpath : udev_rpath,
3353 install : true,
3354 install_dir : rootbindir)
3355
3356 executable(
3357 'systemd-shutdown',
3358 systemd_shutdown_sources,
3359 include_directories : includes,
3360 link_with : [libshared],
3361 dependencies : [libmount],
3362 install_rpath : rootlibexecdir,
3363 install : true,
3364 install_dir : rootlibexecdir)
3365
3366 executable(
3367 'systemd-update-done',
3368 'src/update-done/update-done.c',
3369 include_directories : includes,
3370 link_with : [libshared],
3371 install_rpath : rootlibexecdir,
3372 install : true,
3373 install_dir : rootlibexecdir)
3374
3375 executable(
3376 'systemd-update-utmp',
3377 'src/update-utmp/update-utmp.c',
3378 include_directories : includes,
3379 link_with : [libshared],
3380 dependencies : [libaudit],
3381 install_rpath : rootlibexecdir,
3382 install : (conf.get('ENABLE_UTMP') == 1),
3383 install_dir : rootlibexecdir)
3384
3385 if conf.get('HAVE_KMOD') == 1
3386 executable(
3387 'systemd-modules-load',
3388 'src/modules-load/modules-load.c',
3389 include_directories : includes,
3390 link_with : [libshared],
3391 dependencies : [libkmod],
3392 install_rpath : rootlibexecdir,
3393 install : true,
3394 install_dir : rootlibexecdir)
3395
3396 meson.add_install_script('sh', '-c',
3397 mkdir_p.format(modulesloaddir))
3398 if install_sysconfdir
3399 meson.add_install_script('sh', '-c',
3400 mkdir_p.format(sysconfdir / 'modules-load.d'))
3401 endif
3402 endif
3403
3404 public_programs += executable(
3405 'systemd-nspawn',
3406 systemd_nspawn_sources,
3407 include_directories : includes,
3408 link_with : [libnspawn_core,
3409 libshared],
3410 dependencies : [libblkid,
3411 libseccomp],
3412 install_rpath : rootlibexecdir,
3413 install : true)
3414
3415 if conf.get('ENABLE_NETWORKD') == 1
3416 executable(
3417 'systemd-networkd',
3418 systemd_networkd_sources,
3419 include_directories : network_includes,
3420 link_with : [libnetworkd_core,
3421 libsystemd_network,
3422 networkd_link_with],
3423 dependencies : [threads],
3424 install_rpath : rootlibexecdir,
3425 install : true,
3426 install_dir : rootlibexecdir)
3427
3428 executable(
3429 'systemd-networkd-wait-online',
3430 systemd_networkd_wait_online_sources,
3431 include_directories : includes,
3432 link_with : [networkd_link_with],
3433 install_rpath : rootlibexecdir,
3434 install : true,
3435 install_dir : rootlibexecdir)
3436
3437 public_programs += executable(
3438 'networkctl',
3439 networkctl_sources,
3440 include_directories : libsystemd_network_includes,
3441 link_with : [libsystemd_network,
3442 networkd_link_with],
3443 install_rpath : rootlibexecdir,
3444 install : true,
3445 install_dir : rootbindir)
3446
3447 exe = executable(
3448 'systemd-network-generator',
3449 network_generator_sources,
3450 include_directories : includes,
3451 link_with : [networkd_link_with],
3452 install_rpath : rootlibexecdir,
3453 install : true,
3454 install_dir : rootlibexecdir)
3455
3456 if want_tests != 'false'
3457 test('test-network-generator-conversion',
3458 test_network_generator_conversion_sh,
3459 # https://github.com/mesonbuild/meson/issues/2681
3460 args : exe.full_path())
3461 endif
3462 endif
3463
3464 executable(
3465 'systemd-sulogin-shell',
3466 'src/sulogin-shell/sulogin-shell.c',
3467 include_directories : includes,
3468 link_with : [libshared],
3469 install_rpath : rootlibexecdir,
3470 install : true,
3471 install_dir : rootlibexecdir)
3472
3473 ############################################################
3474
3475 custom_target(
3476 'systemd-runtest.env',
3477 output : 'systemd-runtest.env',
3478 command : [sh, '-c',
3479 '{ echo SYSTEMD_TEST_DATA=@0@; echo SYSTEMD_CATALOG_DIR=@1@; } >@OUTPUT@'.format(
3480 project_source_root / 'test',
3481 project_build_root / 'catalog')],
3482 build_by_default : true)
3483
3484 test_cflags = ['-DTEST_CODE=1']
3485 # We intentionally do not do inline initializations with definitions for a
3486 # bunch of _cleanup_ variables in tests, to ensure valgrind is triggered if we
3487 # use the variable unexpectedly. This triggers a lot of maybe-uninitialized
3488 # false positives when the combination of -O2 and -flto is used. Suppress them.
3489 if '-O2' in get_option('c_args') and '-flto=auto' in get_option('c_args')
3490 test_cflags += cc.first_supported_argument('-Wno-maybe-uninitialized')
3491 endif
3492
3493 foreach tuple : tests
3494 sources = tuple[0]
3495 link_with = tuple.length() > 1 and tuple[1].length() > 0 ? tuple[1] : [libshared]
3496 dependencies = tuple.length() > 2 ? tuple[2] : []
3497 incs = tuple.length() > 3 and tuple[3].length() > 0 ? tuple[3] : includes
3498 condition = tuple.length() > 4 ? tuple[4] : ''
3499 type = tuple.length() > 5 ? tuple[5] : ''
3500 defs = tuple.length() > 6 ? tuple[6] : []
3501 defs += test_cflags
3502 parallel = tuple.length() > 7 ? tuple[7] : true
3503 timeout = 30
3504
3505 name = sources[0].split('/')[-1].split('.')[0]
3506 if type.startswith('timeout=')
3507 timeout = type.split('=')[1].to_int()
3508 type = ''
3509 endif
3510
3511 if condition == '' or conf.get(condition) == 1
3512 exe = executable(
3513 name,
3514 sources,
3515 include_directories : incs,
3516 link_with : link_with,
3517 dependencies : [versiondep,
3518 dependencies],
3519 c_args : defs,
3520 build_by_default : want_tests != 'false',
3521 install_rpath : rootlibexecdir,
3522 install : install_tests,
3523 install_dir : testsdir / type)
3524
3525 if type == 'manual'
3526 message('@0@ is a manual test'.format(name))
3527 elif type == 'unsafe' and want_tests != 'unsafe'
3528 message('@0@ is an unsafe test'.format(name))
3529 elif want_tests != 'false'
3530 test(name, exe,
3531 env : test_env,
3532 timeout : timeout)
3533 endif
3534 else
3535 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3536 endif
3537 endforeach
3538
3539 exe = executable(
3540 'test-libsystemd-sym',
3541 test_libsystemd_sym_c,
3542 include_directories : includes,
3543 link_with : [libsystemd],
3544 build_by_default : want_tests != 'false',
3545 install : install_tests,
3546 install_dir : testsdir)
3547 if want_tests != 'false'
3548 test('test-libsystemd-sym', exe)
3549 endif
3550
3551 exe = executable(
3552 'test-libsystemd-static-sym',
3553 test_libsystemd_sym_c,
3554 include_directories : includes,
3555 link_with : [install_libsystemd_static],
3556 dependencies : [threads], # threads is already included in dependencies on the library,
3557 # but does not seem to get propagated. Add here as a work-around.
3558 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3559 install : install_tests and static_libsystemd_pic,
3560 install_dir : testsdir)
3561 if want_tests != 'false' and static_libsystemd_pic
3562 test('test-libsystemd-static-sym', exe)
3563 endif
3564
3565 exe = executable(
3566 'test-libudev-sym',
3567 test_libudev_sym_c,
3568 include_directories : libudev_includes,
3569 c_args : ['-Wno-deprecated-declarations'] + test_cflags,
3570 link_with : [libudev],
3571 build_by_default : want_tests != 'false',
3572 install : install_tests,
3573 install_dir : testsdir)
3574 if want_tests != 'false'
3575 test('test-libudev-sym', exe)
3576 endif
3577
3578 exe = executable(
3579 'test-libudev-static-sym',
3580 test_libudev_sym_c,
3581 include_directories : libudev_includes,
3582 c_args : ['-Wno-deprecated-declarations'] + test_cflags,
3583 link_with : [install_libudev_static],
3584 build_by_default : want_tests != 'false' and static_libudev_pic,
3585 install : install_tests and static_libudev_pic,
3586 install_dir : testsdir)
3587 if want_tests != 'false' and static_libudev_pic
3588 test('test-libudev-static-sym', exe)
3589 endif
3590
3591 ############################################################
3592
3593 fuzzer_exes = []
3594
3595 foreach tuple : fuzzers
3596 sources = tuple[0]
3597 link_with = tuple.length() > 1 and tuple[1].length() > 0 ? tuple[1] : [libshared]
3598 dependencies = tuple.length() > 2 ? tuple[2] : []
3599 incs = tuple.length() > 3 and tuple[3].length() > 0 ? tuple[3] : includes
3600 defs = tuple.length() > 4 ? tuple[4] : []
3601 link_args = []
3602
3603 if want_ossfuzz
3604 dependencies += fuzzing_engine
3605 elif want_libfuzzer
3606 if fuzzing_engine.found()
3607 dependencies += fuzzing_engine
3608 else
3609 link_args += ['-fsanitize=fuzzer']
3610 endif
3611 else
3612 sources += 'src/fuzz/fuzz-main.c'
3613 endif
3614
3615 name = sources[0].split('/')[-1].split('.')[0]
3616
3617 exe = executable(
3618 name,
3619 sources,
3620 include_directories : [incs, include_directories('src/fuzz')],
3621 link_with : link_with,
3622 dependencies : dependencies,
3623 c_args : defs + test_cflags,
3624 link_args: link_args,
3625 install : false,
3626 build_by_default : fuzzer_build)
3627 fuzzer_exes += exe
3628
3629 if want_tests != 'false'
3630 # Run the fuzz regression tests without any sanitizers enabled.
3631 # Additional invocations with sanitizers may be added below.
3632 foreach p : fuzz_regression_tests
3633 b = p.split('/')[-2]
3634 c = p.split('/')[-1]
3635
3636 if b == name
3637 test('@0@_@1@'.format(b, c),
3638 exe,
3639 args : [project_source_root / p])
3640 endif
3641 endforeach
3642 endif
3643 endforeach
3644
3645 alias_target('fuzzers', fuzzer_exes)
3646
3647 ############################################################
3648
3649 subdir('modprobe.d')
3650 subdir('sysctl.d')
3651 subdir('sysusers.d')
3652 subdir('tmpfiles.d')
3653 subdir('hwdb.d')
3654 subdir('units')
3655 subdir('presets')
3656 subdir('network')
3657 subdir('man')
3658 subdir('shell-completion/bash')
3659 subdir('shell-completion/zsh')
3660 subdir('docs/sysvinit')
3661 subdir('docs/var-log')
3662
3663 install_subdir('factory/etc',
3664 install_dir : factorydir)
3665
3666 if install_sysconfdir
3667 install_data('xorg/50-systemd-user.sh',
3668 install_dir : xinitrcdir)
3669 endif
3670 install_data('LICENSE.GPL2',
3671 'LICENSE.LGPL2.1',
3672 'NEWS',
3673 'README',
3674 'docs/CODING_STYLE.md',
3675 'docs/DISTRO_PORTING.md',
3676 'docs/ENVIRONMENT.md',
3677 'docs/HACKING.md',
3678 'docs/TRANSIENT-SETTINGS.md',
3679 'docs/TRANSLATORS.md',
3680 'docs/UIDS-GIDS.md',
3681 'docs/GVARIANT-SERIALIZATION.md',
3682 install_dir : docdir)
3683
3684 install_subdir('LICENSES',
3685 install_dir : docdir)
3686
3687 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3688 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3689
3690 ############################################################
3691
3692 # Ensure that changes to the docs/ directory do not break the
3693 # basic Github pages build. But only run it in developer mode,
3694 # as it might be fragile due to changes in the tooling, and it is
3695 # not generally useful for users.
3696 jekyll = find_program('jekyll', required : false)
3697 if get_option('mode') == 'developer' and want_tests != 'false' and jekyll.found()
3698 test('github-pages',
3699 jekyll,
3700 args : ['build',
3701 '--source', project_source_root / 'docs',
3702 '--destination', project_build_root / '_site'])
3703 endif
3704
3705 ############################################################
3706
3707 check_help = find_program('tools/check-help.sh')
3708
3709 foreach exec : public_programs
3710 name = exec.full_path().split('/')[-1]
3711 if want_tests != 'false'
3712 test('check-help-' + name,
3713 check_help,
3714 args : exec.full_path())
3715 endif
3716 endforeach
3717
3718 ############################################################
3719
3720 check_directives_sh = find_program('tools/check-directives.sh')
3721
3722 if want_tests != 'false'
3723 test('check-directives',
3724 check_directives_sh,
3725 args : [project_source_root, project_build_root])
3726 endif
3727
3728 ############################################################
3729
3730 # Enable tests for all supported sanitizers
3731 foreach tuple : sanitizers
3732 sanitizer = tuple[0]
3733 build = tuple[1]
3734
3735 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3736 prev = ''
3737 foreach p : fuzz_regression_tests
3738 b = p.split('/')[-2]
3739 c = p.split('/')[-1]
3740
3741 name = '@0@:@1@'.format(b, sanitizer)
3742
3743 if name != prev
3744 if want_tests == 'false'
3745 message('Not compiling @0@ because tests is set to false'.format(name))
3746 elif fuzz_tests
3747 exe = custom_target(
3748 name,
3749 output : name,
3750 depends : build,
3751 command : [ln, '-fs',
3752 build.full_path() / b,
3753 '@OUTPUT@'],
3754 build_by_default : true)
3755 else
3756 message('Not compiling @0@ because fuzz-tests is set to false'.format(name))
3757 endif
3758 endif
3759 prev = name
3760
3761 if fuzz_tests
3762 test('@0@_@1@_@2@'.format(b, c, sanitizer),
3763 env,
3764 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
3765 timeout : 60,
3766 args : [exe.full_path(),
3767 project_source_root / p])
3768 endif
3769 endforeach
3770 endif
3771 endforeach
3772
3773
3774 ############################################################
3775
3776 if git.found()
3777 all_files = run_command(
3778 env, '-u', 'GIT_WORK_TREE',
3779 git, '--git-dir=@0@/.git'.format(project_source_root),
3780 'ls-files', ':/*.[ch]',
3781 check : false)
3782 if all_files.returncode() == 0
3783 all_files = files(all_files.stdout().split())
3784
3785 custom_target(
3786 'tags',
3787 output : 'tags',
3788 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3789 run_target(
3790 'ctags',
3791 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3792 endif
3793 endif
3794
3795 if git.found()
3796 git_contrib_sh = find_program('tools/git-contrib.sh')
3797 run_target(
3798 'git-contrib',
3799 command : [git_contrib_sh])
3800 endif
3801
3802 if git.found()
3803 git_head = run_command(
3804 git, '--git-dir=@0@/.git'.format(project_source_root),
3805 'rev-parse', 'HEAD',
3806 check : false).stdout().strip()
3807 git_head_short = run_command(
3808 git, '--git-dir=@0@/.git'.format(project_source_root),
3809 'rev-parse', '--short=7', 'HEAD',
3810 check : false).stdout().strip()
3811
3812 run_target(
3813 'git-snapshot',
3814 command : [git, 'archive',
3815 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3816 git_head_short),
3817 '--prefix', 'systemd-@0@/'.format(git_head),
3818 'HEAD'])
3819 endif
3820
3821 ############################################################
3822
3823 check_api_docs_sh = find_program('tools/check-api-docs.sh')
3824 run_target(
3825 'check-api-docs',
3826 depends : [man, libsystemd, libudev],
3827 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3828
3829 alias_target('update-dbus-docs', update_dbus_docs)
3830 alias_target('update-man-rules', update_man_rules)
3831
3832 ############################################################
3833
3834 alt_time_epoch = run_command('date', '-Is', '-u', '-d', '@@0@'.format(time_epoch),
3835 check : true).stdout().strip()
3836
3837 summary({
3838 'build mode' : get_option('mode'),
3839 'split /usr' : split_usr,
3840 'split bin-sbin' : split_bin,
3841 'prefix directory' : prefixdir,
3842 'rootprefix directory' : rootprefixdir,
3843 'sysconf directory' : sysconfdir,
3844 'include directory' : includedir,
3845 'lib directory' : libdir,
3846 'rootlib directory' : rootlibdir,
3847 'SysV init scripts' : sysvinit_path,
3848 'SysV rc?.d directories' : sysvrcnd_path,
3849 'PAM modules directory' : pamlibdir,
3850 'PAM configuration directory' : pamconfdir,
3851 'libcryptsetup plugins directory' : libcryptsetup_plugins_dir,
3852 'RPM macros directory' : rpmmacrosdir,
3853 'modprobe.d directory' : modprobedir,
3854 'D-Bus policy directory' : dbuspolicydir,
3855 'D-Bus session directory' : dbussessionservicedir,
3856 'D-Bus system directory' : dbussystemservicedir,
3857 'bash completions directory' : bashcompletiondir,
3858 'zsh completions directory' : zshcompletiondir,
3859 'extra start script' : get_option('rc-local'),
3860 'debug shell' : '@0@ @ @1@'.format(get_option('debug-shell'),
3861 get_option('debug-tty')),
3862 'system UIDs' : '<=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_UID_MAX'),
3863 conf.get('SYSTEM_ALLOC_UID_MIN')),
3864 'system GIDs' : '<=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_GID_MAX'),
3865 conf.get('SYSTEM_ALLOC_GID_MIN')),
3866 'dynamic UIDs' : '@0@…@1@'.format(dynamic_uid_min, dynamic_uid_max),
3867 'container UID bases' : '@0@…@1@'.format(container_uid_base_min, container_uid_base_max),
3868 'static UID/GID allocations' : ' '.join(static_ugids),
3869 '/dev/kvm access mode' : get_option('dev-kvm-mode'),
3870 'render group access mode' : get_option('group-render-mode'),
3871 'certificate root directory' : get_option('certificate-root'),
3872 'support URL' : support_url,
3873 'nobody user name' : nobody_user,
3874 'nobody group name' : nobody_group,
3875 'fallback hostname' : get_option('fallback-hostname'),
3876 'default DNSSEC mode' : default_dnssec,
3877 'default DNS-over-TLS mode' : default_dns_over_tls,
3878 'default mDNS mode' : default_mdns,
3879 'default LLMNR mode' : default_llmnr,
3880 'default DNS servers' : dns_servers.split(' '),
3881 'default NTP servers' : ntp_servers.split(' '),
3882 'default cgroup hierarchy' : default_hierarchy,
3883 'default net.naming-scheme value' : default_net_naming_scheme,
3884 'default KillUserProcesses value' : kill_user_processes,
3885 'default locale' : default_locale,
3886 'default user $PATH' :
3887 default_user_path != '' ? default_user_path : '(same as system services)',
3888 'systemd service watchdog' : service_watchdog == '' ? 'disabled' : service_watchdog,
3889 'time epoch' : '@0@ (@1@)'.format(time_epoch, alt_time_epoch)})
3890
3891 # TODO:
3892 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3893 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3894 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3895
3896 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_GNU_EFI') == 1
3897 summary({
3898 'EFI machine type' : efi_arch[0],
3899 'EFI CC' : '@0@'.format(' '.join(efi_cc)),
3900 'EFI lds' : efi_lds,
3901 'EFI crt0' : efi_crt0,
3902 'EFI include directory' : efi_incdir},
3903 section : 'Extensible Firmware Interface')
3904 endif
3905
3906 found = []
3907 missing = []
3908
3909 foreach tuple : [
3910 # dependencies
3911 ['ACL'],
3912 ['AUDIT'],
3913 ['AppArmor'],
3914 ['IMA'],
3915 ['PAM'],
3916 ['SECCOMP'],
3917 ['SELinux'],
3918 ['SMACK'],
3919 ['blkid'],
3920 ['elfutils'],
3921 ['gcrypt'],
3922 ['gnutls'],
3923 ['libbpf'],
3924 ['libcryptsetup'],
3925 ['libcryptsetup-plugins'],
3926 ['libcurl'],
3927 ['libfdisk'],
3928 ['libfido2'],
3929 ['libidn'],
3930 ['libidn2'],
3931 ['libiptc'],
3932 ['microhttpd'],
3933 ['openssl'],
3934 ['p11kit'],
3935 ['pcre2'],
3936 ['pwquality'],
3937 ['qrencode'],
3938 ['tpm2'],
3939 ['xkbcommon'],
3940
3941 # compression libs
3942 ['zstd'],
3943 ['lz4'],
3944 ['xz'],
3945 ['zlib'],
3946 ['bzip2'],
3947
3948 # components
3949 ['backlight'],
3950 ['binfmt'],
3951 ['bpf-framework', conf.get('BPF_FRAMEWORK') == 1],
3952 ['coredump'],
3953 ['environment.d'],
3954 ['efi'],
3955 ['gnu-efi'],
3956 ['firstboot'],
3957 ['hibernate'],
3958 ['homed'],
3959 ['hostnamed'],
3960 ['hwdb'],
3961 ['importd'],
3962 ['initrd'],
3963 ['kernel-install', get_option('kernel-install')],
3964 ['localed'],
3965 ['logind'],
3966 ['machined'],
3967 ['networkd'],
3968 ['nss-myhostname'],
3969 ['nss-mymachines'],
3970 ['nss-resolve'],
3971 ['nss-systemd'],
3972 ['oomd'],
3973 ['portabled'],
3974 ['pstore'],
3975 ['quotacheck'],
3976 ['randomseed'],
3977 ['repart'],
3978 ['resolve'],
3979 ['rfkill'],
3980 ['sysext'],
3981 ['systemd-analyze', conf.get('ENABLE_ANALYZE') == 1],
3982 ['sysusers'],
3983 ['timedated'],
3984 ['timesyncd'],
3985 ['tmpfiles'],
3986 ['userdb'],
3987 ['vconsole'],
3988 ['xdg-autostart'],
3989
3990 # optional features
3991 ['idn'],
3992 ['polkit'],
3993 ['nscd'],
3994 ['legacy-pkla', install_polkit_pkla],
3995 ['kmod'],
3996 ['dbus'],
3997 ['glib'],
3998 ['tpm'],
3999 ['man pages', want_man],
4000 ['html pages', want_html],
4001 ['man page indices', want_man and have_lxml],
4002 ['SysV compat'],
4003 ['compat-mutable-uid-boundaries'],
4004 ['utmp'],
4005 ['ldconfig'],
4006 ['adm group', get_option('adm-group')],
4007 ['wheel group', get_option('wheel-group')],
4008 ['gshadow'],
4009 ['debug hashmap'],
4010 ['debug mmap cache'],
4011 ['debug siphash'],
4012 ['valgrind', conf.get('VALGRIND') == 1],
4013 ['trace logging', conf.get('LOG_TRACE') == 1],
4014 ['install tests', install_tests],
4015 ['link-udev-shared', get_option('link-udev-shared')],
4016 ['link-systemctl-shared', get_option('link-systemctl-shared')],
4017 ['link-networkd-shared', get_option('link-networkd-shared')],
4018 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
4019 ['fexecve'],
4020 ['standalone-binaries', get_option('standalone-binaries')],
4021 ]
4022
4023 if tuple.length() >= 2
4024 cond = tuple[1]
4025 else
4026 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
4027 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
4028 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
4029 endif
4030 if cond
4031 found += tuple[0]
4032 else
4033 missing += tuple[0]
4034 endif
4035 endforeach
4036
4037 if static_libsystemd == 'false'
4038 missing += 'static-libsystemd'
4039 else
4040 found += 'static-libsystemd(@0@)'.format(static_libsystemd)
4041 endif
4042
4043 if static_libudev == 'false'
4044 missing += 'static-libudev'
4045 else
4046 found += 'static-libudev(@0@)'.format(static_libudev)
4047 endif
4048
4049 if conf.get('HAVE_OPENSSL_OR_GCRYPT') == 1 and conf.get('PREFER_OPENSSL') == 1
4050 found += 'cryptolib(openssl)'
4051 elif conf.get('HAVE_OPENSSL_OR_GCRYPT') == 1
4052 found += 'cryptolib(gcrypt)'
4053 else
4054 missing += 'cryptolib'
4055 endif
4056
4057 if conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1
4058 found += 'DNS-over-TLS(gnutls)'
4059 elif conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1
4060 found += 'DNS-over-TLS(openssl)'
4061 else
4062 missing += 'DNS-over-TLS'
4063 endif
4064
4065 summary({
4066 'enabled' : ', '.join(found),
4067 'disabled' : ', '.join(missing)},
4068 section : 'Features')
4069
4070 if rootprefixdir != rootprefix_default
4071 warning('\n' +
4072 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
4073 'systemd used fixed names for unit file directories and other paths, so anything\n' +
4074 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
4075 endif