1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
13 meson_version : '>= 0.46',
16 libsystemd_version = '0.28.0'
17 libudev_version = '1.6.17'
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
23 conf = configuration_data()
24 conf.set('PROJECT_VERSION', meson.project_version(),
25 description : 'Numerical project version (used where a simple number is expected)')
27 substs = configuration_data()
28 substs.set('PROJECT_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
29 substs.set('PROJECT_VERSION', meson.project_version(),
30 description : 'Numerical project version (used where a simple number is expected)')
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
34 project_source_root = meson.current_source_dir()
35 relative_source_path = run_command('realpath',
36 '--relative-to=@0@'.format(meson.current_build_dir()),
37 project_source_root).stdout().strip()
38 conf.set_quoted('RELATIVE_SOURCE_PATH', relative_source_path)
40 want_ossfuzz = get_option('oss-fuzz')
41 want_libfuzzer = get_option('llvm-fuzz')
42 want_fuzzbuzz = get_option('fuzzbuzz')
43 if want_ossfuzz + want_libfuzzer + want_fuzzbuzz > 1
44 error('only one of oss-fuzz, llvm-fuzz or fuzzbuzz can be specified')
47 skip_deps = want_ossfuzz or want_libfuzzer
48 fuzzer_build = want_ossfuzz or want_libfuzzer or want_fuzzbuzz
50 #####################################################################
52 # Try to install the git pre-commit hook
53 git_hook = run_command(join_paths(project_source_root, 'tools/add-git-hook.sh'))
54 if git_hook.returncode() == 0
55 message(git_hook.stdout().strip())
58 #####################################################################
60 if get_option('split-usr') == 'auto'
61 split_usr = run_command('test', '-L', '/bin').returncode() != 0
63 split_usr = get_option('split-usr') == 'true'
65 conf.set10('HAVE_SPLIT_USR', split_usr,
66 description : '/usr/bin and /bin directories are separate')
68 if get_option('split-bin') == 'auto'
69 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
71 split_bin = get_option('split-bin') == 'true'
73 conf.set10('HAVE_SPLIT_BIN', split_bin,
74 description : 'bin and sbin directories are separate')
76 rootprefixdir = get_option('rootprefix')
77 # Unusual rootprefixdir values are used by some distros
78 # (see https://github.com/systemd/systemd/pull/7461).
79 rootprefix_default = split_usr ? '/' : '/usr'
80 if rootprefixdir == ''
81 rootprefixdir = rootprefix_default
83 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
85 sysvinit_path = get_option('sysvinit-path')
86 sysvrcnd_path = get_option('sysvrcnd-path')
87 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
88 description : 'SysV init scripts and rcN.d links are supported')
90 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
91 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
92 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
94 # join_paths ignores the preceding arguments if an absolute component is
95 # encountered, so this should canonicalize various paths when they are
96 # absolute or relative.
97 prefixdir = get_option('prefix')
98 if not prefixdir.startswith('/')
99 error('Prefix is not absolute: "@0@"'.format(prefixdir))
101 bindir = join_paths(prefixdir, get_option('bindir'))
102 libdir = join_paths(prefixdir, get_option('libdir'))
103 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
104 includedir = join_paths(prefixdir, get_option('includedir'))
105 datadir = join_paths(prefixdir, get_option('datadir'))
106 localstatedir = join_paths('/', get_option('localstatedir'))
108 rootbindir = join_paths(rootprefixdir, 'bin')
109 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
110 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
112 rootlibdir = get_option('rootlibdir')
114 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
117 # Dirs of external packages
118 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
119 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
120 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
121 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
122 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
123 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
124 rpmmacrosdir = get_option('rpmmacrosdir')
125 if rpmmacrosdir != 'no'
126 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
128 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
131 pkgdatadir = join_paths(datadir, 'systemd')
132 environmentdir = join_paths(prefixdir, 'lib/environment.d')
133 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
134 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
135 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
136 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
137 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
138 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
139 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
140 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
141 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
142 pkgincludedir = join_paths(includedir, 'systemd')
143 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
144 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
145 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
146 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
147 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
148 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
149 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
150 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
151 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
152 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
153 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
154 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
155 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
156 factorydir = join_paths(datadir, 'factory')
157 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
158 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
159 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
160 catalogstatedir = join_paths(systemdstatedir, 'catalog')
161 randomseeddir = join_paths(localstatedir, 'lib/systemd')
162 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
163 ntpservicelistdir = join_paths(rootprefixdir, 'lib/systemd/ntp-units.d')
165 docdir = get_option('docdir')
167 docdir = join_paths(datadir, 'doc/systemd')
170 dbuspolicydir = get_option('dbuspolicydir')
171 if dbuspolicydir == ''
172 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
175 dbussessionservicedir = get_option('dbussessionservicedir')
176 if dbussessionservicedir == ''
177 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
180 dbussystemservicedir = get_option('dbussystemservicedir')
181 if dbussystemservicedir == ''
182 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
185 pamlibdir = get_option('pamlibdir')
187 pamlibdir = join_paths(rootlibdir, 'security')
190 pamconfdir = get_option('pamconfdir')
192 pamconfdir = join_paths(sysconfdir, 'pam.d')
195 memory_accounting_default = get_option('memory-accounting-default')
196 status_unit_format_default = get_option('status-unit-format-default')
198 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
199 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
200 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
201 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
202 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
203 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
205 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
207 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
208 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
209 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
210 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
211 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
212 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
213 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
214 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
215 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
216 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
217 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
218 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
219 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
220 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
221 conf.set_quoted('ROOTPREFIX', rootprefixdir)
222 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
223 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
224 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
225 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
226 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
227 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
228 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
229 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
230 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
231 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
232 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
233 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
234 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
235 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
236 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
237 conf.set_quoted('LIBDIR', libdir)
238 conf.set_quoted('ROOTLIBDIR', rootlibdir)
239 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
240 conf.set_quoted('BOOTLIBDIR', bootlibdir)
241 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
242 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
243 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
244 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
245 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
246 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
247 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
248 conf.set_quoted('SYSTEMD_HOMEWORK_PATH', join_paths(rootlibexecdir, 'systemd-homework'))
249 conf.set_quoted('SYSTEMD_USERWORK_PATH', join_paths(rootlibexecdir, 'systemd-userwork'))
250 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
251 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
252 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
254 substs.set('prefix', prefixdir)
255 substs.set('rootprefix', rootprefixdir)
256 substs.set('rootprefix_noslash', rootprefixdir_noslash)
257 substs.set('exec_prefix', prefixdir)
258 substs.set('libdir', libdir)
259 substs.set('rootlibdir', rootlibdir)
260 substs.set('includedir', includedir)
261 substs.set('sysconfdir', sysconfdir)
262 substs.set('bindir', bindir)
263 substs.set('rootbindir', rootbindir)
264 substs.set('rootlibexecdir', rootlibexecdir)
265 substs.set('systemunitdir', systemunitdir)
266 substs.set('userunitdir', userunitdir)
267 substs.set('systempresetdir', systempresetdir)
268 substs.set('userpresetdir', userpresetdir)
269 substs.set('udevhwdbdir', udevhwdbdir)
270 substs.set('udevrulesdir', udevrulesdir)
271 substs.set('udevlibexecdir', udevlibexecdir)
272 substs.set('environmentdir', environmentdir)
273 substs.set('catalogdir', catalogdir)
274 substs.set('tmpfilesdir', tmpfilesdir)
275 substs.set('sysusersdir', sysusersdir)
276 substs.set('sysctldir', sysctldir)
277 substs.set('binfmtdir', binfmtdir)
278 substs.set('modulesloaddir', modulesloaddir)
279 substs.set('modprobedir', modprobedir)
280 substs.set('systemgeneratordir', systemgeneratordir)
281 substs.set('usergeneratordir', usergeneratordir)
282 substs.set('systemenvgeneratordir', systemenvgeneratordir)
283 substs.set('userenvgeneratordir', userenvgeneratordir)
284 substs.set('systemshutdowndir', systemshutdowndir)
285 substs.set('systemsleepdir', systemsleepdir)
286 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
287 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
288 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
289 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
290 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
291 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
292 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
293 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
294 substs.set('BUILD_ROOT', meson.current_build_dir())
296 #####################################################################
298 cc = meson.get_compiler('c')
299 pkgconfig = import('pkgconfig')
300 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
301 meson_build_sh = find_program('tools/meson-build.sh')
303 want_tests = get_option('tests')
304 slow_tests = want_tests != 'false' and get_option('slow-tests')
305 install_tests = get_option('install-tests')
307 if add_languages('cpp', required : fuzzer_build)
308 # Used only for tests
309 cxx = meson.get_compiler('cpp')
310 cxx_cmd = ' '.join(cxx.cmd_array())
316 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
317 if fuzzing_engine.found()
318 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
319 elif cc.has_argument('-fsanitize=fuzzer-no-link')
320 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
322 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
325 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
327 fuzzing_engine = meson.get_compiler('cpp').find_library(get_option('fuzzbuzz-engine'), dirs: get_option('fuzzbuzz-engine-dir'))
330 # Those generate many false positives, and we do not want to change the code to
332 basic_disabled_warnings = [
333 '-Wno-unused-parameter',
334 '-Wno-missing-field-initializers',
335 '-Wno-unused-result',
336 '-Wno-format-signedness',
338 if get_option('b_ndebug') == 'true'
339 # With asserts disabled with get a bunch of warnings about variables which
340 # are used only in the asserts. This is not useful at all, so let's just silence
342 basic_disabled_warnings += [
343 '-Wno-unused-variable',
344 '-Wno-unused-but-set-variable',
348 possible_cc_flags = [
351 '-Wmissing-include-dirs',
352 '-Wold-style-definition',
356 '-Wsuggest-attribute=noreturn',
357 '-Werror=missing-prototypes',
358 '-Werror=implicit-function-declaration',
359 '-Werror=missing-declarations',
360 '-Werror=return-type',
361 '-Werror=incompatible-pointer-types',
363 '-Wstrict-prototypes',
365 '-Wmissing-noreturn',
366 '-Wimplicit-fallthrough=5',
369 '-Wstrict-aliasing=2',
372 '-Werror=shift-count-overflow',
373 '-Werror=shift-overflow=2',
377 # negative arguments are correctly detected starting with meson 0.46.
378 '-Wno-error=#warnings', # clang
379 '-Wno-string-plus-int', # clang
381 # work-around for gcc 7.1 turning this on on its own.
382 '-Wno-error=nonnull',
384 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
385 # optimizations enabled, producing essentially false positives.
386 '-Wno-maybe-uninitialized',
390 '-fdiagnostics-show-option',
391 '-fno-strict-aliasing',
392 '-fvisibility=hidden',
394 '-fstack-protector-strong',
395 '--param=ssp-buffer-size=4',
398 # --as-needed and --no-undefined are provided by meson by default,
399 # run mesonconf to see what is enabled
400 possible_link_flags = [
406 if cc.get_id() == 'clang'
407 possible_cc_flags += [
408 '-Wno-typedef-redefinition',
409 '-Wno-gnu-variable-sized-type-not-at-end',
413 if get_option('buildtype') != 'debug'
414 possible_cc_flags += [
415 '-ffunction-sections',
419 possible_link_flags += '-Wl,--gc-sections'
422 add_project_arguments(cc.get_supported_arguments(basic_disabled_warnings), language : 'c')
423 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
424 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
428 #include <inttypes.h>
429 typedef uint64_t usec_t;
430 usec_t now(clockid_t clock);
435 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
436 add_project_arguments('-Werror=shadow', language : 'c')
440 add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp')
443 cpp = ' '.join(cc.cmd_array()) + ' -E'
445 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
447 #####################################################################
448 # compilation result tests
450 conf.set('_GNU_SOURCE', true)
451 conf.set('__SANE_USERSPACE_TYPES__', true)
452 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
454 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
455 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
456 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
457 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
461 #include <sys/stat.h>
464 foreach decl : ['char16_t',
469 # We get -1 if the size cannot be determined
470 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
472 if decl == 'struct statx'
474 want_linux_stat_h = false
476 have = cc.sizeof(decl,
477 prefix : decl_headers + '#include <linux/stat.h>',
478 args : '-D_GNU_SOURCE') > 0
479 want_linux_stat_h = have
483 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
486 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
488 foreach ident : ['secure_getenv', '__secure_getenv']
489 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
493 ['memfd_create', '''#include <sys/mman.h>'''],
494 ['gettid', '''#include <sys/types.h>
495 #include <unistd.h>'''],
496 ['pivot_root', '''#include <stdlib.h>
497 #include <unistd.h>'''], # no known header declares pivot_root
498 ['name_to_handle_at', '''#include <sys/types.h>
499 #include <sys/stat.h>
500 #include <fcntl.h>'''],
501 ['setns', '''#include <sched.h>'''],
502 ['renameat2', '''#include <stdio.h>
503 #include <fcntl.h>'''],
504 ['kcmp', '''#include <linux/kcmp.h>'''],
505 ['keyctl', '''#include <sys/types.h>
506 #include <keyutils.h>'''],
507 ['copy_file_range', '''#include <sys/syscall.h>
508 #include <unistd.h>'''],
509 ['bpf', '''#include <sys/syscall.h>
510 #include <unistd.h>'''],
511 ['statx', '''#include <sys/types.h>
512 #include <sys/stat.h>
513 #include <unistd.h>'''],
514 ['explicit_bzero' , '''#include <string.h>'''],
515 ['reallocarray', '''#include <malloc.h>'''],
516 ['set_mempolicy', '''#include <stdlib.h>
517 #include <unistd.h>'''],
518 ['get_mempolicy', '''#include <stdlib.h>
519 #include <unistd.h>'''],
520 ['pidfd_send_signal', '''#include <stdlib.h>
523 #include <sys/wait.h>'''],
524 ['pidfd_open', '''#include <stdlib.h>
527 #include <sys/wait.h>'''],
528 ['rt_sigqueueinfo', '''#include <stdlib.h>
531 #include <sys/wait.h>'''],
534 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
535 conf.set10('HAVE_' + ident[0].to_upper(), have)
538 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
539 conf.set10('USE_SYS_RANDOM_H', true)
540 conf.set10('HAVE_GETRANDOM', true)
542 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
543 conf.set10('USE_SYS_RANDOM_H', false)
544 conf.set10('HAVE_GETRANDOM', have)
547 #####################################################################
549 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
551 get_option('version-tag'),
552 meson.project_version()]
555 input : 'src/version/version.h.in',
556 output : 'version.h',
559 versiondep = declare_dependency(sources: version_h)
561 sed = find_program('sed')
562 awk = find_program('awk')
563 m4 = find_program('m4')
564 stat = find_program('stat')
565 git = find_program('git', required : false)
566 env = find_program('env')
567 perl = find_program('perl', required : false)
569 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
570 mkdir_p = 'mkdir -p $DESTDIR/@0@'
571 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
572 splash_bmp = files('test/splash.bmp')
574 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
575 # /usr/sbin, /sbin, and fall back to the default from middle column.
576 progs = [['quotaon', '/usr/sbin/quotaon' ],
577 ['quotacheck', '/usr/sbin/quotacheck' ],
578 ['kmod', '/usr/bin/kmod' ],
579 ['kexec', '/usr/sbin/kexec' ],
580 ['sulogin', '/usr/sbin/sulogin' ],
581 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
582 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
583 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
584 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
585 ['nologin', '/usr/sbin/nologin', ],
588 path = get_option(prog[0] + '-path')
590 message('Using @1@ for @0@'.format(prog[0], path))
592 exe = find_program(prog[0],
593 '/usr/sbin/' + prog[0],
596 path = exe.found() ? exe.path() : prog[1]
598 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
599 conf.set_quoted(name, path)
600 substs.set(name, path)
603 conf.set_quoted('TELINIT', get_option('telinit-path'))
605 if run_command('ln', '--relative', '--help').returncode() != 0
606 error('ln does not support --relative (added in coreutils 8.16)')
609 ############################################################
611 gperf = find_program('gperf')
613 gperf_test_format = '''
615 const char * in_word_set(const char *, @0@);
618 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
619 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
620 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
621 if cc.compiles(gperf_test)
622 gperf_len_type = 'size_t'
624 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
625 if cc.compiles(gperf_test)
626 gperf_len_type = 'unsigned'
628 error('unable to determine gperf len type')
631 message('gperf len type is @0@'.format(gperf_len_type))
632 conf.set('GPERF_LEN_TYPE', gperf_len_type,
633 description : 'The type of gperf "len" parameter')
635 ############################################################
637 if not cc.has_header('sys/capability.h')
638 error('POSIX caps headers not found')
640 foreach header : ['crypt.h',
642 'linux/vm_sockets.h',
644 'valgrind/memcheck.h',
645 'valgrind/valgrind.h',
648 conf.set10('HAVE_' + header.underscorify().to_upper(),
649 cc.has_header(header))
652 ############################################################
654 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
655 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
656 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
658 default_hierarchy = get_option('default-hierarchy')
659 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
660 description : 'default cgroup hierarchy as string')
661 if default_hierarchy == 'legacy'
662 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
663 elif default_hierarchy == 'hybrid'
664 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
666 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
669 default_net_naming_scheme = get_option('default-net-naming-scheme')
670 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
672 time_epoch = get_option('time-epoch')
675 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
677 conf.set('TIME_EPOCH', time_epoch)
679 system_uid_max = get_option('system-uid-max')
680 if system_uid_max == -1
681 system_uid_max = run_command(
683 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
684 '/etc/login.defs').stdout().strip()
685 if system_uid_max == ''
688 system_uid_max = system_uid_max.to_int()
691 conf.set('SYSTEM_UID_MAX', system_uid_max)
692 substs.set('systemuidmax', system_uid_max)
694 system_gid_max = get_option('system-gid-max')
695 if system_gid_max == -1
696 system_gid_max = run_command(
698 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
699 '/etc/login.defs').stdout().strip()
700 if system_gid_max == ''
703 system_gid_max = system_gid_max.to_int()
706 conf.set('SYSTEM_GID_MAX', system_gid_max)
707 substs.set('systemgidmax', system_gid_max)
709 dynamic_uid_min = get_option('dynamic-uid-min')
710 dynamic_uid_max = get_option('dynamic-uid-max')
711 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
712 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
713 substs.set('dynamicuidmin', dynamic_uid_min)
714 substs.set('dynamicuidmax', dynamic_uid_max)
716 container_uid_base_min = get_option('container-uid-base-min')
717 container_uid_base_max = get_option('container-uid-base-max')
718 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
719 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
720 substs.set('containeruidbasemin', container_uid_base_min)
721 substs.set('containeruidbasemax', container_uid_base_max)
723 nobody_user = get_option('nobody-user')
724 nobody_group = get_option('nobody-group')
726 if not meson.is_cross_build()
727 getent_result = run_command('getent', 'passwd', '65534')
728 if getent_result.returncode() == 0
729 name = getent_result.stdout().split(':')[0]
730 if name != nobody_user
732 '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) +
733 'Your build will result in an user table setup that is incompatible with the local system.')
736 id_result = run_command('id', '-u', nobody_user)
737 if id_result.returncode() == 0
738 id = id_result.stdout().to_int()
741 '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) +
742 'Your build will result in an user table setup that is incompatible with the local system.')
746 getent_result = run_command('getent', 'group', '65534')
747 if getent_result.returncode() == 0
748 name = getent_result.stdout().split(':')[0]
749 if name != nobody_group
751 '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) +
752 'Your build will result in an group table setup that is incompatible with the local system.')
755 id_result = run_command('id', '-g', nobody_group)
756 if id_result.returncode() == 0
757 id = id_result.stdout().to_int()
760 '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) +
761 'Your build will result in an group table setup that is incompatible with the local system.')
765 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
767 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
768 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
771 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
772 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
773 substs.set('NOBODY_USER_NAME', nobody_user)
774 substs.set('NOBODY_GROUP_NAME', nobody_group)
776 tty_gid = get_option('tty-gid')
777 conf.set('TTY_GID', tty_gid)
778 substs.set('TTY_GID', tty_gid)
780 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
781 users_gid = get_option('users-gid')
782 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
784 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
785 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
787 dev_kvm_mode = get_option('dev-kvm-mode')
788 substs.set('DEV_KVM_MODE', dev_kvm_mode)
789 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
790 group_render_mode = get_option('group-render-mode')
791 substs.set('GROUP_RENDER_MODE', group_render_mode)
792 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
794 kill_user_processes = get_option('default-kill-user-processes')
795 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
796 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
797 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
799 dns_servers = get_option('dns-servers')
800 conf.set_quoted('DNS_SERVERS', dns_servers)
801 substs.set('DNS_SERVERS', dns_servers)
803 ntp_servers = get_option('ntp-servers')
804 conf.set_quoted('NTP_SERVERS', ntp_servers)
805 substs.set('NTP_SERVERS', ntp_servers)
807 default_locale = get_option('default-locale')
808 if default_locale == ''
809 if not meson.is_cross_build()
810 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
811 default_locale = run_command(choose_default_locale_sh).stdout().strip()
813 default_locale = 'C.UTF-8'
816 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
818 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
820 service_watchdog = get_option('service-watchdog')
821 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
822 substs.set('SERVICE_WATCHDOG', watchdog_value)
824 substs.set('SUSHELL', get_option('debug-shell'))
825 substs.set('DEBUGTTY', get_option('debug-tty'))
826 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
828 enable_debug_hashmap = false
829 enable_debug_mmap_cache = false
830 enable_debug_siphash = false
831 foreach name : get_option('debug-extra')
833 enable_debug_hashmap = true
834 elif name == 'mmap-cache'
835 enable_debug_mmap_cache = true
836 elif name == 'siphash'
837 enable_debug_siphash = true
839 message('unknown debug option "@0@", ignoring'.format(name))
842 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
843 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
844 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
846 conf.set10('VALGRIND', get_option('valgrind'))
847 conf.set10('LOG_TRACE', get_option('log-trace'))
849 default_user_path = get_option('user-path')
850 if default_user_path != ''
851 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
852 default_user_path_display = default_user_path
854 # meson 0.49 fails when ?: is used in .format()
855 default_user_path_display = '(same as system services)'
859 #####################################################################
861 threads = dependency('threads')
862 librt = cc.find_library('rt')
863 libm = cc.find_library('m')
864 libdl = cc.find_library('dl')
865 libcrypt = cc.find_library('crypt')
867 libcap = dependency('libcap', required : false)
868 if not libcap.found()
869 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
870 libcap = cc.find_library('cap')
873 libmount = dependency('mount',
874 version : fuzzer_build ? '>= 0' : '>= 2.30')
876 want_libfdisk = get_option('fdisk')
877 if want_libfdisk != 'false' and not skip_deps
878 libfdisk = dependency('fdisk',
879 required : want_libfdisk == 'true')
880 have = libfdisk.found()
885 conf.set10('HAVE_LIBFDISK', have)
887 want_pwquality = get_option('pwquality')
888 if want_pwquality != 'false' and not skip_deps
889 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
890 have = libpwquality.found()
895 conf.set10('HAVE_PWQUALITY', have)
897 want_seccomp = get_option('seccomp')
898 if want_seccomp != 'false' and not skip_deps
899 libseccomp = dependency('libseccomp',
900 version : '>= 2.3.1',
901 required : want_seccomp == 'true')
902 have = libseccomp.found()
907 conf.set10('HAVE_SECCOMP', have)
909 want_selinux = get_option('selinux')
910 if want_selinux != 'false' and not skip_deps
911 libselinux = dependency('libselinux',
912 version : '>= 2.1.9',
913 required : want_selinux == 'true')
914 have = libselinux.found()
919 conf.set10('HAVE_SELINUX', have)
921 want_apparmor = get_option('apparmor')
922 if want_apparmor != 'false' and not skip_deps
923 libapparmor = dependency('libapparmor',
924 required : want_apparmor == 'true')
925 have = libapparmor.found()
930 conf.set10('HAVE_APPARMOR', have)
932 smack_run_label = get_option('smack-run-label')
933 if smack_run_label != ''
934 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
937 want_polkit = get_option('polkit')
938 install_polkit = false
939 install_polkit_pkla = false
940 if want_polkit != 'false' and not skip_deps
941 install_polkit = true
943 libpolkit = dependency('polkit-gobject-1',
945 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
946 message('Old polkit detected, will install pkla files')
947 install_polkit_pkla = true
950 conf.set10('ENABLE_POLKIT', install_polkit)
952 want_acl = get_option('acl')
953 if want_acl != 'false' and not skip_deps
954 libacl = cc.find_library('acl', required : want_acl == 'true')
955 have = libacl.found()
960 conf.set10('HAVE_ACL', have)
962 want_audit = get_option('audit')
963 if want_audit != 'false' and not skip_deps
964 libaudit = dependency('audit', required : want_audit == 'true')
965 have = libaudit.found()
970 conf.set10('HAVE_AUDIT', have)
972 want_blkid = get_option('blkid')
973 if want_blkid != 'false' and not skip_deps
974 libblkid = dependency('blkid', required : want_blkid == 'true')
975 have = libblkid.found()
980 conf.set10('HAVE_BLKID', have)
982 want_kmod = get_option('kmod')
983 if want_kmod != 'false' and not skip_deps
984 libkmod = dependency('libkmod',
986 required : want_kmod == 'true')
987 have = libkmod.found()
992 conf.set10('HAVE_KMOD', have)
994 want_pam = get_option('pam')
995 if want_pam != 'false' and not skip_deps
996 libpam = cc.find_library('pam', required : want_pam == 'true')
997 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
998 have = libpam.found() and libpam_misc.found()
1004 conf.set10('HAVE_PAM', have)
1006 want_microhttpd = get_option('microhttpd')
1007 if want_microhttpd != 'false' and not skip_deps
1008 libmicrohttpd = dependency('libmicrohttpd',
1009 version : '>= 0.9.33',
1010 required : want_microhttpd == 'true')
1011 have = libmicrohttpd.found()
1016 conf.set10('HAVE_MICROHTTPD', have)
1018 want_libcryptsetup = get_option('libcryptsetup')
1019 if want_libcryptsetup != 'false' and not skip_deps
1020 libcryptsetup = dependency('libcryptsetup',
1021 version : '>= 2.0.1',
1022 required : want_libcryptsetup == 'true')
1023 have = libcryptsetup.found()
1025 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1026 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
1031 conf.set10('HAVE_LIBCRYPTSETUP', have)
1033 want_libcurl = get_option('libcurl')
1034 if want_libcurl != 'false' and not skip_deps
1035 libcurl = dependency('libcurl',
1036 version : '>= 7.32.0',
1037 required : want_libcurl == 'true')
1038 have = libcurl.found()
1043 conf.set10('HAVE_LIBCURL', have)
1045 want_libidn = get_option('libidn')
1046 want_libidn2 = get_option('libidn2')
1047 if want_libidn == 'true' and want_libidn2 == 'true'
1048 error('libidn and libidn2 cannot be requested simultaneously')
1051 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1052 libidn = dependency('libidn2',
1053 required : want_libidn2 == 'true')
1054 have = libidn.found()
1059 conf.set10('HAVE_LIBIDN2', have)
1060 if not have and want_libidn != 'false' and not skip_deps
1061 # libidn is used for both libidn and libidn2 objects
1062 libidn = dependency('libidn',
1063 required : want_libidn == 'true')
1064 have = libidn.found()
1068 conf.set10('HAVE_LIBIDN', have)
1070 want_libiptc = get_option('libiptc')
1071 if want_libiptc != 'false' and not skip_deps
1072 libiptc = dependency('libiptc',
1073 required : want_libiptc == 'true')
1074 have = libiptc.found()
1079 conf.set10('HAVE_LIBIPTC', have)
1081 want_qrencode = get_option('qrencode')
1082 if want_qrencode != 'false' and not skip_deps
1083 libqrencode = dependency('libqrencode',
1084 required : want_qrencode == 'true')
1085 have = libqrencode.found()
1090 conf.set10('HAVE_QRENCODE', have)
1092 want_gcrypt = get_option('gcrypt')
1093 if want_gcrypt != 'false' and not skip_deps
1094 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1095 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1096 have = libgcrypt.found() and libgpg_error.found()
1101 # link to neither of the libs if one is not found
1105 conf.set10('HAVE_GCRYPT', have)
1107 want_gnutls = get_option('gnutls')
1108 if want_gnutls != 'false' and not skip_deps
1109 libgnutls = dependency('gnutls',
1110 version : '>= 3.1.4',
1111 required : want_gnutls == 'true')
1112 have = libgnutls.found()
1117 conf.set10('HAVE_GNUTLS', have)
1119 want_openssl = get_option('openssl')
1120 if want_openssl != 'false' and not skip_deps
1121 libopenssl = dependency('openssl',
1122 version : '>= 1.1.0',
1123 required : want_openssl == 'true')
1124 have = libopenssl.found()
1129 conf.set10('HAVE_OPENSSL', have)
1131 want_p11kit = get_option('p11kit')
1132 if want_p11kit != 'false' and not skip_deps
1133 libp11kit = dependency('p11-kit-1',
1134 version : '>= 0.23.3',
1135 required : want_p11kit == 'true')
1136 have = libp11kit.found()
1141 conf.set10('HAVE_P11KIT', have)
1143 want_elfutils = get_option('elfutils')
1144 if want_elfutils != 'false' and not skip_deps
1145 libdw = dependency('libdw',
1146 required : want_elfutils == 'true')
1147 have = libdw.found()
1152 conf.set10('HAVE_ELFUTILS', have)
1154 want_zlib = get_option('zlib')
1155 if want_zlib != 'false' and not skip_deps
1156 libz = dependency('zlib',
1157 required : want_zlib == 'true')
1163 conf.set10('HAVE_ZLIB', have)
1165 want_bzip2 = get_option('bzip2')
1166 if want_bzip2 != 'false' and not skip_deps
1167 libbzip2 = cc.find_library('bz2',
1168 required : want_bzip2 == 'true')
1169 have = libbzip2.found()
1174 conf.set10('HAVE_BZIP2', have)
1176 want_xz = get_option('xz')
1177 if want_xz != 'false' and not skip_deps
1178 libxz = dependency('liblzma',
1179 required : want_xz == 'true')
1180 have = libxz.found()
1185 conf.set10('HAVE_XZ', have)
1187 want_lz4 = get_option('lz4')
1188 if want_lz4 != 'false' and not skip_deps
1189 liblz4 = dependency('liblz4',
1190 version : '>= 1.3.0',
1191 required : want_lz4 == 'true')
1192 have = liblz4.found()
1197 conf.set10('HAVE_LZ4', have)
1199 want_xkbcommon = get_option('xkbcommon')
1200 if want_xkbcommon != 'false' and not skip_deps
1201 libxkbcommon = dependency('xkbcommon',
1202 version : '>= 0.3.0',
1203 required : want_xkbcommon == 'true')
1204 have = libxkbcommon.found()
1209 conf.set10('HAVE_XKBCOMMON', have)
1211 want_pcre2 = get_option('pcre2')
1212 if want_pcre2 != 'false'
1213 libpcre2 = dependency('libpcre2-8',
1214 required : want_pcre2 == 'true')
1215 have = libpcre2.found()
1220 conf.set10('HAVE_PCRE2', have)
1222 want_glib = get_option('glib')
1223 if want_glib != 'false' and not skip_deps
1224 libglib = dependency('glib-2.0',
1225 version : '>= 2.22.0',
1226 required : want_glib == 'true')
1227 libgobject = dependency('gobject-2.0',
1228 version : '>= 2.22.0',
1229 required : want_glib == 'true')
1230 libgio = dependency('gio-2.0',
1231 required : want_glib == 'true')
1232 have = libglib.found() and libgobject.found() and libgio.found()
1239 conf.set10('HAVE_GLIB', have)
1241 want_dbus = get_option('dbus')
1242 if want_dbus != 'false' and not skip_deps
1243 libdbus = dependency('dbus-1',
1244 version : '>= 1.3.2',
1245 required : want_dbus == 'true')
1246 have = libdbus.found()
1251 conf.set10('HAVE_DBUS', have)
1253 default_dnssec = get_option('default-dnssec')
1255 default_dnssec = 'no'
1257 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1258 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1259 default_dnssec = 'no'
1261 conf.set('DEFAULT_DNSSEC_MODE',
1262 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1263 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1265 dns_over_tls = get_option('dns-over-tls')
1266 if dns_over_tls != 'false'
1267 if dns_over_tls == 'openssl'
1270 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1271 if dns_over_tls == 'gnutls' and not have_gnutls
1272 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1275 if dns_over_tls == 'gnutls' or have_gnutls
1276 have_openssl = false
1278 have_openssl = conf.get('HAVE_OPENSSL') == 1
1279 if dns_over_tls != 'auto' and not have_openssl
1280 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1281 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1284 have = have_gnutls or have_openssl
1288 have_openssl = false
1290 conf.set10('ENABLE_DNS_OVER_TLS', have)
1291 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1292 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1294 default_dns_over_tls = get_option('default-dns-over-tls')
1296 default_dns_over_tls = 'no'
1298 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1299 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.')
1300 default_dns_over_tls = 'no'
1302 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1303 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1304 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1306 want_repart = get_option('repart')
1307 if want_repart != 'false'
1308 have = (conf.get('HAVE_OPENSSL') == 1 and
1309 conf.get('HAVE_LIBFDISK') == 1)
1310 if want_repart == 'true' and not have
1311 error('repart support was requested, but dependencies are not available')
1316 conf.set10('ENABLE_REPART', have)
1318 want_importd = get_option('importd')
1319 if want_importd != 'false'
1320 have = (conf.get('HAVE_LIBCURL') == 1 and
1321 conf.get('HAVE_ZLIB') == 1 and
1322 conf.get('HAVE_XZ') == 1 and
1323 conf.get('HAVE_GCRYPT') == 1)
1324 if want_importd == 'true' and not have
1325 error('importd support was requested, but dependencies are not available')
1330 conf.set10('ENABLE_IMPORTD', have)
1332 want_homed = get_option('homed')
1333 if want_homed != 'false'
1334 have = (conf.get('HAVE_OPENSSL') == 1 and
1335 conf.get('HAVE_LIBFDISK') == 1 and
1336 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1337 if want_homed == 'true' and not have
1338 error('homed support was requested, but dependencies are not available')
1343 conf.set10('ENABLE_HOMED', have)
1345 have = have and conf.get('HAVE_PAM') == 1
1346 conf.set10('ENABLE_PAM_HOME', have)
1348 want_remote = get_option('remote')
1349 if want_remote != 'false'
1350 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1351 conf.get('HAVE_LIBCURL') == 1]
1352 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1353 # it's possible to build one without the other. Complain only if
1354 # support was explicitly requested. The auxiliary files like sysusers
1355 # config should be installed when any of the programs are built.
1356 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1357 error('remote support was requested, but dependencies are not available')
1359 have = have_deps[0] or have_deps[1]
1363 conf.set10('ENABLE_REMOTE', have)
1365 foreach term : ['utmp',
1399 have = get_option(term)
1400 name = 'ENABLE_' + term.underscorify().to_upper()
1401 conf.set10(name, have)
1404 foreach tuple : [['nss-mymachines', 'machined'],
1405 ['nss-resolve', 'resolve']]
1406 want = get_option(tuple[0])
1408 have = get_option(tuple[1])
1409 if want == 'true' and not have
1410 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1415 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1416 conf.set10(name, have)
1420 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1421 'ENABLE_NSS_MYMACHINES',
1422 'ENABLE_NSS_RESOLVE',
1423 'ENABLE_NSS_SYSTEMD']
1424 if conf.get(term) == 1
1428 conf.set10('ENABLE_NSS', enable_nss)
1430 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1435 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1437 #####################################################################
1439 if get_option('efi')
1440 efi_arch = host_machine.cpu_family()
1442 if efi_arch == 'x86'
1443 EFI_MACHINE_TYPE_NAME = 'ia32'
1444 gnu_efi_arch = 'ia32'
1445 elif efi_arch == 'x86_64'
1446 EFI_MACHINE_TYPE_NAME = 'x64'
1447 gnu_efi_arch = 'x86_64'
1448 elif efi_arch == 'arm'
1449 EFI_MACHINE_TYPE_NAME = 'arm'
1450 gnu_efi_arch = 'arm'
1451 elif efi_arch == 'aarch64'
1452 EFI_MACHINE_TYPE_NAME = 'aa64'
1453 gnu_efi_arch = 'aarch64'
1455 EFI_MACHINE_TYPE_NAME = ''
1460 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1462 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1466 conf.set10('ENABLE_EFI', have)
1468 #####################################################################
1470 config_h = configure_file(
1471 output : 'config.h',
1472 configuration : conf)
1474 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1476 includes = include_directories('src/basic',
1481 'src/journal-remote',
1485 'src/time-wait-sync',
1491 'src/libsystemd/sd-bus',
1492 'src/libsystemd/sd-device',
1493 'src/libsystemd/sd-event',
1494 'src/libsystemd/sd-hwdb',
1495 'src/libsystemd/sd-id128',
1496 'src/libsystemd/sd-netlink',
1497 'src/libsystemd/sd-network',
1498 'src/libsystemd/sd-resolve',
1499 'src/libsystemd-network',
1502 add_project_arguments('-include', 'config.h', language : 'c')
1504 generate_gperfs = find_program('tools/generate-gperfs.py')
1508 subdir('src/systemd')
1510 subdir('src/libsystemd')
1511 subdir('src/libsystemd-network')
1512 subdir('src/journal')
1515 libjournal_core = static_library(
1517 libjournal_core_sources,
1519 include_directories : includes,
1522 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1523 libsystemd = shared_library(
1526 version : libsystemd_version,
1527 include_directories : includes,
1528 link_args : ['-shared',
1529 '-Wl,--version-script=' + libsystemd_sym_path],
1530 link_with : [libbasic,
1532 link_whole : [libsystemd_static,
1534 dependencies : [threads,
1538 link_depends : libsystemd_sym,
1540 install_dir : rootlibdir)
1542 static_libsystemd = get_option('static-libsystemd')
1543 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1545 install_libsystemd_static = static_library(
1548 journal_client_sources,
1550 basic_gcrypt_sources,
1552 include_directories : includes,
1553 build_by_default : static_libsystemd != 'false',
1554 install : static_libsystemd != 'false',
1555 install_dir : rootlibdir,
1556 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1557 dependencies : [threads,
1566 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1568 #Generate autosuspend rules
1569 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1571 ############################################################
1573 # binaries that have --help and are intended for use by humans,
1574 # usually, but not always, installed in /bin.
1575 public_programs = []
1577 subdir('src/libudev')
1578 subdir('src/shared')
1580 subdir('src/shutdown')
1582 subdir('src/network')
1584 subdir('src/analyze')
1585 subdir('src/journal-remote')
1586 subdir('src/coredump')
1587 subdir('src/pstore')
1588 subdir('src/hostname')
1589 subdir('src/import')
1590 subdir('src/partition')
1591 subdir('src/kernel-install')
1592 subdir('src/locale')
1593 subdir('src/machine')
1594 subdir('src/portable')
1595 subdir('src/userdb')
1597 subdir('src/nspawn')
1598 subdir('src/resolve')
1599 subdir('src/timedate')
1600 subdir('src/timesync')
1601 subdir('src/vconsole')
1602 subdir('src/boot/efi')
1609 ############################################################
1611 # only static linking apart from libdl, to make sure that the
1612 # module is linked to all libraries that it uses.
1613 test_dlopen = executable(
1617 include_directories : includes,
1618 link_with : [libbasic],
1619 dependencies : [libdl],
1620 build_by_default : want_tests != 'false')
1622 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1623 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h'],
1624 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1625 ['resolve', 'ENABLE_NSS_RESOLVE']]
1627 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1631 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1632 version_script_arg = join_paths(project_source_root, sym)
1634 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1635 if tuple.length() > 2
1636 sources += tuple[2].split()
1639 nss = shared_library(
1644 include_directories : includes,
1645 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1646 link_args : ['-Wl,-z,nodelete',
1648 '-Wl,--version-script=' + version_script_arg],
1649 link_with : [libsystemd_static,
1652 dependencies : [threads,
1656 install_dir : rootlibdir)
1658 # We cannot use shared_module because it does not support version suffix.
1659 # Unfortunately shared_library insists on creating the symlink…
1660 meson.add_install_script('sh', '-c',
1661 'rm $DESTDIR@0@/libnss_@1@.so'
1662 .format(rootlibdir, module))
1664 if want_tests != 'false'
1665 test('dlopen-nss_' + module,
1667 # path to dlopen must include a slash
1668 args : nss.full_path())
1673 ############################################################
1675 executable('systemd',
1677 include_directories : includes,
1678 link_with : [libcore,
1680 dependencies : [versiondep,
1687 install_rpath : rootlibexecdir,
1689 install_dir : rootlibexecdir)
1691 meson.add_install_script(meson_make_symlink,
1692 join_paths(rootlibexecdir, 'systemd'),
1693 join_paths(rootsbindir, 'init'))
1695 exe = executable('systemd-analyze',
1696 systemd_analyze_sources,
1697 include_directories : includes,
1698 link_with : [libcore,
1700 dependencies : [versiondep,
1707 install_rpath : rootlibexecdir,
1709 public_programs += exe
1711 executable('systemd-journald',
1712 systemd_journald_sources,
1713 include_directories : includes,
1714 link_with : [libjournal_core,
1716 dependencies : [threads,
1720 install_rpath : rootlibexecdir,
1722 install_dir : rootlibexecdir)
1724 exe = executable('systemd-cat',
1725 systemd_cat_sources,
1726 include_directories : includes,
1727 link_with : [libjournal_core,
1729 dependencies : [threads],
1730 install_rpath : rootlibexecdir,
1732 public_programs += exe
1734 exe = executable('journalctl',
1736 include_directories : includes,
1737 link_with : [libshared],
1738 dependencies : [threads,
1743 install_rpath : rootlibexecdir,
1745 install_dir : rootbindir)
1746 public_programs += exe
1748 executable('systemd-getty-generator',
1749 'src/getty-generator/getty-generator.c',
1750 include_directories : includes,
1751 link_with : [libshared],
1752 install_rpath : rootlibexecdir,
1754 install_dir : systemgeneratordir)
1756 executable('systemd-debug-generator',
1757 'src/debug-generator/debug-generator.c',
1758 include_directories : includes,
1759 link_with : [libshared],
1760 install_rpath : rootlibexecdir,
1762 install_dir : systemgeneratordir)
1764 executable('systemd-run-generator',
1765 'src/run-generator/run-generator.c',
1766 include_directories : includes,
1767 link_with : [libshared],
1768 install_rpath : rootlibexecdir,
1770 install_dir : systemgeneratordir)
1772 executable('systemd-fstab-generator',
1773 'src/fstab-generator/fstab-generator.c',
1774 include_directories : includes,
1775 link_with : [libcore_shared,
1777 install_rpath : rootlibexecdir,
1779 install_dir : systemgeneratordir)
1781 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1782 executable('30-systemd-environment-d-generator',
1783 'src/environment-d-generator/environment-d-generator.c',
1784 include_directories : includes,
1785 link_with : [libshared],
1786 install_rpath : rootlibexecdir,
1788 install_dir : userenvgeneratordir)
1790 meson.add_install_script(meson_make_symlink,
1791 join_paths(sysconfdir, 'environment'),
1792 join_paths(environmentdir, '99-environment.conf'))
1795 if conf.get('ENABLE_HIBERNATE') == 1
1796 executable('systemd-hibernate-resume-generator',
1797 'src/hibernate-resume/hibernate-resume-generator.c',
1798 include_directories : includes,
1799 link_with : [libshared],
1800 install_rpath : rootlibexecdir,
1802 install_dir : systemgeneratordir)
1804 executable('systemd-hibernate-resume',
1805 'src/hibernate-resume/hibernate-resume.c',
1806 include_directories : includes,
1807 link_with : [libshared],
1808 install_rpath : rootlibexecdir,
1810 install_dir : rootlibexecdir)
1813 if conf.get('HAVE_BLKID') == 1
1814 executable('systemd-gpt-auto-generator',
1815 'src/gpt-auto-generator/gpt-auto-generator.c',
1816 'src/shared/blkid-util.h',
1817 include_directories : includes,
1818 link_with : [libshared],
1819 dependencies : libblkid,
1820 install_rpath : rootlibexecdir,
1822 install_dir : systemgeneratordir)
1824 exe = executable('systemd-dissect',
1825 'src/dissect/dissect.c',
1826 include_directories : includes,
1827 link_with : [libshared],
1828 install_rpath : rootlibexecdir,
1830 install_dir : rootlibexecdir)
1831 public_programs += exe
1834 if conf.get('ENABLE_RESOLVE') == 1
1835 executable('systemd-resolved',
1836 systemd_resolved_sources,
1837 include_directories : includes,
1838 link_with : [libshared,
1840 libsystemd_resolve_core],
1841 dependencies : systemd_resolved_dependencies,
1842 install_rpath : rootlibexecdir,
1844 install_dir : rootlibexecdir)
1846 exe = executable('resolvectl',
1848 include_directories : includes,
1849 link_with : [libshared,
1851 libsystemd_resolve_core],
1852 dependencies : [threads,
1856 install_rpath : rootlibexecdir,
1858 public_programs += exe
1860 meson.add_install_script(meson_make_symlink,
1861 join_paths(bindir, 'resolvectl'),
1862 join_paths(rootsbindir, 'resolvconf'))
1864 meson.add_install_script(meson_make_symlink,
1865 join_paths(bindir, 'resolvectl'),
1866 join_paths(bindir, 'systemd-resolve'))
1869 if conf.get('ENABLE_LOGIND') == 1
1870 executable('systemd-logind',
1871 systemd_logind_sources,
1872 include_directories : includes,
1873 link_with : [liblogind_core,
1875 dependencies : [threads,
1877 install_rpath : rootlibexecdir,
1879 install_dir : rootlibexecdir)
1881 exe = executable('loginctl',
1883 include_directories : includes,
1884 link_with : [libshared],
1885 dependencies : [threads,
1888 install_rpath : rootlibexecdir,
1890 install_dir : rootbindir)
1891 public_programs += exe
1893 exe = executable('systemd-inhibit',
1894 'src/login/inhibit.c',
1895 include_directories : includes,
1896 link_with : [libshared],
1897 install_rpath : rootlibexecdir,
1899 install_dir : rootbindir)
1900 public_programs += exe
1902 if conf.get('HAVE_PAM') == 1
1903 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1904 pam_systemd = shared_library(
1908 include_directories : includes,
1909 link_args : ['-shared',
1910 '-Wl,--version-script=' + version_script_arg],
1911 link_with : [libsystemd_static,
1913 dependencies : [threads,
1916 link_depends : pam_systemd_sym,
1918 install_dir : pamlibdir)
1920 if want_tests != 'false'
1921 test('dlopen-pam_systemd',
1923 # path to dlopen must include a slash
1924 args : pam_systemd.full_path())
1928 executable('systemd-user-runtime-dir',
1929 user_runtime_dir_sources,
1930 include_directories : includes,
1931 link_with : [libshared],
1932 install_rpath : rootlibexecdir,
1934 install_dir : rootlibexecdir)
1937 if conf.get('HAVE_PAM') == 1
1938 executable('systemd-user-sessions',
1939 'src/user-sessions/user-sessions.c',
1940 include_directories : includes,
1941 link_with : [libshared],
1942 install_rpath : rootlibexecdir,
1944 install_dir : rootlibexecdir)
1947 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1948 exe = executable('bootctl',
1949 'src/boot/bootctl.c',
1950 include_directories : includes,
1951 link_with : [libshared],
1952 dependencies : [libblkid],
1953 install_rpath : rootlibexecdir,
1955 public_programs += exe
1957 executable('systemd-bless-boot',
1958 'src/boot/bless-boot.c',
1959 include_directories : includes,
1960 link_with : [libshared],
1961 dependencies : [libblkid],
1962 install_rpath : rootlibexecdir,
1964 install_dir : rootlibexecdir)
1966 executable('systemd-bless-boot-generator',
1967 'src/boot/bless-boot-generator.c',
1968 include_directories : includes,
1969 link_with : [libshared],
1970 install_rpath : rootlibexecdir,
1972 install_dir : systemgeneratordir)
1975 executable('systemd-boot-check-no-failures',
1976 'src/boot/boot-check-no-failures.c',
1977 include_directories : includes,
1978 link_with : [libshared],
1979 dependencies : [libblkid],
1980 install_rpath : rootlibexecdir,
1982 install_dir : rootlibexecdir)
1984 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1985 include_directories : includes,
1986 link_with : [libshared],
1987 dependencies : [threads],
1988 install_rpath : rootlibexecdir,
1990 public_programs += exe
1993 if get_option('link-systemctl-shared')
1994 systemctl_link_with = [libshared]
1996 systemctl_link_with = [libsystemd_static,
2002 exe = executable('systemctl',
2003 'src/systemctl/systemctl.c',
2004 'src/systemctl/sysv-compat.h',
2005 'src/systemctl/sysv-compat.c',
2006 include_directories : includes,
2007 link_with : systemctl_link_with,
2008 dependencies : [threads,
2013 install_rpath : rootlibexecdir,
2015 install_dir : rootbindir)
2016 public_programs += exe
2018 if conf.get('ENABLE_PORTABLED') == 1
2019 executable('systemd-portabled',
2020 systemd_portabled_sources,
2021 include_directories : includes,
2022 link_with : [libshared],
2023 dependencies : [threads],
2024 install_rpath : rootlibexecdir,
2026 install_dir : rootlibexecdir)
2028 exe = executable('portablectl', 'src/portable/portablectl.c',
2029 include_directories : includes,
2030 link_with : [libshared],
2031 dependencies : [threads],
2032 install_rpath : rootlibexecdir,
2034 install_dir : rootbindir)
2035 public_programs += exe
2038 if conf.get('ENABLE_USERDB') == 1
2039 executable('systemd-userwork',
2040 systemd_userwork_sources,
2041 include_directories : includes,
2042 link_with : [libshared],
2043 dependencies : [threads],
2044 install_rpath : rootlibexecdir,
2046 install_dir : rootlibexecdir)
2048 executable('systemd-userdbd',
2049 systemd_userdbd_sources,
2050 include_directories : includes,
2051 link_with : [libshared],
2052 dependencies : [threads],
2053 install_rpath : rootlibexecdir,
2055 install_dir : rootlibexecdir)
2057 executable('userdbctl',
2059 include_directories : includes,
2060 link_with : [libshared],
2061 dependencies : [threads],
2062 install_rpath : rootlibexecdir,
2064 install_dir : rootbindir)
2067 if conf.get('ENABLE_HOMED') == 1
2068 executable('systemd-homework',
2069 systemd_homework_sources,
2070 include_directories : includes,
2071 link_with : [libshared],
2072 dependencies : [threads,
2079 install_rpath : rootlibexecdir,
2081 install_dir : rootlibexecdir)
2083 executable('systemd-homed',
2084 systemd_homed_sources,
2085 include_directories : includes,
2086 link_with : [libshared],
2087 dependencies : [threads,
2091 install_rpath : rootlibexecdir,
2093 install_dir : rootlibexecdir)
2095 executable('homectl',
2097 include_directories : includes,
2098 link_with : [libshared],
2099 dependencies : [threads,
2104 install_rpath : rootlibexecdir,
2106 install_dir : rootbindir)
2108 if conf.get('HAVE_PAM') == 1
2109 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2110 pam_systemd = shared_library(
2114 include_directories : includes,
2115 link_args : ['-shared',
2116 '-Wl,--version-script=' + version_script_arg],
2117 link_with : [libsystemd_static,
2119 dependencies : [threads,
2123 link_depends : pam_systemd_home_sym,
2125 install_dir : pamlibdir)
2129 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
2130 meson.add_install_script(meson_make_symlink,
2131 join_paths(rootbindir, 'systemctl'),
2132 join_paths(rootsbindir, alias))
2135 if conf.get('ENABLE_BACKLIGHT') == 1
2136 executable('systemd-backlight',
2137 'src/backlight/backlight.c',
2138 include_directories : includes,
2139 link_with : [libshared],
2140 install_rpath : rootlibexecdir,
2142 install_dir : rootlibexecdir)
2145 if conf.get('ENABLE_RFKILL') == 1
2146 executable('systemd-rfkill',
2147 'src/rfkill/rfkill.c',
2148 include_directories : includes,
2149 link_with : [libshared],
2150 install_rpath : rootlibexecdir,
2152 install_dir : rootlibexecdir)
2155 executable('systemd-system-update-generator',
2156 'src/system-update-generator/system-update-generator.c',
2157 include_directories : includes,
2158 link_with : [libshared],
2159 install_rpath : rootlibexecdir,
2161 install_dir : systemgeneratordir)
2163 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2164 systemd_cryptsetup_sources = files('''
2165 src/cryptsetup/cryptsetup.c
2166 src/cryptsetup/cryptsetup-pkcs11.h
2169 if conf.get('HAVE_P11KIT') == 1
2170 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2173 executable('systemd-cryptsetup',
2174 systemd_cryptsetup_sources,
2175 include_directories : includes,
2176 link_with : [libshared],
2177 dependencies : [libcryptsetup,
2179 install_rpath : rootlibexecdir,
2181 install_dir : rootlibexecdir)
2183 executable('systemd-cryptsetup-generator',
2184 'src/cryptsetup/cryptsetup-generator.c',
2185 include_directories : includes,
2186 link_with : [libshared],
2187 dependencies : [libcryptsetup],
2188 install_rpath : rootlibexecdir,
2190 install_dir : systemgeneratordir)
2192 executable('systemd-veritysetup',
2193 'src/veritysetup/veritysetup.c',
2194 include_directories : includes,
2195 link_with : [libshared],
2196 dependencies : [libcryptsetup],
2197 install_rpath : rootlibexecdir,
2199 install_dir : rootlibexecdir)
2201 executable('systemd-veritysetup-generator',
2202 'src/veritysetup/veritysetup-generator.c',
2203 include_directories : includes,
2204 link_with : [libshared],
2205 dependencies : [libcryptsetup],
2206 install_rpath : rootlibexecdir,
2208 install_dir : systemgeneratordir)
2211 if conf.get('HAVE_SYSV_COMPAT') == 1
2212 executable('systemd-sysv-generator',
2213 'src/sysv-generator/sysv-generator.c',
2214 include_directories : includes,
2215 link_with : [libshared],
2216 install_rpath : rootlibexecdir,
2218 install_dir : systemgeneratordir)
2220 executable('systemd-rc-local-generator',
2221 'src/rc-local-generator/rc-local-generator.c',
2222 include_directories : includes,
2223 link_with : [libshared],
2224 install_rpath : rootlibexecdir,
2226 install_dir : systemgeneratordir)
2229 if conf.get('ENABLE_HOSTNAMED') == 1
2230 executable('systemd-hostnamed',
2231 'src/hostname/hostnamed.c',
2232 include_directories : includes,
2233 link_with : [libshared],
2234 install_rpath : rootlibexecdir,
2236 install_dir : rootlibexecdir)
2238 exe = executable('hostnamectl',
2239 'src/hostname/hostnamectl.c',
2240 include_directories : includes,
2241 link_with : [libshared],
2242 install_rpath : rootlibexecdir,
2244 public_programs += exe
2247 if conf.get('ENABLE_LOCALED') == 1
2248 if conf.get('HAVE_XKBCOMMON') == 1
2249 # logind will load libxkbcommon.so dynamically on its own
2255 executable('systemd-localed',
2256 systemd_localed_sources,
2257 include_directories : includes,
2258 link_with : [libshared],
2259 dependencies : deps,
2260 install_rpath : rootlibexecdir,
2262 install_dir : rootlibexecdir)
2264 exe = executable('localectl',
2266 include_directories : includes,
2267 link_with : [libshared],
2268 install_rpath : rootlibexecdir,
2270 public_programs += exe
2273 if conf.get('ENABLE_TIMEDATED') == 1
2274 executable('systemd-timedated',
2275 'src/timedate/timedated.c',
2276 include_directories : includes,
2277 link_with : [libshared],
2278 install_rpath : rootlibexecdir,
2280 install_dir : rootlibexecdir)
2283 if conf.get('ENABLE_TIMEDATECTL') == 1
2284 exe = executable('timedatectl',
2285 'src/timedate/timedatectl.c',
2286 include_directories : includes,
2287 install_rpath : rootlibexecdir,
2288 link_with : [libshared],
2289 dependencies : [libm],
2291 public_programs += exe
2294 if conf.get('ENABLE_TIMESYNCD') == 1
2295 executable('systemd-timesyncd',
2296 systemd_timesyncd_sources,
2297 include_directories : includes,
2298 link_with : [libshared],
2299 dependencies : [threads,
2301 install_rpath : rootlibexecdir,
2303 install_dir : rootlibexecdir)
2305 executable('systemd-time-wait-sync',
2306 'src/time-wait-sync/time-wait-sync.c',
2307 include_directories : includes,
2308 link_with : [libshared],
2309 install_rpath : rootlibexecdir,
2311 install_dir : rootlibexecdir)
2314 if conf.get('ENABLE_MACHINED') == 1
2315 executable('systemd-machined',
2316 systemd_machined_sources,
2317 include_directories : includes,
2318 link_with : [libmachine_core,
2320 install_rpath : rootlibexecdir,
2322 install_dir : rootlibexecdir)
2324 exe = executable('machinectl',
2325 'src/machine/machinectl.c',
2326 include_directories : includes,
2327 link_with : [libshared],
2328 dependencies : [threads,
2331 install_rpath : rootlibexecdir,
2333 install_dir : rootbindir)
2334 public_programs += exe
2337 if conf.get('ENABLE_IMPORTD') == 1
2338 executable('systemd-importd',
2339 systemd_importd_sources,
2340 include_directories : includes,
2341 link_with : [libshared],
2342 dependencies : [threads],
2343 install_rpath : rootlibexecdir,
2345 install_dir : rootlibexecdir)
2347 systemd_pull = executable('systemd-pull',
2348 systemd_pull_sources,
2349 include_directories : includes,
2350 link_with : [libshared],
2351 dependencies : [versiondep,
2357 install_rpath : rootlibexecdir,
2359 install_dir : rootlibexecdir)
2361 systemd_import = executable('systemd-import',
2362 systemd_import_sources,
2363 include_directories : includes,
2364 link_with : [libshared],
2365 dependencies : [libcurl,
2369 install_rpath : rootlibexecdir,
2371 install_dir : rootlibexecdir)
2373 systemd_import_fs = executable('systemd-import-fs',
2374 systemd_import_fs_sources,
2375 include_directories : includes,
2376 link_with : [libshared],
2377 install_rpath : rootlibexecdir,
2379 install_dir : rootlibexecdir)
2381 systemd_export = executable('systemd-export',
2382 systemd_export_sources,
2383 include_directories : includes,
2384 link_with : [libshared],
2385 dependencies : [libcurl,
2389 install_rpath : rootlibexecdir,
2391 install_dir : rootlibexecdir)
2393 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2396 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2397 exe = executable('systemd-journal-upload',
2398 systemd_journal_upload_sources,
2399 include_directories : includes,
2400 link_with : [libshared],
2401 dependencies : [versiondep,
2407 install_rpath : rootlibexecdir,
2409 install_dir : rootlibexecdir)
2410 public_programs += exe
2413 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2414 s_j_remote = executable('systemd-journal-remote',
2415 systemd_journal_remote_sources,
2416 include_directories : includes,
2417 link_with : [libshared,
2418 libsystemd_journal_remote],
2419 dependencies : [threads,
2424 install_rpath : rootlibexecdir,
2426 install_dir : rootlibexecdir)
2428 s_j_gatewayd = executable('systemd-journal-gatewayd',
2429 systemd_journal_gatewayd_sources,
2430 include_directories : includes,
2431 link_with : [libshared],
2432 dependencies : [threads,
2437 install_rpath : rootlibexecdir,
2439 install_dir : rootlibexecdir)
2440 public_programs += [s_j_remote, s_j_gatewayd]
2443 if conf.get('ENABLE_COREDUMP') == 1
2444 executable('systemd-coredump',
2445 systemd_coredump_sources,
2446 include_directories : includes,
2447 link_with : [libshared],
2448 dependencies : [threads,
2453 install_rpath : rootlibexecdir,
2455 install_dir : rootlibexecdir)
2457 exe = executable('coredumpctl',
2458 coredumpctl_sources,
2459 include_directories : includes,
2460 link_with : [libshared],
2461 dependencies : [threads,
2464 install_rpath : rootlibexecdir,
2466 public_programs += exe
2469 if conf.get('ENABLE_PSTORE') == 1
2470 executable('systemd-pstore',
2471 systemd_pstore_sources,
2472 include_directories : includes,
2473 link_with : [libshared],
2474 dependencies : [threads,
2479 install_rpath : rootlibexecdir,
2481 install_dir : rootlibexecdir)
2484 if conf.get('ENABLE_BINFMT') == 1
2485 exe = executable('systemd-binfmt',
2486 'src/binfmt/binfmt.c',
2487 include_directories : includes,
2488 link_with : [libshared],
2489 install_rpath : rootlibexecdir,
2491 install_dir : rootlibexecdir)
2492 public_programs += exe
2494 meson.add_install_script('sh', '-c',
2495 mkdir_p.format(binfmtdir))
2496 meson.add_install_script('sh', '-c',
2497 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2500 if conf.get('ENABLE_REPART') == 1
2501 executable('systemd-repart',
2502 systemd_repart_sources,
2503 include_directories : includes,
2504 link_with : [libshared],
2505 dependencies : [threads,
2510 install_rpath : rootlibexecdir,
2512 install_dir : rootbindir)
2515 if conf.get('ENABLE_VCONSOLE') == 1
2516 executable('systemd-vconsole-setup',
2517 'src/vconsole/vconsole-setup.c',
2518 include_directories : includes,
2519 link_with : [libshared],
2520 install_rpath : rootlibexecdir,
2522 install_dir : rootlibexecdir)
2525 if conf.get('ENABLE_RANDOMSEED') == 1
2526 executable('systemd-random-seed',
2527 'src/random-seed/random-seed.c',
2528 include_directories : includes,
2529 link_with : [libshared],
2530 install_rpath : rootlibexecdir,
2532 install_dir : rootlibexecdir)
2535 if conf.get('ENABLE_FIRSTBOOT') == 1
2536 executable('systemd-firstboot',
2537 'src/firstboot/firstboot.c',
2538 include_directories : includes,
2539 link_with : [libshared],
2540 dependencies : [libcrypt],
2541 install_rpath : rootlibexecdir,
2543 install_dir : rootbindir)
2546 executable('systemd-remount-fs',
2547 'src/remount-fs/remount-fs.c',
2548 include_directories : includes,
2549 link_with : [libcore_shared,
2551 install_rpath : rootlibexecdir,
2553 install_dir : rootlibexecdir)
2555 executable('systemd-machine-id-setup',
2556 'src/machine-id-setup/machine-id-setup-main.c',
2557 include_directories : includes,
2558 link_with : [libcore_shared,
2560 install_rpath : rootlibexecdir,
2562 install_dir : rootbindir)
2564 executable('systemd-fsck',
2566 include_directories : includes,
2567 link_with : [libshared],
2568 install_rpath : rootlibexecdir,
2570 install_dir : rootlibexecdir)
2572 executable('systemd-growfs',
2573 'src/partition/growfs.c',
2574 include_directories : includes,
2575 link_with : [libshared],
2576 dependencies : [libcryptsetup],
2577 install_rpath : rootlibexecdir,
2579 install_dir : rootlibexecdir)
2581 executable('systemd-makefs',
2582 'src/partition/makefs.c',
2583 include_directories : includes,
2584 link_with : [libshared],
2585 install_rpath : rootlibexecdir,
2587 install_dir : rootlibexecdir)
2589 executable('systemd-sleep',
2590 'src/sleep/sleep.c',
2591 include_directories : includes,
2592 link_with : [libshared],
2593 install_rpath : rootlibexecdir,
2595 install_dir : rootlibexecdir)
2597 install_data('src/sleep/sleep.conf',
2598 install_dir : pkgsysconfdir)
2600 exe = executable('systemd-sysctl',
2601 'src/sysctl/sysctl.c',
2602 include_directories : includes,
2603 link_with : [libshared],
2604 install_rpath : rootlibexecdir,
2606 install_dir : rootlibexecdir)
2607 public_programs += exe
2609 executable('systemd-ac-power',
2610 'src/ac-power/ac-power.c',
2611 include_directories : includes,
2612 link_with : [libshared],
2613 install_rpath : rootlibexecdir,
2615 install_dir : rootlibexecdir)
2617 exe = executable('systemd-detect-virt',
2618 'src/detect-virt/detect-virt.c',
2619 include_directories : includes,
2620 link_with : [libshared],
2621 install_rpath : rootlibexecdir,
2623 public_programs += exe
2625 exe = executable('systemd-delta',
2626 'src/delta/delta.c',
2627 include_directories : includes,
2628 link_with : [libshared],
2629 install_rpath : rootlibexecdir,
2631 public_programs += exe
2633 exe = executable('systemd-escape',
2634 'src/escape/escape.c',
2635 include_directories : includes,
2636 link_with : [libshared],
2637 install_rpath : rootlibexecdir,
2639 install_dir : rootbindir)
2640 public_programs += exe
2642 exe = executable('systemd-notify',
2643 'src/notify/notify.c',
2644 include_directories : includes,
2645 link_with : [libshared],
2646 install_rpath : rootlibexecdir,
2648 install_dir : rootbindir)
2649 public_programs += exe
2651 executable('systemd-volatile-root',
2652 'src/volatile-root/volatile-root.c',
2653 include_directories : includes,
2654 link_with : [libshared],
2655 install_rpath : rootlibexecdir,
2657 install_dir : rootlibexecdir)
2659 executable('systemd-cgroups-agent',
2660 'src/cgroups-agent/cgroups-agent.c',
2661 include_directories : includes,
2662 link_with : [libshared],
2663 install_rpath : rootlibexecdir,
2665 install_dir : rootlibexecdir)
2667 exe = executable('systemd-id128',
2668 'src/id128/id128.c',
2669 include_directories : includes,
2670 link_with : [libshared],
2671 install_rpath : rootlibexecdir,
2673 public_programs += exe
2675 exe = executable('systemd-path',
2677 include_directories : includes,
2678 link_with : [libshared],
2679 install_rpath : rootlibexecdir,
2681 public_programs += exe
2683 exe = executable('systemd-ask-password',
2684 'src/ask-password/ask-password.c',
2685 include_directories : includes,
2686 link_with : [libshared],
2687 install_rpath : rootlibexecdir,
2689 install_dir : rootbindir)
2690 public_programs += exe
2692 executable('systemd-reply-password',
2693 'src/reply-password/reply-password.c',
2694 include_directories : includes,
2695 link_with : [libshared],
2696 install_rpath : rootlibexecdir,
2698 install_dir : rootlibexecdir)
2700 exe = executable('systemd-tty-ask-password-agent',
2701 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2702 include_directories : includes,
2703 link_with : [libshared],
2704 install_rpath : rootlibexecdir,
2706 install_dir : rootbindir)
2707 public_programs += exe
2709 exe = executable('systemd-cgls',
2711 include_directories : includes,
2712 link_with : [libshared],
2713 install_rpath : rootlibexecdir,
2715 public_programs += exe
2717 exe = executable('systemd-cgtop',
2718 'src/cgtop/cgtop.c',
2719 include_directories : includes,
2720 link_with : [libshared],
2721 install_rpath : rootlibexecdir,
2723 public_programs += exe
2725 executable('systemd-initctl',
2726 'src/initctl/initctl.c',
2727 include_directories : includes,
2728 link_with : [libshared],
2729 install_rpath : rootlibexecdir,
2731 install_dir : rootlibexecdir)
2733 exe = executable('systemd-mount',
2734 'src/mount/mount-tool.c',
2735 include_directories : includes,
2736 link_with : [libshared],
2737 dependencies: [libmount],
2738 install_rpath : rootlibexecdir,
2740 public_programs += exe
2742 meson.add_install_script(meson_make_symlink,
2743 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2745 exe = executable('systemd-run',
2747 include_directories : includes,
2748 link_with : [libshared],
2749 install_rpath : rootlibexecdir,
2751 public_programs += exe
2753 exe = executable('systemd-stdio-bridge',
2754 'src/stdio-bridge/stdio-bridge.c',
2755 include_directories : includes,
2756 link_with : [libshared],
2757 dependencies : [versiondep],
2758 install_rpath : rootlibexecdir,
2760 public_programs += exe
2762 exe = executable('busctl',
2763 'src/busctl/busctl.c',
2764 'src/busctl/busctl-introspect.c',
2765 'src/busctl/busctl-introspect.h',
2766 include_directories : includes,
2767 link_with : [libshared],
2768 install_rpath : rootlibexecdir,
2770 public_programs += exe
2772 if conf.get('ENABLE_SYSUSERS') == 1
2773 exe = executable('systemd-sysusers',
2774 'src/sysusers/sysusers.c',
2775 include_directories : includes,
2776 link_with : [libshared],
2777 install_rpath : rootlibexecdir,
2779 install_dir : rootbindir)
2780 public_programs += exe
2783 if conf.get('ENABLE_TMPFILES') == 1
2784 exe = executable('systemd-tmpfiles',
2785 'src/tmpfiles/tmpfiles.c',
2786 include_directories : includes,
2787 link_with : [libshared],
2788 dependencies : [libacl],
2789 install_rpath : rootlibexecdir,
2791 install_dir : rootbindir)
2792 public_programs += exe
2794 if want_tests != 'false'
2795 test('test-systemd-tmpfiles',
2796 test_systemd_tmpfiles_py,
2797 # https://github.com/mesonbuild/meson/issues/2681
2798 args : exe.full_path())
2802 if conf.get('ENABLE_HWDB') == 1
2803 exe = executable('systemd-hwdb',
2805 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2806 include_directories : includes,
2807 link_with : [libudev_static],
2808 install_rpath : udev_rpath,
2810 install_dir : rootbindir)
2811 public_programs += exe
2814 if conf.get('ENABLE_QUOTACHECK') == 1
2815 executable('systemd-quotacheck',
2816 'src/quotacheck/quotacheck.c',
2817 include_directories : includes,
2818 link_with : [libshared],
2819 install_rpath : rootlibexecdir,
2821 install_dir : rootlibexecdir)
2824 exe = executable('systemd-socket-proxyd',
2825 'src/socket-proxy/socket-proxyd.c',
2826 include_directories : includes,
2827 link_with : [libshared],
2828 dependencies : [threads],
2829 install_rpath : rootlibexecdir,
2831 install_dir : rootlibexecdir)
2832 public_programs += exe
2834 exe = executable('systemd-udevd',
2835 systemd_udevd_sources,
2836 include_directories : includes,
2837 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2838 link_with : [libudev_core,
2841 dependencies : [versiondep,
2847 install_rpath : udev_rpath,
2849 install_dir : rootlibexecdir)
2850 public_programs += exe
2852 exe = executable('udevadm',
2854 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2855 include_directories : includes,
2856 link_with : [libudev_core,
2859 dependencies : [versiondep,
2865 install_rpath : udev_rpath,
2867 install_dir : rootbindir)
2868 public_programs += exe
2870 executable('systemd-shutdown',
2871 systemd_shutdown_sources,
2872 include_directories : includes,
2873 link_with : [libcore_shared,
2875 dependencies : [libmount],
2876 install_rpath : rootlibexecdir,
2878 install_dir : rootlibexecdir)
2880 executable('systemd-update-done',
2881 'src/update-done/update-done.c',
2882 include_directories : includes,
2883 link_with : [libshared],
2884 install_rpath : rootlibexecdir,
2886 install_dir : rootlibexecdir)
2888 executable('systemd-update-utmp',
2889 'src/update-utmp/update-utmp.c',
2890 include_directories : includes,
2891 link_with : [libshared],
2892 dependencies : [libaudit],
2893 install_rpath : rootlibexecdir,
2895 install_dir : rootlibexecdir)
2897 if conf.get('HAVE_KMOD') == 1
2898 executable('systemd-modules-load',
2899 'src/modules-load/modules-load.c',
2900 include_directories : includes,
2901 link_with : [libshared],
2902 dependencies : [libkmod],
2903 install_rpath : rootlibexecdir,
2905 install_dir : rootlibexecdir)
2907 meson.add_install_script('sh', '-c',
2908 mkdir_p.format(modulesloaddir))
2909 meson.add_install_script('sh', '-c',
2910 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2913 exe = executable('systemd-nspawn',
2914 systemd_nspawn_sources,
2915 include_directories : includes,
2916 link_with : [libcore_shared,
2919 dependencies : [libblkid,
2921 install_rpath : rootlibexecdir,
2923 public_programs += exe
2925 if conf.get('ENABLE_NETWORKD') == 1
2926 executable('systemd-networkd',
2927 systemd_networkd_sources,
2928 include_directories : network_include_dir,
2929 link_with : [libnetworkd_core,
2932 networkd_link_with],
2933 dependencies : [threads],
2934 install_rpath : rootlibexecdir,
2936 install_dir : rootlibexecdir)
2938 executable('systemd-networkd-wait-online',
2939 systemd_networkd_wait_online_sources,
2940 include_directories : includes,
2941 link_with : [libnetworkd_core,
2942 networkd_link_with],
2943 install_rpath : rootlibexecdir,
2945 install_dir : rootlibexecdir)
2947 exe = executable('networkctl',
2949 include_directories : includes,
2950 link_with : [libsystemd_network,
2951 networkd_link_with],
2952 install_rpath : rootlibexecdir,
2954 install_dir : rootbindir)
2955 public_programs += exe
2957 executable('systemd-network-generator',
2958 network_generator_sources,
2959 include_directories : includes,
2960 link_with : [networkd_link_with],
2961 install_rpath : rootlibexecdir,
2963 install_dir : rootlibexecdir)
2966 executable('systemd-sulogin-shell',
2967 ['src/sulogin-shell/sulogin-shell.c'],
2968 include_directories : includes,
2969 link_with : [libshared],
2970 install_rpath : rootlibexecdir,
2972 install_dir : rootlibexecdir)
2974 ############################################################
2977 'systemd-runtest.env',
2978 output : 'systemd-runtest.env',
2979 command : ['sh', '-c', '{ ' +
2980 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2981 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2983 build_by_default : true)
2985 foreach tuple : tests
2987 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2988 dependencies = tuple[2]
2989 condition = tuple.length() >= 4 ? tuple[3] : ''
2990 type = tuple.length() >= 5 ? tuple[4] : ''
2991 defs = tuple.length() >= 6 ? tuple[5] : []
2992 incs = tuple.length() >= 7 ? tuple[6] : includes
2995 name = sources[0].split('/')[-1].split('.')[0]
2996 if type.startswith('timeout=')
2997 timeout = type.split('=')[1].to_int()
3001 if condition == '' or conf.get(condition) == 1
3005 include_directories : incs,
3006 link_with : link_with,
3007 dependencies : [versiondep,
3010 build_by_default : want_tests != 'false',
3011 install_rpath : rootlibexecdir,
3012 install : install_tests,
3013 install_dir : join_paths(testsdir, type))
3016 message('@0@ is a manual test'.format(name))
3017 elif type == 'unsafe' and want_tests != 'unsafe'
3018 message('@0@ is an unsafe test'.format(name))
3019 elif want_tests != 'false'
3025 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3030 'test-libsystemd-sym',
3031 test_libsystemd_sym_c,
3032 include_directories : includes,
3033 link_with : [libsystemd],
3034 build_by_default : want_tests != 'false',
3035 install : install_tests,
3036 install_dir : testsdir)
3037 if want_tests != 'false'
3038 test('test-libsystemd-sym', exe)
3042 'test-libsystemd-static-sym',
3043 test_libsystemd_sym_c,
3044 include_directories : includes,
3045 link_with : [install_libsystemd_static],
3046 dependencies : [threads], # threads is already included in dependencies on the library,
3047 # but does not seem to get propagated. Add here as a work-around.
3048 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3049 install : install_tests and static_libsystemd_pic,
3050 install_dir : testsdir)
3051 if want_tests != 'false' and static_libsystemd_pic
3052 test('test-libsystemd-static-sym', exe)
3058 include_directories : includes,
3059 c_args : '-Wno-deprecated-declarations',
3060 link_with : [libudev],
3061 build_by_default : want_tests != 'false',
3062 install : install_tests,
3063 install_dir : testsdir)
3064 if want_tests != 'false'
3065 test('test-libudev-sym', exe)
3069 'test-libudev-static-sym',
3071 include_directories : includes,
3072 c_args : '-Wno-deprecated-declarations',
3073 link_with : [install_libudev_static],
3074 build_by_default : want_tests != 'false' and static_libudev_pic,
3075 install : install_tests and static_libudev_pic,
3076 install_dir : testsdir)
3077 if want_tests != 'false' and static_libudev_pic
3078 test('test-libudev-static-sym', exe)
3081 ############################################################
3085 if get_option('tests') != 'false'
3086 foreach tuple : fuzzers
3088 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3089 dependencies = tuple[2]
3090 defs = tuple.length() >= 4 ? tuple[3] : []
3091 incs = tuple.length() >= 5 ? tuple[4] : includes
3094 if want_ossfuzz or want_fuzzbuzz
3095 dependencies += fuzzing_engine
3097 if fuzzing_engine.found()
3098 dependencies += fuzzing_engine
3100 link_args += ['-fsanitize=fuzzer']
3103 sources += 'src/fuzz/fuzz-main.c'
3107 sources += 'src/fuzz/fuzzer-entry-point.c'
3110 name = sources[0].split('/')[-1].split('.')[0]
3112 fuzzer_exes += executable(
3115 include_directories : [incs, include_directories('src/fuzz')],
3116 link_with : link_with,
3117 dependencies : dependencies,
3119 link_args: link_args,
3124 run_target('fuzzers',
3125 depends : fuzzer_exes,
3128 ############################################################
3130 make_directive_index_py = find_program('tools/make-directive-index.py')
3131 make_man_index_py = find_program('tools/make-man-index.py')
3132 xml_helper_py = find_program('tools/xml_helper.py')
3133 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
3134 autosuspend_update_sh = find_program('tools/meson-autosuspend-update.sh')
3137 subdir('sysusers.d')
3138 subdir('tmpfiles.d')
3144 subdir('shell-completion/bash')
3145 subdir('shell-completion/zsh')
3146 subdir('docs/sysvinit')
3147 subdir('docs/var-log')
3149 install_subdir('factory/etc',
3150 install_dir : factorydir)
3152 install_data('xorg/50-systemd-user.sh',
3153 install_dir : xinitrcdir)
3154 install_data('modprobe.d/systemd.conf',
3155 install_dir : modprobedir)
3156 install_data('LICENSE.GPL2',
3160 'docs/CODING_STYLE.md',
3161 'docs/DISTRO_PORTING.md',
3162 'docs/ENVIRONMENT.md',
3164 'docs/TRANSIENT-SETTINGS.md',
3165 'docs/TRANSLATORS.md',
3166 'docs/UIDS-GIDS.md',
3167 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3168 install_dir : docdir)
3170 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3171 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3173 ############################################################
3175 meson_check_help = find_program('tools/meson-check-help.sh')
3177 foreach exec : public_programs
3178 name = exec.full_path().split('/')[-1]
3179 if want_tests != 'false'
3180 test('check-help-' + name,
3182 args : exec.full_path())
3186 ############################################################
3188 check_directives_sh = find_program('tools/check-directives.sh')
3190 if want_tests != 'false'
3191 test('check-directives',
3192 check_directives_sh,
3193 args : project_source_root)
3196 ############################################################
3198 # Enable tests for all supported sanitizers
3199 foreach tuple : sanitizers
3200 sanitizer = tuple[0]
3203 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3205 foreach p : fuzz_regression_tests
3206 b = p.split('/')[-2]
3207 c = p.split('/')[-1]
3209 name = '@0@:@1@'.format(b, sanitizer)
3212 if want_tests == 'false'
3213 message('Not compiling @0@ because tests is set to false'.format(name))
3215 exe = custom_target(
3219 command : [env, 'ln', '-fs',
3220 join_paths(build.full_path(), b),
3222 build_by_default : true)
3224 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3229 if want_tests != 'false' and slow_tests
3230 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3232 args : [exe.full_path(),
3233 join_paths(project_source_root, p)])
3240 ############################################################
3243 all_files = run_command(
3245 ['--git-dir=@0@/.git'.format(project_source_root),
3248 all_files = files(all_files.stdout().split())
3253 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3256 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3260 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3263 command : [meson_git_contrib_sh])
3267 git_head = run_command(
3269 ['--git-dir=@0@/.git'.format(project_source_root),
3270 'rev-parse', 'HEAD']).stdout().strip()
3271 git_head_short = run_command(
3273 ['--git-dir=@0@/.git'.format(project_source_root),
3274 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3278 command : ['git', 'archive',
3279 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3281 '--prefix', 'systemd-@0@/'.format(git_head),
3285 ############################################################
3287 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3290 depends : [man, libsystemd, libudev],
3291 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3293 ############################################################
3294 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3297 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3299 'split /usr: @0@'.format(split_usr),
3300 'split bin-sbin: @0@'.format(split_bin),
3301 'prefix directory: @0@'.format(prefixdir),
3302 'rootprefix directory: @0@'.format(rootprefixdir),
3303 'sysconf directory: @0@'.format(sysconfdir),
3304 'include directory: @0@'.format(includedir),
3305 'lib directory: @0@'.format(libdir),
3306 'rootlib directory: @0@'.format(rootlibdir),
3307 'SysV init scripts: @0@'.format(sysvinit_path),
3308 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3309 'PAM modules directory: @0@'.format(pamlibdir),
3310 'PAM configuration directory: @0@'.format(pamconfdir),
3311 'RPM macros directory: @0@'.format(rpmmacrosdir),
3312 'modprobe.d directory: @0@'.format(modprobedir),
3313 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3314 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3315 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3316 'bash completions directory: @0@'.format(bashcompletiondir),
3317 'zsh completions directory: @0@'.format(zshcompletiondir),
3318 'extra start script: @0@'.format(get_option('rc-local')),
3319 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3320 get_option('debug-tty')),
3321 'TTY GID: @0@'.format(tty_gid),
3322 'users GID: @0@'.format(substs.get('USERS_GID')),
3323 'maximum system UID: @0@'.format(system_uid_max),
3324 'maximum system GID: @0@'.format(system_gid_max),
3325 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3326 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3327 'minimum container UID base: @0@'.format(container_uid_base_min),
3328 'maximum container UID base: @0@'.format(container_uid_base_max),
3329 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3330 'render group access mode: @0@'.format(get_option('group-render-mode')),
3331 'certificate root directory: @0@'.format(get_option('certificate-root')),
3332 'support URL: @0@'.format(support_url),
3333 'nobody user name: @0@'.format(nobody_user),
3334 'nobody group name: @0@'.format(nobody_group),
3335 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3336 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3338 'default DNSSEC mode: @0@'.format(default_dnssec),
3339 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3340 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3341 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3342 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3343 'default locale: @0@'.format(default_locale),
3344 'default user $PATH: @0@'.format(default_user_path_display),
3345 'systemd service watchdog: @0@'.format(watchdog_opt)]
3347 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3348 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3350 'default DNS servers: @0@'.format(alt_dns_servers),
3351 'default NTP servers: @0@'.format(alt_ntp_servers)]
3353 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3354 '@@0@'.format(time_epoch)).stdout().strip()
3356 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3359 'static libsystemd: @0@'.format(static_libsystemd),
3360 'static libudev: @0@'.format(static_libudev)]
3363 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3364 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3365 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3367 if conf.get('ENABLE_EFI') == 1
3368 status += 'efi arch: @0@'.format(efi_arch)
3372 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3373 'EFI CC @0@'.format(' '.join(efi_cc)),
3374 'EFI lds: @0@'.format(efi_lds),
3375 'EFI crt0: @0@'.format(efi_crt0),
3376 'EFI include directory: @0@'.format(efi_incdir)]
3434 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3435 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3439 ['legacy pkla', install_polkit_pkla],
3441 ['gnu-efi', have_gnu_efi],
3454 ['man pages', want_man],
3455 ['html pages', want_html],
3456 ['man page indices', want_man and have_lxml],
3461 ['adm group', get_option('adm-group')],
3462 ['wheel group', get_option('wheel-group')],
3465 ['debug mmap cache'],
3467 ['valgrind', conf.get('VALGRIND') == 1],
3468 ['trace logging', conf.get('LOG_TRACE') == 1],
3469 ['link-udev-shared', get_option('link-udev-shared')],
3470 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3471 ['link-networkd-shared', get_option('link-networkd-shared')],
3474 if tuple.length() >= 2
3477 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3478 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3479 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3490 'enabled features: @0@'.format(', '.join(found)),
3492 'disabled features: @0@'.format(', '.join(missing)),
3494 message('\n '.join(status))
3496 if rootprefixdir != rootprefix_default
3498 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3499 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3500 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))