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