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('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
285 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
286 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
287 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
288 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
289 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
290 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
291 substs.set('BUILD_ROOT', meson.current_build_dir())
293 #####################################################################
295 cc = meson.get_compiler('c')
296 pkgconfig = import('pkgconfig')
297 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
298 meson_build_sh = find_program('tools/meson-build.sh')
300 want_tests = get_option('tests')
301 slow_tests = want_tests != 'false' and get_option('slow-tests')
302 install_tests = get_option('install-tests')
304 if add_languages('cpp', required : fuzzer_build)
305 # Used only for tests
306 cxx = meson.get_compiler('cpp')
307 cxx_cmd = ' '.join(cxx.cmd_array())
313 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
314 if fuzzing_engine.found()
315 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
316 elif cc.has_argument('-fsanitize=fuzzer-no-link')
317 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
319 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
322 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
324 fuzzing_engine = meson.get_compiler('cpp').find_library(get_option('fuzzbuzz-engine'), dirs: get_option('fuzzbuzz-engine-dir'))
327 # Those generate many false positives, and we do not want to change the code to
329 basic_disabled_warnings = [
330 '-Wno-unused-parameter',
331 '-Wno-missing-field-initializers',
332 '-Wno-unused-result',
333 '-Wno-format-signedness',
335 if get_option('b_ndebug') == 'true'
336 # With asserts disabled with get a bunch of warnings about variables which
337 # are used only in the asserts. This is not useful at all, so let's just silence
339 basic_disabled_warnings += [
340 '-Wno-unused-variable',
341 '-Wno-unused-but-set-variable',
345 possible_cc_flags = [
348 '-Wmissing-include-dirs',
349 '-Wold-style-definition',
353 '-Wsuggest-attribute=noreturn',
354 '-Werror=missing-prototypes',
355 '-Werror=implicit-function-declaration',
356 '-Werror=missing-declarations',
357 '-Werror=return-type',
358 '-Werror=incompatible-pointer-types',
360 '-Wstrict-prototypes',
362 '-Wmissing-noreturn',
363 '-Wimplicit-fallthrough=5',
366 '-Wstrict-aliasing=2',
369 '-Werror=shift-count-overflow',
370 '-Werror=shift-overflow=2',
374 # negative arguments are correctly detected starting with meson 0.46.
375 '-Wno-error=#warnings', # clang
376 '-Wno-string-plus-int', # clang
378 # work-around for gcc 7.1 turning this on on its own.
379 '-Wno-error=nonnull',
381 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
382 # optimizations enabled, producing essentially false positives.
383 '-Wno-maybe-uninitialized',
387 '-fdiagnostics-show-option',
388 '-fno-strict-aliasing',
389 '-fvisibility=hidden',
391 '-fstack-protector-strong',
392 '--param=ssp-buffer-size=4',
395 # --as-needed and --no-undefined are provided by meson by default,
396 # run mesonconf to see what is enabled
397 possible_link_flags = [
403 if cc.get_id() == 'clang'
404 possible_cc_flags += [
405 '-Wno-typedef-redefinition',
406 '-Wno-gnu-variable-sized-type-not-at-end',
410 if get_option('buildtype') != 'debug'
411 possible_cc_flags += [
412 '-ffunction-sections',
416 possible_link_flags += '-Wl,--gc-sections'
419 add_project_arguments(cc.get_supported_arguments(basic_disabled_warnings), language : 'c')
420 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
421 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
425 #include <inttypes.h>
426 typedef uint64_t usec_t;
427 usec_t now(clockid_t clock);
432 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
433 add_project_arguments('-Werror=shadow', language : 'c')
437 add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp')
440 cpp = ' '.join(cc.cmd_array()) + ' -E'
442 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
444 #####################################################################
445 # compilation result tests
447 conf.set('_GNU_SOURCE', true)
448 conf.set('__SANE_USERSPACE_TYPES__', true)
449 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
451 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
452 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
453 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
454 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
455 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
456 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
457 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
461 #include <sys/stat.h>
464 foreach decl : ['char16_t',
469 # We get -1 if the size cannot be determined
470 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
472 if decl == 'struct statx'
474 want_linux_stat_h = false
476 have = cc.sizeof(decl,
477 prefix : decl_headers + '#include <linux/stat.h>',
478 args : '-D_GNU_SOURCE') > 0
479 want_linux_stat_h = have
483 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
486 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
488 foreach ident : ['secure_getenv', '__secure_getenv']
489 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
493 ['memfd_create', '''#include <sys/mman.h>'''],
494 ['gettid', '''#include <sys/types.h>
495 #include <unistd.h>'''],
496 ['pivot_root', '''#include <stdlib.h>
497 #include <unistd.h>'''], # no known header declares pivot_root
498 ['name_to_handle_at', '''#include <sys/types.h>
499 #include <sys/stat.h>
500 #include <fcntl.h>'''],
501 ['setns', '''#include <sched.h>'''],
502 ['renameat2', '''#include <stdio.h>
503 #include <fcntl.h>'''],
504 ['kcmp', '''#include <linux/kcmp.h>'''],
505 ['keyctl', '''#include <sys/types.h>
506 #include <keyutils.h>'''],
507 ['copy_file_range', '''#include <sys/syscall.h>
508 #include <unistd.h>'''],
509 ['bpf', '''#include <sys/syscall.h>
510 #include <unistd.h>'''],
511 ['statx', '''#include <sys/types.h>
512 #include <sys/stat.h>
513 #include <unistd.h>'''],
514 ['explicit_bzero' , '''#include <string.h>'''],
515 ['reallocarray', '''#include <malloc.h>'''],
516 ['set_mempolicy', '''#include <stdlib.h>
517 #include <unistd.h>'''],
518 ['get_mempolicy', '''#include <stdlib.h>
519 #include <unistd.h>'''],
520 ['pidfd_send_signal', '''#include <stdlib.h>
523 #include <sys/wait.h>'''],
524 ['pidfd_open', '''#include <stdlib.h>
527 #include <sys/wait.h>'''],
528 ['rt_sigqueueinfo', '''#include <stdlib.h>
531 #include <sys/wait.h>'''],
534 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
535 conf.set10('HAVE_' + ident[0].to_upper(), have)
538 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
539 conf.set10('USE_SYS_RANDOM_H', true)
540 conf.set10('HAVE_GETRANDOM', true)
542 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
543 conf.set10('USE_SYS_RANDOM_H', false)
544 conf.set10('HAVE_GETRANDOM', have)
547 #####################################################################
549 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
551 get_option('version-tag'),
552 meson.project_version()]
555 input : 'src/version/version.h.in',
556 output : 'version.h',
559 versiondep = declare_dependency(sources: version_h)
561 sed = find_program('sed')
562 awk = find_program('awk')
563 m4 = find_program('m4')
564 stat = find_program('stat')
565 git = find_program('git', required : false)
566 env = find_program('env')
567 perl = find_program('perl', required : false)
569 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
570 mkdir_p = 'mkdir -p $DESTDIR/@0@'
571 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
572 splash_bmp = files('test/splash.bmp')
574 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
575 # /usr/sbin, /sbin, and fall back to the default from middle column.
576 progs = [['quotaon', '/usr/sbin/quotaon' ],
577 ['quotacheck', '/usr/sbin/quotacheck' ],
578 ['kmod', '/usr/bin/kmod' ],
579 ['kexec', '/usr/sbin/kexec' ],
580 ['sulogin', '/usr/sbin/sulogin' ],
581 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
582 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
583 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
584 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
585 ['nologin', '/usr/sbin/nologin', ],
588 path = get_option(prog[0] + '-path')
590 message('Using @1@ for @0@'.format(prog[0], path))
592 exe = find_program(prog[0],
593 '/usr/sbin/' + prog[0],
596 path = exe.found() ? exe.path() : prog[1]
598 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
599 conf.set_quoted(name, path)
600 substs.set(name, path)
603 conf.set_quoted('TELINIT', get_option('telinit-path'))
605 if run_command('ln', '--relative', '--help').returncode() != 0
606 error('ln does not support --relative (added in coreutils 8.16)')
609 ############################################################
611 gperf = find_program('gperf')
613 gperf_test_format = '''
615 const char * in_word_set(const char *, @0@);
618 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
619 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
620 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
621 if cc.compiles(gperf_test)
622 gperf_len_type = 'size_t'
624 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
625 if cc.compiles(gperf_test)
626 gperf_len_type = 'unsigned'
628 error('unable to determine gperf len type')
631 message('gperf len type is @0@'.format(gperf_len_type))
632 conf.set('GPERF_LEN_TYPE', gperf_len_type,
633 description : 'The type of gperf "len" parameter')
635 ############################################################
637 if not cc.has_header('sys/capability.h')
638 error('POSIX caps headers not found')
640 foreach header : ['crypt.h',
642 'linux/vm_sockets.h',
644 'valgrind/memcheck.h',
645 'valgrind/valgrind.h',
648 conf.set10('HAVE_' + header.underscorify().to_upper(),
649 cc.has_header(header))
652 ############################################################
654 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
655 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
656 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
658 default_hierarchy = get_option('default-hierarchy')
659 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
660 description : 'default cgroup hierarchy as string')
661 if default_hierarchy == 'legacy'
662 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
663 elif default_hierarchy == 'hybrid'
664 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
666 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
669 default_net_naming_scheme = get_option('default-net-naming-scheme')
670 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
672 time_epoch = get_option('time-epoch')
675 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
677 conf.set('TIME_EPOCH', time_epoch)
679 system_uid_max = get_option('system-uid-max')
680 if system_uid_max == -1
681 system_uid_max = run_command(
683 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
684 '/etc/login.defs').stdout().strip()
685 if system_uid_max == ''
688 system_uid_max = system_uid_max.to_int()
691 conf.set('SYSTEM_UID_MAX', system_uid_max)
692 substs.set('systemuidmax', system_uid_max)
694 system_gid_max = get_option('system-gid-max')
695 if system_gid_max == -1
696 system_gid_max = run_command(
698 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
699 '/etc/login.defs').stdout().strip()
700 if system_gid_max == ''
703 system_gid_max = system_gid_max.to_int()
706 conf.set('SYSTEM_GID_MAX', system_gid_max)
707 substs.set('systemgidmax', system_gid_max)
709 dynamic_uid_min = get_option('dynamic-uid-min')
710 dynamic_uid_max = get_option('dynamic-uid-max')
711 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
712 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
713 substs.set('dynamicuidmin', dynamic_uid_min)
714 substs.set('dynamicuidmax', dynamic_uid_max)
716 container_uid_base_min = get_option('container-uid-base-min')
717 container_uid_base_max = get_option('container-uid-base-max')
718 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
719 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
720 substs.set('containeruidbasemin', container_uid_base_min)
721 substs.set('containeruidbasemax', container_uid_base_max)
723 nobody_user = get_option('nobody-user')
724 nobody_group = get_option('nobody-group')
726 if not meson.is_cross_build()
727 getent_result = run_command('getent', 'passwd', '65534')
728 if getent_result.returncode() == 0
729 name = getent_result.stdout().split(':')[0]
730 if name != nobody_user
732 'The local user with the UID 65534 does not match the configured user name "@0@" of the nobody user (its name is @1@).\n'.format(nobody_user, name) +
733 'Your build will result in an user table setup that is incompatible with the local system.')
736 id_result = run_command('id', '-u', nobody_user)
737 if id_result.returncode() == 0
738 id = id_result.stdout().to_int()
741 'The local user with the configured user name "@0@" of the nobody user does not have UID 65534 (it has @1@).\n'.format(nobody_user, id) +
742 'Your build will result in an user table setup that is incompatible with the local system.')
746 getent_result = run_command('getent', 'group', '65534')
747 if getent_result.returncode() == 0
748 name = getent_result.stdout().split(':')[0]
749 if name != nobody_group
751 'The local group with the GID 65534 does not match the configured group name "@0@" of the nobody group (its name is @1@).\n'.format(nobody_group, name) +
752 'Your build will result in an group table setup that is incompatible with the local system.')
755 id_result = run_command('id', '-g', nobody_group)
756 if id_result.returncode() == 0
757 id = id_result.stdout().to_int()
760 'The local group with the configured group name "@0@" of the nobody group does not have UID 65534 (it has @1@).\n'.format(nobody_group, id) +
761 'Your build will result in an group table setup that is incompatible with the local system.')
765 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
767 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
768 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
771 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
772 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
773 substs.set('NOBODY_USER_NAME', nobody_user)
774 substs.set('NOBODY_GROUP_NAME', nobody_group)
776 tty_gid = get_option('tty-gid')
777 conf.set('TTY_GID', tty_gid)
778 substs.set('TTY_GID', tty_gid)
780 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
781 users_gid = get_option('users-gid')
782 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
784 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
785 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
787 dev_kvm_mode = get_option('dev-kvm-mode')
788 substs.set('DEV_KVM_MODE', dev_kvm_mode)
789 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
790 group_render_mode = get_option('group-render-mode')
791 substs.set('GROUP_RENDER_MODE', group_render_mode)
792 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
794 kill_user_processes = get_option('default-kill-user-processes')
795 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
796 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
797 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
799 dns_servers = get_option('dns-servers')
800 conf.set_quoted('DNS_SERVERS', dns_servers)
801 substs.set('DNS_SERVERS', dns_servers)
803 ntp_servers = get_option('ntp-servers')
804 conf.set_quoted('NTP_SERVERS', ntp_servers)
805 substs.set('NTP_SERVERS', ntp_servers)
807 default_locale = get_option('default-locale')
808 if default_locale == ''
809 if not meson.is_cross_build()
810 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
811 default_locale = run_command(choose_default_locale_sh).stdout().strip()
813 default_locale = 'C.UTF-8'
816 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
818 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
820 service_watchdog = get_option('service-watchdog')
821 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
822 substs.set('SERVICE_WATCHDOG', watchdog_value)
824 substs.set('SUSHELL', get_option('debug-shell'))
825 substs.set('DEBUGTTY', get_option('debug-tty'))
826 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
828 enable_debug_hashmap = false
829 enable_debug_mmap_cache = false
830 enable_debug_siphash = false
831 foreach name : get_option('debug-extra')
833 enable_debug_hashmap = true
834 elif name == 'mmap-cache'
835 enable_debug_mmap_cache = true
836 elif name == 'siphash'
837 enable_debug_siphash = true
839 message('unknown debug option "@0@", ignoring'.format(name))
842 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
843 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
844 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
846 conf.set10('VALGRIND', get_option('valgrind'))
847 conf.set10('LOG_TRACE', get_option('log-trace'))
849 default_user_path = get_option('user-path')
850 if default_user_path != ''
851 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
852 default_user_path_display = default_user_path
854 # meson 0.49 fails when ?: is used in .format()
855 default_user_path_display = '(same as system services)'
859 #####################################################################
861 threads = dependency('threads')
862 librt = cc.find_library('rt')
863 libm = cc.find_library('m')
864 libdl = cc.find_library('dl')
865 libcrypt = cc.find_library('crypt')
867 libcap = dependency('libcap', required : false)
868 if not libcap.found()
869 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
870 libcap = cc.find_library('cap')
873 libmount = dependency('mount',
874 version : fuzzer_build ? '>= 0' : '>= 2.30')
876 want_seccomp = get_option('seccomp')
877 if want_seccomp != 'false' and not skip_deps
878 libseccomp = dependency('libseccomp',
879 version : '>= 2.3.1',
880 required : want_seccomp == 'true')
881 have = libseccomp.found()
886 conf.set10('HAVE_SECCOMP', have)
888 want_selinux = get_option('selinux')
889 if want_selinux != 'false' and not skip_deps
890 libselinux = dependency('libselinux',
891 version : '>= 2.1.9',
892 required : want_selinux == 'true')
893 have = libselinux.found()
898 conf.set10('HAVE_SELINUX', have)
900 want_apparmor = get_option('apparmor')
901 if want_apparmor != 'false' and not skip_deps
902 libapparmor = dependency('libapparmor',
903 required : want_apparmor == 'true')
904 have = libapparmor.found()
909 conf.set10('HAVE_APPARMOR', have)
911 smack_run_label = get_option('smack-run-label')
912 if smack_run_label != ''
913 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
916 want_polkit = get_option('polkit')
917 install_polkit = false
918 install_polkit_pkla = false
919 if want_polkit != 'false' and not skip_deps
920 install_polkit = true
922 libpolkit = dependency('polkit-gobject-1',
924 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
925 message('Old polkit detected, will install pkla files')
926 install_polkit_pkla = true
929 conf.set10('ENABLE_POLKIT', install_polkit)
931 want_acl = get_option('acl')
932 if want_acl != 'false' and not skip_deps
933 libacl = cc.find_library('acl', required : want_acl == 'true')
934 have = libacl.found()
939 conf.set10('HAVE_ACL', have)
941 want_audit = get_option('audit')
942 if want_audit != 'false' and not skip_deps
943 libaudit = dependency('audit', required : want_audit == 'true')
944 have = libaudit.found()
949 conf.set10('HAVE_AUDIT', have)
951 want_blkid = get_option('blkid')
952 if want_blkid != 'false' and not skip_deps
953 libblkid = dependency('blkid', required : want_blkid == 'true')
954 have = libblkid.found()
959 conf.set10('HAVE_BLKID', have)
961 want_kmod = get_option('kmod')
962 if want_kmod != 'false' and not skip_deps
963 libkmod = dependency('libkmod',
965 required : want_kmod == 'true')
966 have = libkmod.found()
971 conf.set10('HAVE_KMOD', have)
973 want_pam = get_option('pam')
974 if want_pam != 'false' and not skip_deps
975 libpam = cc.find_library('pam', required : want_pam == 'true')
976 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
977 have = libpam.found() and libpam_misc.found()
983 conf.set10('HAVE_PAM', have)
985 want_microhttpd = get_option('microhttpd')
986 if want_microhttpd != 'false' and not skip_deps
987 libmicrohttpd = dependency('libmicrohttpd',
988 version : '>= 0.9.33',
989 required : want_microhttpd == 'true')
990 have = libmicrohttpd.found()
995 conf.set10('HAVE_MICROHTTPD', have)
997 want_libcryptsetup = get_option('libcryptsetup')
998 if want_libcryptsetup != 'false' and not skip_deps
999 libcryptsetup = dependency('libcryptsetup',
1000 version : '>= 2.0.1',
1001 required : want_libcryptsetup == 'true')
1002 have = libcryptsetup.found()
1007 conf.set10('HAVE_LIBCRYPTSETUP', have)
1009 want_libcurl = get_option('libcurl')
1010 if want_libcurl != 'false' and not skip_deps
1011 libcurl = dependency('libcurl',
1012 version : '>= 7.32.0',
1013 required : want_libcurl == 'true')
1014 have = libcurl.found()
1019 conf.set10('HAVE_LIBCURL', have)
1021 want_libidn = get_option('libidn')
1022 want_libidn2 = get_option('libidn2')
1023 if want_libidn == 'true' and want_libidn2 == 'true'
1024 error('libidn and libidn2 cannot be requested simultaneously')
1027 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1028 libidn = dependency('libidn2',
1029 required : want_libidn2 == 'true')
1030 have = libidn.found()
1035 conf.set10('HAVE_LIBIDN2', have)
1036 if not have and want_libidn != 'false' and not skip_deps
1037 # libidn is used for both libidn and libidn2 objects
1038 libidn = dependency('libidn',
1039 required : want_libidn == 'true')
1040 have = libidn.found()
1044 conf.set10('HAVE_LIBIDN', have)
1046 want_libiptc = get_option('libiptc')
1047 if want_libiptc != 'false' and not skip_deps
1048 libiptc = dependency('libiptc',
1049 required : want_libiptc == 'true')
1050 have = libiptc.found()
1055 conf.set10('HAVE_LIBIPTC', have)
1057 want_qrencode = get_option('qrencode')
1058 if want_qrencode != 'false' and not skip_deps
1059 libqrencode = dependency('libqrencode',
1060 required : want_qrencode == 'true')
1061 have = libqrencode.found()
1066 conf.set10('HAVE_QRENCODE', have)
1068 want_gcrypt = get_option('gcrypt')
1069 if want_gcrypt != 'false' and not skip_deps
1070 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1071 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1072 have = libgcrypt.found() and libgpg_error.found()
1077 # link to neither of the libs if one is not found
1081 conf.set10('HAVE_GCRYPT', have)
1083 want_gnutls = get_option('gnutls')
1084 if want_gnutls != 'false' and not skip_deps
1085 libgnutls = dependency('gnutls',
1086 version : '>= 3.1.4',
1087 required : want_gnutls == 'true')
1088 have = libgnutls.found()
1093 conf.set10('HAVE_GNUTLS', have)
1095 want_openssl = get_option('openssl')
1096 if want_openssl != 'false' and not skip_deps
1097 libopenssl = dependency('openssl',
1098 version : '>= 1.1.0',
1099 required : want_openssl == 'true')
1100 have = libopenssl.found()
1105 conf.set10('HAVE_OPENSSL', have)
1107 want_p11kit = get_option('p11kit')
1108 if want_p11kit != 'false' and not skip_deps
1109 libp11kit = dependency('p11-kit-1',
1110 version : '>= 0.23.3',
1111 required : want_p11kit == 'true')
1112 have = libp11kit.found()
1117 conf.set10('HAVE_P11KIT', have)
1119 want_elfutils = get_option('elfutils')
1120 if want_elfutils != 'false' and not skip_deps
1121 libdw = dependency('libdw',
1122 required : want_elfutils == 'true')
1123 have = libdw.found()
1128 conf.set10('HAVE_ELFUTILS', have)
1130 want_zlib = get_option('zlib')
1131 if want_zlib != 'false' and not skip_deps
1132 libz = dependency('zlib',
1133 required : want_zlib == 'true')
1139 conf.set10('HAVE_ZLIB', have)
1141 want_bzip2 = get_option('bzip2')
1142 if want_bzip2 != 'false' and not skip_deps
1143 libbzip2 = cc.find_library('bz2',
1144 required : want_bzip2 == 'true')
1145 have = libbzip2.found()
1150 conf.set10('HAVE_BZIP2', have)
1152 want_xz = get_option('xz')
1153 if want_xz != 'false' and not skip_deps
1154 libxz = dependency('liblzma',
1155 required : want_xz == 'true')
1156 have = libxz.found()
1161 conf.set10('HAVE_XZ', have)
1163 want_lz4 = get_option('lz4')
1164 if want_lz4 != 'false' and not skip_deps
1165 liblz4 = dependency('liblz4',
1166 version : '>= 1.3.0',
1167 required : want_lz4 == 'true')
1168 have = liblz4.found()
1173 conf.set10('HAVE_LZ4', have)
1175 want_xkbcommon = get_option('xkbcommon')
1176 if want_xkbcommon != 'false' and not skip_deps
1177 libxkbcommon = dependency('xkbcommon',
1178 version : '>= 0.3.0',
1179 required : want_xkbcommon == 'true')
1180 have = libxkbcommon.found()
1185 conf.set10('HAVE_XKBCOMMON', have)
1187 want_pcre2 = get_option('pcre2')
1188 if want_pcre2 != 'false'
1189 libpcre2 = dependency('libpcre2-8',
1190 required : want_pcre2 == 'true')
1191 have = libpcre2.found()
1196 conf.set10('HAVE_PCRE2', have)
1198 want_glib = get_option('glib')
1199 if want_glib != 'false' and not skip_deps
1200 libglib = dependency('glib-2.0',
1201 version : '>= 2.22.0',
1202 required : want_glib == 'true')
1203 libgobject = dependency('gobject-2.0',
1204 version : '>= 2.22.0',
1205 required : want_glib == 'true')
1206 libgio = dependency('gio-2.0',
1207 required : want_glib == 'true')
1208 have = libglib.found() and libgobject.found() and libgio.found()
1215 conf.set10('HAVE_GLIB', have)
1217 want_dbus = get_option('dbus')
1218 if want_dbus != 'false' and not skip_deps
1219 libdbus = dependency('dbus-1',
1220 version : '>= 1.3.2',
1221 required : want_dbus == 'true')
1222 have = libdbus.found()
1227 conf.set10('HAVE_DBUS', have)
1229 default_dnssec = get_option('default-dnssec')
1231 default_dnssec = 'no'
1233 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1234 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1235 default_dnssec = 'no'
1237 conf.set('DEFAULT_DNSSEC_MODE',
1238 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1239 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1241 dns_over_tls = get_option('dns-over-tls')
1242 if dns_over_tls != 'false'
1243 if dns_over_tls == 'openssl'
1246 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1247 if dns_over_tls == 'gnutls' and not have_gnutls
1248 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1251 if dns_over_tls == 'gnutls' or have_gnutls
1252 have_openssl = false
1254 have_openssl = conf.get('HAVE_OPENSSL') == 1
1255 if dns_over_tls != 'auto' and not have_openssl
1256 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1257 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1260 have = have_gnutls or have_openssl
1264 have_openssl = false
1266 conf.set10('ENABLE_DNS_OVER_TLS', have)
1267 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1268 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1270 default_dns_over_tls = get_option('default-dns-over-tls')
1272 default_dns_over_tls = 'no'
1274 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1275 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.')
1276 default_dns_over_tls = 'no'
1278 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1279 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1280 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1282 want_importd = get_option('importd')
1283 if want_importd != 'false'
1284 have = (conf.get('HAVE_LIBCURL') == 1 and
1285 conf.get('HAVE_ZLIB') == 1 and
1286 conf.get('HAVE_XZ') == 1 and
1287 conf.get('HAVE_GCRYPT') == 1)
1288 if want_importd == 'true' and not have
1289 error('importd support was requested, but dependencies are not available')
1294 conf.set10('ENABLE_IMPORTD', have)
1296 want_remote = get_option('remote')
1297 if want_remote != 'false'
1298 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1299 conf.get('HAVE_LIBCURL') == 1]
1300 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1301 # it's possible to build one without the other. Complain only if
1302 # support was explicitly requested. The auxiliary files like sysusers
1303 # config should be installed when any of the programs are built.
1304 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1305 error('remote support was requested, but dependencies are not available')
1307 have = have_deps[0] or have_deps[1]
1311 conf.set10('ENABLE_REMOTE', have)
1313 foreach term : ['utmp',
1347 have = get_option(term)
1348 name = 'ENABLE_' + term.underscorify().to_upper()
1349 conf.set10(name, have)
1352 foreach tuple : [['nss-mymachines', 'machined'],
1353 ['nss-resolve', 'resolve']]
1354 want = get_option(tuple[0])
1356 have = get_option(tuple[1])
1357 if want == 'true' and not have
1358 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1363 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1364 conf.set10(name, have)
1368 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1369 'ENABLE_NSS_MYMACHINES',
1370 'ENABLE_NSS_RESOLVE',
1371 'ENABLE_NSS_SYSTEMD']
1372 if conf.get(term) == 1
1376 conf.set10('ENABLE_NSS', enable_nss)
1378 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1383 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1385 #####################################################################
1387 if get_option('efi')
1388 efi_arch = host_machine.cpu_family()
1390 if efi_arch == 'x86'
1391 EFI_MACHINE_TYPE_NAME = 'ia32'
1392 gnu_efi_arch = 'ia32'
1393 elif efi_arch == 'x86_64'
1394 EFI_MACHINE_TYPE_NAME = 'x64'
1395 gnu_efi_arch = 'x86_64'
1396 elif efi_arch == 'arm'
1397 EFI_MACHINE_TYPE_NAME = 'arm'
1398 gnu_efi_arch = 'arm'
1399 elif efi_arch == 'aarch64'
1400 EFI_MACHINE_TYPE_NAME = 'aa64'
1401 gnu_efi_arch = 'aarch64'
1403 EFI_MACHINE_TYPE_NAME = ''
1408 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1410 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1414 conf.set10('ENABLE_EFI', have)
1416 #####################################################################
1418 config_h = configure_file(
1419 output : 'config.h',
1420 configuration : conf)
1422 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1424 includes = include_directories('src/basic',
1429 'src/journal-remote',
1433 'src/time-wait-sync',
1439 'src/libsystemd/sd-bus',
1440 'src/libsystemd/sd-device',
1441 'src/libsystemd/sd-event',
1442 'src/libsystemd/sd-hwdb',
1443 'src/libsystemd/sd-id128',
1444 'src/libsystemd/sd-netlink',
1445 'src/libsystemd/sd-network',
1446 'src/libsystemd/sd-resolve',
1447 'src/libsystemd-network',
1450 add_project_arguments('-include', 'config.h', language : 'c')
1452 generate_gperfs = find_program('tools/generate-gperfs.py')
1456 subdir('src/systemd')
1458 subdir('src/libsystemd')
1459 subdir('src/libsystemd-network')
1460 subdir('src/journal')
1463 libjournal_core = static_library(
1465 libjournal_core_sources,
1467 include_directories : includes,
1470 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1471 libsystemd = shared_library(
1474 version : libsystemd_version,
1475 include_directories : includes,
1476 link_args : ['-shared',
1477 '-Wl,--version-script=' + libsystemd_sym_path],
1478 link_with : [libbasic,
1480 link_whole : [libsystemd_static,
1482 dependencies : [threads,
1486 link_depends : libsystemd_sym,
1488 install_dir : rootlibdir)
1490 static_libsystemd = get_option('static-libsystemd')
1491 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1493 install_libsystemd_static = static_library(
1496 journal_client_sources,
1498 basic_gcrypt_sources,
1500 include_directories : includes,
1501 build_by_default : static_libsystemd != 'false',
1502 install : static_libsystemd != 'false',
1503 install_dir : rootlibdir,
1504 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1505 dependencies : [threads,
1514 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1516 #Generate autosuspend rules
1517 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1519 ############################################################
1521 # binaries that have --help and are intended for use by humans,
1522 # usually, but not always, installed in /bin.
1523 public_programs = []
1525 subdir('src/libudev')
1526 subdir('src/shared')
1528 subdir('src/shutdown')
1530 subdir('src/network')
1532 subdir('src/analyze')
1533 subdir('src/journal-remote')
1534 subdir('src/coredump')
1535 subdir('src/pstore')
1536 subdir('src/hostname')
1537 subdir('src/import')
1538 subdir('src/kernel-install')
1539 subdir('src/locale')
1540 subdir('src/machine')
1541 subdir('src/portable')
1542 subdir('src/userdb')
1543 subdir('src/nspawn')
1544 subdir('src/resolve')
1545 subdir('src/timedate')
1546 subdir('src/timesync')
1547 subdir('src/vconsole')
1548 subdir('src/boot/efi')
1555 ############################################################
1557 # only static linking apart from libdl, to make sure that the
1558 # module is linked to all libraries that it uses.
1559 test_dlopen = executable(
1563 include_directories : includes,
1564 link_with : [libbasic],
1565 dependencies : [libdl],
1566 build_by_default : want_tests != 'false')
1568 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1569 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h'],
1570 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1571 ['resolve', 'ENABLE_NSS_RESOLVE']]
1573 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1577 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1578 version_script_arg = join_paths(project_source_root, sym)
1580 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1581 if tuple.length() > 2
1582 sources += tuple[2].split()
1585 nss = shared_library(
1590 include_directories : includes,
1591 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1592 link_args : ['-Wl,-z,nodelete',
1594 '-Wl,--version-script=' + version_script_arg],
1595 link_with : [libsystemd_static,
1598 dependencies : [threads,
1602 install_dir : rootlibdir)
1604 # We cannot use shared_module because it does not support version suffix.
1605 # Unfortunately shared_library insists on creating the symlink…
1606 meson.add_install_script('sh', '-c',
1607 'rm $DESTDIR@0@/libnss_@1@.so'
1608 .format(rootlibdir, module))
1610 if want_tests != 'false'
1611 test('dlopen-nss_' + module,
1613 # path to dlopen must include a slash
1614 args : nss.full_path())
1619 ############################################################
1621 executable('systemd',
1623 include_directories : includes,
1624 link_with : [libcore,
1626 dependencies : [versiondep,
1633 install_rpath : rootlibexecdir,
1635 install_dir : rootlibexecdir)
1637 meson.add_install_script(meson_make_symlink,
1638 join_paths(rootlibexecdir, 'systemd'),
1639 join_paths(rootsbindir, 'init'))
1641 exe = executable('systemd-analyze',
1642 systemd_analyze_sources,
1643 include_directories : includes,
1644 link_with : [libcore,
1646 dependencies : [versiondep,
1653 install_rpath : rootlibexecdir,
1655 public_programs += exe
1657 executable('systemd-journald',
1658 systemd_journald_sources,
1659 include_directories : includes,
1660 link_with : [libjournal_core,
1662 dependencies : [threads,
1666 install_rpath : rootlibexecdir,
1668 install_dir : rootlibexecdir)
1670 exe = executable('systemd-cat',
1671 systemd_cat_sources,
1672 include_directories : includes,
1673 link_with : [libjournal_core,
1675 dependencies : [threads],
1676 install_rpath : rootlibexecdir,
1678 public_programs += exe
1680 exe = executable('journalctl',
1682 include_directories : includes,
1683 link_with : [libshared],
1684 dependencies : [threads,
1689 install_rpath : rootlibexecdir,
1691 install_dir : rootbindir)
1692 public_programs += exe
1694 executable('systemd-getty-generator',
1695 'src/getty-generator/getty-generator.c',
1696 include_directories : includes,
1697 link_with : [libshared],
1698 install_rpath : rootlibexecdir,
1700 install_dir : systemgeneratordir)
1702 executable('systemd-debug-generator',
1703 'src/debug-generator/debug-generator.c',
1704 include_directories : includes,
1705 link_with : [libshared],
1706 install_rpath : rootlibexecdir,
1708 install_dir : systemgeneratordir)
1710 executable('systemd-run-generator',
1711 'src/run-generator/run-generator.c',
1712 include_directories : includes,
1713 link_with : [libshared],
1714 install_rpath : rootlibexecdir,
1716 install_dir : systemgeneratordir)
1718 executable('systemd-fstab-generator',
1719 'src/fstab-generator/fstab-generator.c',
1720 include_directories : includes,
1721 link_with : [libcore_shared,
1723 install_rpath : rootlibexecdir,
1725 install_dir : systemgeneratordir)
1727 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1728 executable('30-systemd-environment-d-generator',
1729 'src/environment-d-generator/environment-d-generator.c',
1730 include_directories : includes,
1731 link_with : [libshared],
1732 install_rpath : rootlibexecdir,
1734 install_dir : userenvgeneratordir)
1736 meson.add_install_script(meson_make_symlink,
1737 join_paths(sysconfdir, 'environment'),
1738 join_paths(environmentdir, '99-environment.conf'))
1741 if conf.get('ENABLE_HIBERNATE') == 1
1742 executable('systemd-hibernate-resume-generator',
1743 'src/hibernate-resume/hibernate-resume-generator.c',
1744 include_directories : includes,
1745 link_with : [libshared],
1746 install_rpath : rootlibexecdir,
1748 install_dir : systemgeneratordir)
1750 executable('systemd-hibernate-resume',
1751 'src/hibernate-resume/hibernate-resume.c',
1752 include_directories : includes,
1753 link_with : [libshared],
1754 install_rpath : rootlibexecdir,
1756 install_dir : rootlibexecdir)
1759 if conf.get('HAVE_BLKID') == 1
1760 executable('systemd-gpt-auto-generator',
1761 'src/gpt-auto-generator/gpt-auto-generator.c',
1762 'src/shared/blkid-util.h',
1763 include_directories : includes,
1764 link_with : [libshared],
1765 dependencies : libblkid,
1766 install_rpath : rootlibexecdir,
1768 install_dir : systemgeneratordir)
1770 exe = executable('systemd-dissect',
1771 'src/dissect/dissect.c',
1772 include_directories : includes,
1773 link_with : [libshared],
1774 install_rpath : rootlibexecdir,
1776 install_dir : rootlibexecdir)
1777 public_programs += exe
1780 if conf.get('ENABLE_RESOLVE') == 1
1781 executable('systemd-resolved',
1782 systemd_resolved_sources,
1783 include_directories : includes,
1784 link_with : [libshared,
1786 libsystemd_resolve_core],
1787 dependencies : systemd_resolved_dependencies,
1788 install_rpath : rootlibexecdir,
1790 install_dir : rootlibexecdir)
1792 exe = executable('resolvectl',
1794 include_directories : includes,
1795 link_with : [libshared,
1797 libsystemd_resolve_core],
1798 dependencies : [threads,
1802 install_rpath : rootlibexecdir,
1804 public_programs += exe
1806 meson.add_install_script(meson_make_symlink,
1807 join_paths(bindir, 'resolvectl'),
1808 join_paths(rootsbindir, 'resolvconf'))
1810 meson.add_install_script(meson_make_symlink,
1811 join_paths(bindir, 'resolvectl'),
1812 join_paths(bindir, 'systemd-resolve'))
1815 if conf.get('ENABLE_LOGIND') == 1
1816 executable('systemd-logind',
1817 systemd_logind_sources,
1818 include_directories : includes,
1819 link_with : [liblogind_core,
1821 dependencies : [threads,
1823 install_rpath : rootlibexecdir,
1825 install_dir : rootlibexecdir)
1827 exe = executable('loginctl',
1829 include_directories : includes,
1830 link_with : [libshared],
1831 dependencies : [threads,
1834 install_rpath : rootlibexecdir,
1836 install_dir : rootbindir)
1837 public_programs += exe
1839 exe = executable('systemd-inhibit',
1840 'src/login/inhibit.c',
1841 include_directories : includes,
1842 link_with : [libshared],
1843 install_rpath : rootlibexecdir,
1845 install_dir : rootbindir)
1846 public_programs += exe
1848 if conf.get('HAVE_PAM') == 1
1849 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1850 pam_systemd = shared_library(
1854 include_directories : includes,
1855 link_args : ['-shared',
1856 '-Wl,--version-script=' + version_script_arg],
1857 link_with : [libsystemd_static,
1859 dependencies : [threads,
1862 link_depends : pam_systemd_sym,
1864 install_dir : pamlibdir)
1866 if want_tests != 'false'
1867 test('dlopen-pam_systemd',
1869 # path to dlopen must include a slash
1870 args : pam_systemd.full_path())
1874 executable('systemd-user-runtime-dir',
1875 user_runtime_dir_sources,
1876 include_directories : includes,
1877 link_with : [libshared],
1878 install_rpath : rootlibexecdir,
1880 install_dir : rootlibexecdir)
1883 if conf.get('HAVE_PAM') == 1
1884 executable('systemd-user-sessions',
1885 'src/user-sessions/user-sessions.c',
1886 include_directories : includes,
1887 link_with : [libshared],
1888 install_rpath : rootlibexecdir,
1890 install_dir : rootlibexecdir)
1893 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1894 exe = executable('bootctl',
1895 'src/boot/bootctl.c',
1896 include_directories : includes,
1897 link_with : [libshared],
1898 dependencies : [libblkid],
1899 install_rpath : rootlibexecdir,
1901 public_programs += exe
1903 executable('systemd-bless-boot',
1904 'src/boot/bless-boot.c',
1905 include_directories : includes,
1906 link_with : [libshared],
1907 dependencies : [libblkid],
1908 install_rpath : rootlibexecdir,
1910 install_dir : rootlibexecdir)
1912 executable('systemd-bless-boot-generator',
1913 'src/boot/bless-boot-generator.c',
1914 include_directories : includes,
1915 link_with : [libshared],
1916 install_rpath : rootlibexecdir,
1918 install_dir : systemgeneratordir)
1921 executable('systemd-boot-check-no-failures',
1922 'src/boot/boot-check-no-failures.c',
1923 include_directories : includes,
1924 link_with : [libshared],
1925 dependencies : [libblkid],
1926 install_rpath : rootlibexecdir,
1928 install_dir : rootlibexecdir)
1930 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1931 include_directories : includes,
1932 link_with : [libshared],
1933 dependencies : [threads],
1934 install_rpath : rootlibexecdir,
1936 public_programs += exe
1939 if get_option('link-systemctl-shared')
1940 systemctl_link_with = [libshared]
1942 systemctl_link_with = [libsystemd_static,
1948 exe = executable('systemctl',
1949 'src/systemctl/systemctl.c',
1950 'src/systemctl/sysv-compat.h',
1951 'src/systemctl/sysv-compat.c',
1952 include_directories : includes,
1953 link_with : systemctl_link_with,
1954 dependencies : [threads,
1959 install_rpath : rootlibexecdir,
1961 install_dir : rootbindir)
1962 public_programs += exe
1964 if conf.get('ENABLE_PORTABLED') == 1
1965 executable('systemd-portabled',
1966 systemd_portabled_sources,
1967 include_directories : includes,
1968 link_with : [libshared],
1969 dependencies : [threads],
1970 install_rpath : rootlibexecdir,
1972 install_dir : rootlibexecdir)
1974 exe = executable('portablectl', 'src/portable/portablectl.c',
1975 include_directories : includes,
1976 link_with : [libshared],
1977 dependencies : [threads],
1978 install_rpath : rootlibexecdir,
1980 install_dir : rootbindir)
1981 public_programs += exe
1984 if conf.get('ENABLE_USERDB') == 1
1985 executable('systemd-userwork',
1986 systemd_userwork_sources,
1987 include_directories : includes,
1988 link_with : [libshared],
1989 dependencies : [threads],
1990 install_rpath : rootlibexecdir,
1992 install_dir : rootlibexecdir)
1994 executable('systemd-userdbd',
1995 systemd_userdbd_sources,
1996 include_directories : includes,
1997 link_with : [libshared],
1998 dependencies : [threads],
1999 install_rpath : rootlibexecdir,
2001 install_dir : rootlibexecdir)
2003 executable('userdbctl',
2005 include_directories : includes,
2006 link_with : [libshared],
2007 dependencies : [threads],
2008 install_rpath : rootlibexecdir,
2010 install_dir : rootbindir)
2013 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
2014 meson.add_install_script(meson_make_symlink,
2015 join_paths(rootbindir, 'systemctl'),
2016 join_paths(rootsbindir, alias))
2019 if conf.get('ENABLE_BACKLIGHT') == 1
2020 executable('systemd-backlight',
2021 'src/backlight/backlight.c',
2022 include_directories : includes,
2023 link_with : [libshared],
2024 install_rpath : rootlibexecdir,
2026 install_dir : rootlibexecdir)
2029 if conf.get('ENABLE_RFKILL') == 1
2030 executable('systemd-rfkill',
2031 'src/rfkill/rfkill.c',
2032 include_directories : includes,
2033 link_with : [libshared],
2034 install_rpath : rootlibexecdir,
2036 install_dir : rootlibexecdir)
2039 executable('systemd-system-update-generator',
2040 'src/system-update-generator/system-update-generator.c',
2041 include_directories : includes,
2042 link_with : [libshared],
2043 install_rpath : rootlibexecdir,
2045 install_dir : systemgeneratordir)
2047 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2048 systemd_cryptsetup_sources = files('''
2049 src/cryptsetup/cryptsetup.c
2050 src/cryptsetup/cryptsetup-pkcs11.h
2053 if conf.get('HAVE_P11KIT') == 1
2054 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2057 executable('systemd-cryptsetup',
2058 systemd_cryptsetup_sources,
2059 include_directories : includes,
2060 link_with : [libshared],
2061 dependencies : [libcryptsetup,
2063 install_rpath : rootlibexecdir,
2065 install_dir : rootlibexecdir)
2067 executable('systemd-cryptsetup-generator',
2068 'src/cryptsetup/cryptsetup-generator.c',
2069 include_directories : includes,
2070 link_with : [libshared],
2071 dependencies : [libcryptsetup],
2072 install_rpath : rootlibexecdir,
2074 install_dir : systemgeneratordir)
2076 executable('systemd-veritysetup',
2077 'src/veritysetup/veritysetup.c',
2078 include_directories : includes,
2079 link_with : [libshared],
2080 dependencies : [libcryptsetup],
2081 install_rpath : rootlibexecdir,
2083 install_dir : rootlibexecdir)
2085 executable('systemd-veritysetup-generator',
2086 'src/veritysetup/veritysetup-generator.c',
2087 include_directories : includes,
2088 link_with : [libshared],
2089 dependencies : [libcryptsetup],
2090 install_rpath : rootlibexecdir,
2092 install_dir : systemgeneratordir)
2095 if conf.get('HAVE_SYSV_COMPAT') == 1
2096 executable('systemd-sysv-generator',
2097 'src/sysv-generator/sysv-generator.c',
2098 include_directories : includes,
2099 link_with : [libshared],
2100 install_rpath : rootlibexecdir,
2102 install_dir : systemgeneratordir)
2104 executable('systemd-rc-local-generator',
2105 'src/rc-local-generator/rc-local-generator.c',
2106 include_directories : includes,
2107 link_with : [libshared],
2108 install_rpath : rootlibexecdir,
2110 install_dir : systemgeneratordir)
2113 if conf.get('ENABLE_HOSTNAMED') == 1
2114 executable('systemd-hostnamed',
2115 'src/hostname/hostnamed.c',
2116 include_directories : includes,
2117 link_with : [libshared],
2118 install_rpath : rootlibexecdir,
2120 install_dir : rootlibexecdir)
2122 exe = executable('hostnamectl',
2123 'src/hostname/hostnamectl.c',
2124 include_directories : includes,
2125 link_with : [libshared],
2126 install_rpath : rootlibexecdir,
2128 public_programs += exe
2131 if conf.get('ENABLE_LOCALED') == 1
2132 if conf.get('HAVE_XKBCOMMON') == 1
2133 # logind will load libxkbcommon.so dynamically on its own
2139 executable('systemd-localed',
2140 systemd_localed_sources,
2141 include_directories : includes,
2142 link_with : [libshared],
2143 dependencies : deps,
2144 install_rpath : rootlibexecdir,
2146 install_dir : rootlibexecdir)
2148 exe = executable('localectl',
2150 include_directories : includes,
2151 link_with : [libshared],
2152 install_rpath : rootlibexecdir,
2154 public_programs += exe
2157 if conf.get('ENABLE_TIMEDATED') == 1
2158 executable('systemd-timedated',
2159 'src/timedate/timedated.c',
2160 include_directories : includes,
2161 link_with : [libshared],
2162 install_rpath : rootlibexecdir,
2164 install_dir : rootlibexecdir)
2167 if conf.get('ENABLE_TIMEDATECTL') == 1
2168 exe = executable('timedatectl',
2169 'src/timedate/timedatectl.c',
2170 include_directories : includes,
2171 install_rpath : rootlibexecdir,
2172 link_with : [libshared],
2173 dependencies : [libm],
2175 public_programs += exe
2178 if conf.get('ENABLE_TIMESYNCD') == 1
2179 executable('systemd-timesyncd',
2180 systemd_timesyncd_sources,
2181 include_directories : includes,
2182 link_with : [libshared],
2183 dependencies : [threads,
2185 install_rpath : rootlibexecdir,
2187 install_dir : rootlibexecdir)
2189 executable('systemd-time-wait-sync',
2190 'src/time-wait-sync/time-wait-sync.c',
2191 include_directories : includes,
2192 link_with : [libshared],
2193 install_rpath : rootlibexecdir,
2195 install_dir : rootlibexecdir)
2198 if conf.get('ENABLE_MACHINED') == 1
2199 executable('systemd-machined',
2200 systemd_machined_sources,
2201 include_directories : includes,
2202 link_with : [libmachine_core,
2204 install_rpath : rootlibexecdir,
2206 install_dir : rootlibexecdir)
2208 exe = executable('machinectl',
2209 'src/machine/machinectl.c',
2210 include_directories : includes,
2211 link_with : [libshared],
2212 dependencies : [threads,
2215 install_rpath : rootlibexecdir,
2217 install_dir : rootbindir)
2218 public_programs += exe
2221 if conf.get('ENABLE_IMPORTD') == 1
2222 executable('systemd-importd',
2223 systemd_importd_sources,
2224 include_directories : includes,
2225 link_with : [libshared],
2226 dependencies : [threads],
2227 install_rpath : rootlibexecdir,
2229 install_dir : rootlibexecdir)
2231 systemd_pull = executable('systemd-pull',
2232 systemd_pull_sources,
2233 include_directories : includes,
2234 link_with : [libshared],
2235 dependencies : [versiondep,
2241 install_rpath : rootlibexecdir,
2243 install_dir : rootlibexecdir)
2245 systemd_import = executable('systemd-import',
2246 systemd_import_sources,
2247 include_directories : includes,
2248 link_with : [libshared],
2249 dependencies : [libcurl,
2253 install_rpath : rootlibexecdir,
2255 install_dir : rootlibexecdir)
2257 systemd_import_fs = executable('systemd-import-fs',
2258 systemd_import_fs_sources,
2259 include_directories : includes,
2260 link_with : [libshared],
2261 install_rpath : rootlibexecdir,
2263 install_dir : rootlibexecdir)
2265 systemd_export = executable('systemd-export',
2266 systemd_export_sources,
2267 include_directories : includes,
2268 link_with : [libshared],
2269 dependencies : [libcurl,
2273 install_rpath : rootlibexecdir,
2275 install_dir : rootlibexecdir)
2277 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2280 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2281 exe = executable('systemd-journal-upload',
2282 systemd_journal_upload_sources,
2283 include_directories : includes,
2284 link_with : [libshared],
2285 dependencies : [versiondep,
2291 install_rpath : rootlibexecdir,
2293 install_dir : rootlibexecdir)
2294 public_programs += exe
2297 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2298 s_j_remote = executable('systemd-journal-remote',
2299 systemd_journal_remote_sources,
2300 include_directories : includes,
2301 link_with : [libshared,
2302 libsystemd_journal_remote],
2303 dependencies : [threads,
2308 install_rpath : rootlibexecdir,
2310 install_dir : rootlibexecdir)
2312 s_j_gatewayd = executable('systemd-journal-gatewayd',
2313 systemd_journal_gatewayd_sources,
2314 include_directories : includes,
2315 link_with : [libshared],
2316 dependencies : [threads,
2321 install_rpath : rootlibexecdir,
2323 install_dir : rootlibexecdir)
2324 public_programs += [s_j_remote, s_j_gatewayd]
2327 if conf.get('ENABLE_COREDUMP') == 1
2328 executable('systemd-coredump',
2329 systemd_coredump_sources,
2330 include_directories : includes,
2331 link_with : [libshared],
2332 dependencies : [threads,
2337 install_rpath : rootlibexecdir,
2339 install_dir : rootlibexecdir)
2341 exe = executable('coredumpctl',
2342 coredumpctl_sources,
2343 include_directories : includes,
2344 link_with : [libshared],
2345 dependencies : [threads,
2348 install_rpath : rootlibexecdir,
2350 public_programs += exe
2353 if conf.get('ENABLE_PSTORE') == 1
2354 executable('systemd-pstore',
2355 systemd_pstore_sources,
2356 include_directories : includes,
2357 link_with : [libshared],
2358 dependencies : [threads,
2363 install_rpath : rootlibexecdir,
2365 install_dir : rootlibexecdir)
2368 if conf.get('ENABLE_BINFMT') == 1
2369 exe = executable('systemd-binfmt',
2370 'src/binfmt/binfmt.c',
2371 include_directories : includes,
2372 link_with : [libshared],
2373 install_rpath : rootlibexecdir,
2375 install_dir : rootlibexecdir)
2376 public_programs += exe
2378 meson.add_install_script('sh', '-c',
2379 mkdir_p.format(binfmtdir))
2380 meson.add_install_script('sh', '-c',
2381 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2384 if conf.get('ENABLE_VCONSOLE') == 1
2385 executable('systemd-vconsole-setup',
2386 'src/vconsole/vconsole-setup.c',
2387 include_directories : includes,
2388 link_with : [libshared],
2389 install_rpath : rootlibexecdir,
2391 install_dir : rootlibexecdir)
2394 if conf.get('ENABLE_RANDOMSEED') == 1
2395 executable('systemd-random-seed',
2396 'src/random-seed/random-seed.c',
2397 include_directories : includes,
2398 link_with : [libshared],
2399 install_rpath : rootlibexecdir,
2401 install_dir : rootlibexecdir)
2404 if conf.get('ENABLE_FIRSTBOOT') == 1
2405 executable('systemd-firstboot',
2406 'src/firstboot/firstboot.c',
2407 include_directories : includes,
2408 link_with : [libshared],
2409 dependencies : [libcrypt],
2410 install_rpath : rootlibexecdir,
2412 install_dir : rootbindir)
2415 executable('systemd-remount-fs',
2416 'src/remount-fs/remount-fs.c',
2417 include_directories : includes,
2418 link_with : [libcore_shared,
2420 install_rpath : rootlibexecdir,
2422 install_dir : rootlibexecdir)
2424 executable('systemd-machine-id-setup',
2425 'src/machine-id-setup/machine-id-setup-main.c',
2426 include_directories : includes,
2427 link_with : [libcore_shared,
2429 install_rpath : rootlibexecdir,
2431 install_dir : rootbindir)
2433 executable('systemd-fsck',
2435 include_directories : includes,
2436 link_with : [libshared],
2437 install_rpath : rootlibexecdir,
2439 install_dir : rootlibexecdir)
2441 executable('systemd-growfs',
2442 'src/partition/growfs.c',
2443 include_directories : includes,
2444 link_with : [libshared],
2445 dependencies : [libcryptsetup],
2446 install_rpath : rootlibexecdir,
2448 install_dir : rootlibexecdir)
2450 executable('systemd-makefs',
2451 'src/partition/makefs.c',
2452 include_directories : includes,
2453 link_with : [libshared],
2454 install_rpath : rootlibexecdir,
2456 install_dir : rootlibexecdir)
2458 executable('systemd-sleep',
2459 'src/sleep/sleep.c',
2460 include_directories : includes,
2461 link_with : [libshared],
2462 install_rpath : rootlibexecdir,
2464 install_dir : rootlibexecdir)
2466 install_data('src/sleep/sleep.conf',
2467 install_dir : pkgsysconfdir)
2469 exe = executable('systemd-sysctl',
2470 'src/sysctl/sysctl.c',
2471 include_directories : includes,
2472 link_with : [libshared],
2473 install_rpath : rootlibexecdir,
2475 install_dir : rootlibexecdir)
2476 public_programs += exe
2478 executable('systemd-ac-power',
2479 'src/ac-power/ac-power.c',
2480 include_directories : includes,
2481 link_with : [libshared],
2482 install_rpath : rootlibexecdir,
2484 install_dir : rootlibexecdir)
2486 exe = executable('systemd-detect-virt',
2487 'src/detect-virt/detect-virt.c',
2488 include_directories : includes,
2489 link_with : [libshared],
2490 install_rpath : rootlibexecdir,
2492 public_programs += exe
2494 exe = executable('systemd-delta',
2495 'src/delta/delta.c',
2496 include_directories : includes,
2497 link_with : [libshared],
2498 install_rpath : rootlibexecdir,
2500 public_programs += exe
2502 exe = executable('systemd-escape',
2503 'src/escape/escape.c',
2504 include_directories : includes,
2505 link_with : [libshared],
2506 install_rpath : rootlibexecdir,
2508 install_dir : rootbindir)
2509 public_programs += exe
2511 exe = executable('systemd-notify',
2512 'src/notify/notify.c',
2513 include_directories : includes,
2514 link_with : [libshared],
2515 install_rpath : rootlibexecdir,
2517 install_dir : rootbindir)
2518 public_programs += exe
2520 executable('systemd-volatile-root',
2521 'src/volatile-root/volatile-root.c',
2522 include_directories : includes,
2523 link_with : [libshared],
2524 install_rpath : rootlibexecdir,
2526 install_dir : rootlibexecdir)
2528 executable('systemd-cgroups-agent',
2529 'src/cgroups-agent/cgroups-agent.c',
2530 include_directories : includes,
2531 link_with : [libshared],
2532 install_rpath : rootlibexecdir,
2534 install_dir : rootlibexecdir)
2536 exe = executable('systemd-id128',
2537 'src/id128/id128.c',
2538 include_directories : includes,
2539 link_with : [libshared],
2540 install_rpath : rootlibexecdir,
2542 public_programs += exe
2544 exe = executable('systemd-path',
2546 include_directories : includes,
2547 link_with : [libshared],
2548 install_rpath : rootlibexecdir,
2550 public_programs += exe
2552 exe = executable('systemd-ask-password',
2553 'src/ask-password/ask-password.c',
2554 include_directories : includes,
2555 link_with : [libshared],
2556 install_rpath : rootlibexecdir,
2558 install_dir : rootbindir)
2559 public_programs += exe
2561 executable('systemd-reply-password',
2562 'src/reply-password/reply-password.c',
2563 include_directories : includes,
2564 link_with : [libshared],
2565 install_rpath : rootlibexecdir,
2567 install_dir : rootlibexecdir)
2569 exe = executable('systemd-tty-ask-password-agent',
2570 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2571 include_directories : includes,
2572 link_with : [libshared],
2573 install_rpath : rootlibexecdir,
2575 install_dir : rootbindir)
2576 public_programs += exe
2578 exe = executable('systemd-cgls',
2580 include_directories : includes,
2581 link_with : [libshared],
2582 install_rpath : rootlibexecdir,
2584 public_programs += exe
2586 exe = executable('systemd-cgtop',
2587 'src/cgtop/cgtop.c',
2588 include_directories : includes,
2589 link_with : [libshared],
2590 install_rpath : rootlibexecdir,
2592 public_programs += exe
2594 executable('systemd-initctl',
2595 'src/initctl/initctl.c',
2596 include_directories : includes,
2597 link_with : [libshared],
2598 install_rpath : rootlibexecdir,
2600 install_dir : rootlibexecdir)
2602 exe = executable('systemd-mount',
2603 'src/mount/mount-tool.c',
2604 include_directories : includes,
2605 link_with : [libshared],
2606 dependencies: [libmount],
2607 install_rpath : rootlibexecdir,
2609 public_programs += exe
2611 meson.add_install_script(meson_make_symlink,
2612 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2614 exe = executable('systemd-run',
2616 include_directories : includes,
2617 link_with : [libshared],
2618 install_rpath : rootlibexecdir,
2620 public_programs += exe
2622 exe = executable('systemd-stdio-bridge',
2623 'src/stdio-bridge/stdio-bridge.c',
2624 include_directories : includes,
2625 link_with : [libshared],
2626 dependencies : [versiondep],
2627 install_rpath : rootlibexecdir,
2629 public_programs += exe
2631 exe = executable('busctl',
2632 'src/busctl/busctl.c',
2633 'src/busctl/busctl-introspect.c',
2634 'src/busctl/busctl-introspect.h',
2635 include_directories : includes,
2636 link_with : [libshared],
2637 install_rpath : rootlibexecdir,
2639 public_programs += exe
2641 if conf.get('ENABLE_SYSUSERS') == 1
2642 exe = executable('systemd-sysusers',
2643 'src/sysusers/sysusers.c',
2644 include_directories : includes,
2645 link_with : [libshared],
2646 install_rpath : rootlibexecdir,
2648 install_dir : rootbindir)
2649 public_programs += exe
2652 if conf.get('ENABLE_TMPFILES') == 1
2653 exe = executable('systemd-tmpfiles',
2654 'src/tmpfiles/tmpfiles.c',
2655 include_directories : includes,
2656 link_with : [libshared],
2657 dependencies : [libacl],
2658 install_rpath : rootlibexecdir,
2660 install_dir : rootbindir)
2661 public_programs += exe
2663 if want_tests != 'false'
2664 test('test-systemd-tmpfiles',
2665 test_systemd_tmpfiles_py,
2666 # https://github.com/mesonbuild/meson/issues/2681
2667 args : exe.full_path())
2671 if conf.get('ENABLE_HWDB') == 1
2672 exe = executable('systemd-hwdb',
2674 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2675 include_directories : includes,
2676 link_with : [libudev_static],
2677 install_rpath : udev_rpath,
2679 install_dir : rootbindir)
2680 public_programs += exe
2683 if conf.get('ENABLE_QUOTACHECK') == 1
2684 executable('systemd-quotacheck',
2685 'src/quotacheck/quotacheck.c',
2686 include_directories : includes,
2687 link_with : [libshared],
2688 install_rpath : rootlibexecdir,
2690 install_dir : rootlibexecdir)
2693 exe = executable('systemd-socket-proxyd',
2694 'src/socket-proxy/socket-proxyd.c',
2695 include_directories : includes,
2696 link_with : [libshared],
2697 dependencies : [threads],
2698 install_rpath : rootlibexecdir,
2700 install_dir : rootlibexecdir)
2701 public_programs += exe
2703 exe = executable('systemd-udevd',
2704 systemd_udevd_sources,
2705 include_directories : includes,
2706 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2707 link_with : [libudev_core,
2710 dependencies : [versiondep,
2716 install_rpath : udev_rpath,
2718 install_dir : rootlibexecdir)
2719 public_programs += exe
2721 exe = executable('udevadm',
2723 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2724 include_directories : includes,
2725 link_with : [libudev_core,
2728 dependencies : [versiondep,
2734 install_rpath : udev_rpath,
2736 install_dir : rootbindir)
2737 public_programs += exe
2739 executable('systemd-shutdown',
2740 systemd_shutdown_sources,
2741 include_directories : includes,
2742 link_with : [libcore_shared,
2744 dependencies : [libmount],
2745 install_rpath : rootlibexecdir,
2747 install_dir : rootlibexecdir)
2749 executable('systemd-update-done',
2750 'src/update-done/update-done.c',
2751 include_directories : includes,
2752 link_with : [libshared],
2753 install_rpath : rootlibexecdir,
2755 install_dir : rootlibexecdir)
2757 executable('systemd-update-utmp',
2758 'src/update-utmp/update-utmp.c',
2759 include_directories : includes,
2760 link_with : [libshared],
2761 dependencies : [libaudit],
2762 install_rpath : rootlibexecdir,
2764 install_dir : rootlibexecdir)
2766 if conf.get('HAVE_KMOD') == 1
2767 executable('systemd-modules-load',
2768 'src/modules-load/modules-load.c',
2769 include_directories : includes,
2770 link_with : [libshared],
2771 dependencies : [libkmod],
2772 install_rpath : rootlibexecdir,
2774 install_dir : rootlibexecdir)
2776 meson.add_install_script('sh', '-c',
2777 mkdir_p.format(modulesloaddir))
2778 meson.add_install_script('sh', '-c',
2779 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2782 exe = executable('systemd-nspawn',
2783 systemd_nspawn_sources,
2784 include_directories : includes,
2785 link_with : [libcore_shared,
2788 dependencies : [libblkid,
2790 install_rpath : rootlibexecdir,
2792 public_programs += exe
2794 if conf.get('ENABLE_NETWORKD') == 1
2795 executable('systemd-networkd',
2796 systemd_networkd_sources,
2797 include_directories : network_include_dir,
2798 link_with : [libnetworkd_core,
2801 networkd_link_with],
2802 dependencies : [threads],
2803 install_rpath : rootlibexecdir,
2805 install_dir : rootlibexecdir)
2807 executable('systemd-networkd-wait-online',
2808 systemd_networkd_wait_online_sources,
2809 include_directories : includes,
2810 link_with : [libnetworkd_core,
2811 networkd_link_with],
2812 install_rpath : rootlibexecdir,
2814 install_dir : rootlibexecdir)
2816 exe = executable('networkctl',
2818 include_directories : includes,
2819 link_with : [libsystemd_network,
2820 networkd_link_with],
2821 install_rpath : rootlibexecdir,
2823 install_dir : rootbindir)
2824 public_programs += exe
2826 executable('systemd-network-generator',
2827 network_generator_sources,
2828 include_directories : includes,
2829 link_with : [networkd_link_with],
2830 install_rpath : rootlibexecdir,
2832 install_dir : rootlibexecdir)
2835 executable('systemd-sulogin-shell',
2836 ['src/sulogin-shell/sulogin-shell.c'],
2837 include_directories : includes,
2838 link_with : [libshared],
2839 install_rpath : rootlibexecdir,
2841 install_dir : rootlibexecdir)
2843 ############################################################
2846 'systemd-runtest.env',
2847 output : 'systemd-runtest.env',
2848 command : ['sh', '-c', '{ ' +
2849 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2850 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2852 build_by_default : true)
2854 foreach tuple : tests
2856 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2857 dependencies = tuple[2]
2858 condition = tuple.length() >= 4 ? tuple[3] : ''
2859 type = tuple.length() >= 5 ? tuple[4] : ''
2860 defs = tuple.length() >= 6 ? tuple[5] : []
2861 incs = tuple.length() >= 7 ? tuple[6] : includes
2864 name = sources[0].split('/')[-1].split('.')[0]
2865 if type.startswith('timeout=')
2866 timeout = type.split('=')[1].to_int()
2870 if condition == '' or conf.get(condition) == 1
2874 include_directories : incs,
2875 link_with : link_with,
2876 dependencies : [versiondep,
2879 build_by_default : want_tests != 'false',
2880 install_rpath : rootlibexecdir,
2881 install : install_tests,
2882 install_dir : join_paths(testsdir, type))
2885 message('@0@ is a manual test'.format(name))
2886 elif type == 'unsafe' and want_tests != 'unsafe'
2887 message('@0@ is an unsafe test'.format(name))
2888 elif want_tests != 'false'
2894 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2899 'test-libsystemd-sym',
2900 test_libsystemd_sym_c,
2901 include_directories : includes,
2902 link_with : [libsystemd],
2903 build_by_default : want_tests != 'false',
2904 install : install_tests,
2905 install_dir : testsdir)
2906 if want_tests != 'false'
2907 test('test-libsystemd-sym', exe)
2911 'test-libsystemd-static-sym',
2912 test_libsystemd_sym_c,
2913 include_directories : includes,
2914 link_with : [install_libsystemd_static],
2915 dependencies : [threads], # threads is already included in dependencies on the library,
2916 # but does not seem to get propagated. Add here as a work-around.
2917 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2918 install : install_tests and static_libsystemd_pic,
2919 install_dir : testsdir)
2920 if want_tests != 'false' and static_libsystemd_pic
2921 test('test-libsystemd-static-sym', exe)
2927 include_directories : includes,
2928 c_args : '-Wno-deprecated-declarations',
2929 link_with : [libudev],
2930 build_by_default : want_tests != 'false',
2931 install : install_tests,
2932 install_dir : testsdir)
2933 if want_tests != 'false'
2934 test('test-libudev-sym', exe)
2938 'test-libudev-static-sym',
2940 include_directories : includes,
2941 c_args : '-Wno-deprecated-declarations',
2942 link_with : [install_libudev_static],
2943 build_by_default : want_tests != 'false' and static_libudev_pic,
2944 install : install_tests and static_libudev_pic,
2945 install_dir : testsdir)
2946 if want_tests != 'false' and static_libudev_pic
2947 test('test-libudev-static-sym', exe)
2950 ############################################################
2954 if get_option('tests') != 'false'
2955 foreach tuple : fuzzers
2957 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2958 dependencies = tuple[2]
2959 defs = tuple.length() >= 4 ? tuple[3] : []
2960 incs = tuple.length() >= 5 ? tuple[4] : includes
2963 if want_ossfuzz or want_fuzzbuzz
2964 dependencies += fuzzing_engine
2966 if fuzzing_engine.found()
2967 dependencies += fuzzing_engine
2969 link_args += ['-fsanitize=fuzzer']
2972 sources += 'src/fuzz/fuzz-main.c'
2976 sources += 'src/fuzz/fuzzer-entry-point.c'
2979 name = sources[0].split('/')[-1].split('.')[0]
2981 fuzzer_exes += executable(
2984 include_directories : [incs, include_directories('src/fuzz')],
2985 link_with : link_with,
2986 dependencies : dependencies,
2988 link_args: link_args,
2993 run_target('fuzzers',
2994 depends : fuzzer_exes,
2997 ############################################################
2999 make_directive_index_py = find_program('tools/make-directive-index.py')
3000 make_man_index_py = find_program('tools/make-man-index.py')
3001 xml_helper_py = find_program('tools/xml_helper.py')
3002 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
3003 autosuspend_update_sh = find_program('tools/meson-autosuspend-update.sh')
3006 subdir('sysusers.d')
3007 subdir('tmpfiles.d')
3013 subdir('shell-completion/bash')
3014 subdir('shell-completion/zsh')
3015 subdir('docs/sysvinit')
3016 subdir('docs/var-log')
3018 install_subdir('factory/etc',
3019 install_dir : factorydir)
3021 install_data('xorg/50-systemd-user.sh',
3022 install_dir : xinitrcdir)
3023 install_data('modprobe.d/systemd.conf',
3024 install_dir : modprobedir)
3025 install_data('LICENSE.GPL2',
3029 'docs/CODING_STYLE.md',
3030 'docs/DISTRO_PORTING.md',
3031 'docs/ENVIRONMENT.md',
3033 'docs/TRANSIENT-SETTINGS.md',
3034 'docs/TRANSLATORS.md',
3035 'docs/UIDS-GIDS.md',
3036 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3037 install_dir : docdir)
3039 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3040 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3042 ############################################################
3044 meson_check_help = find_program('tools/meson-check-help.sh')
3046 foreach exec : public_programs
3047 name = exec.full_path().split('/')[-1]
3048 if want_tests != 'false'
3049 test('check-help-' + name,
3051 args : exec.full_path())
3055 ############################################################
3057 check_directives_sh = find_program('tools/check-directives.sh')
3059 if want_tests != 'false'
3060 test('check-directives',
3061 check_directives_sh,
3062 args : project_source_root)
3065 ############################################################
3067 # Enable tests for all supported sanitizers
3068 foreach tuple : sanitizers
3069 sanitizer = tuple[0]
3072 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3074 foreach p : fuzz_regression_tests
3075 b = p.split('/')[-2]
3076 c = p.split('/')[-1]
3078 name = '@0@:@1@'.format(b, sanitizer)
3081 if want_tests == 'false'
3082 message('Not compiling @0@ because tests is set to false'.format(name))
3084 exe = custom_target(
3088 command : [env, 'ln', '-fs',
3089 join_paths(build.full_path(), b),
3091 build_by_default : true)
3093 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3098 if want_tests != 'false' and slow_tests
3099 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3101 args : [exe.full_path(),
3102 join_paths(project_source_root, p)])
3109 ############################################################
3112 all_files = run_command(
3114 ['--git-dir=@0@/.git'.format(project_source_root),
3117 all_files = files(all_files.stdout().split())
3122 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3125 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3129 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3132 command : [meson_git_contrib_sh])
3136 git_head = run_command(
3138 ['--git-dir=@0@/.git'.format(project_source_root),
3139 'rev-parse', 'HEAD']).stdout().strip()
3140 git_head_short = run_command(
3142 ['--git-dir=@0@/.git'.format(project_source_root),
3143 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3147 command : ['git', 'archive',
3148 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3150 '--prefix', 'systemd-@0@/'.format(git_head),
3154 ############################################################
3156 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3159 depends : [man, libsystemd, libudev],
3160 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3162 ############################################################
3163 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3166 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3168 'split /usr: @0@'.format(split_usr),
3169 'split bin-sbin: @0@'.format(split_bin),
3170 'prefix directory: @0@'.format(prefixdir),
3171 'rootprefix directory: @0@'.format(rootprefixdir),
3172 'sysconf directory: @0@'.format(sysconfdir),
3173 'include directory: @0@'.format(includedir),
3174 'lib directory: @0@'.format(libdir),
3175 'rootlib directory: @0@'.format(rootlibdir),
3176 'SysV init scripts: @0@'.format(sysvinit_path),
3177 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3178 'PAM modules directory: @0@'.format(pamlibdir),
3179 'PAM configuration directory: @0@'.format(pamconfdir),
3180 'RPM macros directory: @0@'.format(rpmmacrosdir),
3181 'modprobe.d directory: @0@'.format(modprobedir),
3182 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3183 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3184 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3185 'bash completions directory: @0@'.format(bashcompletiondir),
3186 'zsh completions directory: @0@'.format(zshcompletiondir),
3187 'extra start script: @0@'.format(get_option('rc-local')),
3188 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3189 get_option('debug-tty')),
3190 'TTY GID: @0@'.format(tty_gid),
3191 'users GID: @0@'.format(substs.get('USERS_GID')),
3192 'maximum system UID: @0@'.format(system_uid_max),
3193 'maximum system GID: @0@'.format(system_gid_max),
3194 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3195 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3196 'minimum container UID base: @0@'.format(container_uid_base_min),
3197 'maximum container UID base: @0@'.format(container_uid_base_max),
3198 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3199 'render group access mode: @0@'.format(get_option('group-render-mode')),
3200 'certificate root directory: @0@'.format(get_option('certificate-root')),
3201 'support URL: @0@'.format(support_url),
3202 'nobody user name: @0@'.format(nobody_user),
3203 'nobody group name: @0@'.format(nobody_group),
3204 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3205 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3207 'default DNSSEC mode: @0@'.format(default_dnssec),
3208 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3209 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3210 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3211 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3212 'default locale: @0@'.format(default_locale),
3213 'default user $PATH: @0@'.format(default_user_path_display),
3214 'systemd service watchdog: @0@'.format(watchdog_opt)]
3216 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3217 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3219 'default DNS servers: @0@'.format(alt_dns_servers),
3220 'default NTP servers: @0@'.format(alt_ntp_servers)]
3222 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3223 '@@0@'.format(time_epoch)).stdout().strip()
3225 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3228 'static libsystemd: @0@'.format(static_libsystemd),
3229 'static libudev: @0@'.format(static_libudev)]
3232 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3233 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3234 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3236 if conf.get('ENABLE_EFI') == 1
3237 status += 'efi arch: @0@'.format(efi_arch)
3241 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3242 'EFI CC @0@'.format(' '.join(efi_cc)),
3243 'EFI lib directory: @0@'.format(efi_libdir),
3244 'EFI lds directory: @0@'.format(efi_ldsdir),
3245 'EFI include directory: @0@'.format(efi_incdir)]
3299 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3300 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3304 ['legacy pkla', install_polkit_pkla],
3306 ['gnu-efi', have_gnu_efi],
3319 ['man pages', want_man],
3320 ['html pages', want_html],
3321 ['man page indices', want_man and have_lxml],
3326 ['adm group', get_option('adm-group')],
3327 ['wheel group', get_option('wheel-group')],
3330 ['debug mmap cache'],
3332 ['valgrind', conf.get('VALGRIND') == 1],
3333 ['trace logging', conf.get('LOG_TRACE') == 1],
3334 ['link-udev-shared', get_option('link-udev-shared')],
3335 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3336 ['link-networkd-shared', get_option('link-networkd-shared')],
3339 if tuple.length() >= 2
3342 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3343 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3344 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3355 'enabled features: @0@'.format(', '.join(found)),
3357 'disabled features: @0@'.format(', '.join(missing)),
3359 message('\n '.join(status))
3361 if rootprefixdir != rootprefix_default
3363 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3364 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3365 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))