1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
13 meson_version : '>= 0.46',
16 libsystemd_version = '0.29.0'
17 libudev_version = '1.7.0'
19 # We need the same data in two different formats, ugh!
20 # Also, for hysterical reasons, we use different variable
21 # names, sometimes. Not all variables are included in every
23 conf = configuration_data()
24 conf.set('PROJECT_VERSION', meson.project_version(),
25 description : 'Numerical project version (used where a simple number is expected)')
27 substs = configuration_data()
28 substs.set('PROJECT_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
29 substs.set('PROJECT_VERSION', meson.project_version(),
30 description : 'Numerical project version (used where a simple number is expected)')
32 # This is to be used instead of meson.source_root(), as the latter will return
33 # the wrong result when systemd is being built as a meson subproject
34 project_source_root = meson.current_source_dir()
35 project_build_root = meson.current_build_dir()
36 relative_source_path = run_command('realpath',
37 '--relative-to=@0@'.format(project_build_root),
38 project_source_root).stdout().strip()
39 conf.set_quoted('RELATIVE_SOURCE_PATH', relative_source_path)
41 conf.set10('DEVELOPER_MODE', get_option('mode') == 'developer',
42 description : 'enable additional checks only suitable in development')
44 want_ossfuzz = get_option('oss-fuzz')
45 want_libfuzzer = get_option('llvm-fuzz')
46 if want_ossfuzz + want_libfuzzer > 1
47 error('only one of oss-fuzz or llvm-fuzz can be specified')
50 skip_deps = want_ossfuzz or want_libfuzzer
51 fuzzer_build = want_ossfuzz or want_libfuzzer
53 #####################################################################
55 # Try to install the git pre-commit hook
56 add_git_hook_sh = find_program('tools/add-git-hook.sh', required : false)
57 if add_git_hook_sh.found()
58 git_hook = run_command(add_git_hook_sh)
59 if git_hook.returncode() == 0
60 message(git_hook.stdout().strip())
64 #####################################################################
66 if get_option('split-usr') == 'auto'
67 split_usr = run_command('test', '-L', '/bin').returncode() != 0
69 split_usr = get_option('split-usr') == 'true'
71 conf.set10('HAVE_SPLIT_USR', split_usr,
72 description : '/usr/bin and /bin directories are separate')
74 if get_option('split-bin') == 'auto'
75 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
77 split_bin = get_option('split-bin') == 'true'
79 conf.set10('HAVE_SPLIT_BIN', split_bin,
80 description : 'bin and sbin directories are separate')
82 rootprefixdir = get_option('rootprefix')
83 # Unusual rootprefixdir values are used by some distros
84 # (see https://github.com/systemd/systemd/pull/7461).
85 rootprefix_default = split_usr ? '/' : '/usr'
86 if rootprefixdir == ''
87 rootprefixdir = rootprefix_default
89 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
91 have_standalone_binaries = get_option('standalone-binaries')
93 sysvinit_path = get_option('sysvinit-path')
94 sysvrcnd_path = get_option('sysvrcnd-path')
95 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
96 description : 'SysV init scripts and rcN.d links are supported')
98 if get_option('hibernate') and not get_option('initrd')
99 error('hibernate depends on initrd')
102 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
103 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
104 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
106 # join_paths ignores the preceding arguments if an absolute component is
107 # encountered, so this should canonicalize various paths when they are
108 # absolute or relative.
109 prefixdir = get_option('prefix')
110 if not prefixdir.startswith('/')
111 error('Prefix is not absolute: "@0@"'.format(prefixdir))
113 bindir = join_paths(prefixdir, get_option('bindir'))
114 libdir = join_paths(prefixdir, get_option('libdir'))
115 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
116 includedir = join_paths(prefixdir, get_option('includedir'))
117 datadir = join_paths(prefixdir, get_option('datadir'))
118 localstatedir = join_paths('/', get_option('localstatedir'))
120 rootbindir = join_paths(rootprefixdir, 'bin')
121 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
122 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
124 rootlibdir = get_option('rootlibdir')
126 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
129 # Dirs of external packages
130 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
131 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
132 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
133 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
134 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
135 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
136 rpmmacrosdir = get_option('rpmmacrosdir')
137 if rpmmacrosdir != 'no'
138 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
140 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
143 pkgdatadir = join_paths(datadir, 'systemd')
144 environmentdir = join_paths(prefixdir, 'lib/environment.d')
145 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
146 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
147 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
148 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
149 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
150 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
151 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
152 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
153 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
154 pkgincludedir = join_paths(includedir, 'systemd')
155 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
156 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
157 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
158 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
159 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
160 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
161 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
162 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
163 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
164 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
165 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
166 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
167 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
168 factorydir = join_paths(datadir, 'factory')
169 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
170 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
171 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
172 catalogstatedir = join_paths(systemdstatedir, 'catalog')
173 randomseeddir = join_paths(localstatedir, 'lib/systemd')
174 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
175 ntpservicelistdir = join_paths(rootprefixdir, 'lib/systemd/ntp-units.d')
177 docdir = get_option('docdir')
179 docdir = join_paths(datadir, 'doc/systemd')
182 dbuspolicydir = get_option('dbuspolicydir')
183 if dbuspolicydir == ''
184 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
187 dbussessionservicedir = get_option('dbussessionservicedir')
188 if dbussessionservicedir == ''
189 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
192 dbussystemservicedir = get_option('dbussystemservicedir')
193 if dbussystemservicedir == ''
194 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
197 pamlibdir = get_option('pamlibdir')
199 pamlibdir = join_paths(rootlibdir, 'security')
202 pamconfdir = get_option('pamconfdir')
204 pamconfdir = join_paths(prefixdir, 'lib/pam.d')
207 memory_accounting_default = get_option('memory-accounting-default')
208 status_unit_format_default = get_option('status-unit-format-default')
210 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
211 conf.set_quoted('SYSTEM_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'system'))
212 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
213 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
214 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
215 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
217 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
219 conf.set_quoted('USER_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'user'))
220 conf.set_quoted('USER_DATA_UNIT_DIR', userunitdir)
221 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
222 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
223 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
224 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
225 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
226 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
227 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
228 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
229 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
230 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
231 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
232 conf.set_quoted('ROOTPREFIX', rootprefixdir)
233 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
234 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
235 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
236 conf.set_quoted('SYSTEM_GENERATOR_DIR', systemgeneratordir)
237 conf.set_quoted('USER_GENERATOR_DIR', usergeneratordir)
238 conf.set_quoted('SYSTEM_ENV_GENERATOR_DIR', systemenvgeneratordir)
239 conf.set_quoted('USER_ENV_GENERATOR_DIR', userenvgeneratordir)
240 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
241 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
242 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
243 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
244 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
245 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
246 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
247 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
248 conf.set_quoted('LIBDIR', libdir)
249 conf.set_quoted('ROOTLIBDIR', rootlibdir)
250 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
251 conf.set_quoted('BOOTLIBDIR', bootlibdir)
252 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
253 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
254 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
255 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
256 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
257 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
258 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
259 conf.set_quoted('SYSTEMD_HOMEWORK_PATH', join_paths(rootlibexecdir, 'systemd-homework'))
260 conf.set_quoted('SYSTEMD_USERWORK_PATH', join_paths(rootlibexecdir, 'systemd-userwork'))
261 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
262 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
263 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
265 substs.set('prefix', prefixdir)
266 substs.set('rootprefix', rootprefixdir)
267 substs.set('rootprefix_noslash', rootprefixdir_noslash)
268 substs.set('exec_prefix', prefixdir)
269 substs.set('libdir', libdir)
270 substs.set('rootlibdir', rootlibdir)
271 substs.set('includedir', includedir)
272 substs.set('sysconfdir', sysconfdir)
273 substs.set('bindir', bindir)
274 substs.set('rootbindir', rootbindir)
275 substs.set('rootlibexecdir', rootlibexecdir)
276 substs.set('systemunitdir', systemunitdir)
277 substs.set('userunitdir', userunitdir)
278 substs.set('systempresetdir', systempresetdir)
279 substs.set('userpresetdir', userpresetdir)
280 substs.set('udevhwdbdir', udevhwdbdir)
281 substs.set('udevrulesdir', udevrulesdir)
282 substs.set('udevlibexecdir', udevlibexecdir)
283 substs.set('environmentdir', environmentdir)
284 substs.set('catalogdir', catalogdir)
285 substs.set('tmpfilesdir', tmpfilesdir)
286 substs.set('sysusersdir', sysusersdir)
287 substs.set('sysctldir', sysctldir)
288 substs.set('binfmtdir', binfmtdir)
289 substs.set('modulesloaddir', modulesloaddir)
290 substs.set('modprobedir', modprobedir)
291 substs.set('systemgeneratordir', systemgeneratordir)
292 substs.set('usergeneratordir', usergeneratordir)
293 substs.set('systemenvgeneratordir', systemenvgeneratordir)
294 substs.set('userenvgeneratordir', userenvgeneratordir)
295 substs.set('systemshutdowndir', systemshutdowndir)
296 substs.set('systemsleepdir', systemsleepdir)
297 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
298 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
299 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
300 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
301 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
302 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
303 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
304 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
305 substs.set('BUILD_ROOT', project_build_root)
307 #####################################################################
309 cc = meson.get_compiler('c')
310 pkgconfig = import('pkgconfig')
311 check_compilation_sh = find_program('tools/check-compilation.sh')
312 meson_build_sh = find_program('tools/meson-build.sh')
314 want_tests = get_option('tests')
315 slow_tests = want_tests != 'false' and get_option('slow-tests')
316 fuzz_tests = want_tests != 'false' and get_option('fuzz-tests')
317 install_tests = get_option('install-tests')
319 if add_languages('cpp', required : fuzzer_build)
320 # Used only for tests
321 cxx = meson.get_compiler('cpp')
322 cxx_cmd = ' '.join(cxx.cmd_array())
328 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
329 if fuzzing_engine.found()
330 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
331 elif cc.has_argument('-fsanitize=fuzzer-no-link')
332 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
334 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
337 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
340 # Those generate many false positives, and we do not want to change the code to
342 basic_disabled_warnings = [
343 '-Wno-unused-parameter',
344 '-Wno-missing-field-initializers',
345 '-Wno-unused-result',
346 '-Wno-format-signedness',
349 possible_cc_flags = [
352 '-Wmissing-include-dirs',
353 '-Wold-style-definition',
357 '-Wsuggest-attribute=noreturn',
358 '-Werror=missing-prototypes',
359 '-Werror=implicit-function-declaration',
360 '-Werror=missing-declarations',
361 '-Werror=return-type',
362 '-Werror=incompatible-pointer-types',
364 '-Wstrict-prototypes',
366 '-Wmissing-noreturn',
367 '-Wimplicit-fallthrough=5',
370 '-Wstrict-aliasing=2',
373 '-Werror=shift-count-overflow',
374 '-Werror=shift-overflow=2',
378 # negative arguments are correctly detected starting with meson 0.46.
379 '-Wno-error=#warnings', # clang
380 '-Wno-string-plus-int', # clang
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')
424 have = cc.has_argument('-Wzero-length-bounds')
425 conf.set10('HAVE_ZERO_LENGTH_BOUNDS', have)
429 #include <inttypes.h>
430 typedef uint64_t usec_t;
431 usec_t now(clockid_t clock);
436 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
437 add_project_arguments('-Werror=shadow', language : 'c')
441 add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp')
444 cpp = ' '.join(cc.cmd_array()) + ' -E'
446 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
448 #####################################################################
449 # compilation result tests
451 conf.set('_GNU_SOURCE', true)
452 conf.set('__SANE_USERSPACE_TYPES__', true)
453 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
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 fallback_hostname = get_option('fallback-hostname')
656 if fallback_hostname == '' or fallback_hostname[0] == '.' or fallback_hostname[0] == '-'
657 error('Invalid fallback-hostname configuration')
658 # A more extensive test is done in test-hostname-util. Let's catch
659 # the most obvious errors here so we don't fail with an assert later.
661 conf.set_quoted('FALLBACK_HOSTNAME', fallback_hostname)
663 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
664 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
666 default_hierarchy = get_option('default-hierarchy')
667 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
668 description : 'default cgroup hierarchy as string')
669 if default_hierarchy == 'legacy'
670 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
671 elif default_hierarchy == 'hybrid'
672 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
674 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
677 default_net_naming_scheme = get_option('default-net-naming-scheme')
678 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
680 time_epoch = get_option('time-epoch')
682 time_epoch = run_command('sh', ['-c', 'echo "$SOURCE_DATE_EPOCH"']).stdout().strip()
683 if time_epoch == '' and git.found() and run_command('test', '-e', '.git').returncode() == 0
684 # If we're in a git repository, use the creation time of the latest git tag.
685 latest_tag = run_command('git', 'describe', '--abbrev=0', '--tags').stdout().strip()
686 time_epoch = run_command('git', 'log', '-1', '--format=%at', latest_tag).stdout()
690 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
692 time_epoch = time_epoch.to_int()
694 conf.set('TIME_EPOCH', time_epoch)
696 system_uid_max = get_option('system-uid-max')
697 if system_uid_max == -1
698 system_uid_max = run_command(
700 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
701 '/etc/login.defs').stdout().strip()
702 if system_uid_max == ''
705 system_uid_max = system_uid_max.to_int()
708 conf.set('SYSTEM_UID_MAX', system_uid_max)
709 substs.set('systemuidmax', system_uid_max)
711 system_gid_max = get_option('system-gid-max')
712 if system_gid_max == -1
713 system_gid_max = run_command(
715 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
716 '/etc/login.defs').stdout().strip()
717 if system_gid_max == ''
720 system_gid_max = system_gid_max.to_int()
723 conf.set('SYSTEM_GID_MAX', system_gid_max)
724 substs.set('systemgidmax', system_gid_max)
726 dynamic_uid_min = get_option('dynamic-uid-min')
727 dynamic_uid_max = get_option('dynamic-uid-max')
728 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
729 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
730 substs.set('dynamicuidmin', dynamic_uid_min)
731 substs.set('dynamicuidmax', dynamic_uid_max)
733 container_uid_base_min = get_option('container-uid-base-min')
734 container_uid_base_max = get_option('container-uid-base-max')
735 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
736 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
737 substs.set('containeruidbasemin', container_uid_base_min)
738 substs.set('containeruidbasemax', container_uid_base_max)
740 nobody_user = get_option('nobody-user')
741 nobody_group = get_option('nobody-group')
743 if not meson.is_cross_build()
744 getent_result = run_command('getent', 'passwd', '65534')
745 if getent_result.returncode() == 0
746 name = getent_result.stdout().split(':')[0]
747 if name != nobody_user
749 '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) +
750 'Your build will result in an user table setup that is incompatible with the local system.')
753 id_result = run_command('id', '-u', nobody_user)
754 if id_result.returncode() == 0
755 id = id_result.stdout().to_int()
758 '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) +
759 'Your build will result in an user table setup that is incompatible with the local system.')
763 getent_result = run_command('getent', 'group', '65534')
764 if getent_result.returncode() == 0
765 name = getent_result.stdout().split(':')[0]
766 if name != nobody_group
768 '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) +
769 'Your build will result in an group table setup that is incompatible with the local system.')
772 id_result = run_command('id', '-g', nobody_group)
773 if id_result.returncode() == 0
774 id = id_result.stdout().to_int()
777 '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) +
778 'Your build will result in an group table setup that is incompatible with the local system.')
782 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
784 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
785 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
788 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
789 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
790 substs.set('NOBODY_USER_NAME', nobody_user)
791 substs.set('NOBODY_GROUP_NAME', nobody_group)
793 tty_gid = get_option('tty-gid')
794 conf.set('TTY_GID', tty_gid)
795 substs.set('TTY_GID', tty_gid)
797 # Ensure provided GID argument is numeric, otherwise fall back to default assignment
798 users_gid = get_option('users-gid')
799 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
801 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
802 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
804 dev_kvm_mode = get_option('dev-kvm-mode')
805 substs.set('DEV_KVM_MODE', dev_kvm_mode)
806 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
807 group_render_mode = get_option('group-render-mode')
808 substs.set('GROUP_RENDER_MODE', group_render_mode)
809 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
811 kill_user_processes = get_option('default-kill-user-processes')
812 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
813 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
814 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
816 dns_servers = get_option('dns-servers')
817 conf.set_quoted('DNS_SERVERS', dns_servers)
818 substs.set('DNS_SERVERS', dns_servers)
820 ntp_servers = get_option('ntp-servers')
821 conf.set_quoted('NTP_SERVERS', ntp_servers)
822 substs.set('NTP_SERVERS', ntp_servers)
824 default_locale = get_option('default-locale')
825 if default_locale == ''
826 if not meson.is_cross_build()
827 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
828 default_locale = run_command(choose_default_locale_sh).stdout().strip()
830 default_locale = 'C.UTF-8'
833 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
835 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
837 service_watchdog = get_option('service-watchdog')
838 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
839 substs.set('SERVICE_WATCHDOG', watchdog_value)
841 substs.set('SUSHELL', get_option('debug-shell'))
842 substs.set('DEBUGTTY', get_option('debug-tty'))
843 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
845 enable_debug_hashmap = false
846 enable_debug_mmap_cache = false
847 enable_debug_siphash = false
848 foreach name : get_option('debug-extra')
850 enable_debug_hashmap = true
851 elif name == 'mmap-cache'
852 enable_debug_mmap_cache = true
853 elif name == 'siphash'
854 enable_debug_siphash = true
856 message('unknown debug option "@0@", ignoring'.format(name))
859 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
860 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
861 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
863 conf.set10('VALGRIND', get_option('valgrind'))
864 conf.set10('LOG_TRACE', get_option('log-trace'))
866 default_user_path = get_option('user-path')
867 if default_user_path != ''
868 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
869 default_user_path_display = default_user_path
871 # meson 0.49 fails when ?: is used in .format()
872 default_user_path_display = '(same as system services)'
876 #####################################################################
878 threads = dependency('threads')
879 librt = cc.find_library('rt')
880 libm = cc.find_library('m')
881 libdl = cc.find_library('dl')
882 libcrypt = cc.find_library('crypt')
884 libcap = dependency('libcap', required : false)
885 if not libcap.found()
886 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
887 libcap = cc.find_library('cap')
890 libmount = dependency('mount',
891 version : fuzzer_build ? '>= 0' : '>= 2.30')
893 want_libfdisk = get_option('fdisk')
894 if want_libfdisk != 'false' and not skip_deps
895 libfdisk = dependency('fdisk',
897 required : want_libfdisk == 'true')
898 have = libfdisk.found()
903 conf.set10('HAVE_LIBFDISK', have)
905 want_pwquality = get_option('pwquality')
906 if want_pwquality != 'false' and not skip_deps
907 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
908 have = libpwquality.found()
913 conf.set10('HAVE_PWQUALITY', have)
915 want_seccomp = get_option('seccomp')
916 if want_seccomp != 'false' and not skip_deps
917 libseccomp = dependency('libseccomp',
918 version : '>= 2.3.1',
919 required : want_seccomp == 'true')
920 have = libseccomp.found()
925 conf.set10('HAVE_SECCOMP', have)
927 want_selinux = get_option('selinux')
928 if want_selinux != 'false' and not skip_deps
929 libselinux = dependency('libselinux',
930 version : '>= 2.1.9',
931 required : want_selinux == 'true')
932 have = libselinux.found()
937 conf.set10('HAVE_SELINUX', have)
939 want_apparmor = get_option('apparmor')
940 if want_apparmor != 'false' and not skip_deps
941 libapparmor = dependency('libapparmor',
943 required : want_apparmor == 'true')
944 have = libapparmor.found()
949 conf.set10('HAVE_APPARMOR', have)
951 smack_run_label = get_option('smack-run-label')
952 if smack_run_label != ''
953 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
956 want_polkit = get_option('polkit')
957 install_polkit = false
958 install_polkit_pkla = false
959 if want_polkit != 'false' and not skip_deps
960 install_polkit = true
962 libpolkit = dependency('polkit-gobject-1',
964 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
965 message('Old polkit detected, will install pkla files')
966 install_polkit_pkla = true
969 conf.set10('ENABLE_POLKIT', install_polkit)
971 want_acl = get_option('acl')
972 if want_acl != 'false' and not skip_deps
973 libacl = cc.find_library('acl', required : want_acl == 'true')
974 have = libacl.found()
979 conf.set10('HAVE_ACL', have)
981 want_audit = get_option('audit')
982 if want_audit != 'false' and not skip_deps
983 libaudit = dependency('audit', required : want_audit == 'true')
984 have = libaudit.found()
989 conf.set10('HAVE_AUDIT', have)
991 want_blkid = get_option('blkid')
992 if want_blkid != 'false' and not skip_deps
993 libblkid = dependency('blkid', required : want_blkid == 'true')
994 have = libblkid.found()
999 conf.set10('HAVE_BLKID', have)
1001 want_kmod = get_option('kmod')
1002 if want_kmod != 'false' and not skip_deps
1003 libkmod = dependency('libkmod',
1005 required : want_kmod == 'true')
1006 have = libkmod.found()
1011 conf.set10('HAVE_KMOD', have)
1013 want_pam = get_option('pam')
1014 if want_pam != 'false' and not skip_deps
1015 libpam = cc.find_library('pam', required : want_pam == 'true')
1016 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
1017 have = libpam.found() and libpam_misc.found()
1023 conf.set10('HAVE_PAM', have)
1025 want_microhttpd = get_option('microhttpd')
1026 if want_microhttpd != 'false' and not skip_deps
1027 libmicrohttpd = dependency('libmicrohttpd',
1028 version : '>= 0.9.33',
1029 required : want_microhttpd == 'true')
1030 have = libmicrohttpd.found()
1035 conf.set10('HAVE_MICROHTTPD', have)
1037 want_libcryptsetup = get_option('libcryptsetup')
1038 if want_libcryptsetup != 'false' and not skip_deps
1039 libcryptsetup = dependency('libcryptsetup',
1040 version : '>= 2.0.1',
1041 required : want_libcryptsetup == 'true')
1042 have = libcryptsetup.found()
1044 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1045 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
1046 conf.set10('HAVE_CRYPT_ACTIVATE_BY_SIGNED_KEY',
1047 have and cc.has_function('crypt_activate_by_signed_key', dependencies : libcryptsetup))
1052 conf.set10('HAVE_LIBCRYPTSETUP', have)
1054 want_libcurl = get_option('libcurl')
1055 if want_libcurl != 'false' and not skip_deps
1056 libcurl = dependency('libcurl',
1057 version : '>= 7.32.0',
1058 required : want_libcurl == 'true')
1059 have = libcurl.found()
1064 conf.set10('HAVE_LIBCURL', have)
1066 want_libidn = get_option('libidn')
1067 want_libidn2 = get_option('libidn2')
1068 if want_libidn == 'true' and want_libidn2 == 'true'
1069 error('libidn and libidn2 cannot be requested simultaneously')
1072 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1073 libidn = dependency('libidn2',
1074 required : want_libidn2 == 'true')
1075 have = libidn.found()
1080 conf.set10('HAVE_LIBIDN2', have)
1081 if not have and want_libidn != 'false' and not skip_deps
1082 # libidn is used for both libidn and libidn2 objects
1083 libidn = dependency('libidn',
1084 required : want_libidn == 'true')
1085 have = libidn.found()
1089 conf.set10('HAVE_LIBIDN', have)
1091 want_libiptc = get_option('libiptc')
1092 if want_libiptc != 'false' and not skip_deps
1093 libiptc = dependency('libiptc',
1094 required : want_libiptc == 'true')
1095 have = libiptc.found()
1100 conf.set10('HAVE_LIBIPTC', have)
1102 want_qrencode = get_option('qrencode')
1103 if want_qrencode != 'false' and not skip_deps
1104 libqrencode = dependency('libqrencode',
1105 required : want_qrencode == 'true')
1106 have = libqrencode.found()
1111 conf.set10('HAVE_QRENCODE', have)
1113 want_gcrypt = get_option('gcrypt')
1114 if want_gcrypt != 'false' and not skip_deps
1115 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1116 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1117 have = libgcrypt.found() and libgpg_error.found()
1122 # link to neither of the libs if one is not found
1126 conf.set10('HAVE_GCRYPT', have)
1128 want_gnutls = get_option('gnutls')
1129 if want_gnutls != 'false' and not skip_deps
1130 libgnutls = dependency('gnutls',
1131 version : '>= 3.1.4',
1132 required : want_gnutls == 'true')
1133 have = libgnutls.found()
1138 conf.set10('HAVE_GNUTLS', have)
1140 want_openssl = get_option('openssl')
1141 if want_openssl != 'false' and not skip_deps
1142 libopenssl = dependency('openssl',
1143 version : '>= 1.1.0',
1144 required : want_openssl == 'true')
1145 have = libopenssl.found()
1150 conf.set10('HAVE_OPENSSL', have)
1152 want_p11kit = get_option('p11kit')
1153 if want_p11kit != 'false' and not skip_deps
1154 libp11kit = dependency('p11-kit-1',
1155 version : '>= 0.23.3',
1156 required : want_p11kit == 'true')
1157 have = libp11kit.found()
1162 conf.set10('HAVE_P11KIT', have)
1164 want_libfido2 = get_option('libfido2')
1165 if want_libfido2 != 'false' and not skip_deps
1166 libfido2 = dependency('libfido2',
1167 required : want_libfido2 == 'true')
1168 have = libfido2.found()
1173 conf.set10('HAVE_LIBFIDO2', have)
1175 want_elfutils = get_option('elfutils')
1176 if want_elfutils != 'false' and not skip_deps
1177 libdw = dependency('libdw',
1178 required : want_elfutils == 'true')
1179 have = libdw.found()
1184 conf.set10('HAVE_ELFUTILS', have)
1186 want_zlib = get_option('zlib')
1187 if want_zlib != 'false' and not skip_deps
1188 libz = dependency('zlib',
1189 required : want_zlib == 'true')
1195 conf.set10('HAVE_ZLIB', have)
1197 want_bzip2 = get_option('bzip2')
1198 if want_bzip2 != 'false' and not skip_deps
1199 libbzip2 = cc.find_library('bz2',
1200 required : want_bzip2 == 'true')
1201 have = libbzip2.found()
1206 conf.set10('HAVE_BZIP2', have)
1208 want_xz = get_option('xz')
1209 if want_xz != 'false' and not skip_deps
1210 libxz = dependency('liblzma',
1211 required : want_xz == 'true')
1212 have_xz = libxz.found()
1217 conf.set10('HAVE_XZ', have_xz)
1219 want_lz4 = get_option('lz4')
1220 if want_lz4 != 'false' and not skip_deps
1221 liblz4 = dependency('liblz4',
1222 version : '>= 1.3.0',
1223 required : want_lz4 == 'true')
1224 have_lz4 = liblz4.found()
1229 conf.set10('HAVE_LZ4', have_lz4)
1231 want_zstd = get_option('zstd')
1232 if want_zstd != 'false' and not skip_deps
1233 libzstd = dependency('libzstd',
1234 required : want_zstd == 'true',
1235 version : '>= 1.4.0')
1236 have_zstd = libzstd.found()
1241 conf.set10('HAVE_ZSTD', have_zstd)
1243 conf.set10('HAVE_COMPRESSION', have_xz or have_lz4 or have_zstd)
1245 want_xkbcommon = get_option('xkbcommon')
1246 if want_xkbcommon != 'false' and not skip_deps
1247 libxkbcommon = dependency('xkbcommon',
1248 version : '>= 0.3.0',
1249 required : want_xkbcommon == 'true')
1250 have = libxkbcommon.found()
1255 conf.set10('HAVE_XKBCOMMON', have)
1257 want_pcre2 = get_option('pcre2')
1258 if want_pcre2 != 'false'
1259 libpcre2 = dependency('libpcre2-8',
1260 required : want_pcre2 == 'true')
1261 have = libpcre2.found()
1266 conf.set10('HAVE_PCRE2', have)
1268 want_glib = get_option('glib')
1269 if want_glib != 'false' and not skip_deps
1270 libglib = dependency('glib-2.0',
1271 version : '>= 2.22.0',
1272 required : want_glib == 'true')
1273 libgobject = dependency('gobject-2.0',
1274 version : '>= 2.22.0',
1275 required : want_glib == 'true')
1276 libgio = dependency('gio-2.0',
1277 required : want_glib == 'true')
1278 have = libglib.found() and libgobject.found() and libgio.found()
1285 conf.set10('HAVE_GLIB', have)
1287 want_dbus = get_option('dbus')
1288 if want_dbus != 'false' and not skip_deps
1289 libdbus = dependency('dbus-1',
1290 version : '>= 1.3.2',
1291 required : want_dbus == 'true')
1292 have = libdbus.found()
1297 conf.set10('HAVE_DBUS', have)
1299 default_dnssec = get_option('default-dnssec')
1301 default_dnssec = 'no'
1303 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1304 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1305 default_dnssec = 'no'
1307 conf.set('DEFAULT_DNSSEC_MODE',
1308 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1309 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1311 dns_over_tls = get_option('dns-over-tls')
1312 if dns_over_tls != 'false'
1313 if dns_over_tls == 'openssl'
1316 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1317 if dns_over_tls == 'gnutls' and not have_gnutls
1318 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1321 if dns_over_tls == 'gnutls' or have_gnutls
1322 have_openssl = false
1324 have_openssl = conf.get('HAVE_OPENSSL') == 1
1325 if dns_over_tls != 'auto' and not have_openssl
1326 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1327 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1330 have = have_gnutls or have_openssl
1334 have_openssl = false
1336 conf.set10('ENABLE_DNS_OVER_TLS', have)
1337 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1338 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1340 default_dns_over_tls = get_option('default-dns-over-tls')
1342 default_dns_over_tls = 'no'
1344 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1345 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.')
1346 default_dns_over_tls = 'no'
1348 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1349 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1350 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1352 default_mdns = get_option('default-mdns')
1353 conf.set('DEFAULT_MDNS_MODE',
1354 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
1355 substs.set('DEFAULT_MDNS_MODE', default_mdns)
1357 default_llmnr = get_option('default-llmnr')
1358 conf.set('DEFAULT_LLMNR_MODE',
1359 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
1360 substs.set('DEFAULT_LLMNR_MODE', default_llmnr)
1362 want_repart = get_option('repart')
1363 if want_repart != 'false'
1364 have = (conf.get('HAVE_OPENSSL') == 1 and
1365 conf.get('HAVE_LIBFDISK') == 1)
1366 if want_repart == 'true' and not have
1367 error('repart support was requested, but dependencies are not available')
1372 conf.set10('ENABLE_REPART', have)
1374 want_importd = get_option('importd')
1375 if want_importd != 'false'
1376 have = (conf.get('HAVE_LIBCURL') == 1 and
1377 conf.get('HAVE_ZLIB') == 1 and
1378 conf.get('HAVE_XZ') == 1 and
1379 conf.get('HAVE_GCRYPT') == 1)
1380 if want_importd == 'true' and not have
1381 error('importd support was requested, but dependencies are not available')
1386 conf.set10('ENABLE_IMPORTD', have)
1388 want_homed = get_option('homed')
1389 if want_homed != 'false'
1390 have = (conf.get('HAVE_OPENSSL') == 1 and
1391 conf.get('HAVE_LIBFDISK') == 1 and
1392 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1393 if want_homed == 'true' and not have
1394 error('homed support was requested, but dependencies are not available')
1399 conf.set10('ENABLE_HOMED', have)
1401 have = have and conf.get('HAVE_PAM') == 1
1402 conf.set10('ENABLE_PAM_HOME', have)
1404 want_remote = get_option('remote')
1405 if want_remote != 'false'
1406 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1407 conf.get('HAVE_LIBCURL') == 1]
1408 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1409 # it's possible to build one without the other. Complain only if
1410 # support was explicitly requested. The auxiliary files like sysusers
1411 # config should be installed when any of the programs are built.
1412 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1413 error('remote support was requested, but dependencies are not available')
1415 have = have_deps[0] or have_deps[1]
1419 conf.set10('ENABLE_REMOTE', have)
1421 foreach term : ['analyze',
1458 have = get_option(term)
1459 name = 'ENABLE_' + term.underscorify().to_upper()
1460 conf.set10(name, have)
1463 foreach tuple : [['nss-mymachines', 'machined'],
1464 ['nss-resolve', 'resolve']]
1465 want = get_option(tuple[0])
1467 have = get_option(tuple[1])
1468 if want == 'true' and not have
1469 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1474 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1475 conf.set10(name, have)
1479 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1480 'ENABLE_NSS_MYMACHINES',
1481 'ENABLE_NSS_RESOLVE',
1482 'ENABLE_NSS_SYSTEMD']
1483 if conf.get(term) == 1
1487 conf.set10('ENABLE_NSS', enable_nss)
1489 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1494 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1496 #####################################################################
1498 if get_option('efi')
1499 efi_arch = host_machine.cpu_family()
1501 if efi_arch == 'x86'
1502 EFI_MACHINE_TYPE_NAME = 'ia32'
1503 gnu_efi_arch = 'ia32'
1504 elif efi_arch == 'x86_64'
1505 EFI_MACHINE_TYPE_NAME = 'x64'
1506 gnu_efi_arch = 'x86_64'
1507 elif efi_arch == 'arm'
1508 EFI_MACHINE_TYPE_NAME = 'arm'
1509 gnu_efi_arch = 'arm'
1510 elif efi_arch == 'aarch64'
1511 EFI_MACHINE_TYPE_NAME = 'aa64'
1512 gnu_efi_arch = 'aarch64'
1514 EFI_MACHINE_TYPE_NAME = ''
1519 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1521 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1525 conf.set10('ENABLE_EFI', have)
1527 #####################################################################
1529 config_h = configure_file(
1530 output : 'config.h',
1531 configuration : conf)
1533 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1535 includes = include_directories('src/basic',
1541 'src/journal-remote',
1545 'src/time-wait-sync',
1551 'src/xdg-autostart-generator',
1552 'src/libsystemd/sd-bus',
1553 'src/libsystemd/sd-device',
1554 'src/libsystemd/sd-event',
1555 'src/libsystemd/sd-hwdb',
1556 'src/libsystemd/sd-id128',
1557 'src/libsystemd/sd-netlink',
1558 'src/libsystemd/sd-network',
1559 'src/libsystemd/sd-resolve',
1560 'src/libsystemd-network',
1563 add_project_arguments('-include', 'config.h', language : 'c')
1565 generate_gperfs = find_program('tools/generate-gperfs.py')
1569 subdir('src/systemd')
1571 subdir('src/libsystemd')
1572 subdir('src/libsystemd-network')
1573 subdir('src/journal')
1576 libjournal_core = static_library(
1578 libjournal_core_sources,
1580 include_directories : includes,
1583 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1584 libsystemd = shared_library(
1587 version : libsystemd_version,
1588 include_directories : includes,
1589 link_args : ['-shared',
1590 '-Wl,--version-script=' + libsystemd_sym_path],
1591 link_with : [libbasic,
1593 link_whole : [libsystemd_static,
1595 dependencies : [threads,
1600 link_depends : libsystemd_sym,
1602 install_dir : rootlibdir)
1604 static_libsystemd = get_option('static-libsystemd')
1605 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1607 install_libsystemd_static = static_library(
1610 journal_client_sources,
1612 basic_gcrypt_sources,
1614 include_directories : includes,
1615 build_by_default : static_libsystemd != 'false',
1616 install : static_libsystemd != 'false',
1617 install_dir : rootlibdir,
1618 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1619 dependencies : [threads,
1629 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1631 ############################################################
1633 autosuspend_update_sh = find_program('tools/autosuspend-update.sh')
1634 hwdb_update_sh = find_program('tools/hwdb-update.sh')
1635 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1636 make_directive_index_py = find_program('tools/make-directive-index.py')
1637 make_man_index_py = find_program('tools/make-man-index.py')
1638 syscall_names_update_sh = find_program('tools/syscall-names-update.sh')
1639 xml_helper_py = find_program('tools/xml_helper.py')
1640 update_dbus_docs_py = find_program('tools/update-dbus-docs.py')
1642 ############################################################
1644 # binaries that have --help and are intended for use by humans,
1645 # usually, but not always, installed in /bin.
1646 public_programs = []
1648 subdir('src/libudev')
1649 subdir('src/shared')
1651 subdir('src/shutdown')
1653 subdir('src/network')
1655 subdir('src/analyze')
1656 subdir('src/journal-remote')
1657 subdir('src/coredump')
1658 subdir('src/pstore')
1659 subdir('src/hostname')
1660 subdir('src/import')
1661 subdir('src/partition')
1662 subdir('src/kernel-install')
1663 subdir('src/locale')
1664 subdir('src/machine')
1665 subdir('src/portable')
1666 subdir('src/userdb')
1668 subdir('src/nspawn')
1669 subdir('src/resolve')
1670 subdir('src/timedate')
1671 subdir('src/timesync')
1672 subdir('src/tmpfiles')
1673 subdir('src/vconsole')
1674 subdir('src/boot/efi')
1681 ############################################################
1683 # only static linking apart from libdl, to make sure that the
1684 # module is linked to all libraries that it uses.
1685 test_dlopen = executable(
1689 include_directories : includes,
1690 link_with : [libbasic],
1691 dependencies : [libdl],
1692 build_by_default : want_tests != 'false')
1694 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1695 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h src/nss-systemd/nss-systemd.h'],
1696 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1697 ['resolve', 'ENABLE_NSS_RESOLVE']]
1699 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1703 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1704 version_script_arg = join_paths(project_source_root, sym)
1706 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1707 if tuple.length() > 2
1708 sources += tuple[2].split()
1711 nss = shared_library(
1716 include_directories : includes,
1717 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1718 link_args : ['-Wl,-z,nodelete',
1720 '-Wl,--version-script=' + version_script_arg],
1721 link_with : [libsystemd_static,
1724 dependencies : [threads,
1728 install_dir : rootlibdir)
1730 # We cannot use shared_module because it does not support version suffix.
1731 # Unfortunately shared_library insists on creating the symlink…
1732 meson.add_install_script('sh', '-c',
1733 'rm $DESTDIR@0@/libnss_@1@.so'
1734 .format(rootlibdir, module))
1736 if want_tests != 'false'
1737 test('dlopen-nss_' + module,
1739 # path to dlopen must include a slash
1740 args : nss.full_path())
1745 ############################################################
1750 include_directories : includes,
1751 link_with : [libcore,
1753 dependencies : [versiondep,
1760 install_rpath : rootlibexecdir,
1762 install_dir : rootlibexecdir)
1764 meson.add_install_script(meson_make_symlink,
1765 join_paths(rootlibexecdir, 'systemd'),
1766 join_paths(rootsbindir, 'init'))
1768 public_programs += executable(
1770 systemd_analyze_sources,
1771 include_directories : includes,
1772 link_with : [libcore,
1774 dependencies : [versiondep,
1781 install_rpath : rootlibexecdir,
1782 install : conf.get('ENABLE_ANALYZE'))
1786 systemd_journald_sources,
1787 include_directories : includes,
1788 link_with : [libjournal_core,
1790 dependencies : [threads,
1795 install_rpath : rootlibexecdir,
1797 install_dir : rootlibexecdir)
1799 public_programs += executable(
1801 systemd_cat_sources,
1802 include_directories : includes,
1803 link_with : [libjournal_core,
1805 dependencies : [threads],
1806 install_rpath : rootlibexecdir,
1809 public_programs += executable(
1812 include_directories : includes,
1813 link_with : [libshared],
1814 dependencies : [threads,
1820 install_rpath : rootlibexecdir,
1822 install_dir : rootbindir)
1825 'systemd-getty-generator',
1826 'src/getty-generator/getty-generator.c',
1827 include_directories : includes,
1828 link_with : [libshared],
1829 install_rpath : rootlibexecdir,
1831 install_dir : systemgeneratordir)
1834 'systemd-debug-generator',
1835 'src/debug-generator/debug-generator.c',
1836 include_directories : includes,
1837 link_with : [libshared],
1838 install_rpath : rootlibexecdir,
1840 install_dir : systemgeneratordir)
1843 'systemd-run-generator',
1844 'src/run-generator/run-generator.c',
1845 include_directories : includes,
1846 link_with : [libshared],
1847 install_rpath : rootlibexecdir,
1849 install_dir : systemgeneratordir)
1852 'systemd-fstab-generator',
1853 'src/fstab-generator/fstab-generator.c',
1854 include_directories : includes,
1855 link_with : [libcore_shared,
1857 install_rpath : rootlibexecdir,
1859 install_dir : systemgeneratordir)
1861 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1863 '30-systemd-environment-d-generator',
1864 'src/environment-d-generator/environment-d-generator.c',
1865 include_directories : includes,
1866 link_with : [libshared],
1867 install_rpath : rootlibexecdir,
1869 install_dir : userenvgeneratordir)
1871 meson.add_install_script(meson_make_symlink,
1872 join_paths(sysconfdir, 'environment'),
1873 join_paths(environmentdir, '99-environment.conf'))
1876 if conf.get('ENABLE_HIBERNATE') == 1
1878 'systemd-hibernate-resume-generator',
1879 'src/hibernate-resume/hibernate-resume-generator.c',
1880 include_directories : includes,
1881 link_with : [libshared],
1882 install_rpath : rootlibexecdir,
1884 install_dir : systemgeneratordir)
1887 'systemd-hibernate-resume',
1888 'src/hibernate-resume/hibernate-resume.c',
1889 include_directories : includes,
1890 link_with : [libshared],
1891 install_rpath : rootlibexecdir,
1893 install_dir : rootlibexecdir)
1896 if conf.get('HAVE_BLKID') == 1
1898 'systemd-gpt-auto-generator',
1899 'src/gpt-auto-generator/gpt-auto-generator.c',
1900 'src/shared/blkid-util.h',
1901 include_directories : includes,
1902 link_with : [libshared],
1903 dependencies : libblkid,
1904 install_rpath : rootlibexecdir,
1906 install_dir : systemgeneratordir)
1908 public_programs += executable(
1910 'src/dissect/dissect.c',
1911 include_directories : includes,
1912 link_with : [libshared],
1913 install_rpath : rootlibexecdir,
1917 if conf.get('ENABLE_RESOLVE') == 1
1920 systemd_resolved_sources,
1921 include_directories : includes,
1922 link_with : [libshared,
1924 libsystemd_resolve_core],
1925 dependencies : systemd_resolved_dependencies,
1926 install_rpath : rootlibexecdir,
1928 install_dir : rootlibexecdir)
1930 public_programs += executable(
1933 include_directories : includes,
1934 link_with : [libshared,
1936 libsystemd_resolve_core],
1937 dependencies : [threads,
1941 install_rpath : rootlibexecdir,
1944 meson.add_install_script(meson_make_symlink,
1945 join_paths(bindir, 'resolvectl'),
1946 join_paths(rootsbindir, 'resolvconf'))
1948 meson.add_install_script(meson_make_symlink,
1949 join_paths(bindir, 'resolvectl'),
1950 join_paths(bindir, 'systemd-resolve'))
1953 if conf.get('ENABLE_LOGIND') == 1
1956 systemd_logind_sources,
1957 include_directories : includes,
1958 link_with : [liblogind_core,
1960 dependencies : [threads,
1962 install_rpath : rootlibexecdir,
1964 install_dir : rootlibexecdir)
1966 public_programs += executable(
1969 include_directories : includes,
1970 link_with : [libshared],
1971 dependencies : [threads,
1975 install_rpath : rootlibexecdir,
1977 install_dir : rootbindir)
1979 public_programs += executable(
1981 'src/login/inhibit.c',
1982 include_directories : includes,
1983 link_with : [libshared],
1984 install_rpath : rootlibexecdir,
1986 install_dir : rootbindir)
1988 if conf.get('HAVE_PAM') == 1
1989 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1990 pam_systemd = shared_library(
1994 include_directories : includes,
1995 link_args : ['-shared',
1996 '-Wl,--version-script=' + version_script_arg],
1997 link_with : [libsystemd_static,
1999 dependencies : [threads,
2002 link_depends : pam_systemd_sym,
2004 install_dir : pamlibdir)
2006 if want_tests != 'false'
2007 test('dlopen-pam_systemd',
2009 # path to dlopen must include a slash
2010 args : pam_systemd.full_path())
2015 'systemd-user-runtime-dir',
2016 user_runtime_dir_sources,
2017 include_directories : includes,
2018 link_with : [libshared],
2019 install_rpath : rootlibexecdir,
2021 install_dir : rootlibexecdir)
2024 if conf.get('HAVE_PAM') == 1
2026 'systemd-user-sessions',
2027 'src/user-sessions/user-sessions.c',
2028 include_directories : includes,
2029 link_with : [libshared],
2030 install_rpath : rootlibexecdir,
2032 install_dir : rootlibexecdir)
2035 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
2036 public_programs += executable(
2038 'src/boot/bootctl.c',
2039 include_directories : includes,
2040 link_with : [libshared],
2041 dependencies : [libblkid],
2042 install_rpath : rootlibexecdir,
2045 public_programs += executable(
2046 'systemd-bless-boot',
2047 'src/boot/bless-boot.c',
2048 include_directories : includes,
2049 link_with : [libshared],
2050 dependencies : [libblkid],
2051 install_rpath : rootlibexecdir,
2053 install_dir : rootlibexecdir)
2056 'systemd-bless-boot-generator',
2057 'src/boot/bless-boot-generator.c',
2058 include_directories : includes,
2059 link_with : [libshared],
2060 install_rpath : rootlibexecdir,
2062 install_dir : systemgeneratordir)
2066 'systemd-boot-check-no-failures',
2067 'src/boot/boot-check-no-failures.c',
2068 include_directories : includes,
2069 link_with : [libshared],
2070 dependencies : [libblkid],
2071 install_rpath : rootlibexecdir,
2073 install_dir : rootlibexecdir)
2075 public_programs += executable(
2076 'systemd-socket-activate',
2077 'src/activate/activate.c',
2078 include_directories : includes,
2079 link_with : [libshared],
2080 dependencies : [threads],
2081 install_rpath : rootlibexecdir,
2084 if get_option('link-systemctl-shared')
2085 systemctl_link_with = [libshared]
2087 systemctl_link_with = [libsystemd_static,
2093 public_programs += executable(
2095 'src/systemctl/systemctl.c',
2096 'src/systemctl/sysv-compat.h',
2097 'src/systemctl/sysv-compat.c',
2098 include_directories : includes,
2099 link_with : systemctl_link_with,
2100 dependencies : [threads,
2106 install_rpath : rootlibexecdir,
2108 install_dir : rootbindir)
2110 if conf.get('ENABLE_PORTABLED') == 1
2112 'systemd-portabled',
2113 systemd_portabled_sources,
2114 include_directories : includes,
2115 link_with : [libshared],
2116 dependencies : [threads],
2117 install_rpath : rootlibexecdir,
2119 install_dir : rootlibexecdir)
2121 public_programs += executable(
2123 'src/portable/portablectl.c',
2124 include_directories : includes,
2125 link_with : [libshared],
2126 dependencies : [threads],
2127 install_rpath : rootlibexecdir,
2129 install_dir : rootbindir)
2132 if conf.get('ENABLE_USERDB') == 1
2135 systemd_userwork_sources,
2136 include_directories : includes,
2137 link_with : [libshared],
2138 dependencies : [threads],
2139 install_rpath : rootlibexecdir,
2141 install_dir : rootlibexecdir)
2145 systemd_userdbd_sources,
2146 include_directories : includes,
2147 link_with : [libshared],
2148 dependencies : [threads],
2149 install_rpath : rootlibexecdir,
2151 install_dir : rootlibexecdir)
2153 public_programs += executable(
2156 include_directories : includes,
2157 link_with : [libshared],
2158 dependencies : [threads],
2159 install_rpath : rootlibexecdir,
2161 install_dir : rootbindir)
2164 if conf.get('ENABLE_HOMED') == 1
2167 systemd_homework_sources,
2168 include_directories : includes,
2169 link_with : [libshared],
2170 dependencies : [threads,
2178 install_rpath : rootlibexecdir,
2180 install_dir : rootlibexecdir)
2184 systemd_homed_sources,
2185 include_directories : includes,
2186 link_with : [libshared],
2187 dependencies : [threads,
2190 install_rpath : rootlibexecdir,
2192 install_dir : rootlibexecdir)
2194 public_programs += executable(
2197 include_directories : includes,
2198 link_with : [libshared],
2199 dependencies : [threads,
2205 install_rpath : rootlibexecdir,
2207 install_dir : rootbindir)
2209 if conf.get('HAVE_PAM') == 1
2210 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2211 pam_systemd = shared_library(
2215 include_directories : includes,
2216 link_args : ['-shared',
2217 '-Wl,--version-script=' + version_script_arg],
2218 link_with : [libsystemd_static,
2220 dependencies : [threads,
2224 link_depends : pam_systemd_home_sym,
2226 install_dir : pamlibdir)
2230 foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
2231 (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
2232 meson.add_install_script(meson_make_symlink,
2233 join_paths(rootbindir, 'systemctl'),
2234 join_paths(rootsbindir, alias))
2237 meson.add_install_script(meson_make_symlink,
2238 join_paths(rootbindir, 'udevadm'),
2239 join_paths(rootlibexecdir, 'systemd-udevd'))
2241 if conf.get('ENABLE_BACKLIGHT') == 1
2243 'systemd-backlight',
2244 'src/backlight/backlight.c',
2245 include_directories : includes,
2246 link_with : [libshared],
2247 install_rpath : rootlibexecdir,
2249 install_dir : rootlibexecdir)
2252 if conf.get('ENABLE_RFKILL') == 1
2255 'src/rfkill/rfkill.c',
2256 include_directories : includes,
2257 link_with : [libshared],
2258 install_rpath : rootlibexecdir,
2260 install_dir : rootlibexecdir)
2264 'systemd-system-update-generator',
2265 'src/system-update-generator/system-update-generator.c',
2266 include_directories : includes,
2267 link_with : [libshared],
2268 install_rpath : rootlibexecdir,
2270 install_dir : systemgeneratordir)
2272 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2273 systemd_cryptsetup_sources = files('''
2274 src/cryptsetup/cryptsetup-pkcs11.h
2275 src/cryptsetup/cryptsetup-keyfile.c
2276 src/cryptsetup/cryptsetup-keyfile.h
2277 src/cryptsetup/cryptsetup.c
2280 if conf.get('HAVE_P11KIT') == 1
2281 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2285 'systemd-cryptsetup',
2286 systemd_cryptsetup_sources,
2287 include_directories : includes,
2288 link_with : [libshared],
2289 dependencies : [libcryptsetup,
2291 install_rpath : rootlibexecdir,
2293 install_dir : rootlibexecdir)
2296 'systemd-cryptsetup-generator',
2297 'src/cryptsetup/cryptsetup-generator.c',
2298 include_directories : includes,
2299 link_with : [libshared],
2300 install_rpath : rootlibexecdir,
2302 install_dir : systemgeneratordir)
2305 'systemd-veritysetup',
2306 'src/veritysetup/veritysetup.c',
2307 include_directories : includes,
2308 link_with : [libshared],
2309 dependencies : [libcryptsetup],
2310 install_rpath : rootlibexecdir,
2312 install_dir : rootlibexecdir)
2315 'systemd-veritysetup-generator',
2316 'src/veritysetup/veritysetup-generator.c',
2317 include_directories : includes,
2318 link_with : [libshared],
2319 install_rpath : rootlibexecdir,
2321 install_dir : systemgeneratordir)
2324 if conf.get('HAVE_SYSV_COMPAT') == 1
2326 'systemd-sysv-generator',
2327 'src/sysv-generator/sysv-generator.c',
2328 include_directories : includes,
2329 link_with : [libshared],
2330 install_rpath : rootlibexecdir,
2332 install_dir : systemgeneratordir)
2335 'systemd-rc-local-generator',
2336 'src/rc-local-generator/rc-local-generator.c',
2337 include_directories : includes,
2338 link_with : [libshared],
2339 install_rpath : rootlibexecdir,
2341 install_dir : systemgeneratordir)
2344 if conf.get('ENABLE_XDG_AUTOSTART') == 1
2346 'systemd-xdg-autostart-generator',
2347 'src/xdg-autostart-generator/xdg-autostart-generator.c',
2348 'src/xdg-autostart-generator/xdg-autostart-service.c',
2349 include_directories : includes,
2350 link_with : [libshared],
2351 install_rpath : rootlibexecdir,
2353 install_dir : usergeneratordir)
2356 'systemd-xdg-autostart-condition',
2357 'src/xdg-autostart-generator/xdg-autostart-condition.c',
2358 include_directories : includes,
2359 link_with : [libshared],
2360 install_rpath : rootlibexecdir,
2362 install_dir : rootlibexecdir)
2365 if conf.get('ENABLE_HOSTNAMED') == 1
2367 'systemd-hostnamed',
2368 'src/hostname/hostnamed.c',
2369 include_directories : includes,
2370 link_with : [libshared],
2371 install_rpath : rootlibexecdir,
2373 install_dir : rootlibexecdir)
2375 public_programs += executable(
2377 'src/hostname/hostnamectl.c',
2378 include_directories : includes,
2379 link_with : [libshared],
2380 install_rpath : rootlibexecdir,
2384 if conf.get('ENABLE_LOCALED') == 1
2385 if conf.get('HAVE_XKBCOMMON') == 1
2386 # logind will load libxkbcommon.so dynamically on its own
2394 systemd_localed_sources,
2395 include_directories : includes,
2396 link_with : [libshared],
2397 dependencies : deps,
2398 install_rpath : rootlibexecdir,
2400 install_dir : rootlibexecdir)
2402 public_programs += executable(
2405 include_directories : includes,
2406 link_with : [libshared],
2407 install_rpath : rootlibexecdir,
2411 if conf.get('ENABLE_TIMEDATED') == 1
2413 'systemd-timedated',
2414 'src/timedate/timedated.c',
2415 include_directories : includes,
2416 link_with : [libshared],
2417 install_rpath : rootlibexecdir,
2419 install_dir : rootlibexecdir)
2422 if conf.get('ENABLE_TIMEDATECTL') == 1
2423 public_programs += executable(
2425 'src/timedate/timedatectl.c',
2426 include_directories : includes,
2427 install_rpath : rootlibexecdir,
2428 link_with : [libshared],
2429 dependencies : [libm],
2433 if conf.get('ENABLE_TIMESYNCD') == 1
2434 if get_option('link-timesyncd-shared')
2435 timesyncd_link_with = [libshared]
2437 timesyncd_link_with = [libsystemd_static,
2444 'systemd-timesyncd',
2445 systemd_timesyncd_sources,
2446 include_directories : includes,
2447 link_with : [timesyncd_link_with],
2448 dependencies : [threads,
2450 install_rpath : rootlibexecdir,
2452 install_dir : rootlibexecdir)
2455 'systemd-time-wait-sync',
2456 'src/time-wait-sync/time-wait-sync.c',
2457 include_directories : includes,
2458 link_with : [timesyncd_link_with],
2459 install_rpath : rootlibexecdir,
2461 install_dir : rootlibexecdir)
2464 if conf.get('ENABLE_MACHINED') == 1
2467 systemd_machined_sources,
2468 include_directories : includes,
2469 link_with : [libmachine_core,
2471 install_rpath : rootlibexecdir,
2473 install_dir : rootlibexecdir)
2475 public_programs += executable(
2477 'src/machine/machinectl.c',
2478 include_directories : includes,
2479 link_with : [libshared],
2480 dependencies : [threads,
2484 install_rpath : rootlibexecdir,
2486 install_dir : rootbindir)
2489 if conf.get('ENABLE_IMPORTD') == 1
2492 systemd_importd_sources,
2493 include_directories : includes,
2494 link_with : [libshared],
2495 dependencies : [threads],
2496 install_rpath : rootlibexecdir,
2498 install_dir : rootlibexecdir)
2500 systemd_pull = executable(
2502 systemd_pull_sources,
2503 include_directories : includes,
2504 link_with : [libshared],
2505 dependencies : [versiondep,
2511 install_rpath : rootlibexecdir,
2513 install_dir : rootlibexecdir)
2515 systemd_import = executable(
2517 systemd_import_sources,
2518 include_directories : includes,
2519 link_with : [libshared],
2520 dependencies : [libcurl,
2524 install_rpath : rootlibexecdir,
2526 install_dir : rootlibexecdir)
2528 systemd_import_fs = executable(
2529 'systemd-import-fs',
2530 systemd_import_fs_sources,
2531 include_directories : includes,
2532 link_with : [libshared],
2533 install_rpath : rootlibexecdir,
2535 install_dir : rootlibexecdir)
2537 systemd_export = executable(
2539 systemd_export_sources,
2540 include_directories : includes,
2541 link_with : [libshared],
2542 dependencies : [libcurl,
2546 install_rpath : rootlibexecdir,
2548 install_dir : rootlibexecdir)
2550 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2553 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2554 public_programs += executable(
2555 'systemd-journal-upload',
2556 systemd_journal_upload_sources,
2557 include_directories : includes,
2558 link_with : [libshared],
2559 dependencies : [versiondep,
2566 install_rpath : rootlibexecdir,
2568 install_dir : rootlibexecdir)
2571 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2572 public_programs += executable(
2573 'systemd-journal-remote',
2574 systemd_journal_remote_sources,
2575 include_directories : includes,
2576 link_with : [libshared,
2577 libsystemd_journal_remote],
2578 dependencies : [threads,
2584 install_rpath : rootlibexecdir,
2586 install_dir : rootlibexecdir)
2588 public_programs += executable(
2589 'systemd-journal-gatewayd',
2590 systemd_journal_gatewayd_sources,
2591 include_directories : includes,
2592 link_with : [libshared],
2593 dependencies : [threads,
2599 install_rpath : rootlibexecdir,
2601 install_dir : rootlibexecdir)
2604 if conf.get('ENABLE_COREDUMP') == 1
2607 systemd_coredump_sources,
2608 include_directories : includes,
2609 link_with : [libshared],
2610 dependencies : [threads,
2616 install_rpath : rootlibexecdir,
2618 install_dir : rootlibexecdir)
2620 public_programs += executable(
2622 coredumpctl_sources,
2623 include_directories : includes,
2624 link_with : [libshared],
2625 dependencies : [threads,
2629 install_rpath : rootlibexecdir,
2633 if conf.get('ENABLE_PSTORE') == 1
2636 systemd_pstore_sources,
2637 include_directories : includes,
2638 link_with : [libshared],
2639 dependencies : [threads,
2645 install_rpath : rootlibexecdir,
2647 install_dir : rootlibexecdir)
2650 if conf.get('ENABLE_BINFMT') == 1
2651 public_programs += executable(
2653 'src/binfmt/binfmt.c',
2654 include_directories : includes,
2655 link_with : [libshared],
2656 install_rpath : rootlibexecdir,
2658 install_dir : rootlibexecdir)
2660 meson.add_install_script('sh', '-c',
2661 mkdir_p.format(binfmtdir))
2662 meson.add_install_script('sh', '-c',
2663 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2666 if conf.get('ENABLE_REPART') == 1
2669 systemd_repart_sources,
2670 include_directories : includes,
2671 link_with : [libshared],
2672 dependencies : [threads,
2676 install_rpath : rootlibexecdir,
2678 install_dir : rootbindir)
2679 public_programs += exe
2681 if want_tests != 'false'
2684 args : exe.full_path())
2688 if conf.get('ENABLE_VCONSOLE') == 1
2690 'systemd-vconsole-setup',
2691 'src/vconsole/vconsole-setup.c',
2692 include_directories : includes,
2693 link_with : [libshared],
2694 install_rpath : rootlibexecdir,
2696 install_dir : rootlibexecdir)
2699 if conf.get('ENABLE_RANDOMSEED') == 1
2701 'systemd-random-seed',
2702 'src/random-seed/random-seed.c',
2703 include_directories : includes,
2704 link_with : [libshared],
2705 install_rpath : rootlibexecdir,
2707 install_dir : rootlibexecdir)
2710 if conf.get('ENABLE_FIRSTBOOT') == 1
2712 'systemd-firstboot',
2713 'src/firstboot/firstboot.c',
2714 include_directories : includes,
2715 link_with : [libshared],
2716 dependencies : [libcrypt],
2717 install_rpath : rootlibexecdir,
2719 install_dir : rootbindir)
2723 'systemd-remount-fs',
2724 'src/remount-fs/remount-fs.c',
2725 include_directories : includes,
2726 link_with : [libcore_shared,
2728 install_rpath : rootlibexecdir,
2730 install_dir : rootlibexecdir)
2733 'systemd-machine-id-setup',
2734 'src/machine-id-setup/machine-id-setup-main.c',
2735 include_directories : includes,
2736 link_with : [libcore_shared,
2738 install_rpath : rootlibexecdir,
2740 install_dir : rootbindir)
2745 include_directories : includes,
2746 link_with : [libshared],
2747 install_rpath : rootlibexecdir,
2749 install_dir : rootlibexecdir)
2751 executable('systemd-growfs',
2752 'src/partition/growfs.c',
2753 include_directories : includes,
2754 link_with : [libshared],
2755 install_rpath : rootlibexecdir,
2757 install_dir : rootlibexecdir)
2761 'src/partition/makefs.c',
2762 include_directories : includes,
2763 link_with : [libshared],
2764 install_rpath : rootlibexecdir,
2766 install_dir : rootlibexecdir)
2770 'src/sleep/sleep.c',
2771 include_directories : includes,
2772 link_with : [libshared],
2773 install_rpath : rootlibexecdir,
2775 install_dir : rootlibexecdir)
2777 install_data('src/sleep/sleep.conf',
2778 install_dir : pkgsysconfdir)
2780 public_programs += executable(
2782 'src/sysctl/sysctl.c',
2783 include_directories : includes,
2784 link_with : [libshared],
2785 install_rpath : rootlibexecdir,
2787 install_dir : rootlibexecdir)
2791 'src/ac-power/ac-power.c',
2792 include_directories : includes,
2793 link_with : [libshared],
2794 install_rpath : rootlibexecdir,
2796 install_dir : rootlibexecdir)
2798 public_programs += executable(
2799 'systemd-detect-virt',
2800 'src/detect-virt/detect-virt.c',
2801 include_directories : includes,
2802 link_with : [libshared],
2803 install_rpath : rootlibexecdir,
2806 public_programs += executable(
2808 'src/delta/delta.c',
2809 include_directories : includes,
2810 link_with : [libshared],
2811 install_rpath : rootlibexecdir,
2814 public_programs += executable(
2816 'src/escape/escape.c',
2817 include_directories : includes,
2818 link_with : [libshared],
2819 install_rpath : rootlibexecdir,
2821 install_dir : rootbindir)
2823 public_programs += executable(
2825 'src/notify/notify.c',
2826 include_directories : includes,
2827 link_with : [libshared],
2828 install_rpath : rootlibexecdir,
2830 install_dir : rootbindir)
2833 'systemd-volatile-root',
2834 'src/volatile-root/volatile-root.c',
2835 include_directories : includes,
2836 link_with : [libshared],
2837 install_rpath : rootlibexecdir,
2838 install : conf.get('ENABLE_INITRD') == 1,
2839 install_dir : rootlibexecdir)
2842 'systemd-cgroups-agent',
2843 'src/cgroups-agent/cgroups-agent.c',
2844 include_directories : includes,
2845 link_with : [libshared],
2846 install_rpath : rootlibexecdir,
2848 install_dir : rootlibexecdir)
2850 public_programs += executable(
2852 'src/id128/id128.c',
2853 include_directories : includes,
2854 link_with : [libshared],
2855 install_rpath : rootlibexecdir,
2858 public_programs += executable(
2861 include_directories : includes,
2862 link_with : [libshared],
2863 install_rpath : rootlibexecdir,
2866 public_programs += executable(
2867 'systemd-ask-password',
2868 'src/ask-password/ask-password.c',
2869 include_directories : includes,
2870 link_with : [libshared],
2871 install_rpath : rootlibexecdir,
2873 install_dir : rootbindir)
2876 'systemd-reply-password',
2877 'src/reply-password/reply-password.c',
2878 include_directories : includes,
2879 link_with : [libshared],
2880 install_rpath : rootlibexecdir,
2882 install_dir : rootlibexecdir)
2884 public_programs += executable(
2885 'systemd-tty-ask-password-agent',
2886 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2887 include_directories : includes,
2888 link_with : [libshared],
2889 install_rpath : rootlibexecdir,
2891 install_dir : rootbindir)
2893 public_programs += executable(
2896 include_directories : includes,
2897 link_with : [libshared],
2898 install_rpath : rootlibexecdir,
2901 public_programs += executable(
2903 'src/cgtop/cgtop.c',
2904 include_directories : includes,
2905 link_with : [libshared],
2906 install_rpath : rootlibexecdir,
2911 'src/initctl/initctl.c',
2912 include_directories : includes,
2913 link_with : [libshared],
2914 install_rpath : rootlibexecdir,
2915 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
2916 install_dir : rootlibexecdir)
2918 public_programs += executable(
2920 'src/mount/mount-tool.c',
2921 include_directories : includes,
2922 link_with : [libshared],
2923 dependencies: [libmount],
2924 install_rpath : rootlibexecdir,
2927 meson.add_install_script(meson_make_symlink,
2928 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2930 public_programs += executable(
2933 include_directories : includes,
2934 link_with : [libshared],
2935 install_rpath : rootlibexecdir,
2938 public_programs += executable(
2939 'systemd-stdio-bridge',
2940 'src/stdio-bridge/stdio-bridge.c',
2941 include_directories : includes,
2942 link_with : [libshared],
2943 dependencies : [versiondep],
2944 install_rpath : rootlibexecdir,
2947 public_programs += executable(
2949 'src/busctl/busctl.c',
2950 'src/busctl/busctl-introspect.c',
2951 'src/busctl/busctl-introspect.h',
2952 include_directories : includes,
2953 link_with : [libshared],
2954 install_rpath : rootlibexecdir,
2957 if conf.get('ENABLE_SYSUSERS') == 1
2958 public_programs += executable(
2960 'src/sysusers/sysusers.c',
2961 include_directories : includes,
2962 link_with : [libshared],
2963 install_rpath : rootlibexecdir,
2965 install_dir : rootbindir)
2967 if have_standalone_binaries
2968 public_programs += executable(
2969 'systemd-sysusers.standalone',
2970 'src/sysusers/sysusers.c',
2971 include_directories : includes,
2972 link_with : [libshared_static,
2978 install_dir : rootbindir)
2982 if conf.get('ENABLE_TMPFILES') == 1
2985 systemd_tmpfiles_sources,
2986 include_directories : includes,
2987 link_with : [libshared],
2988 dependencies : [libacl],
2989 install_rpath : rootlibexecdir,
2991 install_dir : rootbindir)
2992 public_programs += exe
2994 if want_tests != 'false'
2995 test('test-systemd-tmpfiles',
2996 test_systemd_tmpfiles_py,
2997 # https://github.com/mesonbuild/meson/issues/2681
2998 args : exe.full_path())
3001 if have_standalone_binaries
3002 public_programs += executable(
3003 'systemd-tmpfiles.standalone',
3004 systemd_tmpfiles_sources,
3005 include_directories : includes,
3006 link_with : [libshared_static,
3011 dependencies : [libacl],
3013 install_dir : rootbindir)
3017 if conf.get('ENABLE_HWDB') == 1
3018 public_programs += executable(
3021 'src/libsystemd/sd-hwdb/hwdb-internal.h',
3022 include_directories : includes,
3023 link_with : [libudev_static],
3024 install_rpath : udev_rpath,
3026 install_dir : rootbindir)
3029 if conf.get('ENABLE_QUOTACHECK') == 1
3031 'systemd-quotacheck',
3032 'src/quotacheck/quotacheck.c',
3033 include_directories : includes,
3034 link_with : [libshared],
3035 install_rpath : rootlibexecdir,
3037 install_dir : rootlibexecdir)
3040 public_programs += executable(
3041 'systemd-socket-proxyd',
3042 'src/socket-proxy/socket-proxyd.c',
3043 include_directories : includes,
3044 link_with : [libshared],
3045 dependencies : [threads],
3046 install_rpath : rootlibexecdir,
3048 install_dir : rootlibexecdir)
3050 public_programs += executable(
3053 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
3054 include_directories : includes,
3055 link_with : [libudev_core,
3058 dependencies : [versiondep,
3064 install_rpath : udev_rpath,
3066 install_dir : rootbindir)
3070 systemd_shutdown_sources,
3071 include_directories : includes,
3072 link_with : [libcore_shared,
3074 dependencies : [libmount],
3075 install_rpath : rootlibexecdir,
3077 install_dir : rootlibexecdir)
3080 'systemd-update-done',
3081 'src/update-done/update-done.c',
3082 include_directories : includes,
3083 link_with : [libshared],
3084 install_rpath : rootlibexecdir,
3086 install_dir : rootlibexecdir)
3089 'systemd-update-utmp',
3090 'src/update-utmp/update-utmp.c',
3091 include_directories : includes,
3092 link_with : [libshared],
3093 dependencies : [libaudit],
3094 install_rpath : rootlibexecdir,
3095 install : (conf.get('ENABLE_UTMP') == 1),
3096 install_dir : rootlibexecdir)
3098 if conf.get('HAVE_KMOD') == 1
3100 'systemd-modules-load',
3101 'src/modules-load/modules-load.c',
3102 include_directories : includes,
3103 link_with : [libshared],
3104 dependencies : [libkmod],
3105 install_rpath : rootlibexecdir,
3107 install_dir : rootlibexecdir)
3109 meson.add_install_script('sh', '-c',
3110 mkdir_p.format(modulesloaddir))
3111 meson.add_install_script('sh', '-c',
3112 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
3115 public_programs += executable(
3117 systemd_nspawn_sources,
3118 include_directories : includes,
3119 link_with : [libcore_shared,
3122 dependencies : [libblkid,
3124 install_rpath : rootlibexecdir,
3127 if conf.get('ENABLE_NETWORKD') == 1
3130 systemd_networkd_sources,
3131 include_directories : network_include_dir,
3132 link_with : [libnetworkd_core,
3135 networkd_link_with],
3136 dependencies : [threads],
3137 install_rpath : rootlibexecdir,
3139 install_dir : rootlibexecdir)
3142 'systemd-networkd-wait-online',
3143 systemd_networkd_wait_online_sources,
3144 include_directories : includes,
3145 link_with : [libnetworkd_core,
3146 networkd_link_with],
3147 install_rpath : rootlibexecdir,
3149 install_dir : rootlibexecdir)
3151 public_programs += executable(
3154 include_directories : includes,
3155 link_with : [libsystemd_network,
3156 networkd_link_with],
3157 install_rpath : rootlibexecdir,
3159 install_dir : rootbindir)
3162 'systemd-network-generator',
3163 network_generator_sources,
3164 include_directories : includes,
3165 link_with : [networkd_link_with],
3166 install_rpath : rootlibexecdir,
3168 install_dir : rootlibexecdir)
3170 if want_tests != 'false'
3171 test('test-network-generator-conversion',
3172 test_network_generator_conversion_sh,
3173 # https://github.com/mesonbuild/meson/issues/2681
3174 args : exe.full_path())
3179 'systemd-sulogin-shell',
3180 ['src/sulogin-shell/sulogin-shell.c'],
3181 include_directories : includes,
3182 link_with : [libshared],
3183 install_rpath : rootlibexecdir,
3185 install_dir : rootlibexecdir)
3187 ############################################################
3190 'systemd-runtest.env',
3191 output : 'systemd-runtest.env',
3192 command : ['sh', '-c', '{ ' +
3193 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
3194 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
3196 build_by_default : true)
3198 foreach tuple : tests
3200 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3201 dependencies = tuple[2]
3202 condition = tuple.length() >= 4 ? tuple[3] : ''
3203 type = tuple.length() >= 5 ? tuple[4] : ''
3204 defs = tuple.length() >= 6 ? tuple[5] : []
3205 incs = tuple.length() >= 7 ? tuple[6] : includes
3208 name = sources[0].split('/')[-1].split('.')[0]
3209 if type.startswith('timeout=')
3210 timeout = type.split('=')[1].to_int()
3214 if condition == '' or conf.get(condition) == 1
3218 include_directories : incs,
3219 link_with : link_with,
3220 dependencies : [versiondep,
3223 build_by_default : want_tests != 'false',
3224 install_rpath : rootlibexecdir,
3225 install : install_tests,
3226 install_dir : join_paths(testsdir, type))
3229 message('@0@ is a manual test'.format(name))
3230 elif type == 'unsafe' and want_tests != 'unsafe'
3231 message('@0@ is an unsafe test'.format(name))
3232 elif want_tests != 'false'
3238 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3243 'test-libsystemd-sym',
3244 test_libsystemd_sym_c,
3245 include_directories : includes,
3246 link_with : [libsystemd],
3247 build_by_default : want_tests != 'false',
3248 install : install_tests,
3249 install_dir : testsdir)
3250 if want_tests != 'false'
3251 test('test-libsystemd-sym', exe)
3255 'test-libsystemd-static-sym',
3256 test_libsystemd_sym_c,
3257 include_directories : includes,
3258 link_with : [install_libsystemd_static],
3259 dependencies : [threads], # threads is already included in dependencies on the library,
3260 # but does not seem to get propagated. Add here as a work-around.
3261 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3262 install : install_tests and static_libsystemd_pic,
3263 install_dir : testsdir)
3264 if want_tests != 'false' and static_libsystemd_pic
3265 test('test-libsystemd-static-sym', exe)
3271 include_directories : includes,
3272 c_args : '-Wno-deprecated-declarations',
3273 link_with : [libudev],
3274 build_by_default : want_tests != 'false',
3275 install : install_tests,
3276 install_dir : testsdir)
3277 if want_tests != 'false'
3278 test('test-libudev-sym', exe)
3282 'test-libudev-static-sym',
3284 include_directories : includes,
3285 c_args : '-Wno-deprecated-declarations',
3286 link_with : [install_libudev_static],
3287 build_by_default : want_tests != 'false' and static_libudev_pic,
3288 install : install_tests and static_libudev_pic,
3289 install_dir : testsdir)
3290 if want_tests != 'false' and static_libudev_pic
3291 test('test-libudev-static-sym', exe)
3294 ############################################################
3298 if get_option('tests') != 'false'
3299 foreach tuple : fuzzers
3301 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3302 dependencies = tuple[2]
3303 defs = tuple.length() >= 4 ? tuple[3] : []
3304 incs = tuple.length() >= 5 ? tuple[4] : includes
3308 dependencies += fuzzing_engine
3310 if fuzzing_engine.found()
3311 dependencies += fuzzing_engine
3313 link_args += ['-fsanitize=fuzzer']
3316 sources += 'src/fuzz/fuzz-main.c'
3319 name = sources[0].split('/')[-1].split('.')[0]
3321 fuzzer_exes += executable(
3324 include_directories : [incs, include_directories('src/fuzz')],
3325 link_with : link_with,
3326 dependencies : dependencies,
3328 link_args: link_args,
3335 depends : fuzzer_exes,
3338 ############################################################
3341 subdir('sysusers.d')
3342 subdir('tmpfiles.d')
3348 subdir('shell-completion/bash')
3349 subdir('shell-completion/zsh')
3350 subdir('docs/sysvinit')
3351 subdir('docs/var-log')
3353 install_subdir('factory/etc',
3354 install_dir : factorydir)
3356 install_data('xorg/50-systemd-user.sh',
3357 install_dir : xinitrcdir)
3358 install_data('modprobe.d/systemd.conf',
3359 install_dir : modprobedir)
3360 install_data('LICENSE.GPL2',
3364 'docs/CODING_STYLE.md',
3365 'docs/DISTRO_PORTING.md',
3366 'docs/ENVIRONMENT.md',
3368 'docs/TRANSIENT-SETTINGS.md',
3369 'docs/TRANSLATORS.md',
3370 'docs/UIDS-GIDS.md',
3371 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3372 install_dir : docdir)
3374 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3375 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3377 ############################################################
3379 check_help = find_program('tools/check-help.sh')
3381 foreach exec : public_programs
3382 name = exec.full_path().split('/')[-1]
3383 if want_tests != 'false'
3384 test('check-help-' + name,
3386 args : exec.full_path())
3390 ############################################################
3392 check_directives_sh = find_program('tools/check-directives.sh')
3394 if want_tests != 'false'
3395 test('check-directives',
3396 check_directives_sh,
3397 args : project_source_root)
3400 ############################################################
3402 # Enable tests for all supported sanitizers
3403 foreach tuple : sanitizers
3404 sanitizer = tuple[0]
3407 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3409 foreach p : fuzz_regression_tests
3410 b = p.split('/')[-2]
3411 c = p.split('/')[-1]
3413 name = '@0@:@1@'.format(b, sanitizer)
3416 if want_tests == 'false'
3417 message('Not compiling @0@ because tests is set to false'.format(name))
3418 elif slow_tests or fuzz_tests
3419 exe = custom_target(
3423 command : [env, 'ln', '-fs',
3424 join_paths(build.full_path(), b),
3426 build_by_default : true)
3428 message('Not compiling @0@ because slow-tests/fuzz-tests is set to false'.format(name))
3433 if want_tests != 'false' and (slow_tests or fuzz_tests)
3434 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3436 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
3438 args : [exe.full_path(),
3439 join_paths(project_source_root, p)])
3446 ############################################################
3449 all_files = run_command(
3451 ['--git-dir=@0@/.git'.format(project_source_root),
3454 all_files = files(all_files.stdout().split())
3459 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3462 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3466 git_contrib_sh = find_program('tools/git-contrib.sh')
3469 command : [git_contrib_sh])
3473 git_head = run_command(
3475 ['--git-dir=@0@/.git'.format(project_source_root),
3476 'rev-parse', 'HEAD']).stdout().strip()
3477 git_head_short = run_command(
3479 ['--git-dir=@0@/.git'.format(project_source_root),
3480 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3484 command : ['git', 'archive',
3485 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3487 '--prefix', 'systemd-@0@/'.format(git_head),
3491 ############################################################
3493 check_api_docs_sh = find_program('tools/check-api-docs.sh')
3496 depends : [man, libsystemd, libudev],
3497 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3499 ############################################################
3500 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3503 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3505 'split /usr: @0@'.format(split_usr),
3506 'split bin-sbin: @0@'.format(split_bin),
3507 'prefix directory: @0@'.format(prefixdir),
3508 'rootprefix directory: @0@'.format(rootprefixdir),
3509 'sysconf directory: @0@'.format(sysconfdir),
3510 'include directory: @0@'.format(includedir),
3511 'lib directory: @0@'.format(libdir),
3512 'rootlib directory: @0@'.format(rootlibdir),
3513 'SysV init scripts: @0@'.format(sysvinit_path),
3514 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3515 'PAM modules directory: @0@'.format(pamlibdir),
3516 'PAM configuration directory: @0@'.format(pamconfdir),
3517 'RPM macros directory: @0@'.format(rpmmacrosdir),
3518 'modprobe.d directory: @0@'.format(modprobedir),
3519 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3520 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3521 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3522 'bash completions directory: @0@'.format(bashcompletiondir),
3523 'zsh completions directory: @0@'.format(zshcompletiondir),
3524 'extra start script: @0@'.format(get_option('rc-local')),
3525 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3526 get_option('debug-tty')),
3527 'TTY GID: @0@'.format(tty_gid),
3528 'users GID: @0@'.format(substs.get('USERS_GID')),
3529 'maximum system UID: @0@'.format(system_uid_max),
3530 'maximum system GID: @0@'.format(system_gid_max),
3531 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3532 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3533 'minimum container UID base: @0@'.format(container_uid_base_min),
3534 'maximum container UID base: @0@'.format(container_uid_base_max),
3535 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3536 'render group access mode: @0@'.format(get_option('group-render-mode')),
3537 'certificate root directory: @0@'.format(get_option('certificate-root')),
3538 'support URL: @0@'.format(support_url),
3539 'nobody user name: @0@'.format(nobody_user),
3540 'nobody group name: @0@'.format(nobody_group),
3541 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3542 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3544 'default DNSSEC mode: @0@'.format(default_dnssec),
3545 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3546 'default mDNS mode: @0@'.format(default_mdns),
3547 'default LLMNR mode: @0@'.format(default_llmnr),
3548 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3549 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3550 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3551 'default locale: @0@'.format(default_locale),
3552 'default user $PATH: @0@'.format(default_user_path_display),
3553 'systemd service watchdog: @0@'.format(watchdog_opt)]
3555 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3556 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3558 'default DNS servers: @0@'.format(alt_dns_servers),
3559 'default NTP servers: @0@'.format(alt_ntp_servers)]
3561 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3562 '@@0@'.format(time_epoch)).stdout().strip()
3564 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3567 'static libsystemd: @0@'.format(static_libsystemd),
3568 'static libudev: @0@'.format(static_libudev)]
3571 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3572 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3573 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3575 if conf.get('ENABLE_EFI') == 1
3576 status += 'efi arch: @0@'.format(efi_arch)
3580 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3581 'EFI CC @0@'.format(' '.join(efi_cc)),
3582 'EFI lds: @0@'.format(efi_lds),
3583 'EFI crt0: @0@'.format(efi_crt0),
3584 'EFI include directory: @0@'.format(efi_incdir)]
3646 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3647 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3651 ['legacy pkla', install_polkit_pkla],
3653 ['gnu-efi', have_gnu_efi],
3666 ['man pages', want_man],
3667 ['html pages', want_html],
3668 ['man page indices', want_man and have_lxml],
3673 ['adm group', get_option('adm-group')],
3674 ['wheel group', get_option('wheel-group')],
3677 ['debug mmap cache'],
3679 ['valgrind', conf.get('VALGRIND') == 1],
3680 ['trace logging', conf.get('LOG_TRACE') == 1],
3681 ['install tests', install_tests],
3682 ['link-udev-shared', get_option('link-udev-shared')],
3683 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3684 ['link-networkd-shared', get_option('link-networkd-shared')],
3685 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3686 ['kernel-install', get_option('kernel-install')],
3687 ['systemd-analyze', conf.get('ENABLE_ANALYZE') == 1],
3690 if tuple.length() >= 2
3693 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3694 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3695 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3706 'enabled features: @0@'.format(', '.join(found)),
3708 'disabled features: @0@'.format(', '.join(missing)),
3710 message('\n '.join(status))
3712 if rootprefixdir != rootprefix_default
3714 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3715 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3716 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))