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