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_HOMEWORK_PATH', join_paths(rootlibexecdir, 'systemd-homework'))
247 conf.set_quoted('SYSTEMD_USERWORK_PATH', join_paths(rootlibexecdir, 'systemd-userwork'))
248 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
249 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
250 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
252 substs.set('prefix', prefixdir)
253 substs.set('rootprefix', rootprefixdir)
254 substs.set('rootprefix_noslash', rootprefixdir_noslash)
255 substs.set('exec_prefix', prefixdir)
256 substs.set('libdir', libdir)
257 substs.set('rootlibdir', rootlibdir)
258 substs.set('includedir', includedir)
259 substs.set('sysconfdir', sysconfdir)
260 substs.set('bindir', bindir)
261 substs.set('rootbindir', rootbindir)
262 substs.set('rootlibexecdir', rootlibexecdir)
263 substs.set('systemunitdir', systemunitdir)
264 substs.set('userunitdir', userunitdir)
265 substs.set('systempresetdir', systempresetdir)
266 substs.set('userpresetdir', userpresetdir)
267 substs.set('udevhwdbdir', udevhwdbdir)
268 substs.set('udevrulesdir', udevrulesdir)
269 substs.set('udevlibexecdir', udevlibexecdir)
270 substs.set('environmentdir', environmentdir)
271 substs.set('catalogdir', catalogdir)
272 substs.set('tmpfilesdir', tmpfilesdir)
273 substs.set('sysusersdir', sysusersdir)
274 substs.set('sysctldir', sysctldir)
275 substs.set('binfmtdir', binfmtdir)
276 substs.set('modulesloaddir', modulesloaddir)
277 substs.set('modprobedir', modprobedir)
278 substs.set('systemgeneratordir', systemgeneratordir)
279 substs.set('usergeneratordir', usergeneratordir)
280 substs.set('systemenvgeneratordir', systemenvgeneratordir)
281 substs.set('userenvgeneratordir', userenvgeneratordir)
282 substs.set('systemshutdowndir', systemshutdowndir)
283 substs.set('systemsleepdir', systemsleepdir)
284 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
285 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
286 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
287 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
288 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
289 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
290 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
291 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
292 substs.set('BUILD_ROOT', meson.current_build_dir())
294 #####################################################################
296 cc = meson.get_compiler('c')
297 pkgconfig = import('pkgconfig')
298 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
299 meson_build_sh = find_program('tools/meson-build.sh')
301 want_tests = get_option('tests')
302 slow_tests = want_tests != 'false' and get_option('slow-tests')
303 install_tests = get_option('install-tests')
305 if add_languages('cpp', required : fuzzer_build)
306 # Used only for tests
307 cxx = meson.get_compiler('cpp')
308 cxx_cmd = ' '.join(cxx.cmd_array())
314 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
315 if fuzzing_engine.found()
316 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
317 elif cc.has_argument('-fsanitize=fuzzer-no-link')
318 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
320 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
323 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
325 fuzzing_engine = meson.get_compiler('cpp').find_library(get_option('fuzzbuzz-engine'), dirs: get_option('fuzzbuzz-engine-dir'))
328 # Those generate many false positives, and we do not want to change the code to
330 basic_disabled_warnings = [
331 '-Wno-unused-parameter',
332 '-Wno-missing-field-initializers',
333 '-Wno-unused-result',
334 '-Wno-format-signedness',
336 if get_option('b_ndebug') == 'true'
337 # With asserts disabled with get a bunch of warnings about variables which
338 # are used only in the asserts. This is not useful at all, so let's just silence
340 basic_disabled_warnings += [
341 '-Wno-unused-variable',
342 '-Wno-unused-but-set-variable',
346 possible_cc_flags = [
349 '-Wmissing-include-dirs',
350 '-Wold-style-definition',
354 '-Wsuggest-attribute=noreturn',
355 '-Werror=missing-prototypes',
356 '-Werror=implicit-function-declaration',
357 '-Werror=missing-declarations',
358 '-Werror=return-type',
359 '-Werror=incompatible-pointer-types',
361 '-Wstrict-prototypes',
363 '-Wmissing-noreturn',
364 '-Wimplicit-fallthrough=5',
367 '-Wstrict-aliasing=2',
370 '-Werror=shift-count-overflow',
371 '-Werror=shift-overflow=2',
375 # negative arguments are correctly detected starting with meson 0.46.
376 '-Wno-error=#warnings', # clang
377 '-Wno-string-plus-int', # clang
379 # work-around for gcc 7.1 turning this on on its own.
380 '-Wno-error=nonnull',
382 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
383 # optimizations enabled, producing essentially false positives.
384 '-Wno-maybe-uninitialized',
388 '-fdiagnostics-show-option',
389 '-fno-strict-aliasing',
390 '-fvisibility=hidden',
392 '-fstack-protector-strong',
393 '--param=ssp-buffer-size=4',
396 # --as-needed and --no-undefined are provided by meson by default,
397 # run mesonconf to see what is enabled
398 possible_link_flags = [
404 if cc.get_id() == 'clang'
405 possible_cc_flags += [
406 '-Wno-typedef-redefinition',
407 '-Wno-gnu-variable-sized-type-not-at-end',
411 if get_option('buildtype') != 'debug'
412 possible_cc_flags += [
413 '-ffunction-sections',
417 possible_link_flags += '-Wl,--gc-sections'
420 add_project_arguments(cc.get_supported_arguments(basic_disabled_warnings), language : 'c')
421 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
422 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
426 #include <inttypes.h>
427 typedef uint64_t usec_t;
428 usec_t now(clockid_t clock);
433 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
434 add_project_arguments('-Werror=shadow', language : 'c')
438 add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp')
441 cpp = ' '.join(cc.cmd_array()) + ' -E'
443 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
445 #####################################################################
446 # compilation result tests
448 conf.set('_GNU_SOURCE', true)
449 conf.set('__SANE_USERSPACE_TYPES__', true)
450 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
452 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
453 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
454 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
455 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
456 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
457 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
458 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
462 #include <sys/stat.h>
465 foreach decl : ['char16_t',
470 # We get -1 if the size cannot be determined
471 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
473 if decl == 'struct statx'
475 want_linux_stat_h = false
477 have = cc.sizeof(decl,
478 prefix : decl_headers + '#include <linux/stat.h>',
479 args : '-D_GNU_SOURCE') > 0
480 want_linux_stat_h = have
484 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
487 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
489 foreach ident : ['secure_getenv', '__secure_getenv']
490 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
494 ['memfd_create', '''#include <sys/mman.h>'''],
495 ['gettid', '''#include <sys/types.h>
496 #include <unistd.h>'''],
497 ['pivot_root', '''#include <stdlib.h>
498 #include <unistd.h>'''], # no known header declares pivot_root
499 ['name_to_handle_at', '''#include <sys/types.h>
500 #include <sys/stat.h>
501 #include <fcntl.h>'''],
502 ['setns', '''#include <sched.h>'''],
503 ['renameat2', '''#include <stdio.h>
504 #include <fcntl.h>'''],
505 ['kcmp', '''#include <linux/kcmp.h>'''],
506 ['keyctl', '''#include <sys/types.h>
507 #include <keyutils.h>'''],
508 ['copy_file_range', '''#include <sys/syscall.h>
509 #include <unistd.h>'''],
510 ['bpf', '''#include <sys/syscall.h>
511 #include <unistd.h>'''],
512 ['statx', '''#include <sys/types.h>
513 #include <sys/stat.h>
514 #include <unistd.h>'''],
515 ['explicit_bzero' , '''#include <string.h>'''],
516 ['reallocarray', '''#include <malloc.h>'''],
517 ['set_mempolicy', '''#include <stdlib.h>
518 #include <unistd.h>'''],
519 ['get_mempolicy', '''#include <stdlib.h>
520 #include <unistd.h>'''],
521 ['pidfd_send_signal', '''#include <stdlib.h>
524 #include <sys/wait.h>'''],
525 ['pidfd_open', '''#include <stdlib.h>
528 #include <sys/wait.h>'''],
529 ['rt_sigqueueinfo', '''#include <stdlib.h>
532 #include <sys/wait.h>'''],
535 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
536 conf.set10('HAVE_' + ident[0].to_upper(), have)
539 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
540 conf.set10('USE_SYS_RANDOM_H', true)
541 conf.set10('HAVE_GETRANDOM', true)
543 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
544 conf.set10('USE_SYS_RANDOM_H', false)
545 conf.set10('HAVE_GETRANDOM', have)
548 #####################################################################
550 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
552 get_option('version-tag'),
553 meson.project_version()]
556 input : 'src/version/version.h.in',
557 output : 'version.h',
560 versiondep = declare_dependency(sources: version_h)
562 sed = find_program('sed')
563 awk = find_program('awk')
564 m4 = find_program('m4')
565 stat = find_program('stat')
566 git = find_program('git', required : false)
567 env = find_program('env')
568 perl = find_program('perl', required : false)
570 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
571 mkdir_p = 'mkdir -p $DESTDIR/@0@'
572 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
573 splash_bmp = files('test/splash.bmp')
575 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
576 # /usr/sbin, /sbin, and fall back to the default from middle column.
577 progs = [['quotaon', '/usr/sbin/quotaon' ],
578 ['quotacheck', '/usr/sbin/quotacheck' ],
579 ['kmod', '/usr/bin/kmod' ],
580 ['kexec', '/usr/sbin/kexec' ],
581 ['sulogin', '/usr/sbin/sulogin' ],
582 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
583 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
584 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
585 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
586 ['nologin', '/usr/sbin/nologin', ],
589 path = get_option(prog[0] + '-path')
591 message('Using @1@ for @0@'.format(prog[0], path))
593 exe = find_program(prog[0],
594 '/usr/sbin/' + prog[0],
597 path = exe.found() ? exe.path() : prog[1]
599 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
600 conf.set_quoted(name, path)
601 substs.set(name, path)
604 conf.set_quoted('TELINIT', get_option('telinit-path'))
606 if run_command('ln', '--relative', '--help').returncode() != 0
607 error('ln does not support --relative (added in coreutils 8.16)')
610 ############################################################
612 gperf = find_program('gperf')
614 gperf_test_format = '''
616 const char * in_word_set(const char *, @0@);
619 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
620 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
621 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
622 if cc.compiles(gperf_test)
623 gperf_len_type = 'size_t'
625 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
626 if cc.compiles(gperf_test)
627 gperf_len_type = 'unsigned'
629 error('unable to determine gperf len type')
632 message('gperf len type is @0@'.format(gperf_len_type))
633 conf.set('GPERF_LEN_TYPE', gperf_len_type,
634 description : 'The type of gperf "len" parameter')
636 ############################################################
638 if not cc.has_header('sys/capability.h')
639 error('POSIX caps headers not found')
641 foreach header : ['crypt.h',
643 'linux/vm_sockets.h',
645 'valgrind/memcheck.h',
646 'valgrind/valgrind.h',
649 conf.set10('HAVE_' + header.underscorify().to_upper(),
650 cc.has_header(header))
653 ############################################################
655 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
656 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
657 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
659 default_hierarchy = get_option('default-hierarchy')
660 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
661 description : 'default cgroup hierarchy as string')
662 if default_hierarchy == 'legacy'
663 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
664 elif default_hierarchy == 'hybrid'
665 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
667 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
670 default_net_naming_scheme = get_option('default-net-naming-scheme')
671 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
673 time_epoch = get_option('time-epoch')
676 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
678 conf.set('TIME_EPOCH', time_epoch)
680 system_uid_max = get_option('system-uid-max')
681 if system_uid_max == -1
682 system_uid_max = run_command(
684 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
685 '/etc/login.defs').stdout().strip()
686 if system_uid_max == ''
689 system_uid_max = system_uid_max.to_int()
692 conf.set('SYSTEM_UID_MAX', system_uid_max)
693 substs.set('systemuidmax', system_uid_max)
695 system_gid_max = get_option('system-gid-max')
696 if system_gid_max == -1
697 system_gid_max = run_command(
699 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
700 '/etc/login.defs').stdout().strip()
701 if system_gid_max == ''
704 system_gid_max = system_gid_max.to_int()
707 conf.set('SYSTEM_GID_MAX', system_gid_max)
708 substs.set('systemgidmax', system_gid_max)
710 dynamic_uid_min = get_option('dynamic-uid-min')
711 dynamic_uid_max = get_option('dynamic-uid-max')
712 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
713 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
714 substs.set('dynamicuidmin', dynamic_uid_min)
715 substs.set('dynamicuidmax', dynamic_uid_max)
717 container_uid_base_min = get_option('container-uid-base-min')
718 container_uid_base_max = get_option('container-uid-base-max')
719 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
720 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
721 substs.set('containeruidbasemin', container_uid_base_min)
722 substs.set('containeruidbasemax', container_uid_base_max)
724 nobody_user = get_option('nobody-user')
725 nobody_group = get_option('nobody-group')
727 if not meson.is_cross_build()
728 getent_result = run_command('getent', 'passwd', '65534')
729 if getent_result.returncode() == 0
730 name = getent_result.stdout().split(':')[0]
731 if name != nobody_user
733 'The local user with the UID 65534 does not match the configured user name "@0@" of the nobody user (its name is @1@).\n'.format(nobody_user, name) +
734 'Your build will result in an user table setup that is incompatible with the local system.')
737 id_result = run_command('id', '-u', nobody_user)
738 if id_result.returncode() == 0
739 id = id_result.stdout().to_int()
742 'The local user with the configured user name "@0@" of the nobody user does not have UID 65534 (it has @1@).\n'.format(nobody_user, id) +
743 'Your build will result in an user table setup that is incompatible with the local system.')
747 getent_result = run_command('getent', 'group', '65534')
748 if getent_result.returncode() == 0
749 name = getent_result.stdout().split(':')[0]
750 if name != nobody_group
752 'The local group with the GID 65534 does not match the configured group name "@0@" of the nobody group (its name is @1@).\n'.format(nobody_group, name) +
753 'Your build will result in an group table setup that is incompatible with the local system.')
756 id_result = run_command('id', '-g', nobody_group)
757 if id_result.returncode() == 0
758 id = id_result.stdout().to_int()
761 'The local group with the configured group name "@0@" of the nobody group does not have UID 65534 (it has @1@).\n'.format(nobody_group, id) +
762 'Your build will result in an group table setup that is incompatible with the local system.')
766 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
768 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
769 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
772 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
773 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
774 substs.set('NOBODY_USER_NAME', nobody_user)
775 substs.set('NOBODY_GROUP_NAME', nobody_group)
777 tty_gid = get_option('tty-gid')
778 conf.set('TTY_GID', tty_gid)
779 substs.set('TTY_GID', tty_gid)
781 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
782 users_gid = get_option('users-gid')
783 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
785 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
786 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
788 dev_kvm_mode = get_option('dev-kvm-mode')
789 substs.set('DEV_KVM_MODE', dev_kvm_mode)
790 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
791 group_render_mode = get_option('group-render-mode')
792 substs.set('GROUP_RENDER_MODE', group_render_mode)
793 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
795 kill_user_processes = get_option('default-kill-user-processes')
796 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
797 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
798 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
800 dns_servers = get_option('dns-servers')
801 conf.set_quoted('DNS_SERVERS', dns_servers)
802 substs.set('DNS_SERVERS', dns_servers)
804 ntp_servers = get_option('ntp-servers')
805 conf.set_quoted('NTP_SERVERS', ntp_servers)
806 substs.set('NTP_SERVERS', ntp_servers)
808 default_locale = get_option('default-locale')
809 if default_locale == ''
810 if not meson.is_cross_build()
811 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
812 default_locale = run_command(choose_default_locale_sh).stdout().strip()
814 default_locale = 'C.UTF-8'
817 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
819 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
821 service_watchdog = get_option('service-watchdog')
822 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
823 substs.set('SERVICE_WATCHDOG', watchdog_value)
825 substs.set('SUSHELL', get_option('debug-shell'))
826 substs.set('DEBUGTTY', get_option('debug-tty'))
827 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
829 enable_debug_hashmap = false
830 enable_debug_mmap_cache = false
831 enable_debug_siphash = false
832 foreach name : get_option('debug-extra')
834 enable_debug_hashmap = true
835 elif name == 'mmap-cache'
836 enable_debug_mmap_cache = true
837 elif name == 'siphash'
838 enable_debug_siphash = true
840 message('unknown debug option "@0@", ignoring'.format(name))
843 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
844 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
845 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
847 conf.set10('VALGRIND', get_option('valgrind'))
848 conf.set10('LOG_TRACE', get_option('log-trace'))
850 default_user_path = get_option('user-path')
851 if default_user_path != ''
852 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
853 default_user_path_display = default_user_path
855 # meson 0.49 fails when ?: is used in .format()
856 default_user_path_display = '(same as system services)'
860 #####################################################################
862 threads = dependency('threads')
863 librt = cc.find_library('rt')
864 libm = cc.find_library('m')
865 libdl = cc.find_library('dl')
866 libcrypt = cc.find_library('crypt')
868 libcap = dependency('libcap', required : false)
869 if not libcap.found()
870 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
871 libcap = cc.find_library('cap')
874 libmount = dependency('mount',
875 version : fuzzer_build ? '>= 0' : '>= 2.30')
877 want_libfdisk = get_option('fdisk')
878 if want_libfdisk != 'false' and not skip_deps
879 libfdisk = dependency('fdisk',
880 required : want_libfdisk == 'true')
881 have = libfdisk.found()
886 conf.set10('HAVE_LIBFDISK', have)
888 want_pwquality = get_option('pwquality')
889 if want_pwquality != 'false' and not skip_deps
890 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
891 have = libpwquality.found()
896 conf.set10('HAVE_PWQUALITY', have)
898 want_seccomp = get_option('seccomp')
899 if want_seccomp != 'false' and not skip_deps
900 libseccomp = dependency('libseccomp',
901 version : '>= 2.3.1',
902 required : want_seccomp == 'true')
903 have = libseccomp.found()
908 conf.set10('HAVE_SECCOMP', have)
910 want_selinux = get_option('selinux')
911 if want_selinux != 'false' and not skip_deps
912 libselinux = dependency('libselinux',
913 version : '>= 2.1.9',
914 required : want_selinux == 'true')
915 have = libselinux.found()
920 conf.set10('HAVE_SELINUX', have)
922 want_apparmor = get_option('apparmor')
923 if want_apparmor != 'false' and not skip_deps
924 libapparmor = dependency('libapparmor',
925 required : want_apparmor == 'true')
926 have = libapparmor.found()
931 conf.set10('HAVE_APPARMOR', have)
933 smack_run_label = get_option('smack-run-label')
934 if smack_run_label != ''
935 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
938 want_polkit = get_option('polkit')
939 install_polkit = false
940 install_polkit_pkla = false
941 if want_polkit != 'false' and not skip_deps
942 install_polkit = true
944 libpolkit = dependency('polkit-gobject-1',
946 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
947 message('Old polkit detected, will install pkla files')
948 install_polkit_pkla = true
951 conf.set10('ENABLE_POLKIT', install_polkit)
953 want_acl = get_option('acl')
954 if want_acl != 'false' and not skip_deps
955 libacl = cc.find_library('acl', required : want_acl == 'true')
956 have = libacl.found()
961 conf.set10('HAVE_ACL', have)
963 want_audit = get_option('audit')
964 if want_audit != 'false' and not skip_deps
965 libaudit = dependency('audit', required : want_audit == 'true')
966 have = libaudit.found()
971 conf.set10('HAVE_AUDIT', have)
973 want_blkid = get_option('blkid')
974 if want_blkid != 'false' and not skip_deps
975 libblkid = dependency('blkid', required : want_blkid == 'true')
976 have = libblkid.found()
981 conf.set10('HAVE_BLKID', have)
983 want_kmod = get_option('kmod')
984 if want_kmod != 'false' and not skip_deps
985 libkmod = dependency('libkmod',
987 required : want_kmod == 'true')
988 have = libkmod.found()
993 conf.set10('HAVE_KMOD', have)
995 want_pam = get_option('pam')
996 if want_pam != 'false' and not skip_deps
997 libpam = cc.find_library('pam', required : want_pam == 'true')
998 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
999 have = libpam.found() and libpam_misc.found()
1005 conf.set10('HAVE_PAM', have)
1007 want_microhttpd = get_option('microhttpd')
1008 if want_microhttpd != 'false' and not skip_deps
1009 libmicrohttpd = dependency('libmicrohttpd',
1010 version : '>= 0.9.33',
1011 required : want_microhttpd == 'true')
1012 have = libmicrohttpd.found()
1017 conf.set10('HAVE_MICROHTTPD', have)
1019 want_libcryptsetup = get_option('libcryptsetup')
1020 if want_libcryptsetup != 'false' and not skip_deps
1021 libcryptsetup = dependency('libcryptsetup',
1022 version : '>= 2.0.1',
1023 required : want_libcryptsetup == 'true')
1024 have = libcryptsetup.found()
1026 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1027 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
1032 conf.set10('HAVE_LIBCRYPTSETUP', have)
1034 want_libcurl = get_option('libcurl')
1035 if want_libcurl != 'false' and not skip_deps
1036 libcurl = dependency('libcurl',
1037 version : '>= 7.32.0',
1038 required : want_libcurl == 'true')
1039 have = libcurl.found()
1044 conf.set10('HAVE_LIBCURL', have)
1046 want_libidn = get_option('libidn')
1047 want_libidn2 = get_option('libidn2')
1048 if want_libidn == 'true' and want_libidn2 == 'true'
1049 error('libidn and libidn2 cannot be requested simultaneously')
1052 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1053 libidn = dependency('libidn2',
1054 required : want_libidn2 == 'true')
1055 have = libidn.found()
1060 conf.set10('HAVE_LIBIDN2', have)
1061 if not have and want_libidn != 'false' and not skip_deps
1062 # libidn is used for both libidn and libidn2 objects
1063 libidn = dependency('libidn',
1064 required : want_libidn == 'true')
1065 have = libidn.found()
1069 conf.set10('HAVE_LIBIDN', have)
1071 want_libiptc = get_option('libiptc')
1072 if want_libiptc != 'false' and not skip_deps
1073 libiptc = dependency('libiptc',
1074 required : want_libiptc == 'true')
1075 have = libiptc.found()
1080 conf.set10('HAVE_LIBIPTC', have)
1082 want_qrencode = get_option('qrencode')
1083 if want_qrencode != 'false' and not skip_deps
1084 libqrencode = dependency('libqrencode',
1085 required : want_qrencode == 'true')
1086 have = libqrencode.found()
1091 conf.set10('HAVE_QRENCODE', have)
1093 want_gcrypt = get_option('gcrypt')
1094 if want_gcrypt != 'false' and not skip_deps
1095 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1096 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1097 have = libgcrypt.found() and libgpg_error.found()
1102 # link to neither of the libs if one is not found
1106 conf.set10('HAVE_GCRYPT', have)
1108 want_gnutls = get_option('gnutls')
1109 if want_gnutls != 'false' and not skip_deps
1110 libgnutls = dependency('gnutls',
1111 version : '>= 3.1.4',
1112 required : want_gnutls == 'true')
1113 have = libgnutls.found()
1118 conf.set10('HAVE_GNUTLS', have)
1120 want_openssl = get_option('openssl')
1121 if want_openssl != 'false' and not skip_deps
1122 libopenssl = dependency('openssl',
1123 version : '>= 1.1.0',
1124 required : want_openssl == 'true')
1125 have = libopenssl.found()
1130 conf.set10('HAVE_OPENSSL', have)
1132 want_p11kit = get_option('p11kit')
1133 if want_p11kit != 'false' and not skip_deps
1134 libp11kit = dependency('p11-kit-1',
1135 version : '>= 0.23.3',
1136 required : want_p11kit == 'true')
1137 have = libp11kit.found()
1142 conf.set10('HAVE_P11KIT', have)
1144 want_elfutils = get_option('elfutils')
1145 if want_elfutils != 'false' and not skip_deps
1146 libdw = dependency('libdw',
1147 required : want_elfutils == 'true')
1148 have = libdw.found()
1153 conf.set10('HAVE_ELFUTILS', have)
1155 want_zlib = get_option('zlib')
1156 if want_zlib != 'false' and not skip_deps
1157 libz = dependency('zlib',
1158 required : want_zlib == 'true')
1164 conf.set10('HAVE_ZLIB', have)
1166 want_bzip2 = get_option('bzip2')
1167 if want_bzip2 != 'false' and not skip_deps
1168 libbzip2 = cc.find_library('bz2',
1169 required : want_bzip2 == 'true')
1170 have = libbzip2.found()
1175 conf.set10('HAVE_BZIP2', have)
1177 want_xz = get_option('xz')
1178 if want_xz != 'false' and not skip_deps
1179 libxz = dependency('liblzma',
1180 required : want_xz == 'true')
1181 have = libxz.found()
1186 conf.set10('HAVE_XZ', have)
1188 want_lz4 = get_option('lz4')
1189 if want_lz4 != 'false' and not skip_deps
1190 liblz4 = dependency('liblz4',
1191 version : '>= 1.3.0',
1192 required : want_lz4 == 'true')
1193 have = liblz4.found()
1198 conf.set10('HAVE_LZ4', have)
1200 want_xkbcommon = get_option('xkbcommon')
1201 if want_xkbcommon != 'false' and not skip_deps
1202 libxkbcommon = dependency('xkbcommon',
1203 version : '>= 0.3.0',
1204 required : want_xkbcommon == 'true')
1205 have = libxkbcommon.found()
1210 conf.set10('HAVE_XKBCOMMON', have)
1212 want_pcre2 = get_option('pcre2')
1213 if want_pcre2 != 'false'
1214 libpcre2 = dependency('libpcre2-8',
1215 required : want_pcre2 == 'true')
1216 have = libpcre2.found()
1221 conf.set10('HAVE_PCRE2', have)
1223 want_glib = get_option('glib')
1224 if want_glib != 'false' and not skip_deps
1225 libglib = dependency('glib-2.0',
1226 version : '>= 2.22.0',
1227 required : want_glib == 'true')
1228 libgobject = dependency('gobject-2.0',
1229 version : '>= 2.22.0',
1230 required : want_glib == 'true')
1231 libgio = dependency('gio-2.0',
1232 required : want_glib == 'true')
1233 have = libglib.found() and libgobject.found() and libgio.found()
1240 conf.set10('HAVE_GLIB', have)
1242 want_dbus = get_option('dbus')
1243 if want_dbus != 'false' and not skip_deps
1244 libdbus = dependency('dbus-1',
1245 version : '>= 1.3.2',
1246 required : want_dbus == 'true')
1247 have = libdbus.found()
1252 conf.set10('HAVE_DBUS', have)
1254 default_dnssec = get_option('default-dnssec')
1256 default_dnssec = 'no'
1258 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1259 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1260 default_dnssec = 'no'
1262 conf.set('DEFAULT_DNSSEC_MODE',
1263 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1264 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1266 dns_over_tls = get_option('dns-over-tls')
1267 if dns_over_tls != 'false'
1268 if dns_over_tls == 'openssl'
1271 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1272 if dns_over_tls == 'gnutls' and not have_gnutls
1273 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1276 if dns_over_tls == 'gnutls' or have_gnutls
1277 have_openssl = false
1279 have_openssl = conf.get('HAVE_OPENSSL') == 1
1280 if dns_over_tls != 'auto' and not have_openssl
1281 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1282 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1285 have = have_gnutls or have_openssl
1289 have_openssl = false
1291 conf.set10('ENABLE_DNS_OVER_TLS', have)
1292 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1293 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1295 default_dns_over_tls = get_option('default-dns-over-tls')
1297 default_dns_over_tls = 'no'
1299 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1300 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.')
1301 default_dns_over_tls = 'no'
1303 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1304 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1305 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1307 want_repart = get_option('repart')
1308 if want_repart != 'false'
1309 have = (conf.get('HAVE_OPENSSL') == 1 and
1310 conf.get('HAVE_LIBFDISK') == 1)
1311 if want_repart == 'true' and not have
1312 error('repart support was requested, but dependencies are not available')
1317 conf.set10('ENABLE_REPART', have)
1319 want_importd = get_option('importd')
1320 if want_importd != 'false'
1321 have = (conf.get('HAVE_LIBCURL') == 1 and
1322 conf.get('HAVE_ZLIB') == 1 and
1323 conf.get('HAVE_XZ') == 1 and
1324 conf.get('HAVE_GCRYPT') == 1)
1325 if want_importd == 'true' and not have
1326 error('importd support was requested, but dependencies are not available')
1331 conf.set10('ENABLE_IMPORTD', have)
1333 want_homed = get_option('homed')
1334 if want_homed != 'false'
1335 have = (conf.get('HAVE_OPENSSL') == 1 and
1336 conf.get('HAVE_LIBFDISK') == 1 and
1337 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1338 if want_homed == 'true' and not have
1339 error('homed support was requested, but dependencies are not available')
1344 conf.set10('ENABLE_HOMED', have)
1346 want_remote = get_option('remote')
1347 if want_remote != 'false'
1348 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1349 conf.get('HAVE_LIBCURL') == 1]
1350 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1351 # it's possible to build one without the other. Complain only if
1352 # support was explicitly requested. The auxiliary files like sysusers
1353 # config should be installed when any of the programs are built.
1354 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1355 error('remote support was requested, but dependencies are not available')
1357 have = have_deps[0] or have_deps[1]
1361 conf.set10('ENABLE_REMOTE', have)
1363 foreach term : ['utmp',
1397 have = get_option(term)
1398 name = 'ENABLE_' + term.underscorify().to_upper()
1399 conf.set10(name, have)
1402 foreach tuple : [['nss-mymachines', 'machined'],
1403 ['nss-resolve', 'resolve']]
1404 want = get_option(tuple[0])
1406 have = get_option(tuple[1])
1407 if want == 'true' and not have
1408 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1413 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1414 conf.set10(name, have)
1418 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1419 'ENABLE_NSS_MYMACHINES',
1420 'ENABLE_NSS_RESOLVE',
1421 'ENABLE_NSS_SYSTEMD']
1422 if conf.get(term) == 1
1426 conf.set10('ENABLE_NSS', enable_nss)
1428 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1433 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1435 #####################################################################
1437 if get_option('efi')
1438 efi_arch = host_machine.cpu_family()
1440 if efi_arch == 'x86'
1441 EFI_MACHINE_TYPE_NAME = 'ia32'
1442 gnu_efi_arch = 'ia32'
1443 elif efi_arch == 'x86_64'
1444 EFI_MACHINE_TYPE_NAME = 'x64'
1445 gnu_efi_arch = 'x86_64'
1446 elif efi_arch == 'arm'
1447 EFI_MACHINE_TYPE_NAME = 'arm'
1448 gnu_efi_arch = 'arm'
1449 elif efi_arch == 'aarch64'
1450 EFI_MACHINE_TYPE_NAME = 'aa64'
1451 gnu_efi_arch = 'aarch64'
1453 EFI_MACHINE_TYPE_NAME = ''
1458 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1460 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1464 conf.set10('ENABLE_EFI', have)
1466 #####################################################################
1468 config_h = configure_file(
1469 output : 'config.h',
1470 configuration : conf)
1472 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1474 includes = include_directories('src/basic',
1479 'src/journal-remote',
1483 'src/time-wait-sync',
1489 'src/libsystemd/sd-bus',
1490 'src/libsystemd/sd-device',
1491 'src/libsystemd/sd-event',
1492 'src/libsystemd/sd-hwdb',
1493 'src/libsystemd/sd-id128',
1494 'src/libsystemd/sd-netlink',
1495 'src/libsystemd/sd-network',
1496 'src/libsystemd/sd-resolve',
1497 'src/libsystemd-network',
1500 add_project_arguments('-include', 'config.h', language : 'c')
1502 generate_gperfs = find_program('tools/generate-gperfs.py')
1506 subdir('src/systemd')
1508 subdir('src/libsystemd')
1509 subdir('src/libsystemd-network')
1510 subdir('src/journal')
1513 libjournal_core = static_library(
1515 libjournal_core_sources,
1517 include_directories : includes,
1520 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1521 libsystemd = shared_library(
1524 version : libsystemd_version,
1525 include_directories : includes,
1526 link_args : ['-shared',
1527 '-Wl,--version-script=' + libsystemd_sym_path],
1528 link_with : [libbasic,
1530 link_whole : [libsystemd_static,
1532 dependencies : [threads,
1536 link_depends : libsystemd_sym,
1538 install_dir : rootlibdir)
1540 static_libsystemd = get_option('static-libsystemd')
1541 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1543 install_libsystemd_static = static_library(
1546 journal_client_sources,
1548 basic_gcrypt_sources,
1550 include_directories : includes,
1551 build_by_default : static_libsystemd != 'false',
1552 install : static_libsystemd != 'false',
1553 install_dir : rootlibdir,
1554 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1555 dependencies : [threads,
1564 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1566 #Generate autosuspend rules
1567 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1569 ############################################################
1571 # binaries that have --help and are intended for use by humans,
1572 # usually, but not always, installed in /bin.
1573 public_programs = []
1575 subdir('src/libudev')
1576 subdir('src/shared')
1578 subdir('src/shutdown')
1580 subdir('src/network')
1582 subdir('src/analyze')
1583 subdir('src/journal-remote')
1584 subdir('src/coredump')
1585 subdir('src/pstore')
1586 subdir('src/hostname')
1587 subdir('src/import')
1588 subdir('src/partition')
1589 subdir('src/kernel-install')
1590 subdir('src/locale')
1591 subdir('src/machine')
1592 subdir('src/portable')
1593 subdir('src/userdb')
1595 subdir('src/nspawn')
1596 subdir('src/resolve')
1597 subdir('src/timedate')
1598 subdir('src/timesync')
1599 subdir('src/vconsole')
1600 subdir('src/boot/efi')
1607 ############################################################
1609 # only static linking apart from libdl, to make sure that the
1610 # module is linked to all libraries that it uses.
1611 test_dlopen = executable(
1615 include_directories : includes,
1616 link_with : [libbasic],
1617 dependencies : [libdl],
1618 build_by_default : want_tests != 'false')
1620 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1621 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h'],
1622 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1623 ['resolve', 'ENABLE_NSS_RESOLVE']]
1625 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1629 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1630 version_script_arg = join_paths(project_source_root, sym)
1632 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1633 if tuple.length() > 2
1634 sources += tuple[2].split()
1637 nss = shared_library(
1642 include_directories : includes,
1643 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1644 link_args : ['-Wl,-z,nodelete',
1646 '-Wl,--version-script=' + version_script_arg],
1647 link_with : [libsystemd_static,
1650 dependencies : [threads,
1654 install_dir : rootlibdir)
1656 # We cannot use shared_module because it does not support version suffix.
1657 # Unfortunately shared_library insists on creating the symlink…
1658 meson.add_install_script('sh', '-c',
1659 'rm $DESTDIR@0@/libnss_@1@.so'
1660 .format(rootlibdir, module))
1662 if want_tests != 'false'
1663 test('dlopen-nss_' + module,
1665 # path to dlopen must include a slash
1666 args : nss.full_path())
1671 ############################################################
1673 executable('systemd',
1675 include_directories : includes,
1676 link_with : [libcore,
1678 dependencies : [versiondep,
1685 install_rpath : rootlibexecdir,
1687 install_dir : rootlibexecdir)
1689 meson.add_install_script(meson_make_symlink,
1690 join_paths(rootlibexecdir, 'systemd'),
1691 join_paths(rootsbindir, 'init'))
1693 exe = executable('systemd-analyze',
1694 systemd_analyze_sources,
1695 include_directories : includes,
1696 link_with : [libcore,
1698 dependencies : [versiondep,
1705 install_rpath : rootlibexecdir,
1707 public_programs += exe
1709 executable('systemd-journald',
1710 systemd_journald_sources,
1711 include_directories : includes,
1712 link_with : [libjournal_core,
1714 dependencies : [threads,
1718 install_rpath : rootlibexecdir,
1720 install_dir : rootlibexecdir)
1722 exe = executable('systemd-cat',
1723 systemd_cat_sources,
1724 include_directories : includes,
1725 link_with : [libjournal_core,
1727 dependencies : [threads],
1728 install_rpath : rootlibexecdir,
1730 public_programs += exe
1732 exe = executable('journalctl',
1734 include_directories : includes,
1735 link_with : [libshared],
1736 dependencies : [threads,
1741 install_rpath : rootlibexecdir,
1743 install_dir : rootbindir)
1744 public_programs += exe
1746 executable('systemd-getty-generator',
1747 'src/getty-generator/getty-generator.c',
1748 include_directories : includes,
1749 link_with : [libshared],
1750 install_rpath : rootlibexecdir,
1752 install_dir : systemgeneratordir)
1754 executable('systemd-debug-generator',
1755 'src/debug-generator/debug-generator.c',
1756 include_directories : includes,
1757 link_with : [libshared],
1758 install_rpath : rootlibexecdir,
1760 install_dir : systemgeneratordir)
1762 executable('systemd-run-generator',
1763 'src/run-generator/run-generator.c',
1764 include_directories : includes,
1765 link_with : [libshared],
1766 install_rpath : rootlibexecdir,
1768 install_dir : systemgeneratordir)
1770 executable('systemd-fstab-generator',
1771 'src/fstab-generator/fstab-generator.c',
1772 include_directories : includes,
1773 link_with : [libcore_shared,
1775 install_rpath : rootlibexecdir,
1777 install_dir : systemgeneratordir)
1779 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1780 executable('30-systemd-environment-d-generator',
1781 'src/environment-d-generator/environment-d-generator.c',
1782 include_directories : includes,
1783 link_with : [libshared],
1784 install_rpath : rootlibexecdir,
1786 install_dir : userenvgeneratordir)
1788 meson.add_install_script(meson_make_symlink,
1789 join_paths(sysconfdir, 'environment'),
1790 join_paths(environmentdir, '99-environment.conf'))
1793 if conf.get('ENABLE_HIBERNATE') == 1
1794 executable('systemd-hibernate-resume-generator',
1795 'src/hibernate-resume/hibernate-resume-generator.c',
1796 include_directories : includes,
1797 link_with : [libshared],
1798 install_rpath : rootlibexecdir,
1800 install_dir : systemgeneratordir)
1802 executable('systemd-hibernate-resume',
1803 'src/hibernate-resume/hibernate-resume.c',
1804 include_directories : includes,
1805 link_with : [libshared],
1806 install_rpath : rootlibexecdir,
1808 install_dir : rootlibexecdir)
1811 if conf.get('HAVE_BLKID') == 1
1812 executable('systemd-gpt-auto-generator',
1813 'src/gpt-auto-generator/gpt-auto-generator.c',
1814 'src/shared/blkid-util.h',
1815 include_directories : includes,
1816 link_with : [libshared],
1817 dependencies : libblkid,
1818 install_rpath : rootlibexecdir,
1820 install_dir : systemgeneratordir)
1822 exe = executable('systemd-dissect',
1823 'src/dissect/dissect.c',
1824 include_directories : includes,
1825 link_with : [libshared],
1826 install_rpath : rootlibexecdir,
1828 install_dir : rootlibexecdir)
1829 public_programs += exe
1832 if conf.get('ENABLE_RESOLVE') == 1
1833 executable('systemd-resolved',
1834 systemd_resolved_sources,
1835 include_directories : includes,
1836 link_with : [libshared,
1838 libsystemd_resolve_core],
1839 dependencies : systemd_resolved_dependencies,
1840 install_rpath : rootlibexecdir,
1842 install_dir : rootlibexecdir)
1844 exe = executable('resolvectl',
1846 include_directories : includes,
1847 link_with : [libshared,
1849 libsystemd_resolve_core],
1850 dependencies : [threads,
1854 install_rpath : rootlibexecdir,
1856 public_programs += exe
1858 meson.add_install_script(meson_make_symlink,
1859 join_paths(bindir, 'resolvectl'),
1860 join_paths(rootsbindir, 'resolvconf'))
1862 meson.add_install_script(meson_make_symlink,
1863 join_paths(bindir, 'resolvectl'),
1864 join_paths(bindir, 'systemd-resolve'))
1867 if conf.get('ENABLE_LOGIND') == 1
1868 executable('systemd-logind',
1869 systemd_logind_sources,
1870 include_directories : includes,
1871 link_with : [liblogind_core,
1873 dependencies : [threads,
1875 install_rpath : rootlibexecdir,
1877 install_dir : rootlibexecdir)
1879 exe = executable('loginctl',
1881 include_directories : includes,
1882 link_with : [libshared],
1883 dependencies : [threads,
1886 install_rpath : rootlibexecdir,
1888 install_dir : rootbindir)
1889 public_programs += exe
1891 exe = executable('systemd-inhibit',
1892 'src/login/inhibit.c',
1893 include_directories : includes,
1894 link_with : [libshared],
1895 install_rpath : rootlibexecdir,
1897 install_dir : rootbindir)
1898 public_programs += exe
1900 if conf.get('HAVE_PAM') == 1
1901 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1902 pam_systemd = shared_library(
1906 include_directories : includes,
1907 link_args : ['-shared',
1908 '-Wl,--version-script=' + version_script_arg],
1909 link_with : [libsystemd_static,
1911 dependencies : [threads,
1914 link_depends : pam_systemd_sym,
1916 install_dir : pamlibdir)
1918 if want_tests != 'false'
1919 test('dlopen-pam_systemd',
1921 # path to dlopen must include a slash
1922 args : pam_systemd.full_path())
1926 executable('systemd-user-runtime-dir',
1927 user_runtime_dir_sources,
1928 include_directories : includes,
1929 link_with : [libshared],
1930 install_rpath : rootlibexecdir,
1932 install_dir : rootlibexecdir)
1935 if conf.get('HAVE_PAM') == 1
1936 executable('systemd-user-sessions',
1937 'src/user-sessions/user-sessions.c',
1938 include_directories : includes,
1939 link_with : [libshared],
1940 install_rpath : rootlibexecdir,
1942 install_dir : rootlibexecdir)
1945 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1946 exe = executable('bootctl',
1947 'src/boot/bootctl.c',
1948 include_directories : includes,
1949 link_with : [libshared],
1950 dependencies : [libblkid],
1951 install_rpath : rootlibexecdir,
1953 public_programs += exe
1955 executable('systemd-bless-boot',
1956 'src/boot/bless-boot.c',
1957 include_directories : includes,
1958 link_with : [libshared],
1959 dependencies : [libblkid],
1960 install_rpath : rootlibexecdir,
1962 install_dir : rootlibexecdir)
1964 executable('systemd-bless-boot-generator',
1965 'src/boot/bless-boot-generator.c',
1966 include_directories : includes,
1967 link_with : [libshared],
1968 install_rpath : rootlibexecdir,
1970 install_dir : systemgeneratordir)
1973 executable('systemd-boot-check-no-failures',
1974 'src/boot/boot-check-no-failures.c',
1975 include_directories : includes,
1976 link_with : [libshared],
1977 dependencies : [libblkid],
1978 install_rpath : rootlibexecdir,
1980 install_dir : rootlibexecdir)
1982 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1983 include_directories : includes,
1984 link_with : [libshared],
1985 dependencies : [threads],
1986 install_rpath : rootlibexecdir,
1988 public_programs += exe
1991 if get_option('link-systemctl-shared')
1992 systemctl_link_with = [libshared]
1994 systemctl_link_with = [libsystemd_static,
2000 exe = executable('systemctl',
2001 'src/systemctl/systemctl.c',
2002 'src/systemctl/sysv-compat.h',
2003 'src/systemctl/sysv-compat.c',
2004 include_directories : includes,
2005 link_with : systemctl_link_with,
2006 dependencies : [threads,
2011 install_rpath : rootlibexecdir,
2013 install_dir : rootbindir)
2014 public_programs += exe
2016 if conf.get('ENABLE_PORTABLED') == 1
2017 executable('systemd-portabled',
2018 systemd_portabled_sources,
2019 include_directories : includes,
2020 link_with : [libshared],
2021 dependencies : [threads],
2022 install_rpath : rootlibexecdir,
2024 install_dir : rootlibexecdir)
2026 exe = executable('portablectl', 'src/portable/portablectl.c',
2027 include_directories : includes,
2028 link_with : [libshared],
2029 dependencies : [threads],
2030 install_rpath : rootlibexecdir,
2032 install_dir : rootbindir)
2033 public_programs += exe
2036 if conf.get('ENABLE_USERDB') == 1
2037 executable('systemd-userwork',
2038 systemd_userwork_sources,
2039 include_directories : includes,
2040 link_with : [libshared],
2041 dependencies : [threads],
2042 install_rpath : rootlibexecdir,
2044 install_dir : rootlibexecdir)
2046 executable('systemd-userdbd',
2047 systemd_userdbd_sources,
2048 include_directories : includes,
2049 link_with : [libshared],
2050 dependencies : [threads],
2051 install_rpath : rootlibexecdir,
2053 install_dir : rootlibexecdir)
2055 executable('userdbctl',
2057 include_directories : includes,
2058 link_with : [libshared],
2059 dependencies : [threads],
2060 install_rpath : rootlibexecdir,
2062 install_dir : rootbindir)
2065 if conf.get('ENABLE_HOMED') == 1
2066 executable('systemd-homework',
2067 systemd_homework_sources,
2068 include_directories : includes,
2069 link_with : [libshared],
2070 dependencies : [threads,
2077 install_rpath : rootlibexecdir,
2079 install_dir : rootlibexecdir)
2081 executable('systemd-homed',
2082 systemd_homed_sources,
2083 include_directories : includes,
2084 link_with : [libshared],
2085 dependencies : [threads,
2089 install_rpath : rootlibexecdir,
2091 install_dir : rootlibexecdir)
2094 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
2095 meson.add_install_script(meson_make_symlink,
2096 join_paths(rootbindir, 'systemctl'),
2097 join_paths(rootsbindir, alias))
2100 if conf.get('ENABLE_BACKLIGHT') == 1
2101 executable('systemd-backlight',
2102 'src/backlight/backlight.c',
2103 include_directories : includes,
2104 link_with : [libshared],
2105 install_rpath : rootlibexecdir,
2107 install_dir : rootlibexecdir)
2110 if conf.get('ENABLE_RFKILL') == 1
2111 executable('systemd-rfkill',
2112 'src/rfkill/rfkill.c',
2113 include_directories : includes,
2114 link_with : [libshared],
2115 install_rpath : rootlibexecdir,
2117 install_dir : rootlibexecdir)
2120 executable('systemd-system-update-generator',
2121 'src/system-update-generator/system-update-generator.c',
2122 include_directories : includes,
2123 link_with : [libshared],
2124 install_rpath : rootlibexecdir,
2126 install_dir : systemgeneratordir)
2128 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2129 systemd_cryptsetup_sources = files('''
2130 src/cryptsetup/cryptsetup.c
2131 src/cryptsetup/cryptsetup-pkcs11.h
2134 if conf.get('HAVE_P11KIT') == 1
2135 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2138 executable('systemd-cryptsetup',
2139 systemd_cryptsetup_sources,
2140 include_directories : includes,
2141 link_with : [libshared],
2142 dependencies : [libcryptsetup,
2144 install_rpath : rootlibexecdir,
2146 install_dir : rootlibexecdir)
2148 executable('systemd-cryptsetup-generator',
2149 'src/cryptsetup/cryptsetup-generator.c',
2150 include_directories : includes,
2151 link_with : [libshared],
2152 dependencies : [libcryptsetup],
2153 install_rpath : rootlibexecdir,
2155 install_dir : systemgeneratordir)
2157 executable('systemd-veritysetup',
2158 'src/veritysetup/veritysetup.c',
2159 include_directories : includes,
2160 link_with : [libshared],
2161 dependencies : [libcryptsetup],
2162 install_rpath : rootlibexecdir,
2164 install_dir : rootlibexecdir)
2166 executable('systemd-veritysetup-generator',
2167 'src/veritysetup/veritysetup-generator.c',
2168 include_directories : includes,
2169 link_with : [libshared],
2170 dependencies : [libcryptsetup],
2171 install_rpath : rootlibexecdir,
2173 install_dir : systemgeneratordir)
2176 if conf.get('HAVE_SYSV_COMPAT') == 1
2177 executable('systemd-sysv-generator',
2178 'src/sysv-generator/sysv-generator.c',
2179 include_directories : includes,
2180 link_with : [libshared],
2181 install_rpath : rootlibexecdir,
2183 install_dir : systemgeneratordir)
2185 executable('systemd-rc-local-generator',
2186 'src/rc-local-generator/rc-local-generator.c',
2187 include_directories : includes,
2188 link_with : [libshared],
2189 install_rpath : rootlibexecdir,
2191 install_dir : systemgeneratordir)
2194 if conf.get('ENABLE_HOSTNAMED') == 1
2195 executable('systemd-hostnamed',
2196 'src/hostname/hostnamed.c',
2197 include_directories : includes,
2198 link_with : [libshared],
2199 install_rpath : rootlibexecdir,
2201 install_dir : rootlibexecdir)
2203 exe = executable('hostnamectl',
2204 'src/hostname/hostnamectl.c',
2205 include_directories : includes,
2206 link_with : [libshared],
2207 install_rpath : rootlibexecdir,
2209 public_programs += exe
2212 if conf.get('ENABLE_LOCALED') == 1
2213 if conf.get('HAVE_XKBCOMMON') == 1
2214 # logind will load libxkbcommon.so dynamically on its own
2220 executable('systemd-localed',
2221 systemd_localed_sources,
2222 include_directories : includes,
2223 link_with : [libshared],
2224 dependencies : deps,
2225 install_rpath : rootlibexecdir,
2227 install_dir : rootlibexecdir)
2229 exe = executable('localectl',
2231 include_directories : includes,
2232 link_with : [libshared],
2233 install_rpath : rootlibexecdir,
2235 public_programs += exe
2238 if conf.get('ENABLE_TIMEDATED') == 1
2239 executable('systemd-timedated',
2240 'src/timedate/timedated.c',
2241 include_directories : includes,
2242 link_with : [libshared],
2243 install_rpath : rootlibexecdir,
2245 install_dir : rootlibexecdir)
2248 if conf.get('ENABLE_TIMEDATECTL') == 1
2249 exe = executable('timedatectl',
2250 'src/timedate/timedatectl.c',
2251 include_directories : includes,
2252 install_rpath : rootlibexecdir,
2253 link_with : [libshared],
2254 dependencies : [libm],
2256 public_programs += exe
2259 if conf.get('ENABLE_TIMESYNCD') == 1
2260 executable('systemd-timesyncd',
2261 systemd_timesyncd_sources,
2262 include_directories : includes,
2263 link_with : [libshared],
2264 dependencies : [threads,
2266 install_rpath : rootlibexecdir,
2268 install_dir : rootlibexecdir)
2270 executable('systemd-time-wait-sync',
2271 'src/time-wait-sync/time-wait-sync.c',
2272 include_directories : includes,
2273 link_with : [libshared],
2274 install_rpath : rootlibexecdir,
2276 install_dir : rootlibexecdir)
2279 if conf.get('ENABLE_MACHINED') == 1
2280 executable('systemd-machined',
2281 systemd_machined_sources,
2282 include_directories : includes,
2283 link_with : [libmachine_core,
2285 install_rpath : rootlibexecdir,
2287 install_dir : rootlibexecdir)
2289 exe = executable('machinectl',
2290 'src/machine/machinectl.c',
2291 include_directories : includes,
2292 link_with : [libshared],
2293 dependencies : [threads,
2296 install_rpath : rootlibexecdir,
2298 install_dir : rootbindir)
2299 public_programs += exe
2302 if conf.get('ENABLE_IMPORTD') == 1
2303 executable('systemd-importd',
2304 systemd_importd_sources,
2305 include_directories : includes,
2306 link_with : [libshared],
2307 dependencies : [threads],
2308 install_rpath : rootlibexecdir,
2310 install_dir : rootlibexecdir)
2312 systemd_pull = executable('systemd-pull',
2313 systemd_pull_sources,
2314 include_directories : includes,
2315 link_with : [libshared],
2316 dependencies : [versiondep,
2322 install_rpath : rootlibexecdir,
2324 install_dir : rootlibexecdir)
2326 systemd_import = executable('systemd-import',
2327 systemd_import_sources,
2328 include_directories : includes,
2329 link_with : [libshared],
2330 dependencies : [libcurl,
2334 install_rpath : rootlibexecdir,
2336 install_dir : rootlibexecdir)
2338 systemd_import_fs = executable('systemd-import-fs',
2339 systemd_import_fs_sources,
2340 include_directories : includes,
2341 link_with : [libshared],
2342 install_rpath : rootlibexecdir,
2344 install_dir : rootlibexecdir)
2346 systemd_export = executable('systemd-export',
2347 systemd_export_sources,
2348 include_directories : includes,
2349 link_with : [libshared],
2350 dependencies : [libcurl,
2354 install_rpath : rootlibexecdir,
2356 install_dir : rootlibexecdir)
2358 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2361 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2362 exe = executable('systemd-journal-upload',
2363 systemd_journal_upload_sources,
2364 include_directories : includes,
2365 link_with : [libshared],
2366 dependencies : [versiondep,
2372 install_rpath : rootlibexecdir,
2374 install_dir : rootlibexecdir)
2375 public_programs += exe
2378 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2379 s_j_remote = executable('systemd-journal-remote',
2380 systemd_journal_remote_sources,
2381 include_directories : includes,
2382 link_with : [libshared,
2383 libsystemd_journal_remote],
2384 dependencies : [threads,
2389 install_rpath : rootlibexecdir,
2391 install_dir : rootlibexecdir)
2393 s_j_gatewayd = executable('systemd-journal-gatewayd',
2394 systemd_journal_gatewayd_sources,
2395 include_directories : includes,
2396 link_with : [libshared],
2397 dependencies : [threads,
2402 install_rpath : rootlibexecdir,
2404 install_dir : rootlibexecdir)
2405 public_programs += [s_j_remote, s_j_gatewayd]
2408 if conf.get('ENABLE_COREDUMP') == 1
2409 executable('systemd-coredump',
2410 systemd_coredump_sources,
2411 include_directories : includes,
2412 link_with : [libshared],
2413 dependencies : [threads,
2418 install_rpath : rootlibexecdir,
2420 install_dir : rootlibexecdir)
2422 exe = executable('coredumpctl',
2423 coredumpctl_sources,
2424 include_directories : includes,
2425 link_with : [libshared],
2426 dependencies : [threads,
2429 install_rpath : rootlibexecdir,
2431 public_programs += exe
2434 if conf.get('ENABLE_PSTORE') == 1
2435 executable('systemd-pstore',
2436 systemd_pstore_sources,
2437 include_directories : includes,
2438 link_with : [libshared],
2439 dependencies : [threads,
2444 install_rpath : rootlibexecdir,
2446 install_dir : rootlibexecdir)
2449 if conf.get('ENABLE_BINFMT') == 1
2450 exe = executable('systemd-binfmt',
2451 'src/binfmt/binfmt.c',
2452 include_directories : includes,
2453 link_with : [libshared],
2454 install_rpath : rootlibexecdir,
2456 install_dir : rootlibexecdir)
2457 public_programs += exe
2459 meson.add_install_script('sh', '-c',
2460 mkdir_p.format(binfmtdir))
2461 meson.add_install_script('sh', '-c',
2462 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2465 if conf.get('ENABLE_REPART') == 1
2466 executable('systemd-repart',
2467 systemd_repart_sources,
2468 include_directories : includes,
2469 link_with : [libshared],
2470 dependencies : [threads,
2475 install_rpath : rootlibexecdir,
2477 install_dir : rootbindir)
2480 if conf.get('ENABLE_VCONSOLE') == 1
2481 executable('systemd-vconsole-setup',
2482 'src/vconsole/vconsole-setup.c',
2483 include_directories : includes,
2484 link_with : [libshared],
2485 install_rpath : rootlibexecdir,
2487 install_dir : rootlibexecdir)
2490 if conf.get('ENABLE_RANDOMSEED') == 1
2491 executable('systemd-random-seed',
2492 'src/random-seed/random-seed.c',
2493 include_directories : includes,
2494 link_with : [libshared],
2495 install_rpath : rootlibexecdir,
2497 install_dir : rootlibexecdir)
2500 if conf.get('ENABLE_FIRSTBOOT') == 1
2501 executable('systemd-firstboot',
2502 'src/firstboot/firstboot.c',
2503 include_directories : includes,
2504 link_with : [libshared],
2505 dependencies : [libcrypt],
2506 install_rpath : rootlibexecdir,
2508 install_dir : rootbindir)
2511 executable('systemd-remount-fs',
2512 'src/remount-fs/remount-fs.c',
2513 include_directories : includes,
2514 link_with : [libcore_shared,
2516 install_rpath : rootlibexecdir,
2518 install_dir : rootlibexecdir)
2520 executable('systemd-machine-id-setup',
2521 'src/machine-id-setup/machine-id-setup-main.c',
2522 include_directories : includes,
2523 link_with : [libcore_shared,
2525 install_rpath : rootlibexecdir,
2527 install_dir : rootbindir)
2529 executable('systemd-fsck',
2531 include_directories : includes,
2532 link_with : [libshared],
2533 install_rpath : rootlibexecdir,
2535 install_dir : rootlibexecdir)
2537 executable('systemd-growfs',
2538 'src/partition/growfs.c',
2539 include_directories : includes,
2540 link_with : [libshared],
2541 dependencies : [libcryptsetup],
2542 install_rpath : rootlibexecdir,
2544 install_dir : rootlibexecdir)
2546 executable('systemd-makefs',
2547 'src/partition/makefs.c',
2548 include_directories : includes,
2549 link_with : [libshared],
2550 install_rpath : rootlibexecdir,
2552 install_dir : rootlibexecdir)
2554 executable('systemd-sleep',
2555 'src/sleep/sleep.c',
2556 include_directories : includes,
2557 link_with : [libshared],
2558 install_rpath : rootlibexecdir,
2560 install_dir : rootlibexecdir)
2562 install_data('src/sleep/sleep.conf',
2563 install_dir : pkgsysconfdir)
2565 exe = executable('systemd-sysctl',
2566 'src/sysctl/sysctl.c',
2567 include_directories : includes,
2568 link_with : [libshared],
2569 install_rpath : rootlibexecdir,
2571 install_dir : rootlibexecdir)
2572 public_programs += exe
2574 executable('systemd-ac-power',
2575 'src/ac-power/ac-power.c',
2576 include_directories : includes,
2577 link_with : [libshared],
2578 install_rpath : rootlibexecdir,
2580 install_dir : rootlibexecdir)
2582 exe = executable('systemd-detect-virt',
2583 'src/detect-virt/detect-virt.c',
2584 include_directories : includes,
2585 link_with : [libshared],
2586 install_rpath : rootlibexecdir,
2588 public_programs += exe
2590 exe = executable('systemd-delta',
2591 'src/delta/delta.c',
2592 include_directories : includes,
2593 link_with : [libshared],
2594 install_rpath : rootlibexecdir,
2596 public_programs += exe
2598 exe = executable('systemd-escape',
2599 'src/escape/escape.c',
2600 include_directories : includes,
2601 link_with : [libshared],
2602 install_rpath : rootlibexecdir,
2604 install_dir : rootbindir)
2605 public_programs += exe
2607 exe = executable('systemd-notify',
2608 'src/notify/notify.c',
2609 include_directories : includes,
2610 link_with : [libshared],
2611 install_rpath : rootlibexecdir,
2613 install_dir : rootbindir)
2614 public_programs += exe
2616 executable('systemd-volatile-root',
2617 'src/volatile-root/volatile-root.c',
2618 include_directories : includes,
2619 link_with : [libshared],
2620 install_rpath : rootlibexecdir,
2622 install_dir : rootlibexecdir)
2624 executable('systemd-cgroups-agent',
2625 'src/cgroups-agent/cgroups-agent.c',
2626 include_directories : includes,
2627 link_with : [libshared],
2628 install_rpath : rootlibexecdir,
2630 install_dir : rootlibexecdir)
2632 exe = executable('systemd-id128',
2633 'src/id128/id128.c',
2634 include_directories : includes,
2635 link_with : [libshared],
2636 install_rpath : rootlibexecdir,
2638 public_programs += exe
2640 exe = executable('systemd-path',
2642 include_directories : includes,
2643 link_with : [libshared],
2644 install_rpath : rootlibexecdir,
2646 public_programs += exe
2648 exe = executable('systemd-ask-password',
2649 'src/ask-password/ask-password.c',
2650 include_directories : includes,
2651 link_with : [libshared],
2652 install_rpath : rootlibexecdir,
2654 install_dir : rootbindir)
2655 public_programs += exe
2657 executable('systemd-reply-password',
2658 'src/reply-password/reply-password.c',
2659 include_directories : includes,
2660 link_with : [libshared],
2661 install_rpath : rootlibexecdir,
2663 install_dir : rootlibexecdir)
2665 exe = executable('systemd-tty-ask-password-agent',
2666 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2667 include_directories : includes,
2668 link_with : [libshared],
2669 install_rpath : rootlibexecdir,
2671 install_dir : rootbindir)
2672 public_programs += exe
2674 exe = executable('systemd-cgls',
2676 include_directories : includes,
2677 link_with : [libshared],
2678 install_rpath : rootlibexecdir,
2680 public_programs += exe
2682 exe = executable('systemd-cgtop',
2683 'src/cgtop/cgtop.c',
2684 include_directories : includes,
2685 link_with : [libshared],
2686 install_rpath : rootlibexecdir,
2688 public_programs += exe
2690 executable('systemd-initctl',
2691 'src/initctl/initctl.c',
2692 include_directories : includes,
2693 link_with : [libshared],
2694 install_rpath : rootlibexecdir,
2696 install_dir : rootlibexecdir)
2698 exe = executable('systemd-mount',
2699 'src/mount/mount-tool.c',
2700 include_directories : includes,
2701 link_with : [libshared],
2702 dependencies: [libmount],
2703 install_rpath : rootlibexecdir,
2705 public_programs += exe
2707 meson.add_install_script(meson_make_symlink,
2708 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2710 exe = executable('systemd-run',
2712 include_directories : includes,
2713 link_with : [libshared],
2714 install_rpath : rootlibexecdir,
2716 public_programs += exe
2718 exe = executable('systemd-stdio-bridge',
2719 'src/stdio-bridge/stdio-bridge.c',
2720 include_directories : includes,
2721 link_with : [libshared],
2722 dependencies : [versiondep],
2723 install_rpath : rootlibexecdir,
2725 public_programs += exe
2727 exe = executable('busctl',
2728 'src/busctl/busctl.c',
2729 'src/busctl/busctl-introspect.c',
2730 'src/busctl/busctl-introspect.h',
2731 include_directories : includes,
2732 link_with : [libshared],
2733 install_rpath : rootlibexecdir,
2735 public_programs += exe
2737 if conf.get('ENABLE_SYSUSERS') == 1
2738 exe = executable('systemd-sysusers',
2739 'src/sysusers/sysusers.c',
2740 include_directories : includes,
2741 link_with : [libshared],
2742 install_rpath : rootlibexecdir,
2744 install_dir : rootbindir)
2745 public_programs += exe
2748 if conf.get('ENABLE_TMPFILES') == 1
2749 exe = executable('systemd-tmpfiles',
2750 'src/tmpfiles/tmpfiles.c',
2751 include_directories : includes,
2752 link_with : [libshared],
2753 dependencies : [libacl],
2754 install_rpath : rootlibexecdir,
2756 install_dir : rootbindir)
2757 public_programs += exe
2759 if want_tests != 'false'
2760 test('test-systemd-tmpfiles',
2761 test_systemd_tmpfiles_py,
2762 # https://github.com/mesonbuild/meson/issues/2681
2763 args : exe.full_path())
2767 if conf.get('ENABLE_HWDB') == 1
2768 exe = executable('systemd-hwdb',
2770 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2771 include_directories : includes,
2772 link_with : [libudev_static],
2773 install_rpath : udev_rpath,
2775 install_dir : rootbindir)
2776 public_programs += exe
2779 if conf.get('ENABLE_QUOTACHECK') == 1
2780 executable('systemd-quotacheck',
2781 'src/quotacheck/quotacheck.c',
2782 include_directories : includes,
2783 link_with : [libshared],
2784 install_rpath : rootlibexecdir,
2786 install_dir : rootlibexecdir)
2789 exe = executable('systemd-socket-proxyd',
2790 'src/socket-proxy/socket-proxyd.c',
2791 include_directories : includes,
2792 link_with : [libshared],
2793 dependencies : [threads],
2794 install_rpath : rootlibexecdir,
2796 install_dir : rootlibexecdir)
2797 public_programs += exe
2799 exe = executable('systemd-udevd',
2800 systemd_udevd_sources,
2801 include_directories : includes,
2802 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2803 link_with : [libudev_core,
2806 dependencies : [versiondep,
2812 install_rpath : udev_rpath,
2814 install_dir : rootlibexecdir)
2815 public_programs += exe
2817 exe = executable('udevadm',
2819 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2820 include_directories : includes,
2821 link_with : [libudev_core,
2824 dependencies : [versiondep,
2830 install_rpath : udev_rpath,
2832 install_dir : rootbindir)
2833 public_programs += exe
2835 executable('systemd-shutdown',
2836 systemd_shutdown_sources,
2837 include_directories : includes,
2838 link_with : [libcore_shared,
2840 dependencies : [libmount],
2841 install_rpath : rootlibexecdir,
2843 install_dir : rootlibexecdir)
2845 executable('systemd-update-done',
2846 'src/update-done/update-done.c',
2847 include_directories : includes,
2848 link_with : [libshared],
2849 install_rpath : rootlibexecdir,
2851 install_dir : rootlibexecdir)
2853 executable('systemd-update-utmp',
2854 'src/update-utmp/update-utmp.c',
2855 include_directories : includes,
2856 link_with : [libshared],
2857 dependencies : [libaudit],
2858 install_rpath : rootlibexecdir,
2860 install_dir : rootlibexecdir)
2862 if conf.get('HAVE_KMOD') == 1
2863 executable('systemd-modules-load',
2864 'src/modules-load/modules-load.c',
2865 include_directories : includes,
2866 link_with : [libshared],
2867 dependencies : [libkmod],
2868 install_rpath : rootlibexecdir,
2870 install_dir : rootlibexecdir)
2872 meson.add_install_script('sh', '-c',
2873 mkdir_p.format(modulesloaddir))
2874 meson.add_install_script('sh', '-c',
2875 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2878 exe = executable('systemd-nspawn',
2879 systemd_nspawn_sources,
2880 include_directories : includes,
2881 link_with : [libcore_shared,
2884 dependencies : [libblkid,
2886 install_rpath : rootlibexecdir,
2888 public_programs += exe
2890 if conf.get('ENABLE_NETWORKD') == 1
2891 executable('systemd-networkd',
2892 systemd_networkd_sources,
2893 include_directories : network_include_dir,
2894 link_with : [libnetworkd_core,
2897 networkd_link_with],
2898 dependencies : [threads],
2899 install_rpath : rootlibexecdir,
2901 install_dir : rootlibexecdir)
2903 executable('systemd-networkd-wait-online',
2904 systemd_networkd_wait_online_sources,
2905 include_directories : includes,
2906 link_with : [libnetworkd_core,
2907 networkd_link_with],
2908 install_rpath : rootlibexecdir,
2910 install_dir : rootlibexecdir)
2912 exe = executable('networkctl',
2914 include_directories : includes,
2915 link_with : [libsystemd_network,
2916 networkd_link_with],
2917 install_rpath : rootlibexecdir,
2919 install_dir : rootbindir)
2920 public_programs += exe
2922 executable('systemd-network-generator',
2923 network_generator_sources,
2924 include_directories : includes,
2925 link_with : [networkd_link_with],
2926 install_rpath : rootlibexecdir,
2928 install_dir : rootlibexecdir)
2931 executable('systemd-sulogin-shell',
2932 ['src/sulogin-shell/sulogin-shell.c'],
2933 include_directories : includes,
2934 link_with : [libshared],
2935 install_rpath : rootlibexecdir,
2937 install_dir : rootlibexecdir)
2939 ############################################################
2942 'systemd-runtest.env',
2943 output : 'systemd-runtest.env',
2944 command : ['sh', '-c', '{ ' +
2945 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2946 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2948 build_by_default : true)
2950 foreach tuple : tests
2952 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2953 dependencies = tuple[2]
2954 condition = tuple.length() >= 4 ? tuple[3] : ''
2955 type = tuple.length() >= 5 ? tuple[4] : ''
2956 defs = tuple.length() >= 6 ? tuple[5] : []
2957 incs = tuple.length() >= 7 ? tuple[6] : includes
2960 name = sources[0].split('/')[-1].split('.')[0]
2961 if type.startswith('timeout=')
2962 timeout = type.split('=')[1].to_int()
2966 if condition == '' or conf.get(condition) == 1
2970 include_directories : incs,
2971 link_with : link_with,
2972 dependencies : [versiondep,
2975 build_by_default : want_tests != 'false',
2976 install_rpath : rootlibexecdir,
2977 install : install_tests,
2978 install_dir : join_paths(testsdir, type))
2981 message('@0@ is a manual test'.format(name))
2982 elif type == 'unsafe' and want_tests != 'unsafe'
2983 message('@0@ is an unsafe test'.format(name))
2984 elif want_tests != 'false'
2990 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2995 'test-libsystemd-sym',
2996 test_libsystemd_sym_c,
2997 include_directories : includes,
2998 link_with : [libsystemd],
2999 build_by_default : want_tests != 'false',
3000 install : install_tests,
3001 install_dir : testsdir)
3002 if want_tests != 'false'
3003 test('test-libsystemd-sym', exe)
3007 'test-libsystemd-static-sym',
3008 test_libsystemd_sym_c,
3009 include_directories : includes,
3010 link_with : [install_libsystemd_static],
3011 dependencies : [threads], # threads is already included in dependencies on the library,
3012 # but does not seem to get propagated. Add here as a work-around.
3013 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3014 install : install_tests and static_libsystemd_pic,
3015 install_dir : testsdir)
3016 if want_tests != 'false' and static_libsystemd_pic
3017 test('test-libsystemd-static-sym', exe)
3023 include_directories : includes,
3024 c_args : '-Wno-deprecated-declarations',
3025 link_with : [libudev],
3026 build_by_default : want_tests != 'false',
3027 install : install_tests,
3028 install_dir : testsdir)
3029 if want_tests != 'false'
3030 test('test-libudev-sym', exe)
3034 'test-libudev-static-sym',
3036 include_directories : includes,
3037 c_args : '-Wno-deprecated-declarations',
3038 link_with : [install_libudev_static],
3039 build_by_default : want_tests != 'false' and static_libudev_pic,
3040 install : install_tests and static_libudev_pic,
3041 install_dir : testsdir)
3042 if want_tests != 'false' and static_libudev_pic
3043 test('test-libudev-static-sym', exe)
3046 ############################################################
3050 if get_option('tests') != 'false'
3051 foreach tuple : fuzzers
3053 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3054 dependencies = tuple[2]
3055 defs = tuple.length() >= 4 ? tuple[3] : []
3056 incs = tuple.length() >= 5 ? tuple[4] : includes
3059 if want_ossfuzz or want_fuzzbuzz
3060 dependencies += fuzzing_engine
3062 if fuzzing_engine.found()
3063 dependencies += fuzzing_engine
3065 link_args += ['-fsanitize=fuzzer']
3068 sources += 'src/fuzz/fuzz-main.c'
3072 sources += 'src/fuzz/fuzzer-entry-point.c'
3075 name = sources[0].split('/')[-1].split('.')[0]
3077 fuzzer_exes += executable(
3080 include_directories : [incs, include_directories('src/fuzz')],
3081 link_with : link_with,
3082 dependencies : dependencies,
3084 link_args: link_args,
3089 run_target('fuzzers',
3090 depends : fuzzer_exes,
3093 ############################################################
3095 make_directive_index_py = find_program('tools/make-directive-index.py')
3096 make_man_index_py = find_program('tools/make-man-index.py')
3097 xml_helper_py = find_program('tools/xml_helper.py')
3098 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
3099 autosuspend_update_sh = find_program('tools/meson-autosuspend-update.sh')
3102 subdir('sysusers.d')
3103 subdir('tmpfiles.d')
3109 subdir('shell-completion/bash')
3110 subdir('shell-completion/zsh')
3111 subdir('docs/sysvinit')
3112 subdir('docs/var-log')
3114 install_subdir('factory/etc',
3115 install_dir : factorydir)
3117 install_data('xorg/50-systemd-user.sh',
3118 install_dir : xinitrcdir)
3119 install_data('modprobe.d/systemd.conf',
3120 install_dir : modprobedir)
3121 install_data('LICENSE.GPL2',
3125 'docs/CODING_STYLE.md',
3126 'docs/DISTRO_PORTING.md',
3127 'docs/ENVIRONMENT.md',
3129 'docs/TRANSIENT-SETTINGS.md',
3130 'docs/TRANSLATORS.md',
3131 'docs/UIDS-GIDS.md',
3132 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3133 install_dir : docdir)
3135 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3136 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3138 ############################################################
3140 meson_check_help = find_program('tools/meson-check-help.sh')
3142 foreach exec : public_programs
3143 name = exec.full_path().split('/')[-1]
3144 if want_tests != 'false'
3145 test('check-help-' + name,
3147 args : exec.full_path())
3151 ############################################################
3153 check_directives_sh = find_program('tools/check-directives.sh')
3155 if want_tests != 'false'
3156 test('check-directives',
3157 check_directives_sh,
3158 args : project_source_root)
3161 ############################################################
3163 # Enable tests for all supported sanitizers
3164 foreach tuple : sanitizers
3165 sanitizer = tuple[0]
3168 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3170 foreach p : fuzz_regression_tests
3171 b = p.split('/')[-2]
3172 c = p.split('/')[-1]
3174 name = '@0@:@1@'.format(b, sanitizer)
3177 if want_tests == 'false'
3178 message('Not compiling @0@ because tests is set to false'.format(name))
3180 exe = custom_target(
3184 command : [env, 'ln', '-fs',
3185 join_paths(build.full_path(), b),
3187 build_by_default : true)
3189 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3194 if want_tests != 'false' and slow_tests
3195 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3197 args : [exe.full_path(),
3198 join_paths(project_source_root, p)])
3205 ############################################################
3208 all_files = run_command(
3210 ['--git-dir=@0@/.git'.format(project_source_root),
3213 all_files = files(all_files.stdout().split())
3218 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3221 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3225 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3228 command : [meson_git_contrib_sh])
3232 git_head = run_command(
3234 ['--git-dir=@0@/.git'.format(project_source_root),
3235 'rev-parse', 'HEAD']).stdout().strip()
3236 git_head_short = run_command(
3238 ['--git-dir=@0@/.git'.format(project_source_root),
3239 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3243 command : ['git', 'archive',
3244 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3246 '--prefix', 'systemd-@0@/'.format(git_head),
3250 ############################################################
3252 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3255 depends : [man, libsystemd, libudev],
3256 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3258 ############################################################
3259 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3262 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3264 'split /usr: @0@'.format(split_usr),
3265 'split bin-sbin: @0@'.format(split_bin),
3266 'prefix directory: @0@'.format(prefixdir),
3267 'rootprefix directory: @0@'.format(rootprefixdir),
3268 'sysconf directory: @0@'.format(sysconfdir),
3269 'include directory: @0@'.format(includedir),
3270 'lib directory: @0@'.format(libdir),
3271 'rootlib directory: @0@'.format(rootlibdir),
3272 'SysV init scripts: @0@'.format(sysvinit_path),
3273 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3274 'PAM modules directory: @0@'.format(pamlibdir),
3275 'PAM configuration directory: @0@'.format(pamconfdir),
3276 'RPM macros directory: @0@'.format(rpmmacrosdir),
3277 'modprobe.d directory: @0@'.format(modprobedir),
3278 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3279 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3280 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3281 'bash completions directory: @0@'.format(bashcompletiondir),
3282 'zsh completions directory: @0@'.format(zshcompletiondir),
3283 'extra start script: @0@'.format(get_option('rc-local')),
3284 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3285 get_option('debug-tty')),
3286 'TTY GID: @0@'.format(tty_gid),
3287 'users GID: @0@'.format(substs.get('USERS_GID')),
3288 'maximum system UID: @0@'.format(system_uid_max),
3289 'maximum system GID: @0@'.format(system_gid_max),
3290 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3291 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3292 'minimum container UID base: @0@'.format(container_uid_base_min),
3293 'maximum container UID base: @0@'.format(container_uid_base_max),
3294 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3295 'render group access mode: @0@'.format(get_option('group-render-mode')),
3296 'certificate root directory: @0@'.format(get_option('certificate-root')),
3297 'support URL: @0@'.format(support_url),
3298 'nobody user name: @0@'.format(nobody_user),
3299 'nobody group name: @0@'.format(nobody_group),
3300 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3301 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3303 'default DNSSEC mode: @0@'.format(default_dnssec),
3304 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3305 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3306 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3307 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3308 'default locale: @0@'.format(default_locale),
3309 'default user $PATH: @0@'.format(default_user_path_display),
3310 'systemd service watchdog: @0@'.format(watchdog_opt)]
3312 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3313 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3315 'default DNS servers: @0@'.format(alt_dns_servers),
3316 'default NTP servers: @0@'.format(alt_ntp_servers)]
3318 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3319 '@@0@'.format(time_epoch)).stdout().strip()
3321 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3324 'static libsystemd: @0@'.format(static_libsystemd),
3325 'static libudev: @0@'.format(static_libudev)]
3328 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3329 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3330 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3332 if conf.get('ENABLE_EFI') == 1
3333 status += 'efi arch: @0@'.format(efi_arch)
3337 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3338 'EFI CC @0@'.format(' '.join(efi_cc)),
3339 'EFI lib directory: @0@'.format(efi_libdir),
3340 'EFI lds directory: @0@'.format(efi_ldsdir),
3341 'EFI include directory: @0@'.format(efi_incdir)]
3399 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3400 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3404 ['legacy pkla', install_polkit_pkla],
3406 ['gnu-efi', have_gnu_efi],
3419 ['man pages', want_man],
3420 ['html pages', want_html],
3421 ['man page indices', want_man and have_lxml],
3426 ['adm group', get_option('adm-group')],
3427 ['wheel group', get_option('wheel-group')],
3430 ['debug mmap cache'],
3432 ['valgrind', conf.get('VALGRIND') == 1],
3433 ['trace logging', conf.get('LOG_TRACE') == 1],
3434 ['link-udev-shared', get_option('link-udev-shared')],
3435 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3436 ['link-networkd-shared', get_option('link-networkd-shared')],
3439 if tuple.length() >= 2
3442 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3443 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3444 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3455 'enabled features: @0@'.format(', '.join(found)),
3457 'disabled features: @0@'.format(', '.join(missing)),
3459 message('\n '.join(status))
3461 if rootprefixdir != rootprefix_default
3463 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3464 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3465 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))