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