]> git.ipfire.org Git - thirdparty/systemd.git/blob - meson.build
Merge pull request #13133 from keszybz/pstore-return-value
[thirdparty/systemd.git] / meson.build
1 # SPDX-License-Identifier: LGPL-2.1+
2
3 project('systemd', 'c',
4 version : '242',
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.26.0'
16 libudev_version = '1.6.14'
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
161 docdir = get_option('docdir')
162 if docdir == ''
163 docdir = join_paths(datadir, 'doc/systemd')
164 endif
165
166 dbuspolicydir = get_option('dbuspolicydir')
167 if dbuspolicydir == ''
168 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
169 endif
170
171 dbussessionservicedir = get_option('dbussessionservicedir')
172 if dbussessionservicedir == ''
173 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
174 endif
175
176 dbussystemservicedir = get_option('dbussystemservicedir')
177 if dbussystemservicedir == ''
178 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
179 endif
180
181 pamlibdir = get_option('pamlibdir')
182 if pamlibdir == ''
183 pamlibdir = join_paths(rootlibdir, 'security')
184 endif
185
186 pamconfdir = get_option('pamconfdir')
187 if pamconfdir == ''
188 pamconfdir = join_paths(sysconfdir, 'pam.d')
189 endif
190
191 memory_accounting_default = get_option('memory-accounting-default')
192 status_unit_format_default = get_option('status-unit-format-default')
193
194 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
195 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
196 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
197 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
198 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
199 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
200
201 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
202
203 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
204 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
205 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
206 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
207 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
208 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
209 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
210 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
211 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
212 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
213 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
214 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
215 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
216 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
217 conf.set_quoted('ROOTPREFIX', rootprefixdir)
218 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
219 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
220 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
221 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
222 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
223 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
224 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
225 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
226 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
227 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
228 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
229 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
230 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
231 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
232 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
233 conf.set_quoted('LIBDIR', libdir)
234 conf.set_quoted('ROOTLIBDIR', rootlibdir)
235 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
236 conf.set_quoted('BOOTLIBDIR', bootlibdir)
237 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
238 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
239 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
240 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
241 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
242 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
243 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
244 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
245 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
246 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
247
248 substs.set('prefix', prefixdir)
249 substs.set('rootprefix', rootprefixdir)
250 substs.set('rootprefix_noslash', rootprefixdir_noslash)
251 substs.set('exec_prefix', prefixdir)
252 substs.set('libdir', libdir)
253 substs.set('rootlibdir', rootlibdir)
254 substs.set('includedir', includedir)
255 substs.set('sysconfdir', sysconfdir)
256 substs.set('bindir', bindir)
257 substs.set('rootbindir', rootbindir)
258 substs.set('rootlibexecdir', rootlibexecdir)
259 substs.set('systemunitdir', systemunitdir)
260 substs.set('userunitdir', userunitdir)
261 substs.set('systempresetdir', systempresetdir)
262 substs.set('userpresetdir', userpresetdir)
263 substs.set('udevhwdbdir', udevhwdbdir)
264 substs.set('udevrulesdir', udevrulesdir)
265 substs.set('udevlibexecdir', udevlibexecdir)
266 substs.set('environmentdir', environmentdir)
267 substs.set('catalogdir', catalogdir)
268 substs.set('tmpfilesdir', tmpfilesdir)
269 substs.set('sysusersdir', sysusersdir)
270 substs.set('sysctldir', sysctldir)
271 substs.set('binfmtdir', binfmtdir)
272 substs.set('modulesloaddir', modulesloaddir)
273 substs.set('modprobedir', modprobedir)
274 substs.set('systemgeneratordir', systemgeneratordir)
275 substs.set('usergeneratordir', usergeneratordir)
276 substs.set('systemenvgeneratordir', systemenvgeneratordir)
277 substs.set('userenvgeneratordir', userenvgeneratordir)
278 substs.set('systemshutdowndir', systemshutdowndir)
279 substs.set('systemsleepdir', systemsleepdir)
280 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
281 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
282 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
283 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
284 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
285 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
286 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
287 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
288 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
289 substs.set('BUILD_ROOT', meson.current_build_dir())
290
291 #####################################################################
292
293 cc = meson.get_compiler('c')
294 pkgconfig = import('pkgconfig')
295 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
296 meson_build_sh = find_program('tools/meson-build.sh')
297
298 want_tests = get_option('tests')
299 slow_tests = want_tests != 'false' and get_option('slow-tests')
300 install_tests = get_option('install-tests')
301
302 if add_languages('cpp', required : fuzzer_build)
303 # Used only for tests
304 cxx_cmd = ' '.join(meson.get_compiler('cpp').cmd_array())
305 else
306 cxx_cmd = ''
307 endif
308
309 if want_libfuzzer
310 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
311 if fuzzing_engine.found()
312 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
313 elif cc.has_argument('-fsanitize=fuzzer-no-link')
314 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
315 else
316 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
317 endif
318 elif want_ossfuzz
319 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
320 elif want_fuzzbuzz
321 fuzzing_engine = meson.get_compiler('cpp').find_library(get_option('fuzzbuzz-engine'), dirs: get_option('fuzzbuzz-engine-dir'))
322 endif
323
324 possible_cc_flags = [
325 '-Wextra',
326 '-Werror=undef',
327 '-Wlogical-op',
328 '-Wmissing-include-dirs',
329 '-Wold-style-definition',
330 '-Wpointer-arith',
331 '-Winit-self',
332 '-Wfloat-equal',
333 '-Wsuggest-attribute=noreturn',
334 '-Werror=missing-prototypes',
335 '-Werror=implicit-function-declaration',
336 '-Werror=missing-declarations',
337 '-Werror=return-type',
338 '-Werror=incompatible-pointer-types',
339 '-Werror=format=2',
340 '-Wstrict-prototypes',
341 '-Wredundant-decls',
342 '-Wmissing-noreturn',
343 '-Wimplicit-fallthrough=5',
344 '-Wshadow',
345 '-Wendif-labels',
346 '-Wstrict-aliasing=2',
347 '-Wwrite-strings',
348 '-Werror=overflow',
349 '-Werror=shift-count-overflow',
350 '-Werror=shift-overflow=2',
351 '-Wdate-time',
352 '-Wnested-externs',
353
354 # negative arguments are correctly detected starting with meson 0.46.
355 '-Wno-unused-parameter',
356 '-Wno-missing-field-initializers',
357 '-Wno-unused-result',
358 '-Wno-format-signedness',
359 '-Wno-error=#warnings', # clang
360 '-Wno-string-plus-int', # clang
361
362 # work-around for gcc 7.1 turning this on on its own.
363 '-Wno-error=nonnull',
364
365 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
366 # optimizations enabled, producing essentially false positives.
367 '-Wno-maybe-uninitialized',
368
369 '-ffast-math',
370 '-fno-common',
371 '-fdiagnostics-show-option',
372 '-fno-strict-aliasing',
373 '-fvisibility=hidden',
374 '-fstack-protector',
375 '-fstack-protector-strong',
376 '--param=ssp-buffer-size=4',
377 ]
378
379 # --as-needed and --no-undefined are provided by meson by default,
380 # run mesonconf to see what is enabled
381 possible_link_flags = [
382 '-Wl,-z,relro',
383 '-Wl,-z,now',
384 ]
385
386 if cc.get_id() == 'clang'
387 possible_cc_flags += [
388 '-Wno-typedef-redefinition',
389 '-Wno-gnu-variable-sized-type-not-at-end',
390 ]
391 endif
392
393 if get_option('buildtype') != 'debug'
394 possible_cc_flags += [
395 '-ffunction-sections',
396 '-fdata-sections',
397 ]
398
399 possible_link_flags += '-Wl,--gc-sections'
400 endif
401
402 if get_option('b_ndebug') == 'true'
403 # With asserts disabled with get a bunch of warnings about variables which
404 # are used only in the asserts. This is not useful at all, so let's just silence
405 # those warnings.
406 possible_cc_flags += [
407 '-Wno-unused-variable',
408 '-Wno-unused-but-set-variable',
409 ]
410 endif
411
412 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
413 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
414
415 if cc.compiles('''
416 #include <time.h>
417 #include <inttypes.h>
418 typedef uint64_t usec_t;
419 usec_t now(clockid_t clock);
420 int main(void) {
421 struct timespec now;
422 return 0;
423 }
424 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
425 add_project_arguments('-Werror=shadow', language : 'c')
426 endif
427
428 cpp = ' '.join(cc.cmd_array()) + ' -E'
429
430 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
431
432 #####################################################################
433 # compilation result tests
434
435 conf.set('_GNU_SOURCE', true)
436 conf.set('__SANE_USERSPACE_TYPES__', true)
437 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
438
439 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
440 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
441 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
442 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
443 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
444 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
445 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
446
447 decl_headers = '''
448 #include <uchar.h>
449 #include <sys/stat.h>
450 '''
451
452 foreach decl : ['char16_t',
453 'char32_t',
454 'struct statx',
455 ]
456
457 # We get -1 if the size cannot be determined
458 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
459
460 if decl == 'struct statx'
461 if have
462 want_linux_stat_h = false
463 else
464 have = cc.sizeof(decl,
465 prefix : decl_headers + '#include <linux/stat.h>',
466 args : '-D_GNU_SOURCE') > 0
467 want_linux_stat_h = have
468 endif
469 endif
470
471 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
472 endforeach
473
474 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
475
476 foreach ident : ['secure_getenv', '__secure_getenv']
477 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
478 endforeach
479
480 foreach ident : [
481 ['memfd_create', '''#include <sys/mman.h>'''],
482 ['gettid', '''#include <sys/types.h>
483 #include <unistd.h>'''],
484 ['pivot_root', '''#include <stdlib.h>
485 #include <unistd.h>'''], # no known header declares pivot_root
486 ['name_to_handle_at', '''#include <sys/types.h>
487 #include <sys/stat.h>
488 #include <fcntl.h>'''],
489 ['setns', '''#include <sched.h>'''],
490 ['renameat2', '''#include <stdio.h>
491 #include <fcntl.h>'''],
492 ['kcmp', '''#include <linux/kcmp.h>'''],
493 ['keyctl', '''#include <sys/types.h>
494 #include <keyutils.h>'''],
495 ['copy_file_range', '''#include <sys/syscall.h>
496 #include <unistd.h>'''],
497 ['bpf', '''#include <sys/syscall.h>
498 #include <unistd.h>'''],
499 ['statx', '''#include <sys/types.h>
500 #include <sys/stat.h>
501 #include <unistd.h>'''],
502 ['explicit_bzero' , '''#include <string.h>'''],
503 ['reallocarray', '''#include <malloc.h>'''],
504 ['set_mempolicy', '''#include <stdlib.h>
505 #include <unistd.h>'''],
506 ['get_mempolicy', '''#include <stdlib.h>
507 #include <unistd.h>'''],
508 ]
509
510 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
511 conf.set10('HAVE_' + ident[0].to_upper(), have)
512 endforeach
513
514 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
515 conf.set10('USE_SYS_RANDOM_H', true)
516 conf.set10('HAVE_GETRANDOM', true)
517 else
518 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
519 conf.set10('USE_SYS_RANDOM_H', false)
520 conf.set10('HAVE_GETRANDOM', have)
521 endif
522
523 #####################################################################
524
525 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
526 project_source_root,
527 get_option('version-tag'),
528 meson.project_version()]
529
530 version_h = vcs_tag(
531 input : 'src/version/version.h.in',
532 output : 'version.h',
533 command: vcs_tagger)
534
535 versiondep = declare_dependency(sources: version_h)
536
537 sed = find_program('sed')
538 awk = find_program('awk')
539 m4 = find_program('m4')
540 stat = find_program('stat')
541 git = find_program('git', required : false)
542 env = find_program('env')
543 perl = find_program('perl', required : false)
544
545 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
546 mkdir_p = 'mkdir -p $DESTDIR/@0@'
547 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
548 splash_bmp = files('test/splash.bmp')
549
550 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
551 # /usr/sbin, /sbin, and fall back to the default from middle column.
552 progs = [['quotaon', '/usr/sbin/quotaon' ],
553 ['quotacheck', '/usr/sbin/quotacheck' ],
554 ['kmod', '/usr/bin/kmod' ],
555 ['kexec', '/usr/sbin/kexec' ],
556 ['sulogin', '/usr/sbin/sulogin' ],
557 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
558 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
559 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
560 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
561 ['nologin', '/usr/sbin/nologin', ],
562 ]
563 foreach prog : progs
564 path = get_option(prog[0] + '-path')
565 if path != ''
566 message('Using @1@ for @0@'.format(prog[0], path))
567 else
568 exe = find_program(prog[0],
569 '/usr/sbin/' + prog[0],
570 '/sbin/' + prog[0],
571 required: false)
572 path = exe.found() ? exe.path() : prog[1]
573 endif
574 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
575 conf.set_quoted(name, path)
576 substs.set(name, path)
577 endforeach
578
579 conf.set_quoted('TELINIT', get_option('telinit-path'))
580
581 if run_command('ln', '--relative', '--help').returncode() != 0
582 error('ln does not support --relative (added in coreutils 8.16)')
583 endif
584
585 ############################################################
586
587 gperf = find_program('gperf')
588
589 gperf_test_format = '''
590 #include <string.h>
591 const char * in_word_set(const char *, @0@);
592 @1@
593 '''
594 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
595 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
596 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
597 if cc.compiles(gperf_test)
598 gperf_len_type = 'size_t'
599 else
600 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
601 if cc.compiles(gperf_test)
602 gperf_len_type = 'unsigned'
603 else
604 error('unable to determine gperf len type')
605 endif
606 endif
607 message('gperf len type is @0@'.format(gperf_len_type))
608 conf.set('GPERF_LEN_TYPE', gperf_len_type,
609 description : 'The type of gperf "len" parameter')
610
611 ############################################################
612
613 if not cc.has_header('sys/capability.h')
614 error('POSIX caps headers not found')
615 endif
616 foreach header : ['crypt.h',
617 'linux/memfd.h',
618 'linux/vm_sockets.h',
619 'sys/auxv.h',
620 'valgrind/memcheck.h',
621 'valgrind/valgrind.h',
622 ]
623
624 conf.set10('HAVE_' + header.underscorify().to_upper(),
625 cc.has_header(header))
626 endforeach
627
628 ############################################################
629
630 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
631 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
632 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
633
634 default_hierarchy = get_option('default-hierarchy')
635 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
636 description : 'default cgroup hierarchy as string')
637 if default_hierarchy == 'legacy'
638 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
639 elif default_hierarchy == 'hybrid'
640 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
641 else
642 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
643 endif
644
645 default_net_naming_scheme = get_option('default-net-naming-scheme')
646 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
647
648 time_epoch = get_option('time-epoch')
649 if time_epoch == -1
650 NEWS = files('NEWS')
651 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
652 endif
653 conf.set('TIME_EPOCH', time_epoch)
654
655 system_uid_max = get_option('system-uid-max')
656 if system_uid_max == -1
657 system_uid_max = run_command(
658 awk,
659 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
660 '/etc/login.defs').stdout().strip()
661 if system_uid_max == ''
662 system_uid_max = 999
663 else
664 system_uid_max = system_uid_max.to_int()
665 endif
666 endif
667 conf.set('SYSTEM_UID_MAX', system_uid_max)
668 substs.set('systemuidmax', system_uid_max)
669
670 system_gid_max = get_option('system-gid-max')
671 if system_gid_max == -1
672 system_gid_max = run_command(
673 awk,
674 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
675 '/etc/login.defs').stdout().strip()
676 if system_gid_max == ''
677 system_gid_max = 999
678 else
679 system_gid_max = system_gid_max.to_int()
680 endif
681 endif
682 conf.set('SYSTEM_GID_MAX', system_gid_max)
683 substs.set('systemgidmax', system_gid_max)
684
685 dynamic_uid_min = get_option('dynamic-uid-min')
686 dynamic_uid_max = get_option('dynamic-uid-max')
687 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
688 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
689 substs.set('dynamicuidmin', dynamic_uid_min)
690 substs.set('dynamicuidmax', dynamic_uid_max)
691
692 container_uid_base_min = get_option('container-uid-base-min')
693 container_uid_base_max = get_option('container-uid-base-max')
694 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
695 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
696 substs.set('containeruidbasemin', container_uid_base_min)
697 substs.set('containeruidbasemax', container_uid_base_max)
698
699 nobody_user = get_option('nobody-user')
700 nobody_group = get_option('nobody-group')
701
702 if not meson.is_cross_build()
703 getent_result = run_command('getent', 'passwd', '65534')
704 if getent_result.returncode() == 0
705 name = getent_result.stdout().split(':')[0]
706 if name != nobody_user
707 warning('\n' +
708 '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) +
709 'Your build will result in an user table setup that is incompatible with the local system.')
710 endif
711 endif
712 id_result = run_command('id', '-u', nobody_user)
713 if id_result.returncode() == 0
714 id = id_result.stdout().to_int()
715 if id != 65534
716 warning('\n' +
717 '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) +
718 'Your build will result in an user table setup that is incompatible with the local system.')
719 endif
720 endif
721
722 getent_result = run_command('getent', 'group', '65534')
723 if getent_result.returncode() == 0
724 name = getent_result.stdout().split(':')[0]
725 if name != nobody_group
726 warning('\n' +
727 '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) +
728 'Your build will result in an group table setup that is incompatible with the local system.')
729 endif
730 endif
731 id_result = run_command('id', '-g', nobody_group)
732 if id_result.returncode() == 0
733 id = id_result.stdout().to_int()
734 if id != 65534
735 warning('\n' +
736 '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) +
737 'Your build will result in an group table setup that is incompatible with the local system.')
738 endif
739 endif
740 endif
741 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
742 warning('\n' +
743 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
744 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
745 endif
746
747 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
748 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
749 substs.set('NOBODY_USER_NAME', nobody_user)
750 substs.set('NOBODY_GROUP_NAME', nobody_group)
751
752 tty_gid = get_option('tty-gid')
753 conf.set('TTY_GID', tty_gid)
754 substs.set('TTY_GID', tty_gid)
755
756 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
757 users_gid = get_option('users-gid')
758 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
759
760 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
761 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
762
763 dev_kvm_mode = get_option('dev-kvm-mode')
764 substs.set('DEV_KVM_MODE', dev_kvm_mode)
765 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
766 group_render_mode = get_option('group-render-mode')
767 substs.set('GROUP_RENDER_MODE', group_render_mode)
768 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
769
770 kill_user_processes = get_option('default-kill-user-processes')
771 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
772 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
773 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
774
775 dns_servers = get_option('dns-servers')
776 conf.set_quoted('DNS_SERVERS', dns_servers)
777 substs.set('DNS_SERVERS', dns_servers)
778
779 ntp_servers = get_option('ntp-servers')
780 conf.set_quoted('NTP_SERVERS', ntp_servers)
781 substs.set('NTP_SERVERS', ntp_servers)
782
783 default_locale = get_option('default-locale')
784 if default_locale == ''
785 if not meson.is_cross_build()
786 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
787 default_locale = run_command(choose_default_locale_sh).stdout().strip()
788 else
789 default_locale = 'C.UTF-8'
790 endif
791 endif
792 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
793
794 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
795
796 substs.set('SUSHELL', get_option('debug-shell'))
797 substs.set('DEBUGTTY', get_option('debug-tty'))
798 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
799
800 enable_debug_hashmap = false
801 enable_debug_mmap_cache = false
802 enable_debug_siphash = false
803 foreach name : get_option('debug-extra')
804 if name == 'hashmap'
805 enable_debug_hashmap = true
806 elif name == 'mmap-cache'
807 enable_debug_mmap_cache = true
808 elif name == 'siphash'
809 enable_debug_siphash = true
810 else
811 message('unknown debug option "@0@", ignoring'.format(name))
812 endif
813 endforeach
814 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
815 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
816 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
817
818 conf.set10('VALGRIND', get_option('valgrind'))
819 conf.set10('LOG_TRACE', get_option('log-trace'))
820
821 #####################################################################
822
823 threads = dependency('threads')
824 librt = cc.find_library('rt')
825 libm = cc.find_library('m')
826 libdl = cc.find_library('dl')
827 libcrypt = cc.find_library('crypt')
828
829 libcap = dependency('libcap', required : false)
830 if not libcap.found()
831 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
832 libcap = cc.find_library('cap')
833 endif
834
835 libmount = dependency('mount',
836 version : fuzzer_build ? '>= 0' : '>= 2.30')
837
838 want_seccomp = get_option('seccomp')
839 if want_seccomp != 'false' and not skip_deps
840 libseccomp = dependency('libseccomp',
841 version : '>= 2.3.1',
842 required : want_seccomp == 'true')
843 have = libseccomp.found()
844 else
845 have = false
846 libseccomp = []
847 endif
848 conf.set10('HAVE_SECCOMP', have)
849
850 want_selinux = get_option('selinux')
851 if want_selinux != 'false' and not skip_deps
852 libselinux = dependency('libselinux',
853 version : '>= 2.1.9',
854 required : want_selinux == 'true')
855 have = libselinux.found()
856 else
857 have = false
858 libselinux = []
859 endif
860 conf.set10('HAVE_SELINUX', have)
861
862 want_apparmor = get_option('apparmor')
863 if want_apparmor != 'false' and not skip_deps
864 libapparmor = dependency('libapparmor',
865 required : want_apparmor == 'true')
866 have = libapparmor.found()
867 else
868 have = false
869 libapparmor = []
870 endif
871 conf.set10('HAVE_APPARMOR', have)
872
873 smack_run_label = get_option('smack-run-label')
874 if smack_run_label != ''
875 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
876 endif
877
878 want_polkit = get_option('polkit')
879 install_polkit = false
880 install_polkit_pkla = false
881 if want_polkit != 'false' and not skip_deps
882 install_polkit = true
883
884 libpolkit = dependency('polkit-gobject-1',
885 required : false)
886 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
887 message('Old polkit detected, will install pkla files')
888 install_polkit_pkla = true
889 endif
890 endif
891 conf.set10('ENABLE_POLKIT', install_polkit)
892
893 want_acl = get_option('acl')
894 if want_acl != 'false' and not skip_deps
895 libacl = cc.find_library('acl', required : want_acl == 'true')
896 have = libacl.found()
897 else
898 have = false
899 libacl = []
900 endif
901 conf.set10('HAVE_ACL', have)
902
903 want_audit = get_option('audit')
904 if want_audit != 'false' and not skip_deps
905 libaudit = dependency('audit', required : want_audit == 'true')
906 have = libaudit.found()
907 else
908 have = false
909 libaudit = []
910 endif
911 conf.set10('HAVE_AUDIT', have)
912
913 want_blkid = get_option('blkid')
914 if want_blkid != 'false' and not skip_deps
915 libblkid = dependency('blkid', required : want_blkid == 'true')
916 have = libblkid.found()
917 else
918 have = false
919 libblkid = []
920 endif
921 conf.set10('HAVE_BLKID', have)
922
923 want_kmod = get_option('kmod')
924 if want_kmod != 'false' and not skip_deps
925 libkmod = dependency('libkmod',
926 version : '>= 15',
927 required : want_kmod == 'true')
928 have = libkmod.found()
929 else
930 have = false
931 libkmod = []
932 endif
933 conf.set10('HAVE_KMOD', have)
934
935 want_pam = get_option('pam')
936 if want_pam != 'false' and not skip_deps
937 libpam = cc.find_library('pam', required : want_pam == 'true')
938 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
939 have = libpam.found() and libpam_misc.found()
940 else
941 have = false
942 libpam = []
943 libpam_misc = []
944 endif
945 conf.set10('HAVE_PAM', have)
946
947 want_microhttpd = get_option('microhttpd')
948 if want_microhttpd != 'false' and not skip_deps
949 libmicrohttpd = dependency('libmicrohttpd',
950 version : '>= 0.9.33',
951 required : want_microhttpd == 'true')
952 have = libmicrohttpd.found()
953 else
954 have = false
955 libmicrohttpd = []
956 endif
957 conf.set10('HAVE_MICROHTTPD', have)
958
959 want_libcryptsetup = get_option('libcryptsetup')
960 if want_libcryptsetup != 'false' and not skip_deps
961 libcryptsetup = dependency('libcryptsetup',
962 version : '>= 1.6.0',
963 required : want_libcryptsetup == 'true')
964 have = libcryptsetup.found()
965 have_sector = cc.has_member(
966 'struct crypt_params_plain',
967 'sector_size',
968 prefix : '#include <libcryptsetup.h>')
969 else
970 have = false
971 have_sector = false
972 libcryptsetup = []
973 endif
974 conf.set10('HAVE_LIBCRYPTSETUP', have)
975 conf.set10('HAVE_LIBCRYPTSETUP_SECTOR_SIZE', have_sector)
976
977 want_libcurl = get_option('libcurl')
978 if want_libcurl != 'false' and not skip_deps
979 libcurl = dependency('libcurl',
980 version : '>= 7.32.0',
981 required : want_libcurl == 'true')
982 have = libcurl.found()
983 else
984 have = false
985 libcurl = []
986 endif
987 conf.set10('HAVE_LIBCURL', have)
988
989 want_libidn = get_option('libidn')
990 want_libidn2 = get_option('libidn2')
991 if want_libidn == 'true' and want_libidn2 == 'true'
992 error('libidn and libidn2 cannot be requested simultaneously')
993 endif
994
995 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
996 libidn = dependency('libidn2',
997 required : want_libidn2 == 'true')
998 have = libidn.found()
999 else
1000 have = false
1001 libidn = []
1002 endif
1003 conf.set10('HAVE_LIBIDN2', have)
1004 if not have and want_libidn != 'false' and not skip_deps
1005 # libidn is used for both libidn and libidn2 objects
1006 libidn = dependency('libidn',
1007 required : want_libidn == 'true')
1008 have = libidn.found()
1009 else
1010 have = false
1011 endif
1012 conf.set10('HAVE_LIBIDN', have)
1013
1014 want_libiptc = get_option('libiptc')
1015 if want_libiptc != 'false' and not skip_deps
1016 libiptc = dependency('libiptc',
1017 required : want_libiptc == 'true')
1018 have = libiptc.found()
1019 else
1020 have = false
1021 libiptc = []
1022 endif
1023 conf.set10('HAVE_LIBIPTC', have)
1024
1025 want_qrencode = get_option('qrencode')
1026 if want_qrencode != 'false' and not skip_deps
1027 libqrencode = dependency('libqrencode',
1028 required : want_qrencode == 'true')
1029 have = libqrencode.found()
1030 else
1031 have = false
1032 libqrencode = []
1033 endif
1034 conf.set10('HAVE_QRENCODE', have)
1035
1036 want_gcrypt = get_option('gcrypt')
1037 if want_gcrypt != 'false' and not skip_deps
1038 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1039 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1040 have = libgcrypt.found() and libgpg_error.found()
1041 else
1042 have = false
1043 endif
1044 if not have
1045 # link to neither of the libs if one is not found
1046 libgcrypt = []
1047 libgpg_error = []
1048 endif
1049 conf.set10('HAVE_GCRYPT', have)
1050
1051 want_gnutls = get_option('gnutls')
1052 if want_gnutls != 'false' and not skip_deps
1053 libgnutls = dependency('gnutls',
1054 version : '>= 3.1.4',
1055 required : want_gnutls == 'true')
1056 have = libgnutls.found()
1057 else
1058 have = false
1059 libgnutls = []
1060 endif
1061 conf.set10('HAVE_GNUTLS', have)
1062
1063 want_openssl = get_option('openssl')
1064 if want_openssl != 'false' and not skip_deps
1065 libopenssl = dependency('openssl',
1066 version : '>= 1.1.0',
1067 required : want_openssl == 'true')
1068 have = libopenssl.found()
1069 else
1070 have = false
1071 libopenssl = []
1072 endif
1073 conf.set10('HAVE_OPENSSL', have)
1074
1075 want_elfutils = get_option('elfutils')
1076 if want_elfutils != 'false' and not skip_deps
1077 libdw = dependency('libdw',
1078 required : want_elfutils == 'true')
1079 have = libdw.found()
1080 else
1081 have = false
1082 libdw = []
1083 endif
1084 conf.set10('HAVE_ELFUTILS', have)
1085
1086 want_zlib = get_option('zlib')
1087 if want_zlib != 'false' and not skip_deps
1088 libz = dependency('zlib',
1089 required : want_zlib == 'true')
1090 have = libz.found()
1091 else
1092 have = false
1093 libz = []
1094 endif
1095 conf.set10('HAVE_ZLIB', have)
1096
1097 want_bzip2 = get_option('bzip2')
1098 if want_bzip2 != 'false' and not skip_deps
1099 libbzip2 = cc.find_library('bz2',
1100 required : want_bzip2 == 'true')
1101 have = libbzip2.found()
1102 else
1103 have = false
1104 libbzip2 = []
1105 endif
1106 conf.set10('HAVE_BZIP2', have)
1107
1108 want_xz = get_option('xz')
1109 if want_xz != 'false' and not skip_deps
1110 libxz = dependency('liblzma',
1111 required : want_xz == 'true')
1112 have = libxz.found()
1113 else
1114 have = false
1115 libxz = []
1116 endif
1117 conf.set10('HAVE_XZ', have)
1118
1119 want_lz4 = get_option('lz4')
1120 if want_lz4 != 'false' and not skip_deps
1121 liblz4 = dependency('liblz4',
1122 version : '>= 1.3.0',
1123 required : want_lz4 == 'true')
1124 have = liblz4.found()
1125 else
1126 have = false
1127 liblz4 = []
1128 endif
1129 conf.set10('HAVE_LZ4', have)
1130
1131 want_xkbcommon = get_option('xkbcommon')
1132 if want_xkbcommon != 'false' and not skip_deps
1133 libxkbcommon = dependency('xkbcommon',
1134 version : '>= 0.3.0',
1135 required : want_xkbcommon == 'true')
1136 have = libxkbcommon.found()
1137 else
1138 have = false
1139 libxkbcommon = []
1140 endif
1141 conf.set10('HAVE_XKBCOMMON', have)
1142
1143 want_pcre2 = get_option('pcre2')
1144 if want_pcre2 != 'false'
1145 libpcre2 = dependency('libpcre2-8',
1146 required : want_pcre2 == 'true')
1147 have = libpcre2.found()
1148 else
1149 have = false
1150 libpcre2 = []
1151 endif
1152 conf.set10('HAVE_PCRE2', have)
1153
1154 want_glib = get_option('glib')
1155 if want_glib != 'false' and not skip_deps
1156 libglib = dependency('glib-2.0',
1157 version : '>= 2.22.0',
1158 required : want_glib == 'true')
1159 libgobject = dependency('gobject-2.0',
1160 version : '>= 2.22.0',
1161 required : want_glib == 'true')
1162 libgio = dependency('gio-2.0',
1163 required : want_glib == 'true')
1164 have = libglib.found() and libgobject.found() and libgio.found()
1165 else
1166 have = false
1167 libglib = []
1168 libgobject = []
1169 libgio = []
1170 endif
1171 conf.set10('HAVE_GLIB', have)
1172
1173 want_dbus = get_option('dbus')
1174 if want_dbus != 'false' and not skip_deps
1175 libdbus = dependency('dbus-1',
1176 version : '>= 1.3.2',
1177 required : want_dbus == 'true')
1178 have = libdbus.found()
1179 else
1180 have = false
1181 libdbus = []
1182 endif
1183 conf.set10('HAVE_DBUS', have)
1184
1185 default_dnssec = get_option('default-dnssec')
1186 if skip_deps
1187 default_dnssec = 'no'
1188 endif
1189 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1190 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1191 default_dnssec = 'no'
1192 endif
1193 conf.set('DEFAULT_DNSSEC_MODE',
1194 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1195 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1196
1197 dns_over_tls = get_option('dns-over-tls')
1198 if dns_over_tls != 'false'
1199 if dns_over_tls == 'openssl'
1200 have_gnutls = false
1201 else
1202 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.5.3'))
1203 if dns_over_tls == 'gnutls' and not have_gnutls
1204 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1205 endif
1206 endif
1207 if dns_over_tls == 'gnutls' or have_gnutls
1208 have_openssl = false
1209 else
1210 have_openssl = conf.get('HAVE_OPENSSL') == 1
1211 if dns_over_tls != 'auto' and not have_openssl
1212 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1213 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1214 endif
1215 endif
1216 have = have_gnutls or have_openssl
1217 else
1218 have = false
1219 have_gnutls = false
1220 have_openssl = false
1221 endif
1222 conf.set10('ENABLE_DNS_OVER_TLS', have)
1223 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1224 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1225
1226 default_dns_over_tls = get_option('default-dns-over-tls')
1227 if skip_deps
1228 default_dns_over_tls = 'no'
1229 endif
1230 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1231 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.')
1232 default_dns_over_tls = 'no'
1233 endif
1234 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1235 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1236 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1237
1238 want_importd = get_option('importd')
1239 if want_importd != 'false'
1240 have = (conf.get('HAVE_LIBCURL') == 1 and
1241 conf.get('HAVE_ZLIB') == 1 and
1242 conf.get('HAVE_XZ') == 1 and
1243 conf.get('HAVE_GCRYPT') == 1)
1244 if want_importd == 'true' and not have
1245 error('importd support was requested, but dependencies are not available')
1246 endif
1247 else
1248 have = false
1249 endif
1250 conf.set10('ENABLE_IMPORTD', have)
1251
1252 want_remote = get_option('remote')
1253 if want_remote != 'false'
1254 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1255 conf.get('HAVE_LIBCURL') == 1]
1256 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1257 # it's possible to build one without the other. Complain only if
1258 # support was explicitly requested. The auxiliary files like sysusers
1259 # config should be installed when any of the programs are built.
1260 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1261 error('remote support was requested, but dependencies are not available')
1262 endif
1263 have = have_deps[0] or have_deps[1]
1264 else
1265 have = false
1266 endif
1267 conf.set10('ENABLE_REMOTE', have)
1268
1269 foreach term : ['utmp',
1270 'hibernate',
1271 'environment-d',
1272 'binfmt',
1273 'coredump',
1274 'pstore',
1275 'resolve',
1276 'logind',
1277 'hostnamed',
1278 'localed',
1279 'machined',
1280 'portabled',
1281 'networkd',
1282 'timedated',
1283 'timesyncd',
1284 'firstboot',
1285 'randomseed',
1286 'backlight',
1287 'vconsole',
1288 'quotacheck',
1289 'sysusers',
1290 'tmpfiles',
1291 'hwdb',
1292 'rfkill',
1293 'ldconfig',
1294 'efi',
1295 'tpm',
1296 'ima',
1297 'smack',
1298 'gshadow',
1299 'idn',
1300 'nss-myhostname',
1301 'nss-systemd']
1302 have = get_option(term)
1303 name = 'ENABLE_' + term.underscorify().to_upper()
1304 conf.set10(name, have)
1305 endforeach
1306
1307 foreach tuple : [['nss-mymachines', 'machined'],
1308 ['nss-resolve', 'resolve']]
1309 want = get_option(tuple[0])
1310 if want != 'false'
1311 have = get_option(tuple[1])
1312 if want == 'true' and not have
1313 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1314 endif
1315 else
1316 have = false
1317 endif
1318 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1319 conf.set10(name, have)
1320 endforeach
1321
1322 enable_nss = false
1323 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1324 'ENABLE_NSS_MYMACHINES',
1325 'ENABLE_NSS_RESOLVE',
1326 'ENABLE_NSS_SYSTEMD']
1327 if conf.get(term) == 1
1328 enable_nss = true
1329 endif
1330 endforeach
1331 conf.set10('ENABLE_NSS', enable_nss)
1332
1333 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1334
1335 tests = []
1336 fuzzers = []
1337
1338 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1339
1340 #####################################################################
1341
1342 if get_option('efi')
1343 efi_arch = host_machine.cpu_family()
1344
1345 if efi_arch == 'x86'
1346 EFI_MACHINE_TYPE_NAME = 'ia32'
1347 gnu_efi_arch = 'ia32'
1348 elif efi_arch == 'x86_64'
1349 EFI_MACHINE_TYPE_NAME = 'x64'
1350 gnu_efi_arch = 'x86_64'
1351 elif efi_arch == 'arm'
1352 EFI_MACHINE_TYPE_NAME = 'arm'
1353 gnu_efi_arch = 'arm'
1354 elif efi_arch == 'aarch64'
1355 EFI_MACHINE_TYPE_NAME = 'aa64'
1356 gnu_efi_arch = 'aarch64'
1357 else
1358 EFI_MACHINE_TYPE_NAME = ''
1359 gnu_efi_arch = ''
1360 endif
1361
1362 have = true
1363 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1364
1365 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1366 else
1367 have = false
1368 endif
1369 conf.set10('ENABLE_EFI', have)
1370
1371 #####################################################################
1372
1373 config_h = configure_file(
1374 output : 'config.h',
1375 configuration : conf)
1376
1377 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1378
1379 includes = include_directories('src/basic',
1380 'src/boot',
1381 'src/shared',
1382 'src/systemd',
1383 'src/journal',
1384 'src/journal-remote',
1385 'src/nspawn',
1386 'src/resolve',
1387 'src/timesync',
1388 'src/time-wait-sync',
1389 'src/login',
1390 'src/udev',
1391 'src/libudev',
1392 'src/core',
1393 'src/shutdown',
1394 'src/libsystemd/sd-bus',
1395 'src/libsystemd/sd-device',
1396 'src/libsystemd/sd-event',
1397 'src/libsystemd/sd-hwdb',
1398 'src/libsystemd/sd-id128',
1399 'src/libsystemd/sd-netlink',
1400 'src/libsystemd/sd-network',
1401 'src/libsystemd/sd-resolve',
1402 'src/libsystemd-network',
1403 '.')
1404
1405 add_project_arguments('-include', 'config.h', language : 'c')
1406
1407 generate_gperfs = find_program('tools/generate-gperfs.py')
1408
1409 subdir('po')
1410 subdir('catalog')
1411 subdir('src/systemd')
1412 subdir('src/basic')
1413 subdir('src/libsystemd')
1414 subdir('src/libsystemd-network')
1415 subdir('src/journal')
1416 subdir('src/login')
1417
1418 libjournal_core = static_library(
1419 'journal-core',
1420 libjournal_core_sources,
1421 journald_gperf_c,
1422 include_directories : includes,
1423 install : false)
1424
1425 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1426 libsystemd = shared_library(
1427 'systemd',
1428 disable_mempool_c,
1429 version : libsystemd_version,
1430 include_directories : includes,
1431 link_args : ['-shared',
1432 '-Wl,--version-script=' + libsystemd_sym_path],
1433 link_with : [libbasic,
1434 libbasic_gcrypt],
1435 link_whole : [libsystemd_static,
1436 libjournal_client],
1437 dependencies : [threads,
1438 librt,
1439 libxz,
1440 liblz4],
1441 link_depends : libsystemd_sym,
1442 install : true,
1443 install_dir : rootlibdir)
1444
1445 static_libsystemd = get_option('static-libsystemd')
1446 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1447
1448 install_libsystemd_static = static_library(
1449 'systemd',
1450 libsystemd_sources,
1451 journal_client_sources,
1452 basic_sources,
1453 basic_gcrypt_sources,
1454 disable_mempool_c,
1455 include_directories : includes,
1456 build_by_default : static_libsystemd != 'false',
1457 install : static_libsystemd != 'false',
1458 install_dir : rootlibdir,
1459 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1460 dependencies : [threads,
1461 librt,
1462 libxz,
1463 liblz4,
1464 libcap,
1465 libblkid,
1466 libmount,
1467 libselinux,
1468 libgcrypt],
1469 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1470
1471 ############################################################
1472
1473 # binaries that have --help and are intended for use by humans,
1474 # usually, but not always, installed in /bin.
1475 public_programs = []
1476
1477 subdir('src/libudev')
1478 subdir('src/shared')
1479 subdir('src/core')
1480 subdir('src/shutdown')
1481 subdir('src/udev')
1482 subdir('src/network')
1483
1484 subdir('src/analyze')
1485 subdir('src/journal-remote')
1486 subdir('src/coredump')
1487 subdir('src/pstore')
1488 subdir('src/hostname')
1489 subdir('src/import')
1490 subdir('src/kernel-install')
1491 subdir('src/locale')
1492 subdir('src/machine')
1493 subdir('src/portable')
1494 subdir('src/nspawn')
1495 subdir('src/resolve')
1496 subdir('src/timedate')
1497 subdir('src/timesync')
1498 subdir('src/vconsole')
1499 subdir('src/boot/efi')
1500
1501 subdir('src/test')
1502 subdir('src/fuzz')
1503 subdir('rules')
1504 subdir('test')
1505
1506 ############################################################
1507
1508 # only static linking apart from libdl, to make sure that the
1509 # module is linked to all libraries that it uses.
1510 test_dlopen = executable(
1511 'test-dlopen',
1512 test_dlopen_c,
1513 disable_mempool_c,
1514 include_directories : includes,
1515 link_with : [libbasic],
1516 dependencies : [libdl],
1517 build_by_default : want_tests != 'false')
1518
1519 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1520 ['systemd', 'ENABLE_NSS_SYSTEMD'],
1521 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1522 ['resolve', 'ENABLE_NSS_RESOLVE']]
1523
1524 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1525 if condition
1526 module = tuple[0]
1527
1528 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1529 version_script_arg = join_paths(project_source_root, sym)
1530
1531 nss = shared_library(
1532 'nss_' + module,
1533 'src/nss-@0@/nss-@0@.c'.format(module),
1534 disable_mempool_c,
1535 version : '2',
1536 include_directories : includes,
1537 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1538 link_args : ['-Wl,-z,nodelete',
1539 '-shared',
1540 '-Wl,--version-script=' + version_script_arg],
1541 link_with : [libsystemd_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('units')
2911 subdir('sysctl.d')
2912 subdir('sysusers.d')
2913 subdir('tmpfiles.d')
2914 subdir('presets')
2915 subdir('hwdb')
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