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