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