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