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