1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
13 meson_version : '>= 0.46',
16 libsystemd_version = '0.27.1'
17 libudev_version = '1.6.16'
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())
26 substs = configuration_data()
27 substs.set('PROJECT_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
28 substs.set('PROJECT_VERSION', meson.project_version())
30 # This is to be used instead of meson.source_root(), as the latter will return
31 # the wrong result when systemd is being built as a meson subproject
32 project_source_root = meson.current_source_dir()
33 relative_source_path = run_command('realpath',
34 '--relative-to=@0@'.format(meson.current_build_dir()),
35 project_source_root).stdout().strip()
36 conf.set_quoted('RELATIVE_SOURCE_PATH', relative_source_path)
38 want_ossfuzz = get_option('oss-fuzz')
39 want_libfuzzer = get_option('llvm-fuzz')
40 want_fuzzbuzz = get_option('fuzzbuzz')
41 if want_ossfuzz + want_libfuzzer + want_fuzzbuzz > 1
42 error('only one of oss-fuzz, llvm-fuzz or fuzzbuzz can be specified')
45 skip_deps = want_ossfuzz or want_libfuzzer
46 fuzzer_build = want_ossfuzz or want_libfuzzer or want_fuzzbuzz
48 #####################################################################
50 # Try to install the git pre-commit hook
51 git_hook = run_command(join_paths(project_source_root, 'tools/add-git-hook.sh'))
52 if git_hook.returncode() == 0
53 message(git_hook.stdout().strip())
56 #####################################################################
58 if get_option('split-usr') == 'auto'
59 split_usr = run_command('test', '-L', '/bin').returncode() != 0
61 split_usr = get_option('split-usr') == 'true'
63 conf.set10('HAVE_SPLIT_USR', split_usr,
64 description : '/usr/bin and /bin directories are separate')
66 if get_option('split-bin') == 'auto'
67 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
69 split_bin = get_option('split-bin') == 'true'
71 conf.set10('HAVE_SPLIT_BIN', split_bin,
72 description : 'bin and sbin directories are separate')
74 rootprefixdir = get_option('rootprefix')
75 # Unusual rootprefixdir values are used by some distros
76 # (see https://github.com/systemd/systemd/pull/7461).
77 rootprefix_default = split_usr ? '/' : '/usr'
78 if rootprefixdir == ''
79 rootprefixdir = rootprefix_default
81 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
83 sysvinit_path = get_option('sysvinit-path')
84 sysvrcnd_path = get_option('sysvrcnd-path')
85 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
86 description : 'SysV init scripts and rcN.d links are supported')
88 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
89 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
90 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
92 # join_paths ignores the preceding arguments if an absolute component is
93 # encountered, so this should canonicalize various paths when they are
94 # absolute or relative.
95 prefixdir = get_option('prefix')
96 if not prefixdir.startswith('/')
97 error('Prefix is not absolute: "@0@"'.format(prefixdir))
99 bindir = join_paths(prefixdir, get_option('bindir'))
100 libdir = join_paths(prefixdir, get_option('libdir'))
101 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
102 includedir = join_paths(prefixdir, get_option('includedir'))
103 datadir = join_paths(prefixdir, get_option('datadir'))
104 localstatedir = join_paths('/', get_option('localstatedir'))
106 rootbindir = join_paths(rootprefixdir, 'bin')
107 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
108 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
110 rootlibdir = get_option('rootlibdir')
112 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
115 # Dirs of external packages
116 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
117 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
118 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
119 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
120 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
121 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
122 rpmmacrosdir = get_option('rpmmacrosdir')
123 if rpmmacrosdir != 'no'
124 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
126 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
129 pkgdatadir = join_paths(datadir, 'systemd')
130 environmentdir = join_paths(prefixdir, 'lib/environment.d')
131 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
132 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
133 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
134 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
135 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
136 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
137 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
138 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
139 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
140 pkgincludedir = join_paths(includedir, 'systemd')
141 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
142 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
143 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
144 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
145 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
146 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
147 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
148 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
149 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
150 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
151 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
152 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
153 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
154 factorydir = join_paths(datadir, 'factory')
155 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
156 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
157 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
158 catalogstatedir = join_paths(systemdstatedir, 'catalog')
159 randomseeddir = join_paths(localstatedir, 'lib/systemd')
160 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
161 ntpservicelistdir = join_paths(rootprefixdir, 'lib/systemd/ntp-units.d')
163 docdir = get_option('docdir')
165 docdir = join_paths(datadir, 'doc/systemd')
168 dbuspolicydir = get_option('dbuspolicydir')
169 if dbuspolicydir == ''
170 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
173 dbussessionservicedir = get_option('dbussessionservicedir')
174 if dbussessionservicedir == ''
175 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
178 dbussystemservicedir = get_option('dbussystemservicedir')
179 if dbussystemservicedir == ''
180 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
183 pamlibdir = get_option('pamlibdir')
185 pamlibdir = join_paths(rootlibdir, 'security')
188 pamconfdir = get_option('pamconfdir')
190 pamconfdir = join_paths(sysconfdir, 'pam.d')
193 memory_accounting_default = get_option('memory-accounting-default')
194 status_unit_format_default = get_option('status-unit-format-default')
196 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
197 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
198 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
199 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
200 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
201 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
203 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
205 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
206 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
207 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
208 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
209 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
210 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
211 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
212 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
213 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
214 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
215 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
216 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
217 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
218 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
219 conf.set_quoted('ROOTPREFIX', rootprefixdir)
220 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
221 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
222 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
223 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
224 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
225 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
226 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
227 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
228 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
229 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
230 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
231 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
232 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
233 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
234 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
235 conf.set_quoted('LIBDIR', libdir)
236 conf.set_quoted('ROOTLIBDIR', rootlibdir)
237 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
238 conf.set_quoted('BOOTLIBDIR', bootlibdir)
239 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
240 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
241 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
242 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
243 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
244 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
245 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
246 conf.set_quoted('SYSTEMD_USERWORK_PATH', join_paths(rootlibexecdir, 'systemd-userwork'))
247 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
248 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
249 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
251 substs.set('prefix', prefixdir)
252 substs.set('rootprefix', rootprefixdir)
253 substs.set('rootprefix_noslash', rootprefixdir_noslash)
254 substs.set('exec_prefix', prefixdir)
255 substs.set('libdir', libdir)
256 substs.set('rootlibdir', rootlibdir)
257 substs.set('includedir', includedir)
258 substs.set('sysconfdir', sysconfdir)
259 substs.set('bindir', bindir)
260 substs.set('rootbindir', rootbindir)
261 substs.set('rootlibexecdir', rootlibexecdir)
262 substs.set('systemunitdir', systemunitdir)
263 substs.set('userunitdir', userunitdir)
264 substs.set('systempresetdir', systempresetdir)
265 substs.set('userpresetdir', userpresetdir)
266 substs.set('udevhwdbdir', udevhwdbdir)
267 substs.set('udevrulesdir', udevrulesdir)
268 substs.set('udevlibexecdir', udevlibexecdir)
269 substs.set('environmentdir', environmentdir)
270 substs.set('catalogdir', catalogdir)
271 substs.set('tmpfilesdir', tmpfilesdir)
272 substs.set('sysusersdir', sysusersdir)
273 substs.set('sysctldir', sysctldir)
274 substs.set('binfmtdir', binfmtdir)
275 substs.set('modulesloaddir', modulesloaddir)
276 substs.set('modprobedir', modprobedir)
277 substs.set('systemgeneratordir', systemgeneratordir)
278 substs.set('usergeneratordir', usergeneratordir)
279 substs.set('systemenvgeneratordir', systemenvgeneratordir)
280 substs.set('userenvgeneratordir', userenvgeneratordir)
281 substs.set('systemshutdowndir', systemshutdowndir)
282 substs.set('systemsleepdir', systemsleepdir)
283 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
284 substs.set('SYSTEMCTL', join_paths(rootbindir, 'systemctl'))
285 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
286 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
287 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
288 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
289 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
290 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
291 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
292 substs.set('BUILD_ROOT', meson.current_build_dir())
294 #####################################################################
296 cc = meson.get_compiler('c')
297 pkgconfig = import('pkgconfig')
298 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
299 meson_build_sh = find_program('tools/meson-build.sh')
301 want_tests = get_option('tests')
302 slow_tests = want_tests != 'false' and get_option('slow-tests')
303 install_tests = get_option('install-tests')
305 if add_languages('cpp', required : fuzzer_build)
306 # Used only for tests
307 cxx = meson.get_compiler('cpp')
308 cxx_cmd = ' '.join(cxx.cmd_array())
314 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
315 if fuzzing_engine.found()
316 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
317 elif cc.has_argument('-fsanitize=fuzzer-no-link')
318 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
320 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
323 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
325 fuzzing_engine = meson.get_compiler('cpp').find_library(get_option('fuzzbuzz-engine'), dirs: get_option('fuzzbuzz-engine-dir'))
328 # Those generate many false positives, and we do not want to change the code to
330 basic_disabled_warnings = [
331 '-Wno-unused-parameter',
332 '-Wno-missing-field-initializers',
333 '-Wno-unused-result',
334 '-Wno-format-signedness',
336 if get_option('b_ndebug') == 'true'
337 # With asserts disabled with get a bunch of warnings about variables which
338 # are used only in the asserts. This is not useful at all, so let's just silence
340 basic_disabled_warnings += [
341 '-Wno-unused-variable',
342 '-Wno-unused-but-set-variable',
346 possible_cc_flags = [
349 '-Wmissing-include-dirs',
350 '-Wold-style-definition',
354 '-Wsuggest-attribute=noreturn',
355 '-Werror=missing-prototypes',
356 '-Werror=implicit-function-declaration',
357 '-Werror=missing-declarations',
358 '-Werror=return-type',
359 '-Werror=incompatible-pointer-types',
361 '-Wstrict-prototypes',
363 '-Wmissing-noreturn',
364 '-Wimplicit-fallthrough=5',
367 '-Wstrict-aliasing=2',
370 '-Werror=shift-count-overflow',
371 '-Werror=shift-overflow=2',
375 # negative arguments are correctly detected starting with meson 0.46.
376 '-Wno-error=#warnings', # clang
377 '-Wno-string-plus-int', # clang
379 # work-around for gcc 7.1 turning this on on its own.
380 '-Wno-error=nonnull',
382 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
383 # optimizations enabled, producing essentially false positives.
384 '-Wno-maybe-uninitialized',
388 '-fdiagnostics-show-option',
389 '-fno-strict-aliasing',
390 '-fvisibility=hidden',
392 '-fstack-protector-strong',
393 '--param=ssp-buffer-size=4',
396 # --as-needed and --no-undefined are provided by meson by default,
397 # run mesonconf to see what is enabled
398 possible_link_flags = [
404 if cc.get_id() == 'clang'
405 possible_cc_flags += [
406 '-Wno-typedef-redefinition',
407 '-Wno-gnu-variable-sized-type-not-at-end',
411 if get_option('buildtype') != 'debug'
412 possible_cc_flags += [
413 '-ffunction-sections',
417 possible_link_flags += '-Wl,--gc-sections'
420 add_project_arguments(cc.get_supported_arguments(basic_disabled_warnings), language : 'c')
421 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
422 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
426 #include <inttypes.h>
427 typedef uint64_t usec_t;
428 usec_t now(clockid_t clock);
433 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
434 add_project_arguments('-Werror=shadow', language : 'c')
438 add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp')
441 cpp = ' '.join(cc.cmd_array()) + ' -E'
443 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
445 #####################################################################
446 # compilation result tests
448 conf.set('_GNU_SOURCE', true)
449 conf.set('__SANE_USERSPACE_TYPES__', true)
450 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
452 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
453 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
454 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
455 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
456 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
457 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
458 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
462 #include <sys/stat.h>
465 foreach decl : ['char16_t',
470 # We get -1 if the size cannot be determined
471 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
473 if decl == 'struct statx'
475 want_linux_stat_h = false
477 have = cc.sizeof(decl,
478 prefix : decl_headers + '#include <linux/stat.h>',
479 args : '-D_GNU_SOURCE') > 0
480 want_linux_stat_h = have
484 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
487 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
489 foreach ident : ['secure_getenv', '__secure_getenv']
490 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
494 ['memfd_create', '''#include <sys/mman.h>'''],
495 ['gettid', '''#include <sys/types.h>
496 #include <unistd.h>'''],
497 ['pivot_root', '''#include <stdlib.h>
498 #include <unistd.h>'''], # no known header declares pivot_root
499 ['name_to_handle_at', '''#include <sys/types.h>
500 #include <sys/stat.h>
501 #include <fcntl.h>'''],
502 ['setns', '''#include <sched.h>'''],
503 ['renameat2', '''#include <stdio.h>
504 #include <fcntl.h>'''],
505 ['kcmp', '''#include <linux/kcmp.h>'''],
506 ['keyctl', '''#include <sys/types.h>
507 #include <keyutils.h>'''],
508 ['copy_file_range', '''#include <sys/syscall.h>
509 #include <unistd.h>'''],
510 ['bpf', '''#include <sys/syscall.h>
511 #include <unistd.h>'''],
512 ['statx', '''#include <sys/types.h>
513 #include <sys/stat.h>
514 #include <unistd.h>'''],
515 ['explicit_bzero' , '''#include <string.h>'''],
516 ['reallocarray', '''#include <malloc.h>'''],
517 ['set_mempolicy', '''#include <stdlib.h>
518 #include <unistd.h>'''],
519 ['get_mempolicy', '''#include <stdlib.h>
520 #include <unistd.h>'''],
521 ['pidfd_send_signal', '''#include <stdlib.h>
524 #include <sys/wait.h>'''],
525 ['pidfd_open', '''#include <stdlib.h>
528 #include <sys/wait.h>'''],
529 ['rt_sigqueueinfo', '''#include <stdlib.h>
532 #include <sys/wait.h>'''],
535 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
536 conf.set10('HAVE_' + ident[0].to_upper(), have)
539 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
540 conf.set10('USE_SYS_RANDOM_H', true)
541 conf.set10('HAVE_GETRANDOM', true)
543 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
544 conf.set10('USE_SYS_RANDOM_H', false)
545 conf.set10('HAVE_GETRANDOM', have)
548 #####################################################################
550 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
552 get_option('version-tag'),
553 meson.project_version()]
556 input : 'src/version/version.h.in',
557 output : 'version.h',
560 versiondep = declare_dependency(sources: version_h)
562 sed = find_program('sed')
563 awk = find_program('awk')
564 m4 = find_program('m4')
565 stat = find_program('stat')
566 git = find_program('git', required : false)
567 env = find_program('env')
568 perl = find_program('perl', required : false)
570 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
571 mkdir_p = 'mkdir -p $DESTDIR/@0@'
572 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
573 splash_bmp = files('test/splash.bmp')
575 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
576 # /usr/sbin, /sbin, and fall back to the default from middle column.
577 progs = [['quotaon', '/usr/sbin/quotaon' ],
578 ['quotacheck', '/usr/sbin/quotacheck' ],
579 ['kmod', '/usr/bin/kmod' ],
580 ['kexec', '/usr/sbin/kexec' ],
581 ['sulogin', '/usr/sbin/sulogin' ],
582 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
583 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
584 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
585 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
586 ['nologin', '/usr/sbin/nologin', ],
589 path = get_option(prog[0] + '-path')
591 message('Using @1@ for @0@'.format(prog[0], path))
593 exe = find_program(prog[0],
594 '/usr/sbin/' + prog[0],
597 path = exe.found() ? exe.path() : prog[1]
599 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
600 conf.set_quoted(name, path)
601 substs.set(name, path)
604 conf.set_quoted('TELINIT', get_option('telinit-path'))
606 if run_command('ln', '--relative', '--help').returncode() != 0
607 error('ln does not support --relative (added in coreutils 8.16)')
610 ############################################################
612 gperf = find_program('gperf')
614 gperf_test_format = '''
616 const char * in_word_set(const char *, @0@);
619 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
620 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
621 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
622 if cc.compiles(gperf_test)
623 gperf_len_type = 'size_t'
625 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
626 if cc.compiles(gperf_test)
627 gperf_len_type = 'unsigned'
629 error('unable to determine gperf len type')
632 message('gperf len type is @0@'.format(gperf_len_type))
633 conf.set('GPERF_LEN_TYPE', gperf_len_type,
634 description : 'The type of gperf "len" parameter')
636 ############################################################
638 if not cc.has_header('sys/capability.h')
639 error('POSIX caps headers not found')
641 foreach header : ['crypt.h',
643 'linux/vm_sockets.h',
645 'valgrind/memcheck.h',
646 'valgrind/valgrind.h',
649 conf.set10('HAVE_' + header.underscorify().to_upper(),
650 cc.has_header(header))
653 ############################################################
655 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
656 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
657 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
659 default_hierarchy = get_option('default-hierarchy')
660 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
661 description : 'default cgroup hierarchy as string')
662 if default_hierarchy == 'legacy'
663 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
664 elif default_hierarchy == 'hybrid'
665 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
667 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
670 default_net_naming_scheme = get_option('default-net-naming-scheme')
671 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
673 time_epoch = get_option('time-epoch')
676 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
678 conf.set('TIME_EPOCH', time_epoch)
680 system_uid_max = get_option('system-uid-max')
681 if system_uid_max == -1
682 system_uid_max = run_command(
684 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
685 '/etc/login.defs').stdout().strip()
686 if system_uid_max == ''
689 system_uid_max = system_uid_max.to_int()
692 conf.set('SYSTEM_UID_MAX', system_uid_max)
693 substs.set('systemuidmax', system_uid_max)
695 system_gid_max = get_option('system-gid-max')
696 if system_gid_max == -1
697 system_gid_max = run_command(
699 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
700 '/etc/login.defs').stdout().strip()
701 if system_gid_max == ''
704 system_gid_max = system_gid_max.to_int()
707 conf.set('SYSTEM_GID_MAX', system_gid_max)
708 substs.set('systemgidmax', system_gid_max)
710 dynamic_uid_min = get_option('dynamic-uid-min')
711 dynamic_uid_max = get_option('dynamic-uid-max')
712 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
713 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
714 substs.set('dynamicuidmin', dynamic_uid_min)
715 substs.set('dynamicuidmax', dynamic_uid_max)
717 container_uid_base_min = get_option('container-uid-base-min')
718 container_uid_base_max = get_option('container-uid-base-max')
719 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
720 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
721 substs.set('containeruidbasemin', container_uid_base_min)
722 substs.set('containeruidbasemax', container_uid_base_max)
724 nobody_user = get_option('nobody-user')
725 nobody_group = get_option('nobody-group')
727 if not meson.is_cross_build()
728 getent_result = run_command('getent', 'passwd', '65534')
729 if getent_result.returncode() == 0
730 name = getent_result.stdout().split(':')[0]
731 if name != nobody_user
733 '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) +
734 'Your build will result in an user table setup that is incompatible with the local system.')
737 id_result = run_command('id', '-u', nobody_user)
738 if id_result.returncode() == 0
739 id = id_result.stdout().to_int()
742 '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) +
743 'Your build will result in an user table setup that is incompatible with the local system.')
747 getent_result = run_command('getent', 'group', '65534')
748 if getent_result.returncode() == 0
749 name = getent_result.stdout().split(':')[0]
750 if name != nobody_group
752 '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) +
753 'Your build will result in an group table setup that is incompatible with the local system.')
756 id_result = run_command('id', '-g', nobody_group)
757 if id_result.returncode() == 0
758 id = id_result.stdout().to_int()
761 '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) +
762 'Your build will result in an group table setup that is incompatible with the local system.')
766 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
768 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
769 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
772 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
773 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
774 substs.set('NOBODY_USER_NAME', nobody_user)
775 substs.set('NOBODY_GROUP_NAME', nobody_group)
777 tty_gid = get_option('tty-gid')
778 conf.set('TTY_GID', tty_gid)
779 substs.set('TTY_GID', tty_gid)
781 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
782 users_gid = get_option('users-gid')
783 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
785 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
786 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
788 dev_kvm_mode = get_option('dev-kvm-mode')
789 substs.set('DEV_KVM_MODE', dev_kvm_mode)
790 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
791 group_render_mode = get_option('group-render-mode')
792 substs.set('GROUP_RENDER_MODE', group_render_mode)
793 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
795 kill_user_processes = get_option('default-kill-user-processes')
796 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
797 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
798 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
800 dns_servers = get_option('dns-servers')
801 conf.set_quoted('DNS_SERVERS', dns_servers)
802 substs.set('DNS_SERVERS', dns_servers)
804 ntp_servers = get_option('ntp-servers')
805 conf.set_quoted('NTP_SERVERS', ntp_servers)
806 substs.set('NTP_SERVERS', ntp_servers)
808 default_locale = get_option('default-locale')
809 if default_locale == ''
810 if not meson.is_cross_build()
811 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
812 default_locale = run_command(choose_default_locale_sh).stdout().strip()
814 default_locale = 'C.UTF-8'
817 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
819 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
821 service_watchdog = get_option('service-watchdog')
822 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
823 substs.set('SERVICE_WATCHDOG', watchdog_value)
825 substs.set('SUSHELL', get_option('debug-shell'))
826 substs.set('DEBUGTTY', get_option('debug-tty'))
827 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
829 enable_debug_hashmap = false
830 enable_debug_mmap_cache = false
831 enable_debug_siphash = false
832 foreach name : get_option('debug-extra')
834 enable_debug_hashmap = true
835 elif name == 'mmap-cache'
836 enable_debug_mmap_cache = true
837 elif name == 'siphash'
838 enable_debug_siphash = true
840 message('unknown debug option "@0@", ignoring'.format(name))
843 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
844 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
845 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
847 conf.set10('VALGRIND', get_option('valgrind'))
848 conf.set10('LOG_TRACE', get_option('log-trace'))
850 default_user_path = get_option('user-path')
851 if default_user_path != ''
852 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
853 default_user_path_display = default_user_path
855 # meson 0.49 fails when ?: is used in .format()
856 default_user_path_display = '(same as system services)'
860 #####################################################################
862 threads = dependency('threads')
863 librt = cc.find_library('rt')
864 libm = cc.find_library('m')
865 libdl = cc.find_library('dl')
866 libcrypt = cc.find_library('crypt')
868 libcap = dependency('libcap', required : false)
869 if not libcap.found()
870 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
871 libcap = cc.find_library('cap')
874 libmount = dependency('mount',
875 version : fuzzer_build ? '>= 0' : '>= 2.30')
877 want_seccomp = get_option('seccomp')
878 if want_seccomp != 'false' and not skip_deps
879 libseccomp = dependency('libseccomp',
880 version : '>= 2.3.1',
881 required : want_seccomp == 'true')
882 have = libseccomp.found()
887 conf.set10('HAVE_SECCOMP', have)
889 want_selinux = get_option('selinux')
890 if want_selinux != 'false' and not skip_deps
891 libselinux = dependency('libselinux',
892 version : '>= 2.1.9',
893 required : want_selinux == 'true')
894 have = libselinux.found()
899 conf.set10('HAVE_SELINUX', have)
901 want_apparmor = get_option('apparmor')
902 if want_apparmor != 'false' and not skip_deps
903 libapparmor = dependency('libapparmor',
904 required : want_apparmor == 'true')
905 have = libapparmor.found()
910 conf.set10('HAVE_APPARMOR', have)
912 smack_run_label = get_option('smack-run-label')
913 if smack_run_label != ''
914 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
917 want_polkit = get_option('polkit')
918 install_polkit = false
919 install_polkit_pkla = false
920 if want_polkit != 'false' and not skip_deps
921 install_polkit = true
923 libpolkit = dependency('polkit-gobject-1',
925 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
926 message('Old polkit detected, will install pkla files')
927 install_polkit_pkla = true
930 conf.set10('ENABLE_POLKIT', install_polkit)
932 want_acl = get_option('acl')
933 if want_acl != 'false' and not skip_deps
934 libacl = cc.find_library('acl', required : want_acl == 'true')
935 have = libacl.found()
940 conf.set10('HAVE_ACL', have)
942 want_audit = get_option('audit')
943 if want_audit != 'false' and not skip_deps
944 libaudit = dependency('audit', required : want_audit == 'true')
945 have = libaudit.found()
950 conf.set10('HAVE_AUDIT', have)
952 want_blkid = get_option('blkid')
953 if want_blkid != 'false' and not skip_deps
954 libblkid = dependency('blkid', required : want_blkid == 'true')
955 have = libblkid.found()
960 conf.set10('HAVE_BLKID', have)
962 want_kmod = get_option('kmod')
963 if want_kmod != 'false' and not skip_deps
964 libkmod = dependency('libkmod',
966 required : want_kmod == 'true')
967 have = libkmod.found()
972 conf.set10('HAVE_KMOD', have)
974 want_pam = get_option('pam')
975 if want_pam != 'false' and not skip_deps
976 libpam = cc.find_library('pam', required : want_pam == 'true')
977 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
978 have = libpam.found() and libpam_misc.found()
984 conf.set10('HAVE_PAM', have)
986 want_microhttpd = get_option('microhttpd')
987 if want_microhttpd != 'false' and not skip_deps
988 libmicrohttpd = dependency('libmicrohttpd',
989 version : '>= 0.9.33',
990 required : want_microhttpd == 'true')
991 have = libmicrohttpd.found()
996 conf.set10('HAVE_MICROHTTPD', have)
998 want_libcryptsetup = get_option('libcryptsetup')
999 if want_libcryptsetup != 'false' and not skip_deps
1000 libcryptsetup = dependency('libcryptsetup',
1001 version : '>= 2.0.1',
1002 required : want_libcryptsetup == 'true')
1003 have = libcryptsetup.found()
1008 conf.set10('HAVE_LIBCRYPTSETUP', have)
1010 want_libcurl = get_option('libcurl')
1011 if want_libcurl != 'false' and not skip_deps
1012 libcurl = dependency('libcurl',
1013 version : '>= 7.32.0',
1014 required : want_libcurl == 'true')
1015 have = libcurl.found()
1020 conf.set10('HAVE_LIBCURL', have)
1022 want_libidn = get_option('libidn')
1023 want_libidn2 = get_option('libidn2')
1024 if want_libidn == 'true' and want_libidn2 == 'true'
1025 error('libidn and libidn2 cannot be requested simultaneously')
1028 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1029 libidn = dependency('libidn2',
1030 required : want_libidn2 == 'true')
1031 have = libidn.found()
1036 conf.set10('HAVE_LIBIDN2', have)
1037 if not have and want_libidn != 'false' and not skip_deps
1038 # libidn is used for both libidn and libidn2 objects
1039 libidn = dependency('libidn',
1040 required : want_libidn == 'true')
1041 have = libidn.found()
1045 conf.set10('HAVE_LIBIDN', have)
1047 want_libiptc = get_option('libiptc')
1048 if want_libiptc != 'false' and not skip_deps
1049 libiptc = dependency('libiptc',
1050 required : want_libiptc == 'true')
1051 have = libiptc.found()
1056 conf.set10('HAVE_LIBIPTC', have)
1058 want_qrencode = get_option('qrencode')
1059 if want_qrencode != 'false' and not skip_deps
1060 libqrencode = dependency('libqrencode',
1061 required : want_qrencode == 'true')
1062 have = libqrencode.found()
1067 conf.set10('HAVE_QRENCODE', have)
1069 want_gcrypt = get_option('gcrypt')
1070 if want_gcrypt != 'false' and not skip_deps
1071 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1072 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1073 have = libgcrypt.found() and libgpg_error.found()
1078 # link to neither of the libs if one is not found
1082 conf.set10('HAVE_GCRYPT', have)
1084 want_gnutls = get_option('gnutls')
1085 if want_gnutls != 'false' and not skip_deps
1086 libgnutls = dependency('gnutls',
1087 version : '>= 3.1.4',
1088 required : want_gnutls == 'true')
1089 have = libgnutls.found()
1094 conf.set10('HAVE_GNUTLS', have)
1096 want_openssl = get_option('openssl')
1097 if want_openssl != 'false' and not skip_deps
1098 libopenssl = dependency('openssl',
1099 version : '>= 1.1.0',
1100 required : want_openssl == 'true')
1101 have = libopenssl.found()
1106 conf.set10('HAVE_OPENSSL', have)
1108 want_p11kit = get_option('p11kit')
1109 if want_p11kit != 'false' and not skip_deps
1110 libp11kit = dependency('p11-kit-1',
1111 version : '>= 0.23.3',
1112 required : want_p11kit == 'true')
1113 have = libp11kit.found()
1118 conf.set10('HAVE_P11KIT', have)
1120 want_elfutils = get_option('elfutils')
1121 if want_elfutils != 'false' and not skip_deps
1122 libdw = dependency('libdw',
1123 required : want_elfutils == 'true')
1124 have = libdw.found()
1129 conf.set10('HAVE_ELFUTILS', have)
1131 want_zlib = get_option('zlib')
1132 if want_zlib != 'false' and not skip_deps
1133 libz = dependency('zlib',
1134 required : want_zlib == 'true')
1140 conf.set10('HAVE_ZLIB', have)
1142 want_bzip2 = get_option('bzip2')
1143 if want_bzip2 != 'false' and not skip_deps
1144 libbzip2 = cc.find_library('bz2',
1145 required : want_bzip2 == 'true')
1146 have = libbzip2.found()
1151 conf.set10('HAVE_BZIP2', have)
1153 want_xz = get_option('xz')
1154 if want_xz != 'false' and not skip_deps
1155 libxz = dependency('liblzma',
1156 required : want_xz == 'true')
1157 have = libxz.found()
1162 conf.set10('HAVE_XZ', have)
1164 want_lz4 = get_option('lz4')
1165 if want_lz4 != 'false' and not skip_deps
1166 liblz4 = dependency('liblz4',
1167 version : '>= 1.3.0',
1168 required : want_lz4 == 'true')
1169 have = liblz4.found()
1174 conf.set10('HAVE_LZ4', have)
1176 want_xkbcommon = get_option('xkbcommon')
1177 if want_xkbcommon != 'false' and not skip_deps
1178 libxkbcommon = dependency('xkbcommon',
1179 version : '>= 0.3.0',
1180 required : want_xkbcommon == 'true')
1181 have = libxkbcommon.found()
1186 conf.set10('HAVE_XKBCOMMON', have)
1188 want_pcre2 = get_option('pcre2')
1189 if want_pcre2 != 'false'
1190 libpcre2 = dependency('libpcre2-8',
1191 required : want_pcre2 == 'true')
1192 have = libpcre2.found()
1197 conf.set10('HAVE_PCRE2', have)
1199 want_glib = get_option('glib')
1200 if want_glib != 'false' and not skip_deps
1201 libglib = dependency('glib-2.0',
1202 version : '>= 2.22.0',
1203 required : want_glib == 'true')
1204 libgobject = dependency('gobject-2.0',
1205 version : '>= 2.22.0',
1206 required : want_glib == 'true')
1207 libgio = dependency('gio-2.0',
1208 required : want_glib == 'true')
1209 have = libglib.found() and libgobject.found() and libgio.found()
1216 conf.set10('HAVE_GLIB', have)
1218 want_dbus = get_option('dbus')
1219 if want_dbus != 'false' and not skip_deps
1220 libdbus = dependency('dbus-1',
1221 version : '>= 1.3.2',
1222 required : want_dbus == 'true')
1223 have = libdbus.found()
1228 conf.set10('HAVE_DBUS', have)
1230 default_dnssec = get_option('default-dnssec')
1232 default_dnssec = 'no'
1234 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1235 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1236 default_dnssec = 'no'
1238 conf.set('DEFAULT_DNSSEC_MODE',
1239 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1240 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1242 dns_over_tls = get_option('dns-over-tls')
1243 if dns_over_tls != 'false'
1244 if dns_over_tls == 'openssl'
1247 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1248 if dns_over_tls == 'gnutls' and not have_gnutls
1249 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1252 if dns_over_tls == 'gnutls' or have_gnutls
1253 have_openssl = false
1255 have_openssl = conf.get('HAVE_OPENSSL') == 1
1256 if dns_over_tls != 'auto' and not have_openssl
1257 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1258 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1261 have = have_gnutls or have_openssl
1265 have_openssl = false
1267 conf.set10('ENABLE_DNS_OVER_TLS', have)
1268 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1269 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1271 default_dns_over_tls = get_option('default-dns-over-tls')
1273 default_dns_over_tls = 'no'
1275 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1276 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.')
1277 default_dns_over_tls = 'no'
1279 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1280 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1281 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1283 want_importd = get_option('importd')
1284 if want_importd != 'false'
1285 have = (conf.get('HAVE_LIBCURL') == 1 and
1286 conf.get('HAVE_ZLIB') == 1 and
1287 conf.get('HAVE_XZ') == 1 and
1288 conf.get('HAVE_GCRYPT') == 1)
1289 if want_importd == 'true' and not have
1290 error('importd support was requested, but dependencies are not available')
1295 conf.set10('ENABLE_IMPORTD', have)
1297 want_remote = get_option('remote')
1298 if want_remote != 'false'
1299 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1300 conf.get('HAVE_LIBCURL') == 1]
1301 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1302 # it's possible to build one without the other. Complain only if
1303 # support was explicitly requested. The auxiliary files like sysusers
1304 # config should be installed when any of the programs are built.
1305 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1306 error('remote support was requested, but dependencies are not available')
1308 have = have_deps[0] or have_deps[1]
1312 conf.set10('ENABLE_REMOTE', have)
1314 foreach term : ['utmp',
1348 have = get_option(term)
1349 name = 'ENABLE_' + term.underscorify().to_upper()
1350 conf.set10(name, have)
1353 foreach tuple : [['nss-mymachines', 'machined'],
1354 ['nss-resolve', 'resolve']]
1355 want = get_option(tuple[0])
1357 have = get_option(tuple[1])
1358 if want == 'true' and not have
1359 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1364 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1365 conf.set10(name, have)
1369 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1370 'ENABLE_NSS_MYMACHINES',
1371 'ENABLE_NSS_RESOLVE',
1372 'ENABLE_NSS_SYSTEMD']
1373 if conf.get(term) == 1
1377 conf.set10('ENABLE_NSS', enable_nss)
1379 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1384 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1386 #####################################################################
1388 if get_option('efi')
1389 efi_arch = host_machine.cpu_family()
1391 if efi_arch == 'x86'
1392 EFI_MACHINE_TYPE_NAME = 'ia32'
1393 gnu_efi_arch = 'ia32'
1394 elif efi_arch == 'x86_64'
1395 EFI_MACHINE_TYPE_NAME = 'x64'
1396 gnu_efi_arch = 'x86_64'
1397 elif efi_arch == 'arm'
1398 EFI_MACHINE_TYPE_NAME = 'arm'
1399 gnu_efi_arch = 'arm'
1400 elif efi_arch == 'aarch64'
1401 EFI_MACHINE_TYPE_NAME = 'aa64'
1402 gnu_efi_arch = 'aarch64'
1404 EFI_MACHINE_TYPE_NAME = ''
1409 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1411 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1415 conf.set10('ENABLE_EFI', have)
1417 #####################################################################
1419 config_h = configure_file(
1420 output : 'config.h',
1421 configuration : conf)
1423 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1425 includes = include_directories('src/basic',
1430 'src/journal-remote',
1434 'src/time-wait-sync',
1440 'src/libsystemd/sd-bus',
1441 'src/libsystemd/sd-device',
1442 'src/libsystemd/sd-event',
1443 'src/libsystemd/sd-hwdb',
1444 'src/libsystemd/sd-id128',
1445 'src/libsystemd/sd-netlink',
1446 'src/libsystemd/sd-network',
1447 'src/libsystemd/sd-resolve',
1448 'src/libsystemd-network',
1451 add_project_arguments('-include', 'config.h', language : 'c')
1453 generate_gperfs = find_program('tools/generate-gperfs.py')
1457 subdir('src/systemd')
1459 subdir('src/libsystemd')
1460 subdir('src/libsystemd-network')
1461 subdir('src/journal')
1464 libjournal_core = static_library(
1466 libjournal_core_sources,
1468 include_directories : includes,
1471 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1472 libsystemd = shared_library(
1475 version : libsystemd_version,
1476 include_directories : includes,
1477 link_args : ['-shared',
1478 '-Wl,--version-script=' + libsystemd_sym_path],
1479 link_with : [libbasic,
1481 link_whole : [libsystemd_static,
1483 dependencies : [threads,
1487 link_depends : libsystemd_sym,
1489 install_dir : rootlibdir)
1491 static_libsystemd = get_option('static-libsystemd')
1492 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1494 install_libsystemd_static = static_library(
1497 journal_client_sources,
1499 basic_gcrypt_sources,
1501 include_directories : includes,
1502 build_by_default : static_libsystemd != 'false',
1503 install : static_libsystemd != 'false',
1504 install_dir : rootlibdir,
1505 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1506 dependencies : [threads,
1515 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1517 #Generate autosuspend rules
1518 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1520 ############################################################
1522 # binaries that have --help and are intended for use by humans,
1523 # usually, but not always, installed in /bin.
1524 public_programs = []
1526 subdir('src/libudev')
1527 subdir('src/shared')
1529 subdir('src/shutdown')
1531 subdir('src/network')
1533 subdir('src/analyze')
1534 subdir('src/journal-remote')
1535 subdir('src/coredump')
1536 subdir('src/pstore')
1537 subdir('src/hostname')
1538 subdir('src/import')
1539 subdir('src/kernel-install')
1540 subdir('src/locale')
1541 subdir('src/machine')
1542 subdir('src/portable')
1543 subdir('src/userdb')
1544 subdir('src/nspawn')
1545 subdir('src/resolve')
1546 subdir('src/timedate')
1547 subdir('src/timesync')
1548 subdir('src/vconsole')
1549 subdir('src/boot/efi')
1556 ############################################################
1558 # only static linking apart from libdl, to make sure that the
1559 # module is linked to all libraries that it uses.
1560 test_dlopen = executable(
1564 include_directories : includes,
1565 link_with : [libbasic],
1566 dependencies : [libdl],
1567 build_by_default : want_tests != 'false')
1569 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1570 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h'],
1571 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1572 ['resolve', 'ENABLE_NSS_RESOLVE']]
1574 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1578 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1579 version_script_arg = join_paths(project_source_root, sym)
1581 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1582 if tuple.length() > 2
1583 sources += tuple[2].split()
1586 nss = shared_library(
1591 include_directories : includes,
1592 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1593 link_args : ['-Wl,-z,nodelete',
1595 '-Wl,--version-script=' + version_script_arg],
1596 link_with : [libsystemd_static,
1599 dependencies : [threads,
1603 install_dir : rootlibdir)
1605 # We cannot use shared_module because it does not support version suffix.
1606 # Unfortunately shared_library insists on creating the symlink…
1607 meson.add_install_script('sh', '-c',
1608 'rm $DESTDIR@0@/libnss_@1@.so'
1609 .format(rootlibdir, module))
1611 if want_tests != 'false'
1612 test('dlopen-nss_' + module,
1614 # path to dlopen must include a slash
1615 args : nss.full_path())
1620 ############################################################
1622 executable('systemd',
1624 include_directories : includes,
1625 link_with : [libcore,
1627 dependencies : [versiondep,
1634 install_rpath : rootlibexecdir,
1636 install_dir : rootlibexecdir)
1638 meson.add_install_script(meson_make_symlink,
1639 join_paths(rootlibexecdir, 'systemd'),
1640 join_paths(rootsbindir, 'init'))
1642 exe = executable('systemd-analyze',
1643 systemd_analyze_sources,
1644 include_directories : includes,
1645 link_with : [libcore,
1647 dependencies : [versiondep,
1654 install_rpath : rootlibexecdir,
1656 public_programs += exe
1658 executable('systemd-journald',
1659 systemd_journald_sources,
1660 include_directories : includes,
1661 link_with : [libjournal_core,
1663 dependencies : [threads,
1667 install_rpath : rootlibexecdir,
1669 install_dir : rootlibexecdir)
1671 exe = executable('systemd-cat',
1672 systemd_cat_sources,
1673 include_directories : includes,
1674 link_with : [libjournal_core,
1676 dependencies : [threads],
1677 install_rpath : rootlibexecdir,
1679 public_programs += exe
1681 exe = executable('journalctl',
1683 include_directories : includes,
1684 link_with : [libshared],
1685 dependencies : [threads,
1690 install_rpath : rootlibexecdir,
1692 install_dir : rootbindir)
1693 public_programs += exe
1695 executable('systemd-getty-generator',
1696 'src/getty-generator/getty-generator.c',
1697 include_directories : includes,
1698 link_with : [libshared],
1699 install_rpath : rootlibexecdir,
1701 install_dir : systemgeneratordir)
1703 executable('systemd-debug-generator',
1704 'src/debug-generator/debug-generator.c',
1705 include_directories : includes,
1706 link_with : [libshared],
1707 install_rpath : rootlibexecdir,
1709 install_dir : systemgeneratordir)
1711 executable('systemd-run-generator',
1712 'src/run-generator/run-generator.c',
1713 include_directories : includes,
1714 link_with : [libshared],
1715 install_rpath : rootlibexecdir,
1717 install_dir : systemgeneratordir)
1719 executable('systemd-fstab-generator',
1720 'src/fstab-generator/fstab-generator.c',
1721 include_directories : includes,
1722 link_with : [libcore_shared,
1724 install_rpath : rootlibexecdir,
1726 install_dir : systemgeneratordir)
1728 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1729 executable('30-systemd-environment-d-generator',
1730 'src/environment-d-generator/environment-d-generator.c',
1731 include_directories : includes,
1732 link_with : [libshared],
1733 install_rpath : rootlibexecdir,
1735 install_dir : userenvgeneratordir)
1737 meson.add_install_script(meson_make_symlink,
1738 join_paths(sysconfdir, 'environment'),
1739 join_paths(environmentdir, '99-environment.conf'))
1742 if conf.get('ENABLE_HIBERNATE') == 1
1743 executable('systemd-hibernate-resume-generator',
1744 'src/hibernate-resume/hibernate-resume-generator.c',
1745 include_directories : includes,
1746 link_with : [libshared],
1747 install_rpath : rootlibexecdir,
1749 install_dir : systemgeneratordir)
1751 executable('systemd-hibernate-resume',
1752 'src/hibernate-resume/hibernate-resume.c',
1753 include_directories : includes,
1754 link_with : [libshared],
1755 install_rpath : rootlibexecdir,
1757 install_dir : rootlibexecdir)
1760 if conf.get('HAVE_BLKID') == 1
1761 executable('systemd-gpt-auto-generator',
1762 'src/gpt-auto-generator/gpt-auto-generator.c',
1763 'src/shared/blkid-util.h',
1764 include_directories : includes,
1765 link_with : [libshared],
1766 dependencies : libblkid,
1767 install_rpath : rootlibexecdir,
1769 install_dir : systemgeneratordir)
1771 exe = executable('systemd-dissect',
1772 'src/dissect/dissect.c',
1773 include_directories : includes,
1774 link_with : [libshared],
1775 install_rpath : rootlibexecdir,
1777 install_dir : rootlibexecdir)
1778 public_programs += exe
1781 if conf.get('ENABLE_RESOLVE') == 1
1782 executable('systemd-resolved',
1783 systemd_resolved_sources,
1784 include_directories : includes,
1785 link_with : [libshared,
1787 libsystemd_resolve_core],
1788 dependencies : systemd_resolved_dependencies,
1789 install_rpath : rootlibexecdir,
1791 install_dir : rootlibexecdir)
1793 exe = executable('resolvectl',
1795 include_directories : includes,
1796 link_with : [libshared,
1798 libsystemd_resolve_core],
1799 dependencies : [threads,
1803 install_rpath : rootlibexecdir,
1805 public_programs += exe
1807 meson.add_install_script(meson_make_symlink,
1808 join_paths(bindir, 'resolvectl'),
1809 join_paths(rootsbindir, 'resolvconf'))
1811 meson.add_install_script(meson_make_symlink,
1812 join_paths(bindir, 'resolvectl'),
1813 join_paths(bindir, 'systemd-resolve'))
1816 if conf.get('ENABLE_LOGIND') == 1
1817 executable('systemd-logind',
1818 systemd_logind_sources,
1819 include_directories : includes,
1820 link_with : [liblogind_core,
1822 dependencies : [threads,
1824 install_rpath : rootlibexecdir,
1826 install_dir : rootlibexecdir)
1828 exe = executable('loginctl',
1830 include_directories : includes,
1831 link_with : [libshared],
1832 dependencies : [threads,
1835 install_rpath : rootlibexecdir,
1837 install_dir : rootbindir)
1838 public_programs += exe
1840 exe = executable('systemd-inhibit',
1841 'src/login/inhibit.c',
1842 include_directories : includes,
1843 link_with : [libshared],
1844 install_rpath : rootlibexecdir,
1846 install_dir : rootbindir)
1847 public_programs += exe
1849 if conf.get('HAVE_PAM') == 1
1850 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1851 pam_systemd = shared_library(
1855 include_directories : includes,
1856 link_args : ['-shared',
1857 '-Wl,--version-script=' + version_script_arg],
1858 link_with : [libsystemd_static,
1860 dependencies : [threads,
1863 link_depends : pam_systemd_sym,
1865 install_dir : pamlibdir)
1867 if want_tests != 'false'
1868 test('dlopen-pam_systemd',
1870 # path to dlopen must include a slash
1871 args : pam_systemd.full_path())
1875 executable('systemd-user-runtime-dir',
1876 user_runtime_dir_sources,
1877 include_directories : includes,
1878 link_with : [libshared],
1879 install_rpath : rootlibexecdir,
1881 install_dir : rootlibexecdir)
1884 if conf.get('HAVE_PAM') == 1
1885 executable('systemd-user-sessions',
1886 'src/user-sessions/user-sessions.c',
1887 include_directories : includes,
1888 link_with : [libshared],
1889 install_rpath : rootlibexecdir,
1891 install_dir : rootlibexecdir)
1894 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1895 exe = executable('bootctl',
1896 'src/boot/bootctl.c',
1897 include_directories : includes,
1898 link_with : [libshared],
1899 dependencies : [libblkid],
1900 install_rpath : rootlibexecdir,
1902 public_programs += exe
1904 executable('systemd-bless-boot',
1905 'src/boot/bless-boot.c',
1906 include_directories : includes,
1907 link_with : [libshared],
1908 dependencies : [libblkid],
1909 install_rpath : rootlibexecdir,
1911 install_dir : rootlibexecdir)
1913 executable('systemd-bless-boot-generator',
1914 'src/boot/bless-boot-generator.c',
1915 include_directories : includes,
1916 link_with : [libshared],
1917 install_rpath : rootlibexecdir,
1919 install_dir : systemgeneratordir)
1922 executable('systemd-boot-check-no-failures',
1923 'src/boot/boot-check-no-failures.c',
1924 include_directories : includes,
1925 link_with : [libshared],
1926 dependencies : [libblkid],
1927 install_rpath : rootlibexecdir,
1929 install_dir : rootlibexecdir)
1931 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1932 include_directories : includes,
1933 link_with : [libshared],
1934 dependencies : [threads],
1935 install_rpath : rootlibexecdir,
1937 public_programs += exe
1940 if get_option('link-systemctl-shared')
1941 systemctl_link_with = [libshared]
1943 systemctl_link_with = [libsystemd_static,
1949 exe = executable('systemctl',
1950 'src/systemctl/systemctl.c',
1951 'src/systemctl/sysv-compat.h',
1952 'src/systemctl/sysv-compat.c',
1953 include_directories : includes,
1954 link_with : systemctl_link_with,
1955 dependencies : [threads,
1960 install_rpath : rootlibexecdir,
1962 install_dir : rootbindir)
1963 public_programs += exe
1965 if conf.get('ENABLE_PORTABLED') == 1
1966 executable('systemd-portabled',
1967 systemd_portabled_sources,
1968 include_directories : includes,
1969 link_with : [libshared],
1970 dependencies : [threads],
1971 install_rpath : rootlibexecdir,
1973 install_dir : rootlibexecdir)
1975 exe = executable('portablectl', 'src/portable/portablectl.c',
1976 include_directories : includes,
1977 link_with : [libshared],
1978 dependencies : [threads],
1979 install_rpath : rootlibexecdir,
1981 install_dir : rootbindir)
1982 public_programs += exe
1985 if conf.get('ENABLE_USERDB') == 1
1986 executable('systemd-userwork',
1987 systemd_userwork_sources,
1988 include_directories : includes,
1989 link_with : [libshared],
1990 dependencies : [threads],
1991 install_rpath : rootlibexecdir,
1993 install_dir : rootlibexecdir)
1995 executable('systemd-userdbd',
1996 systemd_userdbd_sources,
1997 include_directories : includes,
1998 link_with : [libshared],
1999 dependencies : [threads],
2000 install_rpath : rootlibexecdir,
2002 install_dir : rootlibexecdir)
2004 executable('userdbctl',
2006 include_directories : includes,
2007 link_with : [libshared],
2008 dependencies : [threads],
2009 install_rpath : rootlibexecdir,
2011 install_dir : rootbindir)
2014 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
2015 meson.add_install_script(meson_make_symlink,
2016 join_paths(rootbindir, 'systemctl'),
2017 join_paths(rootsbindir, alias))
2020 if conf.get('ENABLE_BACKLIGHT') == 1
2021 executable('systemd-backlight',
2022 'src/backlight/backlight.c',
2023 include_directories : includes,
2024 link_with : [libshared],
2025 install_rpath : rootlibexecdir,
2027 install_dir : rootlibexecdir)
2030 if conf.get('ENABLE_RFKILL') == 1
2031 executable('systemd-rfkill',
2032 'src/rfkill/rfkill.c',
2033 include_directories : includes,
2034 link_with : [libshared],
2035 install_rpath : rootlibexecdir,
2037 install_dir : rootlibexecdir)
2040 executable('systemd-system-update-generator',
2041 'src/system-update-generator/system-update-generator.c',
2042 include_directories : includes,
2043 link_with : [libshared],
2044 install_rpath : rootlibexecdir,
2046 install_dir : systemgeneratordir)
2048 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2049 systemd_cryptsetup_sources = files('''
2050 src/cryptsetup/cryptsetup.c
2051 src/cryptsetup/cryptsetup-pkcs11.h
2054 if conf.get('HAVE_P11KIT') == 1
2055 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2058 executable('systemd-cryptsetup',
2059 systemd_cryptsetup_sources,
2060 include_directories : includes,
2061 link_with : [libshared],
2062 dependencies : [libcryptsetup,
2064 install_rpath : rootlibexecdir,
2066 install_dir : rootlibexecdir)
2068 executable('systemd-cryptsetup-generator',
2069 'src/cryptsetup/cryptsetup-generator.c',
2070 include_directories : includes,
2071 link_with : [libshared],
2072 dependencies : [libcryptsetup],
2073 install_rpath : rootlibexecdir,
2075 install_dir : systemgeneratordir)
2077 executable('systemd-veritysetup',
2078 'src/veritysetup/veritysetup.c',
2079 include_directories : includes,
2080 link_with : [libshared],
2081 dependencies : [libcryptsetup],
2082 install_rpath : rootlibexecdir,
2084 install_dir : rootlibexecdir)
2086 executable('systemd-veritysetup-generator',
2087 'src/veritysetup/veritysetup-generator.c',
2088 include_directories : includes,
2089 link_with : [libshared],
2090 dependencies : [libcryptsetup],
2091 install_rpath : rootlibexecdir,
2093 install_dir : systemgeneratordir)
2096 if conf.get('HAVE_SYSV_COMPAT') == 1
2097 executable('systemd-sysv-generator',
2098 'src/sysv-generator/sysv-generator.c',
2099 include_directories : includes,
2100 link_with : [libshared],
2101 install_rpath : rootlibexecdir,
2103 install_dir : systemgeneratordir)
2105 executable('systemd-rc-local-generator',
2106 'src/rc-local-generator/rc-local-generator.c',
2107 include_directories : includes,
2108 link_with : [libshared],
2109 install_rpath : rootlibexecdir,
2111 install_dir : systemgeneratordir)
2114 if conf.get('ENABLE_HOSTNAMED') == 1
2115 executable('systemd-hostnamed',
2116 'src/hostname/hostnamed.c',
2117 include_directories : includes,
2118 link_with : [libshared],
2119 install_rpath : rootlibexecdir,
2121 install_dir : rootlibexecdir)
2123 exe = executable('hostnamectl',
2124 'src/hostname/hostnamectl.c',
2125 include_directories : includes,
2126 link_with : [libshared],
2127 install_rpath : rootlibexecdir,
2129 public_programs += exe
2132 if conf.get('ENABLE_LOCALED') == 1
2133 if conf.get('HAVE_XKBCOMMON') == 1
2134 # logind will load libxkbcommon.so dynamically on its own
2140 executable('systemd-localed',
2141 systemd_localed_sources,
2142 include_directories : includes,
2143 link_with : [libshared],
2144 dependencies : deps,
2145 install_rpath : rootlibexecdir,
2147 install_dir : rootlibexecdir)
2149 exe = executable('localectl',
2151 include_directories : includes,
2152 link_with : [libshared],
2153 install_rpath : rootlibexecdir,
2155 public_programs += exe
2158 if conf.get('ENABLE_TIMEDATED') == 1
2159 executable('systemd-timedated',
2160 'src/timedate/timedated.c',
2161 include_directories : includes,
2162 link_with : [libshared],
2163 install_rpath : rootlibexecdir,
2165 install_dir : rootlibexecdir)
2168 if conf.get('ENABLE_TIMEDATECTL') == 1
2169 exe = executable('timedatectl',
2170 'src/timedate/timedatectl.c',
2171 include_directories : includes,
2172 install_rpath : rootlibexecdir,
2173 link_with : [libshared],
2174 dependencies : [libm],
2176 public_programs += exe
2179 if conf.get('ENABLE_TIMESYNCD') == 1
2180 executable('systemd-timesyncd',
2181 systemd_timesyncd_sources,
2182 include_directories : includes,
2183 link_with : [libshared],
2184 dependencies : [threads,
2186 install_rpath : rootlibexecdir,
2188 install_dir : rootlibexecdir)
2190 executable('systemd-time-wait-sync',
2191 'src/time-wait-sync/time-wait-sync.c',
2192 include_directories : includes,
2193 link_with : [libshared],
2194 install_rpath : rootlibexecdir,
2196 install_dir : rootlibexecdir)
2199 if conf.get('ENABLE_MACHINED') == 1
2200 executable('systemd-machined',
2201 systemd_machined_sources,
2202 include_directories : includes,
2203 link_with : [libmachine_core,
2205 install_rpath : rootlibexecdir,
2207 install_dir : rootlibexecdir)
2209 exe = executable('machinectl',
2210 'src/machine/machinectl.c',
2211 include_directories : includes,
2212 link_with : [libshared],
2213 dependencies : [threads,
2216 install_rpath : rootlibexecdir,
2218 install_dir : rootbindir)
2219 public_programs += exe
2222 if conf.get('ENABLE_IMPORTD') == 1
2223 executable('systemd-importd',
2224 systemd_importd_sources,
2225 include_directories : includes,
2226 link_with : [libshared],
2227 dependencies : [threads],
2228 install_rpath : rootlibexecdir,
2230 install_dir : rootlibexecdir)
2232 systemd_pull = executable('systemd-pull',
2233 systemd_pull_sources,
2234 include_directories : includes,
2235 link_with : [libshared],
2236 dependencies : [versiondep,
2242 install_rpath : rootlibexecdir,
2244 install_dir : rootlibexecdir)
2246 systemd_import = executable('systemd-import',
2247 systemd_import_sources,
2248 include_directories : includes,
2249 link_with : [libshared],
2250 dependencies : [libcurl,
2254 install_rpath : rootlibexecdir,
2256 install_dir : rootlibexecdir)
2258 systemd_import_fs = executable('systemd-import-fs',
2259 systemd_import_fs_sources,
2260 include_directories : includes,
2261 link_with : [libshared],
2262 install_rpath : rootlibexecdir,
2264 install_dir : rootlibexecdir)
2266 systemd_export = executable('systemd-export',
2267 systemd_export_sources,
2268 include_directories : includes,
2269 link_with : [libshared],
2270 dependencies : [libcurl,
2274 install_rpath : rootlibexecdir,
2276 install_dir : rootlibexecdir)
2278 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2281 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2282 exe = executable('systemd-journal-upload',
2283 systemd_journal_upload_sources,
2284 include_directories : includes,
2285 link_with : [libshared],
2286 dependencies : [versiondep,
2292 install_rpath : rootlibexecdir,
2294 install_dir : rootlibexecdir)
2295 public_programs += exe
2298 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2299 s_j_remote = executable('systemd-journal-remote',
2300 systemd_journal_remote_sources,
2301 include_directories : includes,
2302 link_with : [libshared,
2303 libsystemd_journal_remote],
2304 dependencies : [threads,
2309 install_rpath : rootlibexecdir,
2311 install_dir : rootlibexecdir)
2313 s_j_gatewayd = executable('systemd-journal-gatewayd',
2314 systemd_journal_gatewayd_sources,
2315 include_directories : includes,
2316 link_with : [libshared],
2317 dependencies : [threads,
2322 install_rpath : rootlibexecdir,
2324 install_dir : rootlibexecdir)
2325 public_programs += [s_j_remote, s_j_gatewayd]
2328 if conf.get('ENABLE_COREDUMP') == 1
2329 executable('systemd-coredump',
2330 systemd_coredump_sources,
2331 include_directories : includes,
2332 link_with : [libshared],
2333 dependencies : [threads,
2338 install_rpath : rootlibexecdir,
2340 install_dir : rootlibexecdir)
2342 exe = executable('coredumpctl',
2343 coredumpctl_sources,
2344 include_directories : includes,
2345 link_with : [libshared],
2346 dependencies : [threads,
2349 install_rpath : rootlibexecdir,
2351 public_programs += exe
2354 if conf.get('ENABLE_PSTORE') == 1
2355 executable('systemd-pstore',
2356 systemd_pstore_sources,
2357 include_directories : includes,
2358 link_with : [libshared],
2359 dependencies : [threads,
2364 install_rpath : rootlibexecdir,
2366 install_dir : rootlibexecdir)
2369 if conf.get('ENABLE_BINFMT') == 1
2370 exe = executable('systemd-binfmt',
2371 'src/binfmt/binfmt.c',
2372 include_directories : includes,
2373 link_with : [libshared],
2374 install_rpath : rootlibexecdir,
2376 install_dir : rootlibexecdir)
2377 public_programs += exe
2379 meson.add_install_script('sh', '-c',
2380 mkdir_p.format(binfmtdir))
2381 meson.add_install_script('sh', '-c',
2382 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2385 if conf.get('ENABLE_VCONSOLE') == 1
2386 executable('systemd-vconsole-setup',
2387 'src/vconsole/vconsole-setup.c',
2388 include_directories : includes,
2389 link_with : [libshared],
2390 install_rpath : rootlibexecdir,
2392 install_dir : rootlibexecdir)
2395 if conf.get('ENABLE_RANDOMSEED') == 1
2396 executable('systemd-random-seed',
2397 'src/random-seed/random-seed.c',
2398 include_directories : includes,
2399 link_with : [libshared],
2400 install_rpath : rootlibexecdir,
2402 install_dir : rootlibexecdir)
2405 if conf.get('ENABLE_FIRSTBOOT') == 1
2406 executable('systemd-firstboot',
2407 'src/firstboot/firstboot.c',
2408 include_directories : includes,
2409 link_with : [libshared],
2410 dependencies : [libcrypt],
2411 install_rpath : rootlibexecdir,
2413 install_dir : rootbindir)
2416 executable('systemd-remount-fs',
2417 'src/remount-fs/remount-fs.c',
2418 include_directories : includes,
2419 link_with : [libcore_shared,
2421 install_rpath : rootlibexecdir,
2423 install_dir : rootlibexecdir)
2425 executable('systemd-machine-id-setup',
2426 'src/machine-id-setup/machine-id-setup-main.c',
2427 include_directories : includes,
2428 link_with : [libcore_shared,
2430 install_rpath : rootlibexecdir,
2432 install_dir : rootbindir)
2434 executable('systemd-fsck',
2436 include_directories : includes,
2437 link_with : [libshared],
2438 install_rpath : rootlibexecdir,
2440 install_dir : rootlibexecdir)
2442 executable('systemd-growfs',
2443 'src/partition/growfs.c',
2444 include_directories : includes,
2445 link_with : [libshared],
2446 dependencies : [libcryptsetup],
2447 install_rpath : rootlibexecdir,
2449 install_dir : rootlibexecdir)
2451 executable('systemd-makefs',
2452 'src/partition/makefs.c',
2453 include_directories : includes,
2454 link_with : [libshared],
2455 install_rpath : rootlibexecdir,
2457 install_dir : rootlibexecdir)
2459 executable('systemd-sleep',
2460 'src/sleep/sleep.c',
2461 include_directories : includes,
2462 link_with : [libshared],
2463 install_rpath : rootlibexecdir,
2465 install_dir : rootlibexecdir)
2467 install_data('src/sleep/sleep.conf',
2468 install_dir : pkgsysconfdir)
2470 exe = executable('systemd-sysctl',
2471 'src/sysctl/sysctl.c',
2472 include_directories : includes,
2473 link_with : [libshared],
2474 install_rpath : rootlibexecdir,
2476 install_dir : rootlibexecdir)
2477 public_programs += exe
2479 executable('systemd-ac-power',
2480 'src/ac-power/ac-power.c',
2481 include_directories : includes,
2482 link_with : [libshared],
2483 install_rpath : rootlibexecdir,
2485 install_dir : rootlibexecdir)
2487 exe = executable('systemd-detect-virt',
2488 'src/detect-virt/detect-virt.c',
2489 include_directories : includes,
2490 link_with : [libshared],
2491 install_rpath : rootlibexecdir,
2493 public_programs += exe
2495 exe = executable('systemd-delta',
2496 'src/delta/delta.c',
2497 include_directories : includes,
2498 link_with : [libshared],
2499 install_rpath : rootlibexecdir,
2501 public_programs += exe
2503 exe = executable('systemd-escape',
2504 'src/escape/escape.c',
2505 include_directories : includes,
2506 link_with : [libshared],
2507 install_rpath : rootlibexecdir,
2509 install_dir : rootbindir)
2510 public_programs += exe
2512 exe = executable('systemd-notify',
2513 'src/notify/notify.c',
2514 include_directories : includes,
2515 link_with : [libshared],
2516 install_rpath : rootlibexecdir,
2518 install_dir : rootbindir)
2519 public_programs += exe
2521 executable('systemd-volatile-root',
2522 'src/volatile-root/volatile-root.c',
2523 include_directories : includes,
2524 link_with : [libshared],
2525 install_rpath : rootlibexecdir,
2527 install_dir : rootlibexecdir)
2529 executable('systemd-cgroups-agent',
2530 'src/cgroups-agent/cgroups-agent.c',
2531 include_directories : includes,
2532 link_with : [libshared],
2533 install_rpath : rootlibexecdir,
2535 install_dir : rootlibexecdir)
2537 exe = executable('systemd-id128',
2538 'src/id128/id128.c',
2539 include_directories : includes,
2540 link_with : [libshared],
2541 install_rpath : rootlibexecdir,
2543 public_programs += exe
2545 exe = executable('systemd-path',
2547 include_directories : includes,
2548 link_with : [libshared],
2549 install_rpath : rootlibexecdir,
2551 public_programs += exe
2553 exe = executable('systemd-ask-password',
2554 'src/ask-password/ask-password.c',
2555 include_directories : includes,
2556 link_with : [libshared],
2557 install_rpath : rootlibexecdir,
2559 install_dir : rootbindir)
2560 public_programs += exe
2562 executable('systemd-reply-password',
2563 'src/reply-password/reply-password.c',
2564 include_directories : includes,
2565 link_with : [libshared],
2566 install_rpath : rootlibexecdir,
2568 install_dir : rootlibexecdir)
2570 exe = executable('systemd-tty-ask-password-agent',
2571 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2572 include_directories : includes,
2573 link_with : [libshared],
2574 install_rpath : rootlibexecdir,
2576 install_dir : rootbindir)
2577 public_programs += exe
2579 exe = executable('systemd-cgls',
2581 include_directories : includes,
2582 link_with : [libshared],
2583 install_rpath : rootlibexecdir,
2585 public_programs += exe
2587 exe = executable('systemd-cgtop',
2588 'src/cgtop/cgtop.c',
2589 include_directories : includes,
2590 link_with : [libshared],
2591 install_rpath : rootlibexecdir,
2593 public_programs += exe
2595 executable('systemd-initctl',
2596 'src/initctl/initctl.c',
2597 include_directories : includes,
2598 link_with : [libshared],
2599 install_rpath : rootlibexecdir,
2601 install_dir : rootlibexecdir)
2603 exe = executable('systemd-mount',
2604 'src/mount/mount-tool.c',
2605 include_directories : includes,
2606 link_with : [libshared],
2607 dependencies: [libmount],
2608 install_rpath : rootlibexecdir,
2610 public_programs += exe
2612 meson.add_install_script(meson_make_symlink,
2613 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2615 exe = executable('systemd-run',
2617 include_directories : includes,
2618 link_with : [libshared],
2619 install_rpath : rootlibexecdir,
2621 public_programs += exe
2623 exe = executable('systemd-stdio-bridge',
2624 'src/stdio-bridge/stdio-bridge.c',
2625 include_directories : includes,
2626 link_with : [libshared],
2627 dependencies : [versiondep],
2628 install_rpath : rootlibexecdir,
2630 public_programs += exe
2632 exe = executable('busctl',
2633 'src/busctl/busctl.c',
2634 'src/busctl/busctl-introspect.c',
2635 'src/busctl/busctl-introspect.h',
2636 include_directories : includes,
2637 link_with : [libshared],
2638 install_rpath : rootlibexecdir,
2640 public_programs += exe
2642 if conf.get('ENABLE_SYSUSERS') == 1
2643 exe = executable('systemd-sysusers',
2644 'src/sysusers/sysusers.c',
2645 include_directories : includes,
2646 link_with : [libshared],
2647 install_rpath : rootlibexecdir,
2649 install_dir : rootbindir)
2650 public_programs += exe
2653 if conf.get('ENABLE_TMPFILES') == 1
2654 exe = executable('systemd-tmpfiles',
2655 'src/tmpfiles/tmpfiles.c',
2656 include_directories : includes,
2657 link_with : [libshared],
2658 dependencies : [libacl],
2659 install_rpath : rootlibexecdir,
2661 install_dir : rootbindir)
2662 public_programs += exe
2664 if want_tests != 'false'
2665 test('test-systemd-tmpfiles',
2666 test_systemd_tmpfiles_py,
2667 # https://github.com/mesonbuild/meson/issues/2681
2668 args : exe.full_path())
2672 if conf.get('ENABLE_HWDB') == 1
2673 exe = executable('systemd-hwdb',
2675 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2676 include_directories : includes,
2677 link_with : [libudev_static],
2678 install_rpath : udev_rpath,
2680 install_dir : rootbindir)
2681 public_programs += exe
2684 if conf.get('ENABLE_QUOTACHECK') == 1
2685 executable('systemd-quotacheck',
2686 'src/quotacheck/quotacheck.c',
2687 include_directories : includes,
2688 link_with : [libshared],
2689 install_rpath : rootlibexecdir,
2691 install_dir : rootlibexecdir)
2694 exe = executable('systemd-socket-proxyd',
2695 'src/socket-proxy/socket-proxyd.c',
2696 include_directories : includes,
2697 link_with : [libshared],
2698 dependencies : [threads],
2699 install_rpath : rootlibexecdir,
2701 install_dir : rootlibexecdir)
2702 public_programs += exe
2704 exe = executable('systemd-udevd',
2705 systemd_udevd_sources,
2706 include_directories : includes,
2707 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2708 link_with : [libudev_core,
2711 dependencies : [versiondep,
2717 install_rpath : udev_rpath,
2719 install_dir : rootlibexecdir)
2720 public_programs += exe
2722 exe = executable('udevadm',
2724 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2725 include_directories : includes,
2726 link_with : [libudev_core,
2729 dependencies : [versiondep,
2735 install_rpath : udev_rpath,
2737 install_dir : rootbindir)
2738 public_programs += exe
2740 executable('systemd-shutdown',
2741 systemd_shutdown_sources,
2742 include_directories : includes,
2743 link_with : [libcore_shared,
2745 dependencies : [libmount],
2746 install_rpath : rootlibexecdir,
2748 install_dir : rootlibexecdir)
2750 executable('systemd-update-done',
2751 'src/update-done/update-done.c',
2752 include_directories : includes,
2753 link_with : [libshared],
2754 install_rpath : rootlibexecdir,
2756 install_dir : rootlibexecdir)
2758 executable('systemd-update-utmp',
2759 'src/update-utmp/update-utmp.c',
2760 include_directories : includes,
2761 link_with : [libshared],
2762 dependencies : [libaudit],
2763 install_rpath : rootlibexecdir,
2765 install_dir : rootlibexecdir)
2767 if conf.get('HAVE_KMOD') == 1
2768 executable('systemd-modules-load',
2769 'src/modules-load/modules-load.c',
2770 include_directories : includes,
2771 link_with : [libshared],
2772 dependencies : [libkmod],
2773 install_rpath : rootlibexecdir,
2775 install_dir : rootlibexecdir)
2777 meson.add_install_script('sh', '-c',
2778 mkdir_p.format(modulesloaddir))
2779 meson.add_install_script('sh', '-c',
2780 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2783 exe = executable('systemd-nspawn',
2784 systemd_nspawn_sources,
2785 include_directories : includes,
2786 link_with : [libcore_shared,
2789 dependencies : [libblkid,
2791 install_rpath : rootlibexecdir,
2793 public_programs += exe
2795 if conf.get('ENABLE_NETWORKD') == 1
2796 executable('systemd-networkd',
2797 systemd_networkd_sources,
2798 include_directories : network_include_dir,
2799 link_with : [libnetworkd_core,
2802 networkd_link_with],
2803 dependencies : [threads],
2804 install_rpath : rootlibexecdir,
2806 install_dir : rootlibexecdir)
2808 executable('systemd-networkd-wait-online',
2809 systemd_networkd_wait_online_sources,
2810 include_directories : includes,
2811 link_with : [libnetworkd_core,
2812 networkd_link_with],
2813 install_rpath : rootlibexecdir,
2815 install_dir : rootlibexecdir)
2817 exe = executable('networkctl',
2819 include_directories : includes,
2820 link_with : [libsystemd_network,
2821 networkd_link_with],
2822 install_rpath : rootlibexecdir,
2824 install_dir : rootbindir)
2825 public_programs += exe
2827 executable('systemd-network-generator',
2828 network_generator_sources,
2829 include_directories : includes,
2830 link_with : [networkd_link_with],
2831 install_rpath : rootlibexecdir,
2833 install_dir : rootlibexecdir)
2836 executable('systemd-sulogin-shell',
2837 ['src/sulogin-shell/sulogin-shell.c'],
2838 include_directories : includes,
2839 link_with : [libshared],
2840 install_rpath : rootlibexecdir,
2842 install_dir : rootlibexecdir)
2844 ############################################################
2847 'systemd-runtest.env',
2848 output : 'systemd-runtest.env',
2849 command : ['sh', '-c', '{ ' +
2850 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2851 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2853 build_by_default : true)
2855 foreach tuple : tests
2857 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2858 dependencies = tuple[2]
2859 condition = tuple.length() >= 4 ? tuple[3] : ''
2860 type = tuple.length() >= 5 ? tuple[4] : ''
2861 defs = tuple.length() >= 6 ? tuple[5] : []
2862 incs = tuple.length() >= 7 ? tuple[6] : includes
2865 name = sources[0].split('/')[-1].split('.')[0]
2866 if type.startswith('timeout=')
2867 timeout = type.split('=')[1].to_int()
2871 if condition == '' or conf.get(condition) == 1
2875 include_directories : incs,
2876 link_with : link_with,
2877 dependencies : [versiondep,
2880 build_by_default : want_tests != 'false',
2881 install_rpath : rootlibexecdir,
2882 install : install_tests,
2883 install_dir : join_paths(testsdir, type))
2886 message('@0@ is a manual test'.format(name))
2887 elif type == 'unsafe' and want_tests != 'unsafe'
2888 message('@0@ is an unsafe test'.format(name))
2889 elif want_tests != 'false'
2895 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2900 'test-libsystemd-sym',
2901 test_libsystemd_sym_c,
2902 include_directories : includes,
2903 link_with : [libsystemd],
2904 build_by_default : want_tests != 'false',
2905 install : install_tests,
2906 install_dir : testsdir)
2907 if want_tests != 'false'
2908 test('test-libsystemd-sym', exe)
2912 'test-libsystemd-static-sym',
2913 test_libsystemd_sym_c,
2914 include_directories : includes,
2915 link_with : [install_libsystemd_static],
2916 dependencies : [threads], # threads is already included in dependencies on the library,
2917 # but does not seem to get propagated. Add here as a work-around.
2918 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2919 install : install_tests and static_libsystemd_pic,
2920 install_dir : testsdir)
2921 if want_tests != 'false' and static_libsystemd_pic
2922 test('test-libsystemd-static-sym', exe)
2928 include_directories : includes,
2929 c_args : '-Wno-deprecated-declarations',
2930 link_with : [libudev],
2931 build_by_default : want_tests != 'false',
2932 install : install_tests,
2933 install_dir : testsdir)
2934 if want_tests != 'false'
2935 test('test-libudev-sym', exe)
2939 'test-libudev-static-sym',
2941 include_directories : includes,
2942 c_args : '-Wno-deprecated-declarations',
2943 link_with : [install_libudev_static],
2944 build_by_default : want_tests != 'false' and static_libudev_pic,
2945 install : install_tests and static_libudev_pic,
2946 install_dir : testsdir)
2947 if want_tests != 'false' and static_libudev_pic
2948 test('test-libudev-static-sym', exe)
2951 ############################################################
2955 if get_option('tests') != 'false'
2956 foreach tuple : fuzzers
2958 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2959 dependencies = tuple[2]
2960 defs = tuple.length() >= 4 ? tuple[3] : []
2961 incs = tuple.length() >= 5 ? tuple[4] : includes
2964 if want_ossfuzz or want_fuzzbuzz
2965 dependencies += fuzzing_engine
2967 if fuzzing_engine.found()
2968 dependencies += fuzzing_engine
2970 link_args += ['-fsanitize=fuzzer']
2973 sources += 'src/fuzz/fuzz-main.c'
2977 sources += 'src/fuzz/fuzzer-entry-point.c'
2980 name = sources[0].split('/')[-1].split('.')[0]
2982 fuzzer_exes += executable(
2985 include_directories : [incs, include_directories('src/fuzz')],
2986 link_with : link_with,
2987 dependencies : dependencies,
2989 link_args: link_args,
2994 run_target('fuzzers',
2995 depends : fuzzer_exes,
2998 ############################################################
3000 make_directive_index_py = find_program('tools/make-directive-index.py')
3001 make_man_index_py = find_program('tools/make-man-index.py')
3002 xml_helper_py = find_program('tools/xml_helper.py')
3003 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
3004 autosuspend_update_sh = find_program('tools/meson-autosuspend-update.sh')
3007 subdir('sysusers.d')
3008 subdir('tmpfiles.d')
3014 subdir('shell-completion/bash')
3015 subdir('shell-completion/zsh')
3016 subdir('docs/sysvinit')
3017 subdir('docs/var-log')
3019 install_subdir('factory/etc',
3020 install_dir : factorydir)
3022 install_data('xorg/50-systemd-user.sh',
3023 install_dir : xinitrcdir)
3024 install_data('modprobe.d/systemd.conf',
3025 install_dir : modprobedir)
3026 install_data('LICENSE.GPL2',
3030 'docs/CODING_STYLE.md',
3031 'docs/DISTRO_PORTING.md',
3032 'docs/ENVIRONMENT.md',
3034 'docs/TRANSIENT-SETTINGS.md',
3035 'docs/TRANSLATORS.md',
3036 'docs/UIDS-GIDS.md',
3037 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3038 install_dir : docdir)
3040 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3041 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3043 ############################################################
3045 meson_check_help = find_program('tools/meson-check-help.sh')
3047 foreach exec : public_programs
3048 name = exec.full_path().split('/')[-1]
3049 if want_tests != 'false'
3050 test('check-help-' + name,
3052 args : exec.full_path())
3056 ############################################################
3058 check_directives_sh = find_program('tools/check-directives.sh')
3060 if want_tests != 'false'
3061 test('check-directives',
3062 check_directives_sh,
3063 args : project_source_root)
3066 ############################################################
3068 # Enable tests for all supported sanitizers
3069 foreach tuple : sanitizers
3070 sanitizer = tuple[0]
3073 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3075 foreach p : fuzz_regression_tests
3076 b = p.split('/')[-2]
3077 c = p.split('/')[-1]
3079 name = '@0@:@1@'.format(b, sanitizer)
3082 if want_tests == 'false'
3083 message('Not compiling @0@ because tests is set to false'.format(name))
3085 exe = custom_target(
3089 command : [env, 'ln', '-fs',
3090 join_paths(build.full_path(), b),
3092 build_by_default : true)
3094 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3099 if want_tests != 'false' and slow_tests
3100 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3102 args : [exe.full_path(),
3103 join_paths(project_source_root, p)])
3110 ############################################################
3113 all_files = run_command(
3115 ['--git-dir=@0@/.git'.format(project_source_root),
3118 all_files = files(all_files.stdout().split())
3123 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3126 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3130 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3133 command : [meson_git_contrib_sh])
3137 git_head = run_command(
3139 ['--git-dir=@0@/.git'.format(project_source_root),
3140 'rev-parse', 'HEAD']).stdout().strip()
3141 git_head_short = run_command(
3143 ['--git-dir=@0@/.git'.format(project_source_root),
3144 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3148 command : ['git', 'archive',
3149 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3151 '--prefix', 'systemd-@0@/'.format(git_head),
3155 ############################################################
3157 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3160 depends : [man, libsystemd, libudev],
3161 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3163 ############################################################
3164 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3167 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3169 'split /usr: @0@'.format(split_usr),
3170 'split bin-sbin: @0@'.format(split_bin),
3171 'prefix directory: @0@'.format(prefixdir),
3172 'rootprefix directory: @0@'.format(rootprefixdir),
3173 'sysconf directory: @0@'.format(sysconfdir),
3174 'include directory: @0@'.format(includedir),
3175 'lib directory: @0@'.format(libdir),
3176 'rootlib directory: @0@'.format(rootlibdir),
3177 'SysV init scripts: @0@'.format(sysvinit_path),
3178 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3179 'PAM modules directory: @0@'.format(pamlibdir),
3180 'PAM configuration directory: @0@'.format(pamconfdir),
3181 'RPM macros directory: @0@'.format(rpmmacrosdir),
3182 'modprobe.d directory: @0@'.format(modprobedir),
3183 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3184 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3185 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3186 'bash completions directory: @0@'.format(bashcompletiondir),
3187 'zsh completions directory: @0@'.format(zshcompletiondir),
3188 'extra start script: @0@'.format(get_option('rc-local')),
3189 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3190 get_option('debug-tty')),
3191 'TTY GID: @0@'.format(tty_gid),
3192 'users GID: @0@'.format(substs.get('USERS_GID')),
3193 'maximum system UID: @0@'.format(system_uid_max),
3194 'maximum system GID: @0@'.format(system_gid_max),
3195 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3196 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3197 'minimum container UID base: @0@'.format(container_uid_base_min),
3198 'maximum container UID base: @0@'.format(container_uid_base_max),
3199 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3200 'render group access mode: @0@'.format(get_option('group-render-mode')),
3201 'certificate root directory: @0@'.format(get_option('certificate-root')),
3202 'support URL: @0@'.format(support_url),
3203 'nobody user name: @0@'.format(nobody_user),
3204 'nobody group name: @0@'.format(nobody_group),
3205 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3206 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3208 'default DNSSEC mode: @0@'.format(default_dnssec),
3209 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3210 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3211 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3212 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3213 'default locale: @0@'.format(default_locale),
3214 'default user $PATH: @0@'.format(default_user_path_display),
3215 'systemd service watchdog: @0@'.format(watchdog_opt)]
3217 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3218 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3220 'default DNS servers: @0@'.format(alt_dns_servers),
3221 'default NTP servers: @0@'.format(alt_ntp_servers)]
3223 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3224 '@@0@'.format(time_epoch)).stdout().strip()
3226 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3229 'static libsystemd: @0@'.format(static_libsystemd),
3230 'static libudev: @0@'.format(static_libudev)]
3233 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3234 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3235 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3237 if conf.get('ENABLE_EFI') == 1
3238 status += 'efi arch: @0@'.format(efi_arch)
3242 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3243 'EFI CC @0@'.format(' '.join(efi_cc)),
3244 'EFI lib directory: @0@'.format(efi_libdir),
3245 'EFI lds directory: @0@'.format(efi_ldsdir),
3246 'EFI include directory: @0@'.format(efi_incdir)]
3300 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3301 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3305 ['legacy pkla', install_polkit_pkla],
3307 ['gnu-efi', have_gnu_efi],
3320 ['man pages', want_man],
3321 ['html pages', want_html],
3322 ['man page indices', want_man and have_lxml],
3327 ['adm group', get_option('adm-group')],
3328 ['wheel group', get_option('wheel-group')],
3331 ['debug mmap cache'],
3333 ['valgrind', conf.get('VALGRIND') == 1],
3334 ['trace logging', conf.get('LOG_TRACE') == 1],
3335 ['link-udev-shared', get_option('link-udev-shared')],
3336 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3337 ['link-networkd-shared', get_option('link-networkd-shared')],
3340 if tuple.length() >= 2
3343 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3344 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3345 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3356 'enabled features: @0@'.format(', '.join(found)),
3358 'disabled features: @0@'.format(', '.join(missing)),
3360 message('\n '.join(status))
3362 if rootprefixdir != rootprefix_default
3364 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3365 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3366 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))