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