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