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