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