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