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