]> git.ipfire.org Git - thirdparty/systemd.git/blob - meson.build
core: set error value correctly
[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_p11kit = get_option('p11kit')
1108 if want_p11kit != 'false' and not skip_deps
1109 libp11kit = dependency('p11-kit-1',
1110 version : '>= 0.23.3',
1111 required : want_p11kit == 'true')
1112 have = libp11kit.found()
1113 else
1114 have = false
1115 libp11kit = []
1116 endif
1117 conf.set10('HAVE_P11KIT', have)
1118
1119 want_elfutils = get_option('elfutils')
1120 if want_elfutils != 'false' and not skip_deps
1121 libdw = dependency('libdw',
1122 required : want_elfutils == 'true')
1123 have = libdw.found()
1124 else
1125 have = false
1126 libdw = []
1127 endif
1128 conf.set10('HAVE_ELFUTILS', have)
1129
1130 want_zlib = get_option('zlib')
1131 if want_zlib != 'false' and not skip_deps
1132 libz = dependency('zlib',
1133 required : want_zlib == 'true')
1134 have = libz.found()
1135 else
1136 have = false
1137 libz = []
1138 endif
1139 conf.set10('HAVE_ZLIB', have)
1140
1141 want_bzip2 = get_option('bzip2')
1142 if want_bzip2 != 'false' and not skip_deps
1143 libbzip2 = cc.find_library('bz2',
1144 required : want_bzip2 == 'true')
1145 have = libbzip2.found()
1146 else
1147 have = false
1148 libbzip2 = []
1149 endif
1150 conf.set10('HAVE_BZIP2', have)
1151
1152 want_xz = get_option('xz')
1153 if want_xz != 'false' and not skip_deps
1154 libxz = dependency('liblzma',
1155 required : want_xz == 'true')
1156 have = libxz.found()
1157 else
1158 have = false
1159 libxz = []
1160 endif
1161 conf.set10('HAVE_XZ', have)
1162
1163 want_lz4 = get_option('lz4')
1164 if want_lz4 != 'false' and not skip_deps
1165 liblz4 = dependency('liblz4',
1166 version : '>= 1.3.0',
1167 required : want_lz4 == 'true')
1168 have = liblz4.found()
1169 else
1170 have = false
1171 liblz4 = []
1172 endif
1173 conf.set10('HAVE_LZ4', have)
1174
1175 want_xkbcommon = get_option('xkbcommon')
1176 if want_xkbcommon != 'false' and not skip_deps
1177 libxkbcommon = dependency('xkbcommon',
1178 version : '>= 0.3.0',
1179 required : want_xkbcommon == 'true')
1180 have = libxkbcommon.found()
1181 else
1182 have = false
1183 libxkbcommon = []
1184 endif
1185 conf.set10('HAVE_XKBCOMMON', have)
1186
1187 want_pcre2 = get_option('pcre2')
1188 if want_pcre2 != 'false'
1189 libpcre2 = dependency('libpcre2-8',
1190 required : want_pcre2 == 'true')
1191 have = libpcre2.found()
1192 else
1193 have = false
1194 libpcre2 = []
1195 endif
1196 conf.set10('HAVE_PCRE2', have)
1197
1198 want_glib = get_option('glib')
1199 if want_glib != 'false' and not skip_deps
1200 libglib = dependency('glib-2.0',
1201 version : '>= 2.22.0',
1202 required : want_glib == 'true')
1203 libgobject = dependency('gobject-2.0',
1204 version : '>= 2.22.0',
1205 required : want_glib == 'true')
1206 libgio = dependency('gio-2.0',
1207 required : want_glib == 'true')
1208 have = libglib.found() and libgobject.found() and libgio.found()
1209 else
1210 have = false
1211 libglib = []
1212 libgobject = []
1213 libgio = []
1214 endif
1215 conf.set10('HAVE_GLIB', have)
1216
1217 want_dbus = get_option('dbus')
1218 if want_dbus != 'false' and not skip_deps
1219 libdbus = dependency('dbus-1',
1220 version : '>= 1.3.2',
1221 required : want_dbus == 'true')
1222 have = libdbus.found()
1223 else
1224 have = false
1225 libdbus = []
1226 endif
1227 conf.set10('HAVE_DBUS', have)
1228
1229 default_dnssec = get_option('default-dnssec')
1230 if skip_deps
1231 default_dnssec = 'no'
1232 endif
1233 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1234 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1235 default_dnssec = 'no'
1236 endif
1237 conf.set('DEFAULT_DNSSEC_MODE',
1238 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1239 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1240
1241 dns_over_tls = get_option('dns-over-tls')
1242 if dns_over_tls != 'false'
1243 if dns_over_tls == 'openssl'
1244 have_gnutls = false
1245 else
1246 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1247 if dns_over_tls == 'gnutls' and not have_gnutls
1248 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1249 endif
1250 endif
1251 if dns_over_tls == 'gnutls' or have_gnutls
1252 have_openssl = false
1253 else
1254 have_openssl = conf.get('HAVE_OPENSSL') == 1
1255 if dns_over_tls != 'auto' and not have_openssl
1256 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1257 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1258 endif
1259 endif
1260 have = have_gnutls or have_openssl
1261 else
1262 have = false
1263 have_gnutls = false
1264 have_openssl = false
1265 endif
1266 conf.set10('ENABLE_DNS_OVER_TLS', have)
1267 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1268 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1269
1270 default_dns_over_tls = get_option('default-dns-over-tls')
1271 if skip_deps
1272 default_dns_over_tls = 'no'
1273 endif
1274 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1275 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.')
1276 default_dns_over_tls = 'no'
1277 endif
1278 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1279 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1280 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1281
1282 want_importd = get_option('importd')
1283 if want_importd != 'false'
1284 have = (conf.get('HAVE_LIBCURL') == 1 and
1285 conf.get('HAVE_ZLIB') == 1 and
1286 conf.get('HAVE_XZ') == 1 and
1287 conf.get('HAVE_GCRYPT') == 1)
1288 if want_importd == 'true' and not have
1289 error('importd support was requested, but dependencies are not available')
1290 endif
1291 else
1292 have = false
1293 endif
1294 conf.set10('ENABLE_IMPORTD', have)
1295
1296 want_remote = get_option('remote')
1297 if want_remote != 'false'
1298 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1299 conf.get('HAVE_LIBCURL') == 1]
1300 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1301 # it's possible to build one without the other. Complain only if
1302 # support was explicitly requested. The auxiliary files like sysusers
1303 # config should be installed when any of the programs are built.
1304 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1305 error('remote support was requested, but dependencies are not available')
1306 endif
1307 have = have_deps[0] or have_deps[1]
1308 else
1309 have = false
1310 endif
1311 conf.set10('ENABLE_REMOTE', have)
1312
1313 foreach term : ['utmp',
1314 'hibernate',
1315 'environment-d',
1316 'binfmt',
1317 'coredump',
1318 'pstore',
1319 'resolve',
1320 'logind',
1321 'hostnamed',
1322 'localed',
1323 'machined',
1324 'portabled',
1325 'networkd',
1326 'timedated',
1327 'timesyncd',
1328 'firstboot',
1329 'randomseed',
1330 'backlight',
1331 'vconsole',
1332 'quotacheck',
1333 'sysusers',
1334 'tmpfiles',
1335 'hwdb',
1336 'rfkill',
1337 'ldconfig',
1338 'efi',
1339 'tpm',
1340 'ima',
1341 'smack',
1342 'gshadow',
1343 'idn',
1344 'nss-myhostname',
1345 'nss-systemd']
1346 have = get_option(term)
1347 name = 'ENABLE_' + term.underscorify().to_upper()
1348 conf.set10(name, have)
1349 endforeach
1350
1351 foreach tuple : [['nss-mymachines', 'machined'],
1352 ['nss-resolve', 'resolve']]
1353 want = get_option(tuple[0])
1354 if want != 'false'
1355 have = get_option(tuple[1])
1356 if want == 'true' and not have
1357 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1358 endif
1359 else
1360 have = false
1361 endif
1362 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1363 conf.set10(name, have)
1364 endforeach
1365
1366 enable_nss = false
1367 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1368 'ENABLE_NSS_MYMACHINES',
1369 'ENABLE_NSS_RESOLVE',
1370 'ENABLE_NSS_SYSTEMD']
1371 if conf.get(term) == 1
1372 enable_nss = true
1373 endif
1374 endforeach
1375 conf.set10('ENABLE_NSS', enable_nss)
1376
1377 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1378
1379 tests = []
1380 fuzzers = []
1381
1382 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1383
1384 #####################################################################
1385
1386 if get_option('efi')
1387 efi_arch = host_machine.cpu_family()
1388
1389 if efi_arch == 'x86'
1390 EFI_MACHINE_TYPE_NAME = 'ia32'
1391 gnu_efi_arch = 'ia32'
1392 elif efi_arch == 'x86_64'
1393 EFI_MACHINE_TYPE_NAME = 'x64'
1394 gnu_efi_arch = 'x86_64'
1395 elif efi_arch == 'arm'
1396 EFI_MACHINE_TYPE_NAME = 'arm'
1397 gnu_efi_arch = 'arm'
1398 elif efi_arch == 'aarch64'
1399 EFI_MACHINE_TYPE_NAME = 'aa64'
1400 gnu_efi_arch = 'aarch64'
1401 else
1402 EFI_MACHINE_TYPE_NAME = ''
1403 gnu_efi_arch = ''
1404 endif
1405
1406 have = true
1407 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1408
1409 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1410 else
1411 have = false
1412 endif
1413 conf.set10('ENABLE_EFI', have)
1414
1415 #####################################################################
1416
1417 config_h = configure_file(
1418 output : 'config.h',
1419 configuration : conf)
1420
1421 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1422
1423 includes = include_directories('src/basic',
1424 'src/boot',
1425 'src/shared',
1426 'src/systemd',
1427 'src/journal',
1428 'src/journal-remote',
1429 'src/nspawn',
1430 'src/resolve',
1431 'src/timesync',
1432 'src/time-wait-sync',
1433 'src/login',
1434 'src/udev',
1435 'src/libudev',
1436 'src/core',
1437 'src/shutdown',
1438 'src/libsystemd/sd-bus',
1439 'src/libsystemd/sd-device',
1440 'src/libsystemd/sd-event',
1441 'src/libsystemd/sd-hwdb',
1442 'src/libsystemd/sd-id128',
1443 'src/libsystemd/sd-netlink',
1444 'src/libsystemd/sd-network',
1445 'src/libsystemd/sd-resolve',
1446 'src/libsystemd-network',
1447 '.')
1448
1449 add_project_arguments('-include', 'config.h', language : 'c')
1450
1451 generate_gperfs = find_program('tools/generate-gperfs.py')
1452
1453 subdir('po')
1454 subdir('catalog')
1455 subdir('src/systemd')
1456 subdir('src/basic')
1457 subdir('src/libsystemd')
1458 subdir('src/libsystemd-network')
1459 subdir('src/journal')
1460 subdir('src/login')
1461
1462 libjournal_core = static_library(
1463 'journal-core',
1464 libjournal_core_sources,
1465 journald_gperf_c,
1466 include_directories : includes,
1467 install : false)
1468
1469 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1470 libsystemd = shared_library(
1471 'systemd',
1472 disable_mempool_c,
1473 version : libsystemd_version,
1474 include_directories : includes,
1475 link_args : ['-shared',
1476 '-Wl,--version-script=' + libsystemd_sym_path],
1477 link_with : [libbasic,
1478 libbasic_gcrypt],
1479 link_whole : [libsystemd_static,
1480 libjournal_client],
1481 dependencies : [threads,
1482 librt,
1483 libxz,
1484 liblz4],
1485 link_depends : libsystemd_sym,
1486 install : true,
1487 install_dir : rootlibdir)
1488
1489 static_libsystemd = get_option('static-libsystemd')
1490 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1491
1492 install_libsystemd_static = static_library(
1493 'systemd',
1494 libsystemd_sources,
1495 journal_client_sources,
1496 basic_sources,
1497 basic_gcrypt_sources,
1498 disable_mempool_c,
1499 include_directories : includes,
1500 build_by_default : static_libsystemd != 'false',
1501 install : static_libsystemd != 'false',
1502 install_dir : rootlibdir,
1503 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1504 dependencies : [threads,
1505 librt,
1506 libxz,
1507 liblz4,
1508 libcap,
1509 libblkid,
1510 libmount,
1511 libselinux,
1512 libgcrypt],
1513 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1514
1515 #Generate autosuspend rules
1516 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1517
1518 ############################################################
1519
1520 # binaries that have --help and are intended for use by humans,
1521 # usually, but not always, installed in /bin.
1522 public_programs = []
1523
1524 subdir('src/libudev')
1525 subdir('src/shared')
1526 subdir('src/core')
1527 subdir('src/shutdown')
1528 subdir('src/udev')
1529 subdir('src/network')
1530
1531 subdir('src/analyze')
1532 subdir('src/journal-remote')
1533 subdir('src/coredump')
1534 subdir('src/pstore')
1535 subdir('src/hostname')
1536 subdir('src/import')
1537 subdir('src/kernel-install')
1538 subdir('src/locale')
1539 subdir('src/machine')
1540 subdir('src/portable')
1541 subdir('src/nspawn')
1542 subdir('src/resolve')
1543 subdir('src/timedate')
1544 subdir('src/timesync')
1545 subdir('src/vconsole')
1546 subdir('src/boot/efi')
1547
1548 subdir('src/test')
1549 subdir('src/fuzz')
1550 subdir('rules.d')
1551 subdir('test')
1552
1553 ############################################################
1554
1555 # only static linking apart from libdl, to make sure that the
1556 # module is linked to all libraries that it uses.
1557 test_dlopen = executable(
1558 'test-dlopen',
1559 test_dlopen_c,
1560 disable_mempool_c,
1561 include_directories : includes,
1562 link_with : [libbasic],
1563 dependencies : [libdl],
1564 build_by_default : want_tests != 'false')
1565
1566 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1567 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1568 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1569 ['resolve', 'ENABLE_NSS_RESOLVE']]
1570
1571 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1572 if condition
1573 module = tuple[0]
1574
1575 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1576 version_script_arg = join_paths(project_source_root, sym)
1577
1578 nss = shared_library(
1579 'nss_' + module,
1580 'src/nss-@0@/nss-@0@.c'.format(module),
1581 disable_mempool_c,
1582 version : '2',
1583 include_directories : includes,
1584 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1585 link_args : ['-Wl,-z,nodelete',
1586 '-shared',
1587 '-Wl,--version-script=' + version_script_arg],
1588 link_with : [libsystemd_static,
1589 libshared_static,
1590 libbasic],
1591 dependencies : [threads,
1592 librt],
1593 link_depends : sym,
1594 install : true,
1595 install_dir : rootlibdir)
1596
1597 # We cannot use shared_module because it does not support version suffix.
1598 # Unfortunately shared_library insists on creating the symlink…
1599 meson.add_install_script('sh', '-c',
1600 'rm $DESTDIR@0@/libnss_@1@.so'
1601 .format(rootlibdir, module))
1602
1603 if want_tests != 'false'
1604 test('dlopen-nss_' + module,
1605 test_dlopen,
1606 # path to dlopen must include a slash
1607 args : nss.full_path())
1608 endif
1609 endif
1610 endforeach
1611
1612 ############################################################
1613
1614 executable('systemd',
1615 systemd_sources,
1616 include_directories : includes,
1617 link_with : [libcore,
1618 libshared],
1619 dependencies : [versiondep,
1620 threads,
1621 librt,
1622 libseccomp,
1623 libselinux,
1624 libmount,
1625 libblkid],
1626 install_rpath : rootlibexecdir,
1627 install : true,
1628 install_dir : rootlibexecdir)
1629
1630 meson.add_install_script(meson_make_symlink,
1631 join_paths(rootlibexecdir, 'systemd'),
1632 join_paths(rootsbindir, 'init'))
1633
1634 exe = executable('systemd-analyze',
1635 systemd_analyze_sources,
1636 include_directories : includes,
1637 link_with : [libcore,
1638 libshared],
1639 dependencies : [versiondep,
1640 threads,
1641 librt,
1642 libseccomp,
1643 libselinux,
1644 libmount,
1645 libblkid],
1646 install_rpath : rootlibexecdir,
1647 install : true)
1648 public_programs += exe
1649
1650 executable('systemd-journald',
1651 systemd_journald_sources,
1652 include_directories : includes,
1653 link_with : [libjournal_core,
1654 libshared],
1655 dependencies : [threads,
1656 libxz,
1657 liblz4,
1658 libselinux],
1659 install_rpath : rootlibexecdir,
1660 install : true,
1661 install_dir : rootlibexecdir)
1662
1663 exe = executable('systemd-cat',
1664 systemd_cat_sources,
1665 include_directories : includes,
1666 link_with : [libjournal_core,
1667 libshared],
1668 dependencies : [threads],
1669 install_rpath : rootlibexecdir,
1670 install : true)
1671 public_programs += exe
1672
1673 exe = executable('journalctl',
1674 journalctl_sources,
1675 include_directories : includes,
1676 link_with : [libshared],
1677 dependencies : [threads,
1678 libqrencode,
1679 libxz,
1680 liblz4,
1681 libpcre2],
1682 install_rpath : rootlibexecdir,
1683 install : true,
1684 install_dir : rootbindir)
1685 public_programs += exe
1686
1687 executable('systemd-getty-generator',
1688 'src/getty-generator/getty-generator.c',
1689 include_directories : includes,
1690 link_with : [libshared],
1691 install_rpath : rootlibexecdir,
1692 install : true,
1693 install_dir : systemgeneratordir)
1694
1695 executable('systemd-debug-generator',
1696 'src/debug-generator/debug-generator.c',
1697 include_directories : includes,
1698 link_with : [libshared],
1699 install_rpath : rootlibexecdir,
1700 install : true,
1701 install_dir : systemgeneratordir)
1702
1703 executable('systemd-run-generator',
1704 'src/run-generator/run-generator.c',
1705 include_directories : includes,
1706 link_with : [libshared],
1707 install_rpath : rootlibexecdir,
1708 install : true,
1709 install_dir : systemgeneratordir)
1710
1711 executable('systemd-fstab-generator',
1712 'src/fstab-generator/fstab-generator.c',
1713 include_directories : includes,
1714 link_with : [libcore_shared,
1715 libshared],
1716 install_rpath : rootlibexecdir,
1717 install : true,
1718 install_dir : systemgeneratordir)
1719
1720 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1721 executable('30-systemd-environment-d-generator',
1722 'src/environment-d-generator/environment-d-generator.c',
1723 include_directories : includes,
1724 link_with : [libshared],
1725 install_rpath : rootlibexecdir,
1726 install : true,
1727 install_dir : userenvgeneratordir)
1728
1729 meson.add_install_script(meson_make_symlink,
1730 join_paths(sysconfdir, 'environment'),
1731 join_paths(environmentdir, '99-environment.conf'))
1732 endif
1733
1734 if conf.get('ENABLE_HIBERNATE') == 1
1735 executable('systemd-hibernate-resume-generator',
1736 'src/hibernate-resume/hibernate-resume-generator.c',
1737 include_directories : includes,
1738 link_with : [libshared],
1739 install_rpath : rootlibexecdir,
1740 install : true,
1741 install_dir : systemgeneratordir)
1742
1743 executable('systemd-hibernate-resume',
1744 'src/hibernate-resume/hibernate-resume.c',
1745 include_directories : includes,
1746 link_with : [libshared],
1747 install_rpath : rootlibexecdir,
1748 install : true,
1749 install_dir : rootlibexecdir)
1750 endif
1751
1752 if conf.get('HAVE_BLKID') == 1
1753 executable('systemd-gpt-auto-generator',
1754 'src/gpt-auto-generator/gpt-auto-generator.c',
1755 'src/shared/blkid-util.h',
1756 include_directories : includes,
1757 link_with : [libshared],
1758 dependencies : libblkid,
1759 install_rpath : rootlibexecdir,
1760 install : true,
1761 install_dir : systemgeneratordir)
1762
1763 exe = executable('systemd-dissect',
1764 'src/dissect/dissect.c',
1765 include_directories : includes,
1766 link_with : [libshared],
1767 install_rpath : rootlibexecdir,
1768 install : true,
1769 install_dir : rootlibexecdir)
1770 public_programs += exe
1771 endif
1772
1773 if conf.get('ENABLE_RESOLVE') == 1
1774 executable('systemd-resolved',
1775 systemd_resolved_sources,
1776 include_directories : includes,
1777 link_with : [libshared,
1778 libbasic_gcrypt,
1779 libsystemd_resolve_core],
1780 dependencies : systemd_resolved_dependencies,
1781 install_rpath : rootlibexecdir,
1782 install : true,
1783 install_dir : rootlibexecdir)
1784
1785 exe = executable('resolvectl',
1786 resolvectl_sources,
1787 include_directories : includes,
1788 link_with : [libshared,
1789 libbasic_gcrypt,
1790 libsystemd_resolve_core],
1791 dependencies : [threads,
1792 libgpg_error,
1793 libm,
1794 libidn],
1795 install_rpath : rootlibexecdir,
1796 install : true)
1797 public_programs += exe
1798
1799 meson.add_install_script(meson_make_symlink,
1800 join_paths(bindir, 'resolvectl'),
1801 join_paths(rootsbindir, 'resolvconf'))
1802
1803 meson.add_install_script(meson_make_symlink,
1804 join_paths(bindir, 'resolvectl'),
1805 join_paths(bindir, 'systemd-resolve'))
1806 endif
1807
1808 if conf.get('ENABLE_LOGIND') == 1
1809 executable('systemd-logind',
1810 systemd_logind_sources,
1811 include_directories : includes,
1812 link_with : [liblogind_core,
1813 libshared],
1814 dependencies : [threads,
1815 libacl],
1816 install_rpath : rootlibexecdir,
1817 install : true,
1818 install_dir : rootlibexecdir)
1819
1820 exe = executable('loginctl',
1821 loginctl_sources,
1822 include_directories : includes,
1823 link_with : [libshared],
1824 dependencies : [threads,
1825 liblz4,
1826 libxz],
1827 install_rpath : rootlibexecdir,
1828 install : true,
1829 install_dir : rootbindir)
1830 public_programs += exe
1831
1832 exe = executable('systemd-inhibit',
1833 'src/login/inhibit.c',
1834 include_directories : includes,
1835 link_with : [libshared],
1836 install_rpath : rootlibexecdir,
1837 install : true,
1838 install_dir : rootbindir)
1839 public_programs += exe
1840
1841 if conf.get('HAVE_PAM') == 1
1842 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1843 pam_systemd = shared_library(
1844 'pam_systemd',
1845 pam_systemd_c,
1846 name_prefix : '',
1847 include_directories : includes,
1848 link_args : ['-shared',
1849 '-Wl,--version-script=' + version_script_arg],
1850 link_with : [libsystemd_static,
1851 libshared_static],
1852 dependencies : [threads,
1853 libpam,
1854 libpam_misc],
1855 link_depends : pam_systemd_sym,
1856 install : true,
1857 install_dir : pamlibdir)
1858
1859 if want_tests != 'false'
1860 test('dlopen-pam_systemd',
1861 test_dlopen,
1862 # path to dlopen must include a slash
1863 args : pam_systemd.full_path())
1864 endif
1865 endif
1866
1867 executable('systemd-user-runtime-dir',
1868 user_runtime_dir_sources,
1869 include_directories : includes,
1870 link_with : [libshared],
1871 install_rpath : rootlibexecdir,
1872 install : true,
1873 install_dir : rootlibexecdir)
1874 endif
1875
1876 if conf.get('HAVE_PAM') == 1
1877 executable('systemd-user-sessions',
1878 'src/user-sessions/user-sessions.c',
1879 include_directories : includes,
1880 link_with : [libshared],
1881 install_rpath : rootlibexecdir,
1882 install : true,
1883 install_dir : rootlibexecdir)
1884 endif
1885
1886 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1887 exe = executable('bootctl',
1888 'src/boot/bootctl.c',
1889 include_directories : includes,
1890 link_with : [libshared],
1891 dependencies : [libblkid],
1892 install_rpath : rootlibexecdir,
1893 install : true)
1894 public_programs += exe
1895
1896 executable('systemd-bless-boot',
1897 'src/boot/bless-boot.c',
1898 include_directories : includes,
1899 link_with : [libshared],
1900 dependencies : [libblkid],
1901 install_rpath : rootlibexecdir,
1902 install : true,
1903 install_dir : rootlibexecdir)
1904
1905 executable('systemd-bless-boot-generator',
1906 'src/boot/bless-boot-generator.c',
1907 include_directories : includes,
1908 link_with : [libshared],
1909 install_rpath : rootlibexecdir,
1910 install : true,
1911 install_dir : systemgeneratordir)
1912 endif
1913
1914 executable('systemd-boot-check-no-failures',
1915 'src/boot/boot-check-no-failures.c',
1916 include_directories : includes,
1917 link_with : [libshared],
1918 dependencies : [libblkid],
1919 install_rpath : rootlibexecdir,
1920 install : true,
1921 install_dir : rootlibexecdir)
1922
1923 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1924 include_directories : includes,
1925 link_with : [libshared],
1926 dependencies : [threads],
1927 install_rpath : rootlibexecdir,
1928 install : true)
1929 public_programs += exe
1930
1931
1932 if get_option('link-systemctl-shared')
1933 systemctl_link_with = [libshared]
1934 else
1935 systemctl_link_with = [libsystemd_static,
1936 libshared_static,
1937 libjournal_client,
1938 libbasic_gcrypt]
1939 endif
1940
1941 exe = executable('systemctl',
1942 'src/systemctl/systemctl.c',
1943 'src/systemctl/sysv-compat.h',
1944 'src/systemctl/sysv-compat.c',
1945 include_directories : includes,
1946 link_with : systemctl_link_with,
1947 dependencies : [threads,
1948 libcap,
1949 libselinux,
1950 libxz,
1951 liblz4],
1952 install_rpath : rootlibexecdir,
1953 install : true,
1954 install_dir : rootbindir)
1955 public_programs += exe
1956
1957 if conf.get('ENABLE_PORTABLED') == 1
1958 executable('systemd-portabled',
1959 systemd_portabled_sources,
1960 include_directories : includes,
1961 link_with : [libshared],
1962 dependencies : [threads],
1963 install_rpath : rootlibexecdir,
1964 install : true,
1965 install_dir : rootlibexecdir)
1966
1967 exe = executable('portablectl', 'src/portable/portablectl.c',
1968 include_directories : includes,
1969 link_with : [libshared],
1970 dependencies : [threads],
1971 install_rpath : rootlibexecdir,
1972 install : true,
1973 install_dir : rootbindir)
1974 public_programs += exe
1975 endif
1976
1977 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
1978 meson.add_install_script(meson_make_symlink,
1979 join_paths(rootbindir, 'systemctl'),
1980 join_paths(rootsbindir, alias))
1981 endforeach
1982
1983 if conf.get('ENABLE_BACKLIGHT') == 1
1984 executable('systemd-backlight',
1985 'src/backlight/backlight.c',
1986 include_directories : includes,
1987 link_with : [libshared],
1988 install_rpath : rootlibexecdir,
1989 install : true,
1990 install_dir : rootlibexecdir)
1991 endif
1992
1993 if conf.get('ENABLE_RFKILL') == 1
1994 executable('systemd-rfkill',
1995 'src/rfkill/rfkill.c',
1996 include_directories : includes,
1997 link_with : [libshared],
1998 install_rpath : rootlibexecdir,
1999 install : true,
2000 install_dir : rootlibexecdir)
2001 endif
2002
2003 executable('systemd-system-update-generator',
2004 'src/system-update-generator/system-update-generator.c',
2005 include_directories : includes,
2006 link_with : [libshared],
2007 install_rpath : rootlibexecdir,
2008 install : true,
2009 install_dir : systemgeneratordir)
2010
2011 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2012 systemd_cryptsetup_sources = files('''
2013 src/cryptsetup/cryptsetup.c
2014 src/cryptsetup/cryptsetup-pkcs11.h
2015 '''.split())
2016
2017 if conf.get('HAVE_P11KIT') == 1
2018 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2019 endif
2020
2021 executable('systemd-cryptsetup',
2022 systemd_cryptsetup_sources,
2023 include_directories : includes,
2024 link_with : [libshared],
2025 dependencies : [libcryptsetup,
2026 libp11kit],
2027 install_rpath : rootlibexecdir,
2028 install : true,
2029 install_dir : rootlibexecdir)
2030
2031 executable('systemd-cryptsetup-generator',
2032 'src/cryptsetup/cryptsetup-generator.c',
2033 include_directories : includes,
2034 link_with : [libshared],
2035 dependencies : [libcryptsetup],
2036 install_rpath : rootlibexecdir,
2037 install : true,
2038 install_dir : systemgeneratordir)
2039
2040 executable('systemd-veritysetup',
2041 'src/veritysetup/veritysetup.c',
2042 include_directories : includes,
2043 link_with : [libshared],
2044 dependencies : [libcryptsetup],
2045 install_rpath : rootlibexecdir,
2046 install : true,
2047 install_dir : rootlibexecdir)
2048
2049 executable('systemd-veritysetup-generator',
2050 'src/veritysetup/veritysetup-generator.c',
2051 include_directories : includes,
2052 link_with : [libshared],
2053 dependencies : [libcryptsetup],
2054 install_rpath : rootlibexecdir,
2055 install : true,
2056 install_dir : systemgeneratordir)
2057 endif
2058
2059 if conf.get('HAVE_SYSV_COMPAT') == 1
2060 executable('systemd-sysv-generator',
2061 'src/sysv-generator/sysv-generator.c',
2062 include_directories : includes,
2063 link_with : [libshared],
2064 install_rpath : rootlibexecdir,
2065 install : true,
2066 install_dir : systemgeneratordir)
2067
2068 executable('systemd-rc-local-generator',
2069 'src/rc-local-generator/rc-local-generator.c',
2070 include_directories : includes,
2071 link_with : [libshared],
2072 install_rpath : rootlibexecdir,
2073 install : true,
2074 install_dir : systemgeneratordir)
2075 endif
2076
2077 if conf.get('ENABLE_HOSTNAMED') == 1
2078 executable('systemd-hostnamed',
2079 'src/hostname/hostnamed.c',
2080 include_directories : includes,
2081 link_with : [libshared],
2082 install_rpath : rootlibexecdir,
2083 install : true,
2084 install_dir : rootlibexecdir)
2085
2086 exe = executable('hostnamectl',
2087 'src/hostname/hostnamectl.c',
2088 include_directories : includes,
2089 link_with : [libshared],
2090 install_rpath : rootlibexecdir,
2091 install : true)
2092 public_programs += exe
2093 endif
2094
2095 if conf.get('ENABLE_LOCALED') == 1
2096 if conf.get('HAVE_XKBCOMMON') == 1
2097 # logind will load libxkbcommon.so dynamically on its own
2098 deps = [libdl]
2099 else
2100 deps = []
2101 endif
2102
2103 executable('systemd-localed',
2104 systemd_localed_sources,
2105 include_directories : includes,
2106 link_with : [libshared],
2107 dependencies : deps,
2108 install_rpath : rootlibexecdir,
2109 install : true,
2110 install_dir : rootlibexecdir)
2111
2112 exe = executable('localectl',
2113 localectl_sources,
2114 include_directories : includes,
2115 link_with : [libshared],
2116 install_rpath : rootlibexecdir,
2117 install : true)
2118 public_programs += exe
2119 endif
2120
2121 if conf.get('ENABLE_TIMEDATED') == 1
2122 executable('systemd-timedated',
2123 'src/timedate/timedated.c',
2124 include_directories : includes,
2125 link_with : [libshared],
2126 install_rpath : rootlibexecdir,
2127 install : true,
2128 install_dir : rootlibexecdir)
2129 endif
2130
2131 if conf.get('ENABLE_TIMEDATECTL') == 1
2132 exe = executable('timedatectl',
2133 'src/timedate/timedatectl.c',
2134 include_directories : includes,
2135 install_rpath : rootlibexecdir,
2136 link_with : [libshared],
2137 dependencies : [libm],
2138 install : true)
2139 public_programs += exe
2140 endif
2141
2142 if conf.get('ENABLE_TIMESYNCD') == 1
2143 executable('systemd-timesyncd',
2144 systemd_timesyncd_sources,
2145 include_directories : includes,
2146 link_with : [libshared],
2147 dependencies : [threads,
2148 libm],
2149 install_rpath : rootlibexecdir,
2150 install : true,
2151 install_dir : rootlibexecdir)
2152
2153 executable('systemd-time-wait-sync',
2154 'src/time-wait-sync/time-wait-sync.c',
2155 include_directories : includes,
2156 link_with : [libshared],
2157 install_rpath : rootlibexecdir,
2158 install : true,
2159 install_dir : rootlibexecdir)
2160 endif
2161
2162 if conf.get('ENABLE_MACHINED') == 1
2163 executable('systemd-machined',
2164 systemd_machined_sources,
2165 include_directories : includes,
2166 link_with : [libmachine_core,
2167 libshared],
2168 install_rpath : rootlibexecdir,
2169 install : true,
2170 install_dir : rootlibexecdir)
2171
2172 exe = executable('machinectl',
2173 'src/machine/machinectl.c',
2174 include_directories : includes,
2175 link_with : [libshared],
2176 dependencies : [threads,
2177 libxz,
2178 liblz4],
2179 install_rpath : rootlibexecdir,
2180 install : true,
2181 install_dir : rootbindir)
2182 public_programs += exe
2183 endif
2184
2185 if conf.get('ENABLE_IMPORTD') == 1
2186 executable('systemd-importd',
2187 systemd_importd_sources,
2188 include_directories : includes,
2189 link_with : [libshared],
2190 dependencies : [threads],
2191 install_rpath : rootlibexecdir,
2192 install : true,
2193 install_dir : rootlibexecdir)
2194
2195 systemd_pull = executable('systemd-pull',
2196 systemd_pull_sources,
2197 include_directories : includes,
2198 link_with : [libshared],
2199 dependencies : [versiondep,
2200 libcurl,
2201 libz,
2202 libbzip2,
2203 libxz,
2204 libgcrypt],
2205 install_rpath : rootlibexecdir,
2206 install : true,
2207 install_dir : rootlibexecdir)
2208
2209 systemd_import = executable('systemd-import',
2210 systemd_import_sources,
2211 include_directories : includes,
2212 link_with : [libshared],
2213 dependencies : [libcurl,
2214 libz,
2215 libbzip2,
2216 libxz],
2217 install_rpath : rootlibexecdir,
2218 install : true,
2219 install_dir : rootlibexecdir)
2220
2221 systemd_import_fs = executable('systemd-import-fs',
2222 systemd_import_fs_sources,
2223 include_directories : includes,
2224 link_with : [libshared],
2225 install_rpath : rootlibexecdir,
2226 install : true,
2227 install_dir : rootlibexecdir)
2228
2229 systemd_export = executable('systemd-export',
2230 systemd_export_sources,
2231 include_directories : includes,
2232 link_with : [libshared],
2233 dependencies : [libcurl,
2234 libz,
2235 libbzip2,
2236 libxz],
2237 install_rpath : rootlibexecdir,
2238 install : true,
2239 install_dir : rootlibexecdir)
2240
2241 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2242 endif
2243
2244 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2245 exe = executable('systemd-journal-upload',
2246 systemd_journal_upload_sources,
2247 include_directories : includes,
2248 link_with : [libshared],
2249 dependencies : [versiondep,
2250 threads,
2251 libcurl,
2252 libgnutls,
2253 libxz,
2254 liblz4],
2255 install_rpath : rootlibexecdir,
2256 install : true,
2257 install_dir : rootlibexecdir)
2258 public_programs += exe
2259 endif
2260
2261 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2262 s_j_remote = executable('systemd-journal-remote',
2263 systemd_journal_remote_sources,
2264 include_directories : includes,
2265 link_with : [libshared,
2266 libsystemd_journal_remote],
2267 dependencies : [threads,
2268 libmicrohttpd,
2269 libgnutls,
2270 libxz,
2271 liblz4],
2272 install_rpath : rootlibexecdir,
2273 install : true,
2274 install_dir : rootlibexecdir)
2275
2276 s_j_gatewayd = executable('systemd-journal-gatewayd',
2277 systemd_journal_gatewayd_sources,
2278 include_directories : includes,
2279 link_with : [libshared],
2280 dependencies : [threads,
2281 libmicrohttpd,
2282 libgnutls,
2283 libxz,
2284 liblz4],
2285 install_rpath : rootlibexecdir,
2286 install : true,
2287 install_dir : rootlibexecdir)
2288 public_programs += [s_j_remote, s_j_gatewayd]
2289 endif
2290
2291 if conf.get('ENABLE_COREDUMP') == 1
2292 executable('systemd-coredump',
2293 systemd_coredump_sources,
2294 include_directories : includes,
2295 link_with : [libshared],
2296 dependencies : [threads,
2297 libacl,
2298 libdw,
2299 libxz,
2300 liblz4],
2301 install_rpath : rootlibexecdir,
2302 install : true,
2303 install_dir : rootlibexecdir)
2304
2305 exe = executable('coredumpctl',
2306 coredumpctl_sources,
2307 include_directories : includes,
2308 link_with : [libshared],
2309 dependencies : [threads,
2310 libxz,
2311 liblz4],
2312 install_rpath : rootlibexecdir,
2313 install : true)
2314 public_programs += exe
2315 endif
2316
2317 if conf.get('ENABLE_PSTORE') == 1
2318 executable('systemd-pstore',
2319 systemd_pstore_sources,
2320 include_directories : includes,
2321 link_with : [libshared],
2322 dependencies : [threads,
2323 libacl,
2324 libdw,
2325 libxz,
2326 liblz4],
2327 install_rpath : rootlibexecdir,
2328 install : true,
2329 install_dir : rootlibexecdir)
2330 endif
2331
2332 if conf.get('ENABLE_BINFMT') == 1
2333 exe = executable('systemd-binfmt',
2334 'src/binfmt/binfmt.c',
2335 include_directories : includes,
2336 link_with : [libshared],
2337 install_rpath : rootlibexecdir,
2338 install : true,
2339 install_dir : rootlibexecdir)
2340 public_programs += exe
2341
2342 meson.add_install_script('sh', '-c',
2343 mkdir_p.format(binfmtdir))
2344 meson.add_install_script('sh', '-c',
2345 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2346 endif
2347
2348 if conf.get('ENABLE_VCONSOLE') == 1
2349 executable('systemd-vconsole-setup',
2350 'src/vconsole/vconsole-setup.c',
2351 include_directories : includes,
2352 link_with : [libshared],
2353 install_rpath : rootlibexecdir,
2354 install : true,
2355 install_dir : rootlibexecdir)
2356 endif
2357
2358 if conf.get('ENABLE_RANDOMSEED') == 1
2359 executable('systemd-random-seed',
2360 'src/random-seed/random-seed.c',
2361 include_directories : includes,
2362 link_with : [libshared],
2363 install_rpath : rootlibexecdir,
2364 install : true,
2365 install_dir : rootlibexecdir)
2366 endif
2367
2368 if conf.get('ENABLE_FIRSTBOOT') == 1
2369 executable('systemd-firstboot',
2370 'src/firstboot/firstboot.c',
2371 include_directories : includes,
2372 link_with : [libshared],
2373 dependencies : [libcrypt],
2374 install_rpath : rootlibexecdir,
2375 install : true,
2376 install_dir : rootbindir)
2377 endif
2378
2379 executable('systemd-remount-fs',
2380 'src/remount-fs/remount-fs.c',
2381 include_directories : includes,
2382 link_with : [libcore_shared,
2383 libshared],
2384 install_rpath : rootlibexecdir,
2385 install : true,
2386 install_dir : rootlibexecdir)
2387
2388 executable('systemd-machine-id-setup',
2389 'src/machine-id-setup/machine-id-setup-main.c',
2390 include_directories : includes,
2391 link_with : [libcore_shared,
2392 libshared],
2393 install_rpath : rootlibexecdir,
2394 install : true,
2395 install_dir : rootbindir)
2396
2397 executable('systemd-fsck',
2398 'src/fsck/fsck.c',
2399 include_directories : includes,
2400 link_with : [libshared],
2401 install_rpath : rootlibexecdir,
2402 install : true,
2403 install_dir : rootlibexecdir)
2404
2405 executable('systemd-growfs',
2406 'src/partition/growfs.c',
2407 include_directories : includes,
2408 link_with : [libshared],
2409 dependencies : [libcryptsetup],
2410 install_rpath : rootlibexecdir,
2411 install : true,
2412 install_dir : rootlibexecdir)
2413
2414 executable('systemd-makefs',
2415 'src/partition/makefs.c',
2416 include_directories : includes,
2417 link_with : [libshared],
2418 install_rpath : rootlibexecdir,
2419 install : true,
2420 install_dir : rootlibexecdir)
2421
2422 executable('systemd-sleep',
2423 'src/sleep/sleep.c',
2424 include_directories : includes,
2425 link_with : [libshared],
2426 install_rpath : rootlibexecdir,
2427 install : true,
2428 install_dir : rootlibexecdir)
2429
2430 install_data('src/sleep/sleep.conf',
2431 install_dir : pkgsysconfdir)
2432
2433 exe = executable('systemd-sysctl',
2434 'src/sysctl/sysctl.c',
2435 include_directories : includes,
2436 link_with : [libshared],
2437 install_rpath : rootlibexecdir,
2438 install : true,
2439 install_dir : rootlibexecdir)
2440 public_programs += exe
2441
2442 executable('systemd-ac-power',
2443 'src/ac-power/ac-power.c',
2444 include_directories : includes,
2445 link_with : [libshared],
2446 install_rpath : rootlibexecdir,
2447 install : true,
2448 install_dir : rootlibexecdir)
2449
2450 exe = executable('systemd-detect-virt',
2451 'src/detect-virt/detect-virt.c',
2452 include_directories : includes,
2453 link_with : [libshared],
2454 install_rpath : rootlibexecdir,
2455 install : true)
2456 public_programs += exe
2457
2458 exe = executable('systemd-delta',
2459 'src/delta/delta.c',
2460 include_directories : includes,
2461 link_with : [libshared],
2462 install_rpath : rootlibexecdir,
2463 install : true)
2464 public_programs += exe
2465
2466 exe = executable('systemd-escape',
2467 'src/escape/escape.c',
2468 include_directories : includes,
2469 link_with : [libshared],
2470 install_rpath : rootlibexecdir,
2471 install : true,
2472 install_dir : rootbindir)
2473 public_programs += exe
2474
2475 exe = executable('systemd-notify',
2476 'src/notify/notify.c',
2477 include_directories : includes,
2478 link_with : [libshared],
2479 install_rpath : rootlibexecdir,
2480 install : true,
2481 install_dir : rootbindir)
2482 public_programs += exe
2483
2484 executable('systemd-volatile-root',
2485 'src/volatile-root/volatile-root.c',
2486 include_directories : includes,
2487 link_with : [libshared],
2488 install_rpath : rootlibexecdir,
2489 install : true,
2490 install_dir : rootlibexecdir)
2491
2492 executable('systemd-cgroups-agent',
2493 'src/cgroups-agent/cgroups-agent.c',
2494 include_directories : includes,
2495 link_with : [libshared],
2496 install_rpath : rootlibexecdir,
2497 install : true,
2498 install_dir : rootlibexecdir)
2499
2500 exe = executable('systemd-id128',
2501 'src/id128/id128.c',
2502 include_directories : includes,
2503 link_with : [libshared],
2504 install_rpath : rootlibexecdir,
2505 install : true)
2506 public_programs += exe
2507
2508 exe = executable('systemd-path',
2509 'src/path/path.c',
2510 include_directories : includes,
2511 link_with : [libshared],
2512 install_rpath : rootlibexecdir,
2513 install : true)
2514 public_programs += exe
2515
2516 exe = executable('systemd-ask-password',
2517 'src/ask-password/ask-password.c',
2518 include_directories : includes,
2519 link_with : [libshared],
2520 install_rpath : rootlibexecdir,
2521 install : true,
2522 install_dir : rootbindir)
2523 public_programs += exe
2524
2525 executable('systemd-reply-password',
2526 'src/reply-password/reply-password.c',
2527 include_directories : includes,
2528 link_with : [libshared],
2529 install_rpath : rootlibexecdir,
2530 install : true,
2531 install_dir : rootlibexecdir)
2532
2533 exe = executable('systemd-tty-ask-password-agent',
2534 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2535 include_directories : includes,
2536 link_with : [libshared],
2537 install_rpath : rootlibexecdir,
2538 install : true,
2539 install_dir : rootbindir)
2540 public_programs += exe
2541
2542 exe = executable('systemd-cgls',
2543 'src/cgls/cgls.c',
2544 include_directories : includes,
2545 link_with : [libshared],
2546 install_rpath : rootlibexecdir,
2547 install : true)
2548 public_programs += exe
2549
2550 exe = executable('systemd-cgtop',
2551 'src/cgtop/cgtop.c',
2552 include_directories : includes,
2553 link_with : [libshared],
2554 install_rpath : rootlibexecdir,
2555 install : true)
2556 public_programs += exe
2557
2558 executable('systemd-initctl',
2559 'src/initctl/initctl.c',
2560 include_directories : includes,
2561 link_with : [libshared],
2562 install_rpath : rootlibexecdir,
2563 install : true,
2564 install_dir : rootlibexecdir)
2565
2566 exe = executable('systemd-mount',
2567 'src/mount/mount-tool.c',
2568 include_directories : includes,
2569 link_with : [libshared],
2570 dependencies: [libmount],
2571 install_rpath : rootlibexecdir,
2572 install : true)
2573 public_programs += exe
2574
2575 meson.add_install_script(meson_make_symlink,
2576 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2577
2578 exe = executable('systemd-run',
2579 'src/run/run.c',
2580 include_directories : includes,
2581 link_with : [libshared],
2582 install_rpath : rootlibexecdir,
2583 install : true)
2584 public_programs += exe
2585
2586 exe = executable('systemd-stdio-bridge',
2587 'src/stdio-bridge/stdio-bridge.c',
2588 include_directories : includes,
2589 link_with : [libshared],
2590 dependencies : [versiondep],
2591 install_rpath : rootlibexecdir,
2592 install : true)
2593 public_programs += exe
2594
2595 exe = executable('busctl',
2596 'src/busctl/busctl.c',
2597 'src/busctl/busctl-introspect.c',
2598 'src/busctl/busctl-introspect.h',
2599 include_directories : includes,
2600 link_with : [libshared],
2601 install_rpath : rootlibexecdir,
2602 install : true)
2603 public_programs += exe
2604
2605 if conf.get('ENABLE_SYSUSERS') == 1
2606 exe = executable('systemd-sysusers',
2607 'src/sysusers/sysusers.c',
2608 include_directories : includes,
2609 link_with : [libshared],
2610 install_rpath : rootlibexecdir,
2611 install : true,
2612 install_dir : rootbindir)
2613 public_programs += exe
2614 endif
2615
2616 if conf.get('ENABLE_TMPFILES') == 1
2617 exe = executable('systemd-tmpfiles',
2618 'src/tmpfiles/tmpfiles.c',
2619 include_directories : includes,
2620 link_with : [libshared],
2621 dependencies : [libacl],
2622 install_rpath : rootlibexecdir,
2623 install : true,
2624 install_dir : rootbindir)
2625 public_programs += exe
2626
2627 if want_tests != 'false'
2628 test('test-systemd-tmpfiles',
2629 test_systemd_tmpfiles_py,
2630 # https://github.com/mesonbuild/meson/issues/2681
2631 args : exe.full_path())
2632 endif
2633 endif
2634
2635 if conf.get('ENABLE_HWDB') == 1
2636 exe = executable('systemd-hwdb',
2637 'src/hwdb/hwdb.c',
2638 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2639 include_directories : includes,
2640 link_with : [libudev_static],
2641 install_rpath : udev_rpath,
2642 install : true,
2643 install_dir : rootbindir)
2644 public_programs += exe
2645 endif
2646
2647 if conf.get('ENABLE_QUOTACHECK') == 1
2648 executable('systemd-quotacheck',
2649 'src/quotacheck/quotacheck.c',
2650 include_directories : includes,
2651 link_with : [libshared],
2652 install_rpath : rootlibexecdir,
2653 install : true,
2654 install_dir : rootlibexecdir)
2655 endif
2656
2657 exe = executable('systemd-socket-proxyd',
2658 'src/socket-proxy/socket-proxyd.c',
2659 include_directories : includes,
2660 link_with : [libshared],
2661 dependencies : [threads],
2662 install_rpath : rootlibexecdir,
2663 install : true,
2664 install_dir : rootlibexecdir)
2665 public_programs += exe
2666
2667 exe = executable('systemd-udevd',
2668 systemd_udevd_sources,
2669 include_directories : includes,
2670 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2671 link_with : [libudev_core,
2672 libsystemd_network,
2673 libudev_static],
2674 dependencies : [versiondep,
2675 threads,
2676 libkmod,
2677 libidn,
2678 libacl,
2679 libblkid],
2680 install_rpath : udev_rpath,
2681 install : true,
2682 install_dir : rootlibexecdir)
2683 public_programs += exe
2684
2685 exe = executable('udevadm',
2686 udevadm_sources,
2687 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2688 include_directories : includes,
2689 link_with : [libudev_core,
2690 libsystemd_network,
2691 libudev_static],
2692 dependencies : [versiondep,
2693 threads,
2694 libkmod,
2695 libidn,
2696 libacl,
2697 libblkid],
2698 install_rpath : udev_rpath,
2699 install : true,
2700 install_dir : rootbindir)
2701 public_programs += exe
2702
2703 executable('systemd-shutdown',
2704 systemd_shutdown_sources,
2705 include_directories : includes,
2706 link_with : [libcore_shared,
2707 libshared],
2708 dependencies : [libmount],
2709 install_rpath : rootlibexecdir,
2710 install : true,
2711 install_dir : rootlibexecdir)
2712
2713 executable('systemd-update-done',
2714 'src/update-done/update-done.c',
2715 include_directories : includes,
2716 link_with : [libshared],
2717 install_rpath : rootlibexecdir,
2718 install : true,
2719 install_dir : rootlibexecdir)
2720
2721 executable('systemd-update-utmp',
2722 'src/update-utmp/update-utmp.c',
2723 include_directories : includes,
2724 link_with : [libshared],
2725 dependencies : [libaudit],
2726 install_rpath : rootlibexecdir,
2727 install : true,
2728 install_dir : rootlibexecdir)
2729
2730 if conf.get('HAVE_KMOD') == 1
2731 executable('systemd-modules-load',
2732 'src/modules-load/modules-load.c',
2733 include_directories : includes,
2734 link_with : [libshared],
2735 dependencies : [libkmod],
2736 install_rpath : rootlibexecdir,
2737 install : true,
2738 install_dir : rootlibexecdir)
2739
2740 meson.add_install_script('sh', '-c',
2741 mkdir_p.format(modulesloaddir))
2742 meson.add_install_script('sh', '-c',
2743 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2744 endif
2745
2746 exe = executable('systemd-nspawn',
2747 systemd_nspawn_sources,
2748 include_directories : includes,
2749 link_with : [libcore_shared,
2750 libnspawn_core,
2751 libshared],
2752 dependencies : [libblkid,
2753 libseccomp],
2754 install_rpath : rootlibexecdir,
2755 install : true)
2756 public_programs += exe
2757
2758 if conf.get('ENABLE_NETWORKD') == 1
2759 executable('systemd-networkd',
2760 systemd_networkd_sources,
2761 include_directories : network_include_dir,
2762 link_with : [libnetworkd_core,
2763 libsystemd_network,
2764 libudev_static,
2765 networkd_link_with],
2766 dependencies : [threads],
2767 install_rpath : rootlibexecdir,
2768 install : true,
2769 install_dir : rootlibexecdir)
2770
2771 executable('systemd-networkd-wait-online',
2772 systemd_networkd_wait_online_sources,
2773 include_directories : includes,
2774 link_with : [libnetworkd_core,
2775 networkd_link_with],
2776 install_rpath : rootlibexecdir,
2777 install : true,
2778 install_dir : rootlibexecdir)
2779
2780 exe = executable('networkctl',
2781 networkctl_sources,
2782 include_directories : includes,
2783 link_with : [libsystemd_network,
2784 networkd_link_with],
2785 install_rpath : rootlibexecdir,
2786 install : true,
2787 install_dir : rootbindir)
2788 public_programs += exe
2789
2790 executable('systemd-network-generator',
2791 network_generator_sources,
2792 include_directories : includes,
2793 link_with : [networkd_link_with],
2794 install_rpath : rootlibexecdir,
2795 install : true,
2796 install_dir : rootlibexecdir)
2797 endif
2798
2799 executable('systemd-sulogin-shell',
2800 ['src/sulogin-shell/sulogin-shell.c'],
2801 include_directories : includes,
2802 link_with : [libshared],
2803 install_rpath : rootlibexecdir,
2804 install : true,
2805 install_dir : rootlibexecdir)
2806
2807 ############################################################
2808
2809 custom_target(
2810 'systemd-runtest.env',
2811 output : 'systemd-runtest.env',
2812 command : ['sh', '-c', '{ ' +
2813 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2814 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2815 '} >@OUTPUT@'],
2816 build_by_default : true)
2817
2818 foreach tuple : tests
2819 sources = tuple[0]
2820 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2821 dependencies = tuple[2]
2822 condition = tuple.length() >= 4 ? tuple[3] : ''
2823 type = tuple.length() >= 5 ? tuple[4] : ''
2824 defs = tuple.length() >= 6 ? tuple[5] : []
2825 incs = tuple.length() >= 7 ? tuple[6] : includes
2826 timeout = 30
2827
2828 name = sources[0].split('/')[-1].split('.')[0]
2829 if type.startswith('timeout=')
2830 timeout = type.split('=')[1].to_int()
2831 type = ''
2832 endif
2833
2834 if condition == '' or conf.get(condition) == 1
2835 exe = executable(
2836 name,
2837 sources,
2838 include_directories : incs,
2839 link_with : link_with,
2840 dependencies : [versiondep,
2841 dependencies],
2842 c_args : defs,
2843 build_by_default : want_tests != 'false',
2844 install_rpath : rootlibexecdir,
2845 install : install_tests,
2846 install_dir : join_paths(testsdir, type))
2847
2848 if type == 'manual'
2849 message('@0@ is a manual test'.format(name))
2850 elif type == 'unsafe' and want_tests != 'unsafe'
2851 message('@0@ is an unsafe test'.format(name))
2852 elif want_tests != 'false'
2853 test(name, exe,
2854 env : test_env,
2855 timeout : timeout)
2856 endif
2857 else
2858 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2859 endif
2860 endforeach
2861
2862 exe = executable(
2863 'test-libsystemd-sym',
2864 test_libsystemd_sym_c,
2865 include_directories : includes,
2866 link_with : [libsystemd],
2867 build_by_default : want_tests != 'false',
2868 install : install_tests,
2869 install_dir : testsdir)
2870 if want_tests != 'false'
2871 test('test-libsystemd-sym', exe)
2872 endif
2873
2874 exe = executable(
2875 'test-libsystemd-static-sym',
2876 test_libsystemd_sym_c,
2877 include_directories : includes,
2878 link_with : [install_libsystemd_static],
2879 dependencies : [threads], # threads is already included in dependencies on the library,
2880 # but does not seem to get propagated. Add here as a work-around.
2881 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2882 install : install_tests and static_libsystemd_pic,
2883 install_dir : testsdir)
2884 if want_tests != 'false' and static_libsystemd_pic
2885 test('test-libsystemd-static-sym', exe)
2886 endif
2887
2888 exe = executable(
2889 'test-libudev-sym',
2890 test_libudev_sym_c,
2891 include_directories : includes,
2892 c_args : '-Wno-deprecated-declarations',
2893 link_with : [libudev],
2894 build_by_default : want_tests != 'false',
2895 install : install_tests,
2896 install_dir : testsdir)
2897 if want_tests != 'false'
2898 test('test-libudev-sym', exe)
2899 endif
2900
2901 exe = executable(
2902 'test-libudev-static-sym',
2903 test_libudev_sym_c,
2904 include_directories : includes,
2905 c_args : '-Wno-deprecated-declarations',
2906 link_with : [install_libudev_static],
2907 build_by_default : want_tests != 'false' and static_libudev_pic,
2908 install : install_tests and static_libudev_pic,
2909 install_dir : testsdir)
2910 if want_tests != 'false' and static_libudev_pic
2911 test('test-libudev-static-sym', exe)
2912 endif
2913
2914 ############################################################
2915
2916 fuzzer_exes = []
2917
2918 if get_option('tests') != 'false'
2919 foreach tuple : fuzzers
2920 sources = tuple[0]
2921 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2922 dependencies = tuple[2]
2923 defs = tuple.length() >= 4 ? tuple[3] : []
2924 incs = tuple.length() >= 5 ? tuple[4] : includes
2925 link_args = []
2926
2927 if want_ossfuzz or want_fuzzbuzz
2928 dependencies += fuzzing_engine
2929 elif want_libfuzzer
2930 if fuzzing_engine.found()
2931 dependencies += fuzzing_engine
2932 else
2933 link_args += ['-fsanitize=fuzzer']
2934 endif
2935 else
2936 sources += 'src/fuzz/fuzz-main.c'
2937 endif
2938
2939 if want_fuzzbuzz
2940 sources += 'src/fuzz/fuzzer-entry-point.c'
2941 endif
2942
2943 name = sources[0].split('/')[-1].split('.')[0]
2944
2945 fuzzer_exes += executable(
2946 name,
2947 sources,
2948 include_directories : [incs, include_directories('src/fuzz')],
2949 link_with : link_with,
2950 dependencies : dependencies,
2951 c_args : defs,
2952 link_args: link_args,
2953 install : false)
2954 endforeach
2955 endif
2956
2957 run_target('fuzzers',
2958 depends : fuzzer_exes,
2959 command : ['true'])
2960
2961 ############################################################
2962
2963 make_directive_index_py = find_program('tools/make-directive-index.py')
2964 make_man_index_py = find_program('tools/make-man-index.py')
2965 xml_helper_py = find_program('tools/xml_helper.py')
2966 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
2967 autosuspend_update_sh = find_program('tools/meson-autosuspend-update.sh')
2968
2969 subdir('sysctl.d')
2970 subdir('sysusers.d')
2971 subdir('tmpfiles.d')
2972 subdir('hwdb.d')
2973 subdir('units')
2974 subdir('presets')
2975 subdir('network')
2976 subdir('man')
2977 subdir('shell-completion/bash')
2978 subdir('shell-completion/zsh')
2979 subdir('docs/sysvinit')
2980 subdir('docs/var-log')
2981
2982 install_subdir('factory/etc',
2983 install_dir : factorydir)
2984
2985 install_data('xorg/50-systemd-user.sh',
2986 install_dir : xinitrcdir)
2987 install_data('modprobe.d/systemd.conf',
2988 install_dir : modprobedir)
2989 install_data('LICENSE.GPL2',
2990 'LICENSE.LGPL2.1',
2991 'NEWS',
2992 'README',
2993 'docs/CODING_STYLE.md',
2994 'docs/DISTRO_PORTING.md',
2995 'docs/ENVIRONMENT.md',
2996 'docs/HACKING.md',
2997 'docs/TRANSIENT-SETTINGS.md',
2998 'docs/TRANSLATORS.md',
2999 'docs/UIDS-GIDS.md',
3000 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3001 install_dir : docdir)
3002
3003 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3004 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3005
3006 ############################################################
3007
3008 meson_check_help = find_program('tools/meson-check-help.sh')
3009
3010 foreach exec : public_programs
3011 name = exec.full_path().split('/')[-1]
3012 if want_tests != 'false'
3013 test('check-help-' + name,
3014 meson_check_help,
3015 args : exec.full_path())
3016 endif
3017 endforeach
3018
3019 ############################################################
3020
3021 check_directives_sh = find_program('tools/check-directives.sh')
3022
3023 if want_tests != 'false'
3024 test('check-directives',
3025 check_directives_sh,
3026 args : project_source_root)
3027 endif
3028
3029 ############################################################
3030
3031 # Enable tests for all supported sanitizers
3032 foreach tuple : sanitizers
3033 sanitizer = tuple[0]
3034 build = tuple[1]
3035
3036 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3037 prev = ''
3038 foreach p : fuzz_regression_tests
3039 b = p.split('/')[-2]
3040 c = p.split('/')[-1]
3041
3042 name = '@0@:@1@'.format(b, sanitizer)
3043
3044 if name != prev
3045 if want_tests == 'false'
3046 message('Not compiling @0@ because tests is set to false'.format(name))
3047 elif slow_tests
3048 exe = custom_target(
3049 name,
3050 output : name,
3051 depends : build,
3052 command : [env, 'ln', '-fs',
3053 join_paths(build.full_path(), b),
3054 '@OUTPUT@'],
3055 build_by_default : true)
3056 else
3057 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3058 endif
3059 endif
3060 prev = name
3061
3062 if want_tests != 'false' and slow_tests
3063 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3064 env,
3065 args : [exe.full_path(),
3066 join_paths(project_source_root, p)])
3067 endif
3068 endforeach
3069 endif
3070 endforeach
3071
3072
3073 ############################################################
3074
3075 if git.found()
3076 all_files = run_command(
3077 git,
3078 ['--git-dir=@0@/.git'.format(project_source_root),
3079 'ls-files',
3080 ':/*.[ch]'])
3081 all_files = files(all_files.stdout().split())
3082
3083 custom_target(
3084 'tags',
3085 output : 'tags',
3086 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3087 run_target(
3088 'ctags',
3089 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3090 endif
3091
3092 if git.found()
3093 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3094 run_target(
3095 'git-contrib',
3096 command : [meson_git_contrib_sh])
3097 endif
3098
3099 if git.found()
3100 git_head = run_command(
3101 git,
3102 ['--git-dir=@0@/.git'.format(project_source_root),
3103 'rev-parse', 'HEAD']).stdout().strip()
3104 git_head_short = run_command(
3105 git,
3106 ['--git-dir=@0@/.git'.format(project_source_root),
3107 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3108
3109 run_target(
3110 'git-snapshot',
3111 command : ['git', 'archive',
3112 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3113 git_head_short),
3114 '--prefix', 'systemd-@0@/'.format(git_head),
3115 'HEAD'])
3116 endif
3117
3118 ############################################################
3119
3120 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3121 run_target(
3122 'check-api-docs',
3123 depends : [man, libsystemd, libudev],
3124 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3125
3126 ############################################################
3127 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3128
3129 status = [
3130 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3131
3132 'split /usr: @0@'.format(split_usr),
3133 'split bin-sbin: @0@'.format(split_bin),
3134 'prefix directory: @0@'.format(prefixdir),
3135 'rootprefix directory: @0@'.format(rootprefixdir),
3136 'sysconf directory: @0@'.format(sysconfdir),
3137 'include directory: @0@'.format(includedir),
3138 'lib directory: @0@'.format(libdir),
3139 'rootlib directory: @0@'.format(rootlibdir),
3140 'SysV init scripts: @0@'.format(sysvinit_path),
3141 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3142 'PAM modules directory: @0@'.format(pamlibdir),
3143 'PAM configuration directory: @0@'.format(pamconfdir),
3144 'RPM macros directory: @0@'.format(rpmmacrosdir),
3145 'modprobe.d directory: @0@'.format(modprobedir),
3146 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3147 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3148 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3149 'bash completions directory: @0@'.format(bashcompletiondir),
3150 'zsh completions directory: @0@'.format(zshcompletiondir),
3151 'extra start script: @0@'.format(get_option('rc-local')),
3152 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3153 get_option('debug-tty')),
3154 'TTY GID: @0@'.format(tty_gid),
3155 'users GID: @0@'.format(substs.get('USERS_GID')),
3156 'maximum system UID: @0@'.format(system_uid_max),
3157 'maximum system GID: @0@'.format(system_gid_max),
3158 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3159 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3160 'minimum container UID base: @0@'.format(container_uid_base_min),
3161 'maximum container UID base: @0@'.format(container_uid_base_max),
3162 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3163 'render group access mode: @0@'.format(get_option('group-render-mode')),
3164 'certificate root directory: @0@'.format(get_option('certificate-root')),
3165 'support URL: @0@'.format(support_url),
3166 'nobody user name: @0@'.format(nobody_user),
3167 'nobody group name: @0@'.format(nobody_group),
3168 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3169 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3170
3171 'default DNSSEC mode: @0@'.format(default_dnssec),
3172 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3173 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3174 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3175 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3176 'default locale: @0@'.format(default_locale),
3177 'default user $PATH: @0@'.format(default_user_path_display),
3178 'systemd service watchdog: @0@'.format(watchdog_opt)]
3179
3180 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3181 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3182 status += [
3183 'default DNS servers: @0@'.format(alt_dns_servers),
3184 'default NTP servers: @0@'.format(alt_ntp_servers)]
3185
3186 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3187 '@@0@'.format(time_epoch)).stdout().strip()
3188 status += [
3189 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3190
3191 status += [
3192 'static libsystemd: @0@'.format(static_libsystemd),
3193 'static libudev: @0@'.format(static_libudev)]
3194
3195 # TODO:
3196 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3197 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3198 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3199
3200 if conf.get('ENABLE_EFI') == 1
3201 status += 'efi arch: @0@'.format(efi_arch)
3202
3203 if have_gnu_efi
3204 status += [
3205 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3206 'EFI CC @0@'.format(' '.join(efi_cc)),
3207 'EFI lib directory: @0@'.format(efi_libdir),
3208 'EFI lds directory: @0@'.format(efi_ldsdir),
3209 'EFI include directory: @0@'.format(efi_incdir)]
3210 endif
3211 endif
3212
3213 found = []
3214 missing = []
3215
3216 foreach tuple : [
3217 ['libcryptsetup'],
3218 ['PAM'],
3219 ['p11kit'],
3220 ['AUDIT'],
3221 ['IMA'],
3222 ['AppArmor'],
3223 ['SELinux'],
3224 ['SECCOMP'],
3225 ['SMACK'],
3226 ['zlib'],
3227 ['xz'],
3228 ['lz4'],
3229 ['bzip2'],
3230 ['ACL'],
3231 ['gcrypt'],
3232 ['qrencode'],
3233 ['microhttpd'],
3234 ['gnutls'],
3235 ['openssl'],
3236 ['libcurl'],
3237 ['idn'],
3238 ['libidn2'],
3239 ['libidn'],
3240 ['libiptc'],
3241 ['elfutils'],
3242 ['binfmt'],
3243 ['vconsole'],
3244 ['quotacheck'],
3245 ['tmpfiles'],
3246 ['environment.d'],
3247 ['sysusers'],
3248 ['firstboot'],
3249 ['randomseed'],
3250 ['backlight'],
3251 ['rfkill'],
3252 ['logind'],
3253 ['machined'],
3254 ['portabled'],
3255 ['importd'],
3256 ['hostnamed'],
3257 ['timedated'],
3258 ['timesyncd'],
3259 ['localed'],
3260 ['networkd'],
3261 ['resolve'],
3262 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3263 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3264 ['coredump'],
3265 ['pstore'],
3266 ['polkit'],
3267 ['legacy pkla', install_polkit_pkla],
3268 ['efi'],
3269 ['gnu-efi', have_gnu_efi],
3270 ['kmod'],
3271 ['xkbcommon'],
3272 ['pcre2'],
3273 ['blkid'],
3274 ['dbus'],
3275 ['glib'],
3276 ['nss-myhostname'],
3277 ['nss-mymachines'],
3278 ['nss-resolve'],
3279 ['nss-systemd'],
3280 ['hwdb'],
3281 ['tpm'],
3282 ['man pages', want_man],
3283 ['html pages', want_html],
3284 ['man page indices', want_man and have_lxml],
3285 ['SysV compat'],
3286 ['utmp'],
3287 ['ldconfig'],
3288 ['hibernate'],
3289 ['adm group', get_option('adm-group')],
3290 ['wheel group', get_option('wheel-group')],
3291 ['gshadow'],
3292 ['debug hashmap'],
3293 ['debug mmap cache'],
3294 ['debug siphash'],
3295 ['valgrind', conf.get('VALGRIND') == 1],
3296 ['trace logging', conf.get('LOG_TRACE') == 1],
3297 ['link-udev-shared', get_option('link-udev-shared')],
3298 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3299 ['link-networkd-shared', get_option('link-networkd-shared')],
3300 ]
3301
3302 if tuple.length() >= 2
3303 cond = tuple[1]
3304 else
3305 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3306 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3307 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3308 endif
3309 if cond
3310 found += tuple[0]
3311 else
3312 missing += tuple[0]
3313 endif
3314 endforeach
3315
3316 status += [
3317 '',
3318 'enabled features: @0@'.format(', '.join(found)),
3319 '',
3320 'disabled features: @0@'.format(', '.join(missing)),
3321 '']
3322 message('\n '.join(status))
3323
3324 if rootprefixdir != rootprefix_default
3325 warning('\n' +
3326 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3327 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3328 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
3329 endif