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