]> git.ipfire.org Git - thirdparty/systemd.git/blame_incremental - meson.build
basic/list: add LIST_JOIN helper
[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 libqrencode,
1803 libxz,
1804 liblz4,
1805 libpcre2,
1806 libzstd],
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
2672 if want_tests != 'false'
2673 test('test-repart',
2674 test_repart_sh,
2675 args : exe.full_path())
2676 endif
2677endif
2678
2679if conf.get('ENABLE_VCONSOLE') == 1
2680 executable(
2681 'systemd-vconsole-setup',
2682 'src/vconsole/vconsole-setup.c',
2683 include_directories : includes,
2684 link_with : [libshared],
2685 install_rpath : rootlibexecdir,
2686 install : true,
2687 install_dir : rootlibexecdir)
2688endif
2689
2690if conf.get('ENABLE_RANDOMSEED') == 1
2691 executable(
2692 'systemd-random-seed',
2693 'src/random-seed/random-seed.c',
2694 include_directories : includes,
2695 link_with : [libshared],
2696 install_rpath : rootlibexecdir,
2697 install : true,
2698 install_dir : rootlibexecdir)
2699endif
2700
2701if conf.get('ENABLE_FIRSTBOOT') == 1
2702 executable(
2703 'systemd-firstboot',
2704 'src/firstboot/firstboot.c',
2705 include_directories : includes,
2706 link_with : [libshared],
2707 dependencies : [libcrypt],
2708 install_rpath : rootlibexecdir,
2709 install : true,
2710 install_dir : rootbindir)
2711endif
2712
2713executable(
2714 'systemd-remount-fs',
2715 'src/remount-fs/remount-fs.c',
2716 include_directories : includes,
2717 link_with : [libcore_shared,
2718 libshared],
2719 install_rpath : rootlibexecdir,
2720 install : true,
2721 install_dir : rootlibexecdir)
2722
2723executable(
2724 'systemd-machine-id-setup',
2725 'src/machine-id-setup/machine-id-setup-main.c',
2726 include_directories : includes,
2727 link_with : [libcore_shared,
2728 libshared],
2729 install_rpath : rootlibexecdir,
2730 install : true,
2731 install_dir : rootbindir)
2732
2733executable(
2734 'systemd-fsck',
2735 'src/fsck/fsck.c',
2736 include_directories : includes,
2737 link_with : [libshared],
2738 install_rpath : rootlibexecdir,
2739 install : true,
2740 install_dir : rootlibexecdir)
2741
2742executable('systemd-growfs',
2743 'src/partition/growfs.c',
2744 include_directories : includes,
2745 link_with : [libshared],
2746 dependencies : [libcryptsetup],
2747 install_rpath : rootlibexecdir,
2748 install : true,
2749 install_dir : rootlibexecdir)
2750
2751executable(
2752 'systemd-makefs',
2753 'src/partition/makefs.c',
2754 include_directories : includes,
2755 link_with : [libshared],
2756 install_rpath : rootlibexecdir,
2757 install : true,
2758 install_dir : rootlibexecdir)
2759
2760executable(
2761 'systemd-sleep',
2762 'src/sleep/sleep.c',
2763 include_directories : includes,
2764 link_with : [libshared],
2765 install_rpath : rootlibexecdir,
2766 install : true,
2767 install_dir : rootlibexecdir)
2768
2769install_data('src/sleep/sleep.conf',
2770 install_dir : pkgsysconfdir)
2771
2772public_programs += executable(
2773 'systemd-sysctl',
2774 'src/sysctl/sysctl.c',
2775 include_directories : includes,
2776 link_with : [libshared],
2777 install_rpath : rootlibexecdir,
2778 install : true,
2779 install_dir : rootlibexecdir)
2780
2781executable(
2782 'systemd-ac-power',
2783 'src/ac-power/ac-power.c',
2784 include_directories : includes,
2785 link_with : [libshared],
2786 install_rpath : rootlibexecdir,
2787 install : true,
2788 install_dir : rootlibexecdir)
2789
2790public_programs += executable(
2791 'systemd-detect-virt',
2792 'src/detect-virt/detect-virt.c',
2793 include_directories : includes,
2794 link_with : [libshared],
2795 install_rpath : rootlibexecdir,
2796 install : true)
2797
2798public_programs += executable(
2799 'systemd-delta',
2800 'src/delta/delta.c',
2801 include_directories : includes,
2802 link_with : [libshared],
2803 install_rpath : rootlibexecdir,
2804 install : true)
2805
2806public_programs += executable(
2807 'systemd-escape',
2808 'src/escape/escape.c',
2809 include_directories : includes,
2810 link_with : [libshared],
2811 install_rpath : rootlibexecdir,
2812 install : true,
2813 install_dir : rootbindir)
2814
2815public_programs += executable(
2816 'systemd-notify',
2817 'src/notify/notify.c',
2818 include_directories : includes,
2819 link_with : [libshared],
2820 install_rpath : rootlibexecdir,
2821 install : true,
2822 install_dir : rootbindir)
2823
2824executable(
2825 'systemd-volatile-root',
2826 'src/volatile-root/volatile-root.c',
2827 include_directories : includes,
2828 link_with : [libshared],
2829 install_rpath : rootlibexecdir,
2830 install : conf.get('ENABLE_INITRD') == 1,
2831 install_dir : rootlibexecdir)
2832
2833executable(
2834 'systemd-cgroups-agent',
2835 'src/cgroups-agent/cgroups-agent.c',
2836 include_directories : includes,
2837 link_with : [libshared],
2838 install_rpath : rootlibexecdir,
2839 install : true,
2840 install_dir : rootlibexecdir)
2841
2842public_programs += executable(
2843 'systemd-id128',
2844 'src/id128/id128.c',
2845 include_directories : includes,
2846 link_with : [libshared],
2847 install_rpath : rootlibexecdir,
2848 install : true)
2849
2850public_programs += executable(
2851 'systemd-path',
2852 'src/path/path.c',
2853 include_directories : includes,
2854 link_with : [libshared],
2855 install_rpath : rootlibexecdir,
2856 install : true)
2857
2858public_programs += executable(
2859 'systemd-ask-password',
2860 'src/ask-password/ask-password.c',
2861 include_directories : includes,
2862 link_with : [libshared],
2863 install_rpath : rootlibexecdir,
2864 install : true,
2865 install_dir : rootbindir)
2866
2867executable(
2868 'systemd-reply-password',
2869 'src/reply-password/reply-password.c',
2870 include_directories : includes,
2871 link_with : [libshared],
2872 install_rpath : rootlibexecdir,
2873 install : true,
2874 install_dir : rootlibexecdir)
2875
2876public_programs += executable(
2877 'systemd-tty-ask-password-agent',
2878 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2879 include_directories : includes,
2880 link_with : [libshared],
2881 install_rpath : rootlibexecdir,
2882 install : true,
2883 install_dir : rootbindir)
2884
2885public_programs += executable(
2886 'systemd-cgls',
2887 'src/cgls/cgls.c',
2888 include_directories : includes,
2889 link_with : [libshared],
2890 install_rpath : rootlibexecdir,
2891 install : true)
2892
2893public_programs += executable(
2894 'systemd-cgtop',
2895 'src/cgtop/cgtop.c',
2896 include_directories : includes,
2897 link_with : [libshared],
2898 install_rpath : rootlibexecdir,
2899 install : true)
2900
2901executable(
2902 'systemd-initctl',
2903 'src/initctl/initctl.c',
2904 include_directories : includes,
2905 link_with : [libshared],
2906 install_rpath : rootlibexecdir,
2907 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
2908 install_dir : rootlibexecdir)
2909
2910public_programs += executable(
2911 'systemd-mount',
2912 'src/mount/mount-tool.c',
2913 include_directories : includes,
2914 link_with : [libshared],
2915 dependencies: [libmount],
2916 install_rpath : rootlibexecdir,
2917 install : true)
2918
2919meson.add_install_script(meson_make_symlink,
2920 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2921
2922public_programs += executable(
2923 'systemd-run',
2924 'src/run/run.c',
2925 include_directories : includes,
2926 link_with : [libshared],
2927 install_rpath : rootlibexecdir,
2928 install : true)
2929
2930public_programs += executable(
2931 'systemd-stdio-bridge',
2932 'src/stdio-bridge/stdio-bridge.c',
2933 include_directories : includes,
2934 link_with : [libshared],
2935 dependencies : [versiondep],
2936 install_rpath : rootlibexecdir,
2937 install : true)
2938
2939public_programs += executable(
2940 'busctl',
2941 'src/busctl/busctl.c',
2942 'src/busctl/busctl-introspect.c',
2943 'src/busctl/busctl-introspect.h',
2944 include_directories : includes,
2945 link_with : [libshared],
2946 install_rpath : rootlibexecdir,
2947 install : true)
2948
2949if conf.get('ENABLE_SYSUSERS') == 1
2950 public_programs += executable(
2951 'systemd-sysusers',
2952 'src/sysusers/sysusers.c',
2953 include_directories : includes,
2954 link_with : [libshared],
2955 install_rpath : rootlibexecdir,
2956 install : true,
2957 install_dir : rootbindir)
2958
2959 if have_standalone_binaries
2960 public_programs += executable(
2961 'systemd-sysusers.standalone',
2962 'src/sysusers/sysusers.c',
2963 include_directories : includes,
2964 link_with : [libshared_static,
2965 libbasic,
2966 libbasic_gcrypt,
2967 libsystemd_static,
2968 libjournal_client],
2969 install : true,
2970 install_dir : rootbindir)
2971 endif
2972endif
2973
2974if conf.get('ENABLE_TMPFILES') == 1
2975 exe = executable(
2976 'systemd-tmpfiles',
2977 systemd_tmpfiles_sources,
2978 include_directories : includes,
2979 link_with : [libshared],
2980 dependencies : [libacl],
2981 install_rpath : rootlibexecdir,
2982 install : true,
2983 install_dir : rootbindir)
2984 public_programs += exe
2985
2986 if want_tests != 'false'
2987 test('test-systemd-tmpfiles',
2988 test_systemd_tmpfiles_py,
2989 # https://github.com/mesonbuild/meson/issues/2681
2990 args : exe.full_path())
2991 endif
2992
2993 if have_standalone_binaries
2994 public_programs += executable(
2995 'systemd-tmpfiles.standalone',
2996 systemd_tmpfiles_sources,
2997 include_directories : includes,
2998 link_with : [libshared_static,
2999 libbasic,
3000 libbasic_gcrypt,
3001 libsystemd_static,
3002 libjournal_client],
3003 dependencies : [libacl],
3004 install : true,
3005 install_dir : rootbindir)
3006 endif
3007endif
3008
3009if conf.get('ENABLE_HWDB') == 1
3010 public_programs += executable(
3011 'systemd-hwdb',
3012 'src/hwdb/hwdb.c',
3013 'src/libsystemd/sd-hwdb/hwdb-internal.h',
3014 include_directories : includes,
3015 link_with : [libudev_static],
3016 install_rpath : udev_rpath,
3017 install : true,
3018 install_dir : rootbindir)
3019endif
3020
3021if conf.get('ENABLE_QUOTACHECK') == 1
3022 executable(
3023 'systemd-quotacheck',
3024 'src/quotacheck/quotacheck.c',
3025 include_directories : includes,
3026 link_with : [libshared],
3027 install_rpath : rootlibexecdir,
3028 install : true,
3029 install_dir : rootlibexecdir)
3030endif
3031
3032public_programs += executable(
3033 'systemd-socket-proxyd',
3034 'src/socket-proxy/socket-proxyd.c',
3035 include_directories : includes,
3036 link_with : [libshared],
3037 dependencies : [threads],
3038 install_rpath : rootlibexecdir,
3039 install : true,
3040 install_dir : rootlibexecdir)
3041
3042public_programs += executable(
3043 'udevadm',
3044 udevadm_sources,
3045 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
3046 include_directories : includes,
3047 link_with : [libudev_core,
3048 libsystemd_network,
3049 libudev_static],
3050 dependencies : [versiondep,
3051 threads,
3052 libkmod,
3053 libidn,
3054 libacl,
3055 libblkid],
3056 install_rpath : udev_rpath,
3057 install : true,
3058 install_dir : rootbindir)
3059
3060executable(
3061 'systemd-shutdown',
3062 systemd_shutdown_sources,
3063 include_directories : includes,
3064 link_with : [libcore_shared,
3065 libshared],
3066 dependencies : [libmount],
3067 install_rpath : rootlibexecdir,
3068 install : true,
3069 install_dir : rootlibexecdir)
3070
3071executable(
3072 'systemd-update-done',
3073 'src/update-done/update-done.c',
3074 include_directories : includes,
3075 link_with : [libshared],
3076 install_rpath : rootlibexecdir,
3077 install : true,
3078 install_dir : rootlibexecdir)
3079
3080executable(
3081 'systemd-update-utmp',
3082 'src/update-utmp/update-utmp.c',
3083 include_directories : includes,
3084 link_with : [libshared],
3085 dependencies : [libaudit],
3086 install_rpath : rootlibexecdir,
3087 install : (conf.get('ENABLE_UTMP') == 1),
3088 install_dir : rootlibexecdir)
3089
3090if conf.get('HAVE_KMOD') == 1
3091 executable(
3092 'systemd-modules-load',
3093 'src/modules-load/modules-load.c',
3094 include_directories : includes,
3095 link_with : [libshared],
3096 dependencies : [libkmod],
3097 install_rpath : rootlibexecdir,
3098 install : true,
3099 install_dir : rootlibexecdir)
3100
3101 meson.add_install_script('sh', '-c',
3102 mkdir_p.format(modulesloaddir))
3103 meson.add_install_script('sh', '-c',
3104 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
3105endif
3106
3107public_programs += executable(
3108 'systemd-nspawn',
3109 systemd_nspawn_sources,
3110 include_directories : includes,
3111 link_with : [libcore_shared,
3112 libnspawn_core,
3113 libshared],
3114 dependencies : [libblkid,
3115 libseccomp],
3116 install_rpath : rootlibexecdir,
3117 install : true)
3118
3119if conf.get('ENABLE_NETWORKD') == 1
3120 executable(
3121 'systemd-networkd',
3122 systemd_networkd_sources,
3123 include_directories : network_include_dir,
3124 link_with : [libnetworkd_core,
3125 libsystemd_network,
3126 libudev_static,
3127 networkd_link_with],
3128 dependencies : [threads],
3129 install_rpath : rootlibexecdir,
3130 install : true,
3131 install_dir : rootlibexecdir)
3132
3133 executable(
3134 'systemd-networkd-wait-online',
3135 systemd_networkd_wait_online_sources,
3136 include_directories : includes,
3137 link_with : [libnetworkd_core,
3138 networkd_link_with],
3139 install_rpath : rootlibexecdir,
3140 install : true,
3141 install_dir : rootlibexecdir)
3142
3143 public_programs += executable(
3144 'networkctl',
3145 networkctl_sources,
3146 include_directories : includes,
3147 link_with : [libsystemd_network,
3148 networkd_link_with],
3149 install_rpath : rootlibexecdir,
3150 install : true,
3151 install_dir : rootbindir)
3152
3153 exe = executable(
3154 'systemd-network-generator',
3155 network_generator_sources,
3156 include_directories : includes,
3157 link_with : [networkd_link_with],
3158 install_rpath : rootlibexecdir,
3159 install : true,
3160 install_dir : rootlibexecdir)
3161
3162 if want_tests != 'false'
3163 test('test-network-generator-conversion',
3164 test_network_generator_conversion_sh,
3165 # https://github.com/mesonbuild/meson/issues/2681
3166 args : exe.full_path())
3167 endif
3168endif
3169
3170executable(
3171 'systemd-sulogin-shell',
3172 ['src/sulogin-shell/sulogin-shell.c'],
3173 include_directories : includes,
3174 link_with : [libshared],
3175 install_rpath : rootlibexecdir,
3176 install : true,
3177 install_dir : rootlibexecdir)
3178
3179############################################################
3180
3181custom_target(
3182 'systemd-runtest.env',
3183 output : 'systemd-runtest.env',
3184 command : ['sh', '-c', '{ ' +
3185 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
3186 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
3187 '} >@OUTPUT@'],
3188 build_by_default : true)
3189
3190foreach tuple : tests
3191 sources = tuple[0]
3192 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3193 dependencies = tuple[2]
3194 condition = tuple.length() >= 4 ? tuple[3] : ''
3195 type = tuple.length() >= 5 ? tuple[4] : ''
3196 defs = tuple.length() >= 6 ? tuple[5] : []
3197 incs = tuple.length() >= 7 ? tuple[6] : includes
3198 timeout = 30
3199
3200 name = sources[0].split('/')[-1].split('.')[0]
3201 if type.startswith('timeout=')
3202 timeout = type.split('=')[1].to_int()
3203 type = ''
3204 endif
3205
3206 if condition == '' or conf.get(condition) == 1
3207 exe = executable(
3208 name,
3209 sources,
3210 include_directories : incs,
3211 link_with : link_with,
3212 dependencies : [versiondep,
3213 dependencies],
3214 c_args : defs,
3215 build_by_default : want_tests != 'false',
3216 install_rpath : rootlibexecdir,
3217 install : install_tests,
3218 install_dir : join_paths(testsdir, type))
3219
3220 if type == 'manual'
3221 message('@0@ is a manual test'.format(name))
3222 elif type == 'unsafe' and want_tests != 'unsafe'
3223 message('@0@ is an unsafe test'.format(name))
3224 elif want_tests != 'false'
3225 test(name, exe,
3226 env : test_env,
3227 timeout : timeout)
3228 endif
3229 else
3230 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3231 endif
3232endforeach
3233
3234exe = executable(
3235 'test-libsystemd-sym',
3236 test_libsystemd_sym_c,
3237 include_directories : includes,
3238 link_with : [libsystemd],
3239 build_by_default : want_tests != 'false',
3240 install : install_tests,
3241 install_dir : testsdir)
3242if want_tests != 'false'
3243 test('test-libsystemd-sym', exe)
3244endif
3245
3246exe = executable(
3247 'test-libsystemd-static-sym',
3248 test_libsystemd_sym_c,
3249 include_directories : includes,
3250 link_with : [install_libsystemd_static],
3251 dependencies : [threads], # threads is already included in dependencies on the library,
3252 # but does not seem to get propagated. Add here as a work-around.
3253 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3254 install : install_tests and static_libsystemd_pic,
3255 install_dir : testsdir)
3256if want_tests != 'false' and static_libsystemd_pic
3257 test('test-libsystemd-static-sym', exe)
3258endif
3259
3260exe = executable(
3261 'test-libudev-sym',
3262 test_libudev_sym_c,
3263 include_directories : includes,
3264 c_args : '-Wno-deprecated-declarations',
3265 link_with : [libudev],
3266 build_by_default : want_tests != 'false',
3267 install : install_tests,
3268 install_dir : testsdir)
3269if want_tests != 'false'
3270 test('test-libudev-sym', exe)
3271endif
3272
3273exe = executable(
3274 'test-libudev-static-sym',
3275 test_libudev_sym_c,
3276 include_directories : includes,
3277 c_args : '-Wno-deprecated-declarations',
3278 link_with : [install_libudev_static],
3279 build_by_default : want_tests != 'false' and static_libudev_pic,
3280 install : install_tests and static_libudev_pic,
3281 install_dir : testsdir)
3282if want_tests != 'false' and static_libudev_pic
3283 test('test-libudev-static-sym', exe)
3284endif
3285
3286############################################################
3287
3288fuzzer_exes = []
3289
3290if get_option('tests') != 'false'
3291 foreach tuple : fuzzers
3292 sources = tuple[0]
3293 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3294 dependencies = tuple[2]
3295 defs = tuple.length() >= 4 ? tuple[3] : []
3296 incs = tuple.length() >= 5 ? tuple[4] : includes
3297 link_args = []
3298
3299 if want_ossfuzz
3300 dependencies += fuzzing_engine
3301 elif want_libfuzzer
3302 if fuzzing_engine.found()
3303 dependencies += fuzzing_engine
3304 else
3305 link_args += ['-fsanitize=fuzzer']
3306 endif
3307 else
3308 sources += 'src/fuzz/fuzz-main.c'
3309 endif
3310
3311 name = sources[0].split('/')[-1].split('.')[0]
3312
3313 fuzzer_exes += executable(
3314 name,
3315 sources,
3316 include_directories : [incs, include_directories('src/fuzz')],
3317 link_with : link_with,
3318 dependencies : dependencies,
3319 c_args : defs,
3320 link_args: link_args,
3321 install : false)
3322 endforeach
3323endif
3324
3325run_target(
3326 'fuzzers',
3327 depends : fuzzer_exes,
3328 command : ['true'])
3329
3330############################################################
3331
3332make_directive_index_py = find_program('tools/make-directive-index.py')
3333make_man_index_py = find_program('tools/make-man-index.py')
3334xml_helper_py = find_program('tools/xml_helper.py')
3335hwdb_update_sh = find_program('tools/hwdb-update.sh')
3336autosuspend_update_sh = find_program('tools/autosuspend-update.sh')
3337
3338subdir('sysctl.d')
3339subdir('sysusers.d')
3340subdir('tmpfiles.d')
3341subdir('hwdb.d')
3342subdir('units')
3343subdir('presets')
3344subdir('network')
3345subdir('man')
3346subdir('shell-completion/bash')
3347subdir('shell-completion/zsh')
3348subdir('docs/sysvinit')
3349subdir('docs/var-log')
3350
3351install_subdir('factory/etc',
3352 install_dir : factorydir)
3353
3354install_data('xorg/50-systemd-user.sh',
3355 install_dir : xinitrcdir)
3356install_data('modprobe.d/systemd.conf',
3357 install_dir : modprobedir)
3358install_data('LICENSE.GPL2',
3359 'LICENSE.LGPL2.1',
3360 'NEWS',
3361 'README',
3362 'docs/CODING_STYLE.md',
3363 'docs/DISTRO_PORTING.md',
3364 'docs/ENVIRONMENT.md',
3365 'docs/HACKING.md',
3366 'docs/TRANSIENT-SETTINGS.md',
3367 'docs/TRANSLATORS.md',
3368 'docs/UIDS-GIDS.md',
3369 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3370 install_dir : docdir)
3371
3372meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3373meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3374
3375############################################################
3376
3377check_help = find_program('tools/check-help.sh')
3378
3379foreach exec : public_programs
3380 name = exec.full_path().split('/')[-1]
3381 if want_tests != 'false'
3382 test('check-help-' + name,
3383 check_help,
3384 args : exec.full_path())
3385 endif
3386endforeach
3387
3388############################################################
3389
3390check_directives_sh = find_program('tools/check-directives.sh')
3391
3392if want_tests != 'false'
3393 test('check-directives',
3394 check_directives_sh,
3395 args : project_source_root)
3396endif
3397
3398############################################################
3399
3400# Enable tests for all supported sanitizers
3401foreach tuple : sanitizers
3402 sanitizer = tuple[0]
3403 build = tuple[1]
3404
3405 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3406 prev = ''
3407 foreach p : fuzz_regression_tests
3408 b = p.split('/')[-2]
3409 c = p.split('/')[-1]
3410
3411 name = '@0@:@1@'.format(b, sanitizer)
3412
3413 if name != prev
3414 if want_tests == 'false'
3415 message('Not compiling @0@ because tests is set to false'.format(name))
3416 elif slow_tests or fuzz_tests
3417 exe = custom_target(
3418 name,
3419 output : name,
3420 depends : build,
3421 command : [env, 'ln', '-fs',
3422 join_paths(build.full_path(), b),
3423 '@OUTPUT@'],
3424 build_by_default : true)
3425 else
3426 message('Not compiling @0@ because slow-tests/fuzz-tests is set to false'.format(name))
3427 endif
3428 endif
3429 prev = name
3430
3431 if want_tests != 'false' and (slow_tests or fuzz_tests)
3432 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3433 env,
3434 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
3435 timeout : 60,
3436 args : [exe.full_path(),
3437 join_paths(project_source_root, p)])
3438 endif
3439 endforeach
3440 endif
3441endforeach
3442
3443
3444############################################################
3445
3446if git.found()
3447 all_files = run_command(
3448 git,
3449 ['--git-dir=@0@/.git'.format(project_source_root),
3450 'ls-files',
3451 ':/*.[ch]'])
3452 all_files = files(all_files.stdout().split())
3453
3454 custom_target(
3455 'tags',
3456 output : 'tags',
3457 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3458 run_target(
3459 'ctags',
3460 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3461endif
3462
3463if git.found()
3464 git_contrib_sh = find_program('tools/git-contrib.sh')
3465 run_target(
3466 'git-contrib',
3467 command : [git_contrib_sh])
3468endif
3469
3470if git.found()
3471 git_head = run_command(
3472 git,
3473 ['--git-dir=@0@/.git'.format(project_source_root),
3474 'rev-parse', 'HEAD']).stdout().strip()
3475 git_head_short = run_command(
3476 git,
3477 ['--git-dir=@0@/.git'.format(project_source_root),
3478 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3479
3480 run_target(
3481 'git-snapshot',
3482 command : ['git', 'archive',
3483 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3484 git_head_short),
3485 '--prefix', 'systemd-@0@/'.format(git_head),
3486 'HEAD'])
3487endif
3488
3489############################################################
3490
3491check_api_docs_sh = find_program('tools/check-api-docs.sh')
3492run_target(
3493 'check-api-docs',
3494 depends : [man, libsystemd, libudev],
3495 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3496
3497############################################################
3498watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3499
3500status = [
3501 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3502
3503 'split /usr: @0@'.format(split_usr),
3504 'split bin-sbin: @0@'.format(split_bin),
3505 'prefix directory: @0@'.format(prefixdir),
3506 'rootprefix directory: @0@'.format(rootprefixdir),
3507 'sysconf directory: @0@'.format(sysconfdir),
3508 'include directory: @0@'.format(includedir),
3509 'lib directory: @0@'.format(libdir),
3510 'rootlib directory: @0@'.format(rootlibdir),
3511 'SysV init scripts: @0@'.format(sysvinit_path),
3512 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3513 'PAM modules directory: @0@'.format(pamlibdir),
3514 'PAM configuration directory: @0@'.format(pamconfdir),
3515 'RPM macros directory: @0@'.format(rpmmacrosdir),
3516 'modprobe.d directory: @0@'.format(modprobedir),
3517 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3518 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3519 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3520 'bash completions directory: @0@'.format(bashcompletiondir),
3521 'zsh completions directory: @0@'.format(zshcompletiondir),
3522 'extra start script: @0@'.format(get_option('rc-local')),
3523 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3524 get_option('debug-tty')),
3525 'TTY GID: @0@'.format(tty_gid),
3526 'users GID: @0@'.format(substs.get('USERS_GID')),
3527 'maximum system UID: @0@'.format(system_uid_max),
3528 'maximum system GID: @0@'.format(system_gid_max),
3529 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3530 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3531 'minimum container UID base: @0@'.format(container_uid_base_min),
3532 'maximum container UID base: @0@'.format(container_uid_base_max),
3533 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3534 'render group access mode: @0@'.format(get_option('group-render-mode')),
3535 'certificate root directory: @0@'.format(get_option('certificate-root')),
3536 'support URL: @0@'.format(support_url),
3537 'nobody user name: @0@'.format(nobody_user),
3538 'nobody group name: @0@'.format(nobody_group),
3539 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3540 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3541
3542 'default DNSSEC mode: @0@'.format(default_dnssec),
3543 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3544 'default mDNS mode: @0@'.format(default_mdns),
3545 'default LLMNR mode: @0@'.format(default_llmnr),
3546 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3547 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3548 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3549 'default locale: @0@'.format(default_locale),
3550 'default user $PATH: @0@'.format(default_user_path_display),
3551 'systemd service watchdog: @0@'.format(watchdog_opt)]
3552
3553alt_dns_servers = '\n '.join(dns_servers.split(' '))
3554alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3555status += [
3556 'default DNS servers: @0@'.format(alt_dns_servers),
3557 'default NTP servers: @0@'.format(alt_ntp_servers)]
3558
3559alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3560 '@@0@'.format(time_epoch)).stdout().strip()
3561status += [
3562 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3563
3564status += [
3565 'static libsystemd: @0@'.format(static_libsystemd),
3566 'static libudev: @0@'.format(static_libudev)]
3567
3568# TODO:
3569# CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3570# CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3571# LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3572
3573if conf.get('ENABLE_EFI') == 1
3574 status += 'efi arch: @0@'.format(efi_arch)
3575
3576 if have_gnu_efi
3577 status += [
3578 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3579 'EFI CC @0@'.format(' '.join(efi_cc)),
3580 'EFI lds: @0@'.format(efi_lds),
3581 'EFI crt0: @0@'.format(efi_crt0),
3582 'EFI include directory: @0@'.format(efi_incdir)]
3583 endif
3584endif
3585
3586found = []
3587missing = []
3588
3589foreach tuple : [
3590 ['libcryptsetup'],
3591 ['PAM'],
3592 ['pwquality'],
3593 ['libfdisk'],
3594 ['p11kit'],
3595 ['libfido2'],
3596 ['AUDIT'],
3597 ['IMA'],
3598 ['AppArmor'],
3599 ['SELinux'],
3600 ['SECCOMP'],
3601 ['SMACK'],
3602 ['zlib'],
3603 ['xz'],
3604 ['zstd'],
3605 ['lz4'],
3606 ['bzip2'],
3607 ['ACL'],
3608 ['gcrypt'],
3609 ['qrencode'],
3610 ['microhttpd'],
3611 ['gnutls'],
3612 ['openssl'],
3613 ['libcurl'],
3614 ['idn'],
3615 ['initrd'],
3616 ['libidn2'],
3617 ['libidn'],
3618 ['libiptc'],
3619 ['elfutils'],
3620 ['binfmt'],
3621 ['repart'],
3622 ['vconsole'],
3623 ['quotacheck'],
3624 ['tmpfiles'],
3625 ['environment.d'],
3626 ['sysusers'],
3627 ['firstboot'],
3628 ['randomseed'],
3629 ['backlight'],
3630 ['rfkill'],
3631 ['xdg-autostart'],
3632 ['logind'],
3633 ['machined'],
3634 ['portabled'],
3635 ['userdb'],
3636 ['homed'],
3637 ['importd'],
3638 ['hostnamed'],
3639 ['timedated'],
3640 ['timesyncd'],
3641 ['localed'],
3642 ['networkd'],
3643 ['resolve'],
3644 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3645 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3646 ['coredump'],
3647 ['pstore'],
3648 ['polkit'],
3649 ['legacy pkla', install_polkit_pkla],
3650 ['efi'],
3651 ['gnu-efi', have_gnu_efi],
3652 ['kmod'],
3653 ['xkbcommon'],
3654 ['pcre2'],
3655 ['blkid'],
3656 ['dbus'],
3657 ['glib'],
3658 ['nss-myhostname'],
3659 ['nss-mymachines'],
3660 ['nss-resolve'],
3661 ['nss-systemd'],
3662 ['hwdb'],
3663 ['tpm'],
3664 ['man pages', want_man],
3665 ['html pages', want_html],
3666 ['man page indices', want_man and have_lxml],
3667 ['SysV compat'],
3668 ['utmp'],
3669 ['ldconfig'],
3670 ['hibernate'],
3671 ['adm group', get_option('adm-group')],
3672 ['wheel group', get_option('wheel-group')],
3673 ['gshadow'],
3674 ['debug hashmap'],
3675 ['debug mmap cache'],
3676 ['debug siphash'],
3677 ['valgrind', conf.get('VALGRIND') == 1],
3678 ['trace logging', conf.get('LOG_TRACE') == 1],
3679 ['install tests', install_tests],
3680 ['link-udev-shared', get_option('link-udev-shared')],
3681 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3682 ['link-networkd-shared', get_option('link-networkd-shared')],
3683 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3684 ['kernel-install', get_option('kernel-install')],
3685 ['systemd-analyze', get_option('analyze')],
3686]
3687
3688 if tuple.length() >= 2
3689 cond = tuple[1]
3690 else
3691 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3692 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3693 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3694 endif
3695 if cond
3696 found += tuple[0]
3697 else
3698 missing += tuple[0]
3699 endif
3700endforeach
3701
3702status += [
3703 '',
3704 'enabled features: @0@'.format(', '.join(found)),
3705 '',
3706 'disabled features: @0@'.format(', '.join(missing)),
3707 '']
3708message('\n '.join(status))
3709
3710if rootprefixdir != rootprefix_default
3711 warning('\n' +
3712 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3713 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3714 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))
3715endif