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_PATH', 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('ROOTPREFIX_NOSLASH', rootprefixdir_noslash)
234 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
235 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
236 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
237 conf.set_quoted('SYSTEM_GENERATOR_DIR', systemgeneratordir)
238 conf.set_quoted('USER_GENERATOR_DIR', usergeneratordir)
239 conf.set_quoted('SYSTEM_ENV_GENERATOR_DIR', systemenvgeneratordir)
240 conf.set_quoted('USER_ENV_GENERATOR_DIR', userenvgeneratordir)
241 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
242 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
243 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
244 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
245 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
246 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
247 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
248 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
249 conf.set_quoted('LIBDIR', libdir)
250 conf.set_quoted('ROOTLIBDIR', rootlibdir)
251 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
252 conf.set_quoted('BOOTLIBDIR', bootlibdir)
253 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
254 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
255 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
256 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
257 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
258 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
259 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
260 conf.set_quoted('SYSTEMD_HOMEWORK_PATH', join_paths(rootlibexecdir, 'systemd-homework'))
261 conf.set_quoted('SYSTEMD_USERWORK_PATH', join_paths(rootlibexecdir, 'systemd-userwork'))
262 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
263 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
264 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
266 substs.set('prefix', prefixdir)
267 substs.set('rootprefix', rootprefixdir)
268 substs.set('rootprefix_noslash', rootprefixdir_noslash)
269 substs.set('exec_prefix', prefixdir)
270 substs.set('libdir', libdir)
271 substs.set('rootlibdir', rootlibdir)
272 substs.set('includedir', includedir)
273 substs.set('sysconfdir', sysconfdir)
274 substs.set('bindir', bindir)
275 substs.set('rootbindir', rootbindir)
276 substs.set('rootlibexecdir', rootlibexecdir)
277 substs.set('systemunitdir', systemunitdir)
278 substs.set('userunitdir', userunitdir)
279 substs.set('systempresetdir', systempresetdir)
280 substs.set('userpresetdir', userpresetdir)
281 substs.set('udevhwdbdir', udevhwdbdir)
282 substs.set('udevrulesdir', udevrulesdir)
283 substs.set('udevlibexecdir', udevlibexecdir)
284 substs.set('environmentdir', environmentdir)
285 substs.set('catalogdir', catalogdir)
286 substs.set('tmpfilesdir', tmpfilesdir)
287 substs.set('sysusersdir', sysusersdir)
288 substs.set('sysctldir', sysctldir)
289 substs.set('binfmtdir', binfmtdir)
290 substs.set('modulesloaddir', modulesloaddir)
291 substs.set('modprobedir', modprobedir)
292 substs.set('systemgeneratordir', systemgeneratordir)
293 substs.set('usergeneratordir', usergeneratordir)
294 substs.set('systemenvgeneratordir', systemenvgeneratordir)
295 substs.set('userenvgeneratordir', userenvgeneratordir)
296 substs.set('systemshutdowndir', systemshutdowndir)
297 substs.set('systemsleepdir', systemsleepdir)
298 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
299 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
300 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
301 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
302 substs.set('RC_LOCAL_PATH', get_option('rc-local'))
303 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
304 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
305 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
306 substs.set('BUILD_ROOT', project_build_root)
308 #####################################################################
310 cc = meson.get_compiler('c')
311 pkgconfig = import('pkgconfig')
312 check_compilation_sh = find_program('tools/check-compilation.sh')
313 meson_build_sh = find_program('tools/meson-build.sh')
315 want_tests = get_option('tests')
316 slow_tests = want_tests != 'false' and get_option('slow-tests')
317 fuzz_tests = want_tests != 'false' and get_option('fuzz-tests')
318 install_tests = get_option('install-tests')
320 if add_languages('cpp', required : fuzzer_build)
321 # Used only for tests
322 cxx = meson.get_compiler('cpp')
323 cxx_cmd = ' '.join(cxx.cmd_array())
329 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
330 if fuzzing_engine.found()
331 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
332 elif cc.has_argument('-fsanitize=fuzzer-no-link')
333 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
335 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
338 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
341 # Those generate many false positives, and we do not want to change the code to
343 basic_disabled_warnings = [
344 '-Wno-unused-parameter',
345 '-Wno-missing-field-initializers',
346 '-Wno-unused-result',
347 '-Wno-format-signedness',
350 possible_cc_flags = [
353 '-Wmissing-include-dirs',
354 '-Wold-style-definition',
358 '-Wsuggest-attribute=noreturn',
359 '-Werror=missing-prototypes',
360 '-Werror=implicit-function-declaration',
361 '-Werror=missing-declarations',
362 '-Werror=return-type',
363 '-Werror=incompatible-pointer-types',
365 '-Wstrict-prototypes',
367 '-Wmissing-noreturn',
368 '-Wimplicit-fallthrough=5',
371 '-Wstrict-aliasing=2',
374 '-Werror=shift-count-overflow',
375 '-Werror=shift-overflow=2',
379 # negative arguments are correctly detected starting with meson 0.46.
380 '-Wno-error=#warnings', # clang
381 '-Wno-string-plus-int', # clang
383 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
384 # optimizations enabled, producing essentially false positives.
385 '-Wno-maybe-uninitialized',
389 '-fdiagnostics-show-option',
390 '-fno-strict-aliasing',
391 '-fvisibility=hidden',
393 '-fstack-protector-strong',
394 '--param=ssp-buffer-size=4',
397 # --as-needed and --no-undefined are provided by meson by default,
398 # run mesonconf to see what is enabled
399 possible_link_flags = [
405 if cc.get_id() == 'clang'
406 possible_cc_flags += [
407 '-Wno-typedef-redefinition',
408 '-Wno-gnu-variable-sized-type-not-at-end',
412 if get_option('buildtype') != 'debug'
413 possible_cc_flags += [
414 '-ffunction-sections',
418 possible_link_flags += '-Wl,--gc-sections'
421 add_project_arguments(cc.get_supported_arguments(basic_disabled_warnings), language : 'c')
422 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
423 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
425 have = cc.has_argument('-Wzero-length-bounds')
426 conf.set10('HAVE_ZERO_LENGTH_BOUNDS', have)
430 #include <inttypes.h>
431 typedef uint64_t usec_t;
432 usec_t now(clockid_t clock);
437 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
438 add_project_arguments('-Werror=shadow', language : 'c')
442 add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp')
445 cpp = ' '.join(cc.cmd_array()) + ' -E'
447 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
449 #####################################################################
450 # compilation result tests
452 conf.set('_GNU_SOURCE', true)
453 conf.set('__SANE_USERSPACE_TYPES__', true)
454 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
456 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
457 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
458 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
459 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
463 #include <sys/stat.h>
466 foreach decl : ['char16_t',
471 # We get -1 if the size cannot be determined
472 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
474 if decl == 'struct statx'
476 want_linux_stat_h = false
478 have = cc.sizeof(decl,
479 prefix : decl_headers + '#include <linux/stat.h>',
480 args : '-D_GNU_SOURCE') > 0
481 want_linux_stat_h = have
485 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
488 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
490 foreach ident : ['secure_getenv', '__secure_getenv']
491 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
495 ['memfd_create', '''#include <sys/mman.h>'''],
496 ['gettid', '''#include <sys/types.h>
497 #include <unistd.h>'''],
498 ['pivot_root', '''#include <stdlib.h>
499 #include <unistd.h>'''], # no known header declares pivot_root
500 ['name_to_handle_at', '''#include <sys/types.h>
501 #include <sys/stat.h>
502 #include <fcntl.h>'''],
503 ['setns', '''#include <sched.h>'''],
504 ['renameat2', '''#include <stdio.h>
505 #include <fcntl.h>'''],
506 ['kcmp', '''#include <linux/kcmp.h>'''],
507 ['keyctl', '''#include <sys/types.h>
508 #include <keyutils.h>'''],
509 ['copy_file_range', '''#include <sys/syscall.h>
510 #include <unistd.h>'''],
511 ['bpf', '''#include <sys/syscall.h>
512 #include <unistd.h>'''],
513 ['statx', '''#include <sys/types.h>
514 #include <sys/stat.h>
515 #include <unistd.h>'''],
516 ['explicit_bzero' , '''#include <string.h>'''],
517 ['reallocarray', '''#include <malloc.h>'''],
518 ['set_mempolicy', '''#include <stdlib.h>
519 #include <unistd.h>'''],
520 ['get_mempolicy', '''#include <stdlib.h>
521 #include <unistd.h>'''],
522 ['pidfd_send_signal', '''#include <stdlib.h>
525 #include <sys/wait.h>'''],
526 ['pidfd_open', '''#include <stdlib.h>
529 #include <sys/wait.h>'''],
530 ['rt_sigqueueinfo', '''#include <stdlib.h>
533 #include <sys/wait.h>'''],
536 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
537 conf.set10('HAVE_' + ident[0].to_upper(), have)
540 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
541 conf.set10('USE_SYS_RANDOM_H', true)
542 conf.set10('HAVE_GETRANDOM', true)
544 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
545 conf.set10('USE_SYS_RANDOM_H', false)
546 conf.set10('HAVE_GETRANDOM', have)
549 #####################################################################
551 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
553 get_option('version-tag'),
554 meson.project_version()]
557 input : 'src/version/version.h.in',
558 output : 'version.h',
561 versiondep = declare_dependency(sources: version_h)
563 sed = find_program('sed')
564 awk = find_program('awk')
565 m4 = find_program('m4')
566 stat = find_program('stat')
567 git = find_program('git', required : false)
568 env = find_program('env')
569 perl = find_program('perl', required : false)
571 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
572 mkdir_p = 'mkdir -p $DESTDIR/@0@'
573 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
574 splash_bmp = files('test/splash.bmp')
576 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
577 # /usr/sbin, /sbin, and fall back to the default from middle column.
578 progs = [['quotaon', '/usr/sbin/quotaon' ],
579 ['quotacheck', '/usr/sbin/quotacheck' ],
580 ['kmod', '/usr/bin/kmod' ],
581 ['kexec', '/usr/sbin/kexec' ],
582 ['sulogin', '/usr/sbin/sulogin' ],
583 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
584 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
585 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
586 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
587 ['nologin', '/usr/sbin/nologin', ],
590 path = get_option(prog[0] + '-path')
592 message('Using @1@ for @0@'.format(prog[0], path))
594 exe = find_program(prog[0],
595 '/usr/sbin/' + prog[0],
598 path = exe.found() ? exe.path() : prog[1]
600 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
601 conf.set_quoted(name, path)
602 substs.set(name, path)
605 conf.set_quoted('TELINIT', get_option('telinit-path'))
607 if run_command('ln', '--relative', '--help').returncode() != 0
608 error('ln does not support --relative (added in coreutils 8.16)')
611 ############################################################
613 gperf = find_program('gperf')
615 gperf_test_format = '''
617 const char * in_word_set(const char *, @0@);
620 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
621 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
622 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
623 if cc.compiles(gperf_test)
624 gperf_len_type = 'size_t'
626 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
627 if cc.compiles(gperf_test)
628 gperf_len_type = 'unsigned'
630 error('unable to determine gperf len type')
633 message('gperf len type is @0@'.format(gperf_len_type))
634 conf.set('GPERF_LEN_TYPE', gperf_len_type,
635 description : 'The type of gperf "len" parameter')
637 ############################################################
639 if not cc.has_header('sys/capability.h')
640 error('POSIX caps headers not found')
642 foreach header : ['crypt.h',
644 'linux/vm_sockets.h',
646 'valgrind/memcheck.h',
647 'valgrind/valgrind.h',
650 conf.set10('HAVE_' + header.underscorify().to_upper(),
651 cc.has_header(header))
654 ############################################################
656 fallback_hostname = get_option('fallback-hostname')
657 if fallback_hostname == '' or fallback_hostname[0] == '.' or fallback_hostname[0] == '-'
658 error('Invalid fallback-hostname configuration')
659 # A more extensive test is done in test-hostname-util. Let's catch
660 # the most obvious errors here so we don't fail with an assert later.
662 conf.set_quoted('FALLBACK_HOSTNAME', fallback_hostname)
664 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
665 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
667 default_hierarchy = get_option('default-hierarchy')
668 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
669 description : 'default cgroup hierarchy as string')
670 if default_hierarchy == 'legacy'
671 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
672 elif default_hierarchy == 'hybrid'
673 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
675 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
678 default_net_naming_scheme = get_option('default-net-naming-scheme')
679 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
681 time_epoch = get_option('time-epoch')
683 time_epoch = run_command('sh', ['-c', 'echo "$SOURCE_DATE_EPOCH"']).stdout().strip()
684 if time_epoch == '' and git.found() and run_command('test', '-e', '.git').returncode() == 0
685 # If we're in a git repository, use the creation time of the latest git tag.
686 latest_tag = run_command('git', 'describe', '--abbrev=0', '--tags').stdout().strip()
687 time_epoch = run_command('git', 'log', '-1', '--format=%at', latest_tag).stdout()
691 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
693 time_epoch = time_epoch.to_int()
695 conf.set('TIME_EPOCH', time_epoch)
697 foreach tuple : [['system-alloc-uid-min', 'SYS_UID_MIN', 1], # Also see login.defs(5).
698 ['system-uid-max', 'SYS_UID_MAX', 999],
699 ['system-alloc-gid-min', 'SYS_GID_MIN', 1],
700 ['system-gid-max', 'SYS_GID_MAX', 999]]
701 v = get_option(tuple[0])
705 '/^\s*@0@\s+/ { uid=$2 } END { print uid }'.format(tuple[1]),
706 '/etc/login.defs').stdout().strip()
713 conf.set(tuple[0].underscorify().to_upper(), v)
714 substs.set(tuple[0].underscorify().to_upper(), v)
716 if conf.get('SYSTEM_ALLOC_UID_MIN') >= conf.get('SYSTEM_UID_MAX')
717 error('Invalid uid allocation range')
719 if conf.get('SYSTEM_ALLOC_GID_MIN') >= conf.get('SYSTEM_GID_MAX')
720 error('Invalid gid allocation range')
723 dynamic_uid_min = get_option('dynamic-uid-min')
724 dynamic_uid_max = get_option('dynamic-uid-max')
725 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
726 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
727 substs.set('dynamicuidmin', dynamic_uid_min)
728 substs.set('dynamicuidmax', dynamic_uid_max)
730 container_uid_base_min = get_option('container-uid-base-min')
731 container_uid_base_max = get_option('container-uid-base-max')
732 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
733 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
734 substs.set('containeruidbasemin', container_uid_base_min)
735 substs.set('containeruidbasemax', container_uid_base_max)
737 nobody_user = get_option('nobody-user')
738 nobody_group = get_option('nobody-group')
740 if not meson.is_cross_build()
741 getent_result = run_command('getent', 'passwd', '65534')
742 if getent_result.returncode() == 0
743 name = getent_result.stdout().split(':')[0]
744 if name != nobody_user
746 '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) +
747 'Your build will result in an user table setup that is incompatible with the local system.')
750 id_result = run_command('id', '-u', nobody_user)
751 if id_result.returncode() == 0
752 id = id_result.stdout().to_int()
755 '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) +
756 'Your build will result in an user table setup that is incompatible with the local system.')
760 getent_result = run_command('getent', 'group', '65534')
761 if getent_result.returncode() == 0
762 name = getent_result.stdout().split(':')[0]
763 if name != nobody_group
765 '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) +
766 'Your build will result in an group table setup that is incompatible with the local system.')
769 id_result = run_command('id', '-g', nobody_group)
770 if id_result.returncode() == 0
771 id = id_result.stdout().to_int()
774 '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) +
775 'Your build will result in an group table setup that is incompatible with the local system.')
779 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
781 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
782 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
785 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
786 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
787 substs.set('NOBODY_USER_NAME', nobody_user)
788 substs.set('NOBODY_GROUP_NAME', nobody_group)
790 tty_gid = get_option('tty-gid')
791 conf.set('TTY_GID', tty_gid)
792 substs.set('TTY_GID', tty_gid)
794 # Ensure provided GID argument is numeric, otherwise fall back to default assignment
795 users_gid = get_option('users-gid')
796 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
798 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
799 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
801 dev_kvm_mode = get_option('dev-kvm-mode')
802 substs.set('DEV_KVM_MODE', dev_kvm_mode)
803 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
804 group_render_mode = get_option('group-render-mode')
805 substs.set('GROUP_RENDER_MODE', group_render_mode)
806 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
808 kill_user_processes = get_option('default-kill-user-processes')
809 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
810 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
811 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
813 dns_servers = get_option('dns-servers')
814 conf.set_quoted('DNS_SERVERS', dns_servers)
815 substs.set('DNS_SERVERS', dns_servers)
817 ntp_servers = get_option('ntp-servers')
818 conf.set_quoted('NTP_SERVERS', ntp_servers)
819 substs.set('NTP_SERVERS', ntp_servers)
821 default_locale = get_option('default-locale')
822 if default_locale == ''
823 if not meson.is_cross_build()
824 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
825 default_locale = run_command(choose_default_locale_sh).stdout().strip()
827 default_locale = 'C.UTF-8'
830 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
832 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
834 service_watchdog = get_option('service-watchdog')
835 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
836 substs.set('SERVICE_WATCHDOG', watchdog_value)
838 substs.set('SUSHELL', get_option('debug-shell'))
839 substs.set('DEBUGTTY', get_option('debug-tty'))
840 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
842 enable_debug_hashmap = false
843 enable_debug_mmap_cache = false
844 enable_debug_siphash = false
845 foreach name : get_option('debug-extra')
847 enable_debug_hashmap = true
848 elif name == 'mmap-cache'
849 enable_debug_mmap_cache = true
850 elif name == 'siphash'
851 enable_debug_siphash = true
853 message('unknown debug option "@0@", ignoring'.format(name))
856 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
857 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
858 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
860 conf.set10('VALGRIND', get_option('valgrind'))
861 conf.set10('LOG_TRACE', get_option('log-trace'))
863 default_user_path = get_option('user-path')
864 if default_user_path != ''
865 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
866 default_user_path_display = default_user_path
868 # meson 0.49 fails when ?: is used in .format()
869 default_user_path_display = '(same as system services)'
873 #####################################################################
875 threads = dependency('threads')
876 librt = cc.find_library('rt')
877 libm = cc.find_library('m')
878 libdl = cc.find_library('dl')
879 libcrypt = cc.find_library('crypt')
881 crypt_header = conf.get('HAVE_CRYPT_H') == 1 ? '''#include <crypt.h>''' : '''#include <unistd.h>'''
883 ['crypt_ra', crypt_header],
884 ['crypt_gensalt_ra', crypt_header]]
886 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE',
887 dependencies : libcrypt)
888 conf.set10('HAVE_' + ident[0].to_upper(), have)
891 libcap = dependency('libcap', required : false)
892 if not libcap.found()
893 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
894 libcap = cc.find_library('cap')
897 libmount = dependency('mount',
898 version : fuzzer_build ? '>= 0' : '>= 2.30')
900 want_libfdisk = get_option('fdisk')
901 if want_libfdisk != 'false' and not skip_deps
902 libfdisk = dependency('fdisk',
904 required : want_libfdisk == 'true')
905 have = libfdisk.found()
910 conf.set10('HAVE_LIBFDISK', have)
912 want_pwquality = get_option('pwquality')
913 if want_pwquality != 'false' and not skip_deps
914 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
915 have = libpwquality.found()
920 conf.set10('HAVE_PWQUALITY', have)
922 want_seccomp = get_option('seccomp')
923 if want_seccomp != 'false' and not skip_deps
924 libseccomp = dependency('libseccomp',
925 version : '>= 2.3.1',
926 required : want_seccomp == 'true')
927 have = libseccomp.found()
932 conf.set10('HAVE_SECCOMP', have)
934 want_selinux = get_option('selinux')
935 if want_selinux != 'false' and not skip_deps
936 libselinux = dependency('libselinux',
937 version : '>= 2.1.9',
938 required : want_selinux == 'true')
939 have = libselinux.found()
944 conf.set10('HAVE_SELINUX', have)
946 want_apparmor = get_option('apparmor')
947 if want_apparmor != 'false' and not skip_deps
948 libapparmor = dependency('libapparmor',
950 required : want_apparmor == 'true')
951 have = libapparmor.found()
956 conf.set10('HAVE_APPARMOR', have)
958 smack_run_label = get_option('smack-run-label')
959 if smack_run_label != ''
960 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
963 want_polkit = get_option('polkit')
964 install_polkit = false
965 install_polkit_pkla = false
966 if want_polkit != 'false' and not skip_deps
967 install_polkit = true
969 libpolkit = dependency('polkit-gobject-1',
971 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
972 message('Old polkit detected, will install pkla files')
973 install_polkit_pkla = true
976 conf.set10('ENABLE_POLKIT', install_polkit)
978 want_acl = get_option('acl')
979 if want_acl != 'false' and not skip_deps
980 libacl = cc.find_library('acl', required : want_acl == 'true')
981 have = libacl.found()
986 conf.set10('HAVE_ACL', have)
988 want_audit = get_option('audit')
989 if want_audit != 'false' and not skip_deps
990 libaudit = dependency('audit', required : want_audit == 'true')
991 have = libaudit.found()
996 conf.set10('HAVE_AUDIT', have)
998 want_blkid = get_option('blkid')
999 if want_blkid != 'false' and not skip_deps
1000 libblkid = dependency('blkid', required : want_blkid == 'true')
1001 have = libblkid.found()
1006 conf.set10('HAVE_BLKID', have)
1008 want_kmod = get_option('kmod')
1009 if want_kmod != 'false' and not skip_deps
1010 libkmod = dependency('libkmod',
1012 required : want_kmod == 'true')
1013 have = libkmod.found()
1018 conf.set10('HAVE_KMOD', have)
1020 want_pam = get_option('pam')
1021 if want_pam != 'false' and not skip_deps
1022 libpam = cc.find_library('pam', required : want_pam == 'true')
1023 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
1024 have = libpam.found() and libpam_misc.found()
1030 conf.set10('HAVE_PAM', have)
1032 want_microhttpd = get_option('microhttpd')
1033 if want_microhttpd != 'false' and not skip_deps
1034 libmicrohttpd = dependency('libmicrohttpd',
1035 version : '>= 0.9.33',
1036 required : want_microhttpd == 'true')
1037 have = libmicrohttpd.found()
1042 conf.set10('HAVE_MICROHTTPD', have)
1044 want_libcryptsetup = get_option('libcryptsetup')
1045 if want_libcryptsetup != 'false' and not skip_deps
1046 libcryptsetup = dependency('libcryptsetup',
1047 version : '>= 2.0.1',
1048 required : want_libcryptsetup == 'true')
1049 have = libcryptsetup.found()
1051 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1052 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
1053 conf.set10('HAVE_CRYPT_ACTIVATE_BY_SIGNED_KEY',
1054 have and cc.has_function('crypt_activate_by_signed_key', dependencies : libcryptsetup))
1059 conf.set10('HAVE_LIBCRYPTSETUP', have)
1061 want_libcurl = get_option('libcurl')
1062 if want_libcurl != 'false' and not skip_deps
1063 libcurl = dependency('libcurl',
1064 version : '>= 7.32.0',
1065 required : want_libcurl == 'true')
1066 have = libcurl.found()
1071 conf.set10('HAVE_LIBCURL', have)
1073 want_libidn = get_option('libidn')
1074 want_libidn2 = get_option('libidn2')
1075 if want_libidn == 'true' and want_libidn2 == 'true'
1076 error('libidn and libidn2 cannot be requested simultaneously')
1079 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1080 libidn = dependency('libidn2',
1081 required : want_libidn2 == 'true')
1082 have = libidn.found()
1087 conf.set10('HAVE_LIBIDN2', have)
1088 if not have and want_libidn != 'false' and not skip_deps
1089 # libidn is used for both libidn and libidn2 objects
1090 libidn = dependency('libidn',
1091 required : want_libidn == 'true')
1092 have = libidn.found()
1096 conf.set10('HAVE_LIBIDN', have)
1098 want_libiptc = get_option('libiptc')
1099 if want_libiptc != 'false' and not skip_deps
1100 libiptc = dependency('libiptc',
1101 required : want_libiptc == 'true')
1102 have = libiptc.found()
1107 conf.set10('HAVE_LIBIPTC', have)
1109 want_qrencode = get_option('qrencode')
1110 if want_qrencode != 'false' and not skip_deps
1111 libqrencode = dependency('libqrencode',
1112 required : want_qrencode == 'true')
1113 have = libqrencode.found()
1118 conf.set10('HAVE_QRENCODE', have)
1120 want_gcrypt = get_option('gcrypt')
1121 if want_gcrypt != 'false' and not skip_deps
1122 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1123 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1124 have = libgcrypt.found() and libgpg_error.found()
1129 # link to neither of the libs if one is not found
1133 conf.set10('HAVE_GCRYPT', have)
1135 want_gnutls = get_option('gnutls')
1136 if want_gnutls != 'false' and not skip_deps
1137 libgnutls = dependency('gnutls',
1138 version : '>= 3.1.4',
1139 required : want_gnutls == 'true')
1140 have = libgnutls.found()
1145 conf.set10('HAVE_GNUTLS', have)
1147 want_openssl = get_option('openssl')
1148 if want_openssl != 'false' and not skip_deps
1149 libopenssl = dependency('openssl',
1150 version : '>= 1.1.0',
1151 required : want_openssl == 'true')
1152 have = libopenssl.found()
1157 conf.set10('HAVE_OPENSSL', have)
1159 want_p11kit = get_option('p11kit')
1160 if want_p11kit != 'false' and not skip_deps
1161 libp11kit = dependency('p11-kit-1',
1162 version : '>= 0.23.3',
1163 required : want_p11kit == 'true')
1164 have = libp11kit.found()
1169 conf.set10('HAVE_P11KIT', have)
1171 want_libfido2 = get_option('libfido2')
1172 if want_libfido2 != 'false' and not skip_deps
1173 libfido2 = dependency('libfido2',
1174 required : want_libfido2 == 'true')
1175 have = libfido2.found()
1180 conf.set10('HAVE_LIBFIDO2', have)
1182 want_elfutils = get_option('elfutils')
1183 if want_elfutils != 'false' and not skip_deps
1184 libdw = dependency('libdw',
1185 required : want_elfutils == 'true')
1186 have = libdw.found()
1191 conf.set10('HAVE_ELFUTILS', have)
1193 want_zlib = get_option('zlib')
1194 if want_zlib != 'false' and not skip_deps
1195 libz = dependency('zlib',
1196 required : want_zlib == 'true')
1202 conf.set10('HAVE_ZLIB', have)
1204 want_bzip2 = get_option('bzip2')
1205 if want_bzip2 != 'false' and not skip_deps
1206 libbzip2 = cc.find_library('bz2',
1207 required : want_bzip2 == 'true')
1208 have = libbzip2.found()
1213 conf.set10('HAVE_BZIP2', have)
1215 want_xz = get_option('xz')
1216 if want_xz != 'false' and not skip_deps
1217 libxz = dependency('liblzma',
1218 required : want_xz == 'true')
1219 have_xz = libxz.found()
1224 conf.set10('HAVE_XZ', have_xz)
1226 want_lz4 = get_option('lz4')
1227 if want_lz4 != 'false' and not skip_deps
1228 liblz4 = dependency('liblz4',
1229 version : '>= 1.3.0',
1230 required : want_lz4 == 'true')
1231 have_lz4 = liblz4.found()
1236 conf.set10('HAVE_LZ4', have_lz4)
1238 want_zstd = get_option('zstd')
1239 if want_zstd != 'false' and not skip_deps
1240 libzstd = dependency('libzstd',
1241 required : want_zstd == 'true',
1242 version : '>= 1.4.0')
1243 have_zstd = libzstd.found()
1248 conf.set10('HAVE_ZSTD', have_zstd)
1250 conf.set10('HAVE_COMPRESSION', have_xz or have_lz4 or have_zstd)
1252 want_xkbcommon = get_option('xkbcommon')
1253 if want_xkbcommon != 'false' and not skip_deps
1254 libxkbcommon = dependency('xkbcommon',
1255 version : '>= 0.3.0',
1256 required : want_xkbcommon == 'true')
1257 have = libxkbcommon.found()
1262 conf.set10('HAVE_XKBCOMMON', have)
1264 want_pcre2 = get_option('pcre2')
1265 if want_pcre2 != 'false'
1266 libpcre2 = dependency('libpcre2-8',
1267 required : want_pcre2 == 'true')
1268 have = libpcre2.found()
1273 conf.set10('HAVE_PCRE2', have)
1275 want_glib = get_option('glib')
1276 if want_glib != 'false' and not skip_deps
1277 libglib = dependency('glib-2.0',
1278 version : '>= 2.22.0',
1279 required : want_glib == 'true')
1280 libgobject = dependency('gobject-2.0',
1281 version : '>= 2.22.0',
1282 required : want_glib == 'true')
1283 libgio = dependency('gio-2.0',
1284 required : want_glib == 'true')
1285 have = libglib.found() and libgobject.found() and libgio.found()
1292 conf.set10('HAVE_GLIB', have)
1294 want_dbus = get_option('dbus')
1295 if want_dbus != 'false' and not skip_deps
1296 libdbus = dependency('dbus-1',
1297 version : '>= 1.3.2',
1298 required : want_dbus == 'true')
1299 have = libdbus.found()
1304 conf.set10('HAVE_DBUS', have)
1306 default_dnssec = get_option('default-dnssec')
1308 default_dnssec = 'no'
1310 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1311 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1312 default_dnssec = 'no'
1314 conf.set('DEFAULT_DNSSEC_MODE',
1315 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1316 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1318 dns_over_tls = get_option('dns-over-tls')
1319 if dns_over_tls != 'false'
1320 if dns_over_tls == 'openssl'
1323 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1324 if dns_over_tls == 'gnutls' and not have_gnutls
1325 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1328 if dns_over_tls == 'gnutls' or have_gnutls
1329 have_openssl = false
1331 have_openssl = conf.get('HAVE_OPENSSL') == 1
1332 if dns_over_tls != 'auto' and not have_openssl
1333 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1334 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1337 have = have_gnutls or have_openssl
1341 have_openssl = false
1343 conf.set10('ENABLE_DNS_OVER_TLS', have)
1344 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1345 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1347 default_dns_over_tls = get_option('default-dns-over-tls')
1349 default_dns_over_tls = 'no'
1351 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1352 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.')
1353 default_dns_over_tls = 'no'
1355 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1356 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1357 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1359 default_mdns = get_option('default-mdns')
1360 conf.set('DEFAULT_MDNS_MODE',
1361 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
1362 substs.set('DEFAULT_MDNS_MODE', default_mdns)
1364 default_llmnr = get_option('default-llmnr')
1365 conf.set('DEFAULT_LLMNR_MODE',
1366 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
1367 substs.set('DEFAULT_LLMNR_MODE', default_llmnr)
1369 want_repart = get_option('repart')
1370 if want_repart != 'false'
1371 have = (conf.get('HAVE_OPENSSL') == 1 and
1372 conf.get('HAVE_LIBFDISK') == 1)
1373 if want_repart == 'true' and not have
1374 error('repart support was requested, but dependencies are not available')
1379 conf.set10('ENABLE_REPART', have)
1381 want_importd = get_option('importd')
1382 if want_importd != 'false'
1383 have = (conf.get('HAVE_LIBCURL') == 1 and
1384 conf.get('HAVE_ZLIB') == 1 and
1385 conf.get('HAVE_XZ') == 1 and
1386 conf.get('HAVE_GCRYPT') == 1)
1387 if want_importd == 'true' and not have
1388 error('importd support was requested, but dependencies are not available')
1393 conf.set10('ENABLE_IMPORTD', have)
1395 want_homed = get_option('homed')
1396 if want_homed != 'false'
1397 have = (conf.get('HAVE_OPENSSL') == 1 and
1398 conf.get('HAVE_LIBFDISK') == 1 and
1399 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1400 if want_homed == 'true' and not have
1401 error('homed support was requested, but dependencies are not available')
1406 conf.set10('ENABLE_HOMED', have)
1408 have = have and conf.get('HAVE_PAM') == 1
1409 conf.set10('ENABLE_PAM_HOME', have)
1411 want_remote = get_option('remote')
1412 if want_remote != 'false'
1413 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1414 conf.get('HAVE_LIBCURL') == 1]
1415 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1416 # it's possible to build one without the other. Complain only if
1417 # support was explicitly requested. The auxiliary files like sysusers
1418 # config should be installed when any of the programs are built.
1419 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1420 error('remote support was requested, but dependencies are not available')
1422 have = have_deps[0] or have_deps[1]
1426 conf.set10('ENABLE_REMOTE', have)
1428 foreach term : ['analyze',
1442 'compat-mutable-uid-boundaries',
1466 have = get_option(term)
1467 name = 'ENABLE_' + term.underscorify().to_upper()
1468 conf.set10(name, have)
1471 foreach tuple : [['nss-mymachines', 'machined'],
1472 ['nss-resolve', 'resolve']]
1473 want = get_option(tuple[0])
1475 have = get_option(tuple[1])
1476 if want == 'true' and not have
1477 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1482 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1483 conf.set10(name, have)
1487 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1488 'ENABLE_NSS_MYMACHINES',
1489 'ENABLE_NSS_RESOLVE',
1490 'ENABLE_NSS_SYSTEMD']
1491 if conf.get(term) == 1
1495 conf.set10('ENABLE_NSS', enable_nss)
1497 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1502 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1504 #####################################################################
1506 if get_option('efi')
1507 efi_arch = host_machine.cpu_family()
1509 if efi_arch == 'x86'
1510 EFI_MACHINE_TYPE_NAME = 'ia32'
1511 gnu_efi_arch = 'ia32'
1512 elif efi_arch == 'x86_64'
1513 EFI_MACHINE_TYPE_NAME = 'x64'
1514 gnu_efi_arch = 'x86_64'
1515 elif efi_arch == 'arm'
1516 EFI_MACHINE_TYPE_NAME = 'arm'
1517 gnu_efi_arch = 'arm'
1518 elif efi_arch == 'aarch64'
1519 EFI_MACHINE_TYPE_NAME = 'aa64'
1520 gnu_efi_arch = 'aarch64'
1522 EFI_MACHINE_TYPE_NAME = ''
1527 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1529 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1533 conf.set10('ENABLE_EFI', have)
1535 #####################################################################
1537 config_h = configure_file(
1538 output : 'config.h',
1539 configuration : conf)
1541 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1543 includes = include_directories('src/basic',
1549 'src/journal-remote',
1553 'src/time-wait-sync',
1559 'src/xdg-autostart-generator',
1560 'src/libsystemd/sd-bus',
1561 'src/libsystemd/sd-device',
1562 'src/libsystemd/sd-event',
1563 'src/libsystemd/sd-hwdb',
1564 'src/libsystemd/sd-id128',
1565 'src/libsystemd/sd-netlink',
1566 'src/libsystemd/sd-network',
1567 'src/libsystemd/sd-resolve',
1568 'src/libsystemd-network',
1571 add_project_arguments('-include', 'config.h', language : 'c')
1573 generate_gperfs = find_program('tools/generate-gperfs.py')
1577 subdir('src/systemd')
1579 subdir('src/libsystemd')
1580 subdir('src/libsystemd-network')
1581 subdir('src/journal')
1584 libjournal_core = static_library(
1586 libjournal_core_sources,
1588 include_directories : includes,
1591 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1592 libsystemd = shared_library(
1595 version : libsystemd_version,
1596 include_directories : includes,
1597 link_args : ['-shared',
1598 '-Wl,--version-script=' + libsystemd_sym_path],
1599 link_with : [libbasic,
1601 link_whole : [libsystemd_static,
1603 dependencies : [threads,
1608 link_depends : libsystemd_sym,
1610 install_dir : rootlibdir)
1612 static_libsystemd = get_option('static-libsystemd')
1613 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1615 install_libsystemd_static = static_library(
1618 journal_client_sources,
1620 basic_gcrypt_sources,
1622 include_directories : includes,
1623 build_by_default : static_libsystemd != 'false',
1624 install : static_libsystemd != 'false',
1625 install_dir : rootlibdir,
1626 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1627 dependencies : [threads,
1637 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1639 ############################################################
1641 autosuspend_update_sh = find_program('tools/autosuspend-update.sh')
1642 hwdb_update_sh = find_program('tools/hwdb-update.sh')
1643 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1644 make_directive_index_py = find_program('tools/make-directive-index.py')
1645 make_man_index_py = find_program('tools/make-man-index.py')
1646 syscall_names_update_sh = find_program('tools/syscall-names-update.sh')
1647 xml_helper_py = find_program('tools/xml_helper.py')
1648 update_dbus_docs_py = find_program('tools/update-dbus-docs.py')
1650 ############################################################
1652 # binaries that have --help and are intended for use by humans,
1653 # usually, but not always, installed in /bin.
1654 public_programs = []
1656 subdir('src/libudev')
1657 subdir('src/shared')
1659 subdir('src/shutdown')
1661 subdir('src/network')
1663 subdir('src/analyze')
1664 subdir('src/journal-remote')
1665 subdir('src/coredump')
1666 subdir('src/pstore')
1667 subdir('src/hostname')
1668 subdir('src/import')
1669 subdir('src/partition')
1670 subdir('src/kernel-install')
1671 subdir('src/locale')
1672 subdir('src/machine')
1673 subdir('src/portable')
1674 subdir('src/userdb')
1676 subdir('src/nspawn')
1677 subdir('src/resolve')
1678 subdir('src/timedate')
1679 subdir('src/timesync')
1680 subdir('src/tmpfiles')
1681 subdir('src/vconsole')
1682 subdir('src/boot/efi')
1689 ############################################################
1691 # only static linking apart from libdl, to make sure that the
1692 # module is linked to all libraries that it uses.
1693 test_dlopen = executable(
1697 include_directories : includes,
1698 link_with : [libbasic],
1699 dependencies : [libdl],
1700 build_by_default : want_tests != 'false')
1702 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1703 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h src/nss-systemd/nss-systemd.h'],
1704 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1705 ['resolve', 'ENABLE_NSS_RESOLVE']]
1707 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1711 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1712 version_script_arg = join_paths(project_source_root, sym)
1714 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1715 if tuple.length() > 2
1716 sources += tuple[2].split()
1719 nss = shared_library(
1724 include_directories : includes,
1725 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1726 link_args : ['-Wl,-z,nodelete',
1728 '-Wl,--version-script=' + version_script_arg],
1729 link_with : [libsystemd_static,
1732 dependencies : [threads,
1736 install_dir : rootlibdir)
1738 # We cannot use shared_module because it does not support version suffix.
1739 # Unfortunately shared_library insists on creating the symlink…
1740 meson.add_install_script('sh', '-c',
1741 'rm $DESTDIR@0@/libnss_@1@.so'
1742 .format(rootlibdir, module))
1744 if want_tests != 'false'
1745 test('dlopen-nss_' + module,
1747 # path to dlopen must include a slash
1748 args : nss.full_path())
1753 ############################################################
1758 include_directories : includes,
1759 link_with : [libcore,
1761 dependencies : [versiondep,
1768 install_rpath : rootlibexecdir,
1770 install_dir : rootlibexecdir)
1772 meson.add_install_script(meson_make_symlink,
1773 join_paths(rootlibexecdir, 'systemd'),
1774 join_paths(rootsbindir, 'init'))
1776 public_programs += executable(
1778 systemd_analyze_sources,
1779 include_directories : includes,
1780 link_with : [libcore,
1782 dependencies : [versiondep,
1789 install_rpath : rootlibexecdir,
1790 install : conf.get('ENABLE_ANALYZE'))
1794 systemd_journald_sources,
1795 include_directories : includes,
1796 link_with : [libjournal_core,
1798 dependencies : [threads,
1803 install_rpath : rootlibexecdir,
1805 install_dir : rootlibexecdir)
1807 public_programs += executable(
1809 systemd_cat_sources,
1810 include_directories : includes,
1811 link_with : [libjournal_core,
1813 dependencies : [threads],
1814 install_rpath : rootlibexecdir,
1817 public_programs += executable(
1820 include_directories : includes,
1821 link_with : [libshared],
1822 dependencies : [threads,
1828 install_rpath : rootlibexecdir,
1830 install_dir : rootbindir)
1833 'systemd-getty-generator',
1834 'src/getty-generator/getty-generator.c',
1835 include_directories : includes,
1836 link_with : [libshared],
1837 install_rpath : rootlibexecdir,
1839 install_dir : systemgeneratordir)
1842 'systemd-debug-generator',
1843 'src/debug-generator/debug-generator.c',
1844 include_directories : includes,
1845 link_with : [libshared],
1846 install_rpath : rootlibexecdir,
1848 install_dir : systemgeneratordir)
1851 'systemd-run-generator',
1852 'src/run-generator/run-generator.c',
1853 include_directories : includes,
1854 link_with : [libshared],
1855 install_rpath : rootlibexecdir,
1857 install_dir : systemgeneratordir)
1860 'systemd-fstab-generator',
1861 'src/fstab-generator/fstab-generator.c',
1862 include_directories : includes,
1863 link_with : [libcore_shared,
1865 install_rpath : rootlibexecdir,
1867 install_dir : systemgeneratordir)
1869 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1871 '30-systemd-environment-d-generator',
1872 'src/environment-d-generator/environment-d-generator.c',
1873 include_directories : includes,
1874 link_with : [libshared],
1875 install_rpath : rootlibexecdir,
1877 install_dir : userenvgeneratordir)
1879 meson.add_install_script(meson_make_symlink,
1880 join_paths(sysconfdir, 'environment'),
1881 join_paths(environmentdir, '99-environment.conf'))
1884 if conf.get('ENABLE_HIBERNATE') == 1
1886 'systemd-hibernate-resume-generator',
1887 'src/hibernate-resume/hibernate-resume-generator.c',
1888 include_directories : includes,
1889 link_with : [libshared],
1890 install_rpath : rootlibexecdir,
1892 install_dir : systemgeneratordir)
1895 'systemd-hibernate-resume',
1896 'src/hibernate-resume/hibernate-resume.c',
1897 include_directories : includes,
1898 link_with : [libshared],
1899 install_rpath : rootlibexecdir,
1901 install_dir : rootlibexecdir)
1904 if conf.get('HAVE_BLKID') == 1
1906 'systemd-gpt-auto-generator',
1907 'src/gpt-auto-generator/gpt-auto-generator.c',
1908 'src/shared/blkid-util.h',
1909 include_directories : includes,
1910 link_with : [libshared],
1911 dependencies : libblkid,
1912 install_rpath : rootlibexecdir,
1914 install_dir : systemgeneratordir)
1916 public_programs += executable(
1918 'src/dissect/dissect.c',
1919 include_directories : includes,
1920 link_with : [libshared],
1921 install_rpath : rootlibexecdir,
1925 if conf.get('ENABLE_RESOLVE') == 1
1928 systemd_resolved_sources,
1929 include_directories : includes,
1930 link_with : [libshared,
1932 libsystemd_resolve_core],
1933 dependencies : systemd_resolved_dependencies,
1934 install_rpath : rootlibexecdir,
1936 install_dir : rootlibexecdir)
1938 public_programs += executable(
1941 include_directories : includes,
1942 link_with : [libshared,
1944 libsystemd_resolve_core],
1945 dependencies : [threads,
1949 install_rpath : rootlibexecdir,
1952 meson.add_install_script(meson_make_symlink,
1953 join_paths(bindir, 'resolvectl'),
1954 join_paths(rootsbindir, 'resolvconf'))
1956 meson.add_install_script(meson_make_symlink,
1957 join_paths(bindir, 'resolvectl'),
1958 join_paths(bindir, 'systemd-resolve'))
1961 if conf.get('ENABLE_LOGIND') == 1
1964 systemd_logind_sources,
1965 include_directories : includes,
1966 link_with : [liblogind_core,
1968 dependencies : [threads,
1970 install_rpath : rootlibexecdir,
1972 install_dir : rootlibexecdir)
1974 public_programs += executable(
1977 include_directories : includes,
1978 link_with : [libshared],
1979 dependencies : [threads,
1983 install_rpath : rootlibexecdir,
1985 install_dir : rootbindir)
1987 public_programs += executable(
1989 'src/login/inhibit.c',
1990 include_directories : includes,
1991 link_with : [libshared],
1992 install_rpath : rootlibexecdir,
1994 install_dir : rootbindir)
1996 if conf.get('HAVE_PAM') == 1
1997 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1998 pam_systemd = shared_library(
2002 include_directories : includes,
2003 link_args : ['-shared',
2004 '-Wl,--version-script=' + version_script_arg],
2005 link_with : [libsystemd_static,
2007 dependencies : [threads,
2010 link_depends : pam_systemd_sym,
2012 install_dir : pamlibdir)
2014 if want_tests != 'false'
2015 test('dlopen-pam_systemd',
2017 # path to dlopen must include a slash
2018 args : pam_systemd.full_path())
2023 'systemd-user-runtime-dir',
2024 user_runtime_dir_sources,
2025 include_directories : includes,
2026 link_with : [libshared],
2027 install_rpath : rootlibexecdir,
2029 install_dir : rootlibexecdir)
2032 if conf.get('HAVE_PAM') == 1
2034 'systemd-user-sessions',
2035 'src/user-sessions/user-sessions.c',
2036 include_directories : includes,
2037 link_with : [libshared],
2038 install_rpath : rootlibexecdir,
2040 install_dir : rootlibexecdir)
2043 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
2044 public_programs += executable(
2046 'src/boot/bootctl.c',
2047 include_directories : includes,
2048 link_with : [libshared],
2049 dependencies : [libblkid],
2050 install_rpath : rootlibexecdir,
2053 public_programs += executable(
2054 'systemd-bless-boot',
2055 'src/boot/bless-boot.c',
2056 include_directories : includes,
2057 link_with : [libshared],
2058 dependencies : [libblkid],
2059 install_rpath : rootlibexecdir,
2061 install_dir : rootlibexecdir)
2064 'systemd-bless-boot-generator',
2065 'src/boot/bless-boot-generator.c',
2066 include_directories : includes,
2067 link_with : [libshared],
2068 install_rpath : rootlibexecdir,
2070 install_dir : systemgeneratordir)
2074 'systemd-boot-check-no-failures',
2075 'src/boot/boot-check-no-failures.c',
2076 include_directories : includes,
2077 link_with : [libshared],
2078 dependencies : [libblkid],
2079 install_rpath : rootlibexecdir,
2081 install_dir : rootlibexecdir)
2083 public_programs += executable(
2084 'systemd-socket-activate',
2085 'src/activate/activate.c',
2086 include_directories : includes,
2087 link_with : [libshared],
2088 dependencies : [threads],
2089 install_rpath : rootlibexecdir,
2092 if get_option('link-systemctl-shared')
2093 systemctl_link_with = [libshared]
2095 systemctl_link_with = [libsystemd_static,
2101 public_programs += executable(
2103 'src/systemctl/systemctl.c',
2104 'src/systemctl/sysv-compat.h',
2105 'src/systemctl/sysv-compat.c',
2106 include_directories : includes,
2107 link_with : systemctl_link_with,
2108 dependencies : [threads,
2114 install_rpath : rootlibexecdir,
2116 install_dir : rootbindir)
2118 if conf.get('ENABLE_PORTABLED') == 1
2120 'systemd-portabled',
2121 systemd_portabled_sources,
2122 include_directories : includes,
2123 link_with : [libshared],
2124 dependencies : [threads],
2125 install_rpath : rootlibexecdir,
2127 install_dir : rootlibexecdir)
2129 public_programs += executable(
2131 'src/portable/portablectl.c',
2132 include_directories : includes,
2133 link_with : [libshared],
2134 dependencies : [threads],
2135 install_rpath : rootlibexecdir,
2137 install_dir : rootbindir)
2140 if conf.get('ENABLE_USERDB') == 1
2143 systemd_userwork_sources,
2144 include_directories : includes,
2145 link_with : [libshared],
2146 dependencies : [threads],
2147 install_rpath : rootlibexecdir,
2149 install_dir : rootlibexecdir)
2153 systemd_userdbd_sources,
2154 include_directories : includes,
2155 link_with : [libshared],
2156 dependencies : [threads],
2157 install_rpath : rootlibexecdir,
2159 install_dir : rootlibexecdir)
2161 public_programs += executable(
2164 include_directories : includes,
2165 link_with : [libshared],
2166 dependencies : [threads],
2167 install_rpath : rootlibexecdir,
2169 install_dir : rootbindir)
2172 if conf.get('ENABLE_HOMED') == 1
2175 systemd_homework_sources,
2176 include_directories : includes,
2177 link_with : [libshared],
2178 dependencies : [threads,
2186 install_rpath : rootlibexecdir,
2188 install_dir : rootlibexecdir)
2192 systemd_homed_sources,
2193 include_directories : includes,
2194 link_with : [libshared],
2195 dependencies : [threads,
2198 install_rpath : rootlibexecdir,
2200 install_dir : rootlibexecdir)
2202 public_programs += executable(
2205 include_directories : includes,
2206 link_with : [libshared],
2207 dependencies : [threads,
2213 install_rpath : rootlibexecdir,
2215 install_dir : rootbindir)
2217 if conf.get('HAVE_PAM') == 1
2218 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2219 pam_systemd = shared_library(
2223 include_directories : includes,
2224 link_args : ['-shared',
2225 '-Wl,--version-script=' + version_script_arg],
2226 link_with : [libsystemd_static,
2228 dependencies : [threads,
2232 link_depends : pam_systemd_home_sym,
2234 install_dir : pamlibdir)
2238 foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
2239 (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
2240 meson.add_install_script(meson_make_symlink,
2241 join_paths(rootbindir, 'systemctl'),
2242 join_paths(rootsbindir, alias))
2245 meson.add_install_script(meson_make_symlink,
2246 join_paths(rootbindir, 'udevadm'),
2247 join_paths(rootlibexecdir, 'systemd-udevd'))
2249 if conf.get('ENABLE_BACKLIGHT') == 1
2251 'systemd-backlight',
2252 'src/backlight/backlight.c',
2253 include_directories : includes,
2254 link_with : [libshared],
2255 install_rpath : rootlibexecdir,
2257 install_dir : rootlibexecdir)
2260 if conf.get('ENABLE_RFKILL') == 1
2263 'src/rfkill/rfkill.c',
2264 include_directories : includes,
2265 link_with : [libshared],
2266 install_rpath : rootlibexecdir,
2268 install_dir : rootlibexecdir)
2272 'systemd-system-update-generator',
2273 'src/system-update-generator/system-update-generator.c',
2274 include_directories : includes,
2275 link_with : [libshared],
2276 install_rpath : rootlibexecdir,
2278 install_dir : systemgeneratordir)
2280 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2281 systemd_cryptsetup_sources = files('''
2282 src/cryptsetup/cryptsetup-pkcs11.h
2283 src/cryptsetup/cryptsetup-keyfile.c
2284 src/cryptsetup/cryptsetup-keyfile.h
2285 src/cryptsetup/cryptsetup.c
2288 if conf.get('HAVE_P11KIT') == 1
2289 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2293 'systemd-cryptsetup',
2294 systemd_cryptsetup_sources,
2295 include_directories : includes,
2296 link_with : [libshared],
2297 dependencies : [libcryptsetup,
2299 install_rpath : rootlibexecdir,
2301 install_dir : rootlibexecdir)
2304 'systemd-cryptsetup-generator',
2305 'src/cryptsetup/cryptsetup-generator.c',
2306 include_directories : includes,
2307 link_with : [libshared],
2308 install_rpath : rootlibexecdir,
2310 install_dir : systemgeneratordir)
2313 'systemd-veritysetup',
2314 'src/veritysetup/veritysetup.c',
2315 include_directories : includes,
2316 link_with : [libshared],
2317 dependencies : [libcryptsetup],
2318 install_rpath : rootlibexecdir,
2320 install_dir : rootlibexecdir)
2323 'systemd-veritysetup-generator',
2324 'src/veritysetup/veritysetup-generator.c',
2325 include_directories : includes,
2326 link_with : [libshared],
2327 install_rpath : rootlibexecdir,
2329 install_dir : systemgeneratordir)
2332 if conf.get('HAVE_SYSV_COMPAT') == 1
2334 'systemd-sysv-generator',
2335 'src/sysv-generator/sysv-generator.c',
2336 include_directories : includes,
2337 link_with : [libshared],
2338 install_rpath : rootlibexecdir,
2340 install_dir : systemgeneratordir)
2343 'systemd-rc-local-generator',
2344 'src/rc-local-generator/rc-local-generator.c',
2345 include_directories : includes,
2346 link_with : [libshared],
2347 install_rpath : rootlibexecdir,
2349 install_dir : systemgeneratordir)
2352 if conf.get('ENABLE_XDG_AUTOSTART') == 1
2354 'systemd-xdg-autostart-generator',
2355 'src/xdg-autostart-generator/xdg-autostart-generator.c',
2356 'src/xdg-autostart-generator/xdg-autostart-service.c',
2357 include_directories : includes,
2358 link_with : [libshared],
2359 install_rpath : rootlibexecdir,
2361 install_dir : usergeneratordir)
2364 'systemd-xdg-autostart-condition',
2365 'src/xdg-autostart-generator/xdg-autostart-condition.c',
2366 include_directories : includes,
2367 link_with : [libshared],
2368 install_rpath : rootlibexecdir,
2370 install_dir : rootlibexecdir)
2373 if conf.get('ENABLE_HOSTNAMED') == 1
2375 'systemd-hostnamed',
2376 'src/hostname/hostnamed.c',
2377 include_directories : includes,
2378 link_with : [libshared],
2379 install_rpath : rootlibexecdir,
2381 install_dir : rootlibexecdir)
2383 public_programs += executable(
2385 'src/hostname/hostnamectl.c',
2386 include_directories : includes,
2387 link_with : [libshared],
2388 install_rpath : rootlibexecdir,
2392 if conf.get('ENABLE_LOCALED') == 1
2393 if conf.get('HAVE_XKBCOMMON') == 1
2394 # logind will load libxkbcommon.so dynamically on its own
2402 systemd_localed_sources,
2403 include_directories : includes,
2404 link_with : [libshared],
2405 dependencies : deps,
2406 install_rpath : rootlibexecdir,
2408 install_dir : rootlibexecdir)
2410 public_programs += executable(
2413 include_directories : includes,
2414 link_with : [libshared],
2415 install_rpath : rootlibexecdir,
2419 if conf.get('ENABLE_TIMEDATED') == 1
2421 'systemd-timedated',
2422 'src/timedate/timedated.c',
2423 include_directories : includes,
2424 link_with : [libshared],
2425 install_rpath : rootlibexecdir,
2427 install_dir : rootlibexecdir)
2430 if conf.get('ENABLE_TIMEDATECTL') == 1
2431 public_programs += executable(
2433 'src/timedate/timedatectl.c',
2434 include_directories : includes,
2435 install_rpath : rootlibexecdir,
2436 link_with : [libshared],
2437 dependencies : [libm],
2441 if conf.get('ENABLE_TIMESYNCD') == 1
2442 if get_option('link-timesyncd-shared')
2443 timesyncd_link_with = [libshared]
2445 timesyncd_link_with = [libsystemd_static,
2452 'systemd-timesyncd',
2453 systemd_timesyncd_sources,
2454 include_directories : includes,
2455 link_with : [timesyncd_link_with],
2456 dependencies : [threads,
2458 install_rpath : rootlibexecdir,
2460 install_dir : rootlibexecdir)
2463 'systemd-time-wait-sync',
2464 'src/time-wait-sync/time-wait-sync.c',
2465 include_directories : includes,
2466 link_with : [timesyncd_link_with],
2467 install_rpath : rootlibexecdir,
2469 install_dir : rootlibexecdir)
2472 if conf.get('ENABLE_MACHINED') == 1
2475 systemd_machined_sources,
2476 include_directories : includes,
2477 link_with : [libmachine_core,
2479 install_rpath : rootlibexecdir,
2481 install_dir : rootlibexecdir)
2483 public_programs += executable(
2485 'src/machine/machinectl.c',
2486 include_directories : includes,
2487 link_with : [libshared],
2488 dependencies : [threads,
2492 install_rpath : rootlibexecdir,
2494 install_dir : rootbindir)
2497 if conf.get('ENABLE_IMPORTD') == 1
2500 systemd_importd_sources,
2501 include_directories : includes,
2502 link_with : [libshared],
2503 dependencies : [threads],
2504 install_rpath : rootlibexecdir,
2506 install_dir : rootlibexecdir)
2508 systemd_pull = executable(
2510 systemd_pull_sources,
2511 include_directories : includes,
2512 link_with : [libshared],
2513 dependencies : [versiondep,
2519 install_rpath : rootlibexecdir,
2521 install_dir : rootlibexecdir)
2523 systemd_import = executable(
2525 systemd_import_sources,
2526 include_directories : includes,
2527 link_with : [libshared],
2528 dependencies : [libcurl,
2532 install_rpath : rootlibexecdir,
2534 install_dir : rootlibexecdir)
2536 systemd_import_fs = executable(
2537 'systemd-import-fs',
2538 systemd_import_fs_sources,
2539 include_directories : includes,
2540 link_with : [libshared],
2541 install_rpath : rootlibexecdir,
2543 install_dir : rootlibexecdir)
2545 systemd_export = executable(
2547 systemd_export_sources,
2548 include_directories : includes,
2549 link_with : [libshared],
2550 dependencies : [libcurl,
2554 install_rpath : rootlibexecdir,
2556 install_dir : rootlibexecdir)
2558 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2561 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2562 public_programs += executable(
2563 'systemd-journal-upload',
2564 systemd_journal_upload_sources,
2565 include_directories : includes,
2566 link_with : [libshared],
2567 dependencies : [versiondep,
2574 install_rpath : rootlibexecdir,
2576 install_dir : rootlibexecdir)
2579 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2580 public_programs += executable(
2581 'systemd-journal-remote',
2582 systemd_journal_remote_sources,
2583 include_directories : includes,
2584 link_with : [libshared,
2585 libsystemd_journal_remote],
2586 dependencies : [threads,
2592 install_rpath : rootlibexecdir,
2594 install_dir : rootlibexecdir)
2596 public_programs += executable(
2597 'systemd-journal-gatewayd',
2598 systemd_journal_gatewayd_sources,
2599 include_directories : includes,
2600 link_with : [libshared],
2601 dependencies : [threads,
2607 install_rpath : rootlibexecdir,
2609 install_dir : rootlibexecdir)
2612 if conf.get('ENABLE_COREDUMP') == 1
2615 systemd_coredump_sources,
2616 include_directories : includes,
2617 link_with : [libshared],
2618 dependencies : [threads,
2624 install_rpath : rootlibexecdir,
2626 install_dir : rootlibexecdir)
2628 public_programs += executable(
2630 coredumpctl_sources,
2631 include_directories : includes,
2632 link_with : [libshared],
2633 dependencies : [threads,
2637 install_rpath : rootlibexecdir,
2641 if conf.get('ENABLE_PSTORE') == 1
2644 systemd_pstore_sources,
2645 include_directories : includes,
2646 link_with : [libshared],
2647 dependencies : [threads,
2653 install_rpath : rootlibexecdir,
2655 install_dir : rootlibexecdir)
2658 if conf.get('ENABLE_BINFMT') == 1
2659 public_programs += executable(
2661 'src/binfmt/binfmt.c',
2662 include_directories : includes,
2663 link_with : [libshared],
2664 install_rpath : rootlibexecdir,
2666 install_dir : rootlibexecdir)
2668 meson.add_install_script('sh', '-c',
2669 mkdir_p.format(binfmtdir))
2670 meson.add_install_script('sh', '-c',
2671 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2674 if conf.get('ENABLE_REPART') == 1
2677 systemd_repart_sources,
2678 include_directories : includes,
2679 link_with : [libshared],
2680 dependencies : [threads,
2684 install_rpath : rootlibexecdir,
2686 install_dir : rootbindir)
2687 public_programs += exe
2689 if want_tests != 'false'
2692 args : exe.full_path())
2696 if conf.get('ENABLE_VCONSOLE') == 1
2698 'systemd-vconsole-setup',
2699 'src/vconsole/vconsole-setup.c',
2700 include_directories : includes,
2701 link_with : [libshared],
2702 install_rpath : rootlibexecdir,
2704 install_dir : rootlibexecdir)
2707 if conf.get('ENABLE_RANDOMSEED') == 1
2709 'systemd-random-seed',
2710 'src/random-seed/random-seed.c',
2711 include_directories : includes,
2712 link_with : [libshared],
2713 install_rpath : rootlibexecdir,
2715 install_dir : rootlibexecdir)
2718 if conf.get('ENABLE_FIRSTBOOT') == 1
2720 'systemd-firstboot',
2721 'src/firstboot/firstboot.c',
2722 include_directories : includes,
2723 link_with : [libshared],
2724 dependencies : [libcrypt],
2725 install_rpath : rootlibexecdir,
2727 install_dir : rootbindir)
2731 'systemd-remount-fs',
2732 'src/remount-fs/remount-fs.c',
2733 include_directories : includes,
2734 link_with : [libcore_shared,
2736 install_rpath : rootlibexecdir,
2738 install_dir : rootlibexecdir)
2741 'systemd-machine-id-setup',
2742 'src/machine-id-setup/machine-id-setup-main.c',
2743 include_directories : includes,
2744 link_with : [libcore_shared,
2746 install_rpath : rootlibexecdir,
2748 install_dir : rootbindir)
2753 include_directories : includes,
2754 link_with : [libshared],
2755 install_rpath : rootlibexecdir,
2757 install_dir : rootlibexecdir)
2759 executable('systemd-growfs',
2760 'src/partition/growfs.c',
2761 include_directories : includes,
2762 link_with : [libshared],
2763 install_rpath : rootlibexecdir,
2765 install_dir : rootlibexecdir)
2769 'src/partition/makefs.c',
2770 include_directories : includes,
2771 link_with : [libshared],
2772 install_rpath : rootlibexecdir,
2774 install_dir : rootlibexecdir)
2778 'src/sleep/sleep.c',
2779 include_directories : includes,
2780 link_with : [libshared],
2781 install_rpath : rootlibexecdir,
2783 install_dir : rootlibexecdir)
2785 install_data('src/sleep/sleep.conf',
2786 install_dir : pkgsysconfdir)
2788 public_programs += executable(
2790 'src/sysctl/sysctl.c',
2791 include_directories : includes,
2792 link_with : [libshared],
2793 install_rpath : rootlibexecdir,
2795 install_dir : rootlibexecdir)
2799 'src/ac-power/ac-power.c',
2800 include_directories : includes,
2801 link_with : [libshared],
2802 install_rpath : rootlibexecdir,
2804 install_dir : rootlibexecdir)
2806 public_programs += executable(
2807 'systemd-detect-virt',
2808 'src/detect-virt/detect-virt.c',
2809 include_directories : includes,
2810 link_with : [libshared],
2811 install_rpath : rootlibexecdir,
2814 public_programs += executable(
2816 'src/delta/delta.c',
2817 include_directories : includes,
2818 link_with : [libshared],
2819 install_rpath : rootlibexecdir,
2822 public_programs += executable(
2824 'src/escape/escape.c',
2825 include_directories : includes,
2826 link_with : [libshared],
2827 install_rpath : rootlibexecdir,
2829 install_dir : rootbindir)
2831 public_programs += executable(
2833 'src/notify/notify.c',
2834 include_directories : includes,
2835 link_with : [libshared],
2836 install_rpath : rootlibexecdir,
2838 install_dir : rootbindir)
2841 'systemd-volatile-root',
2842 'src/volatile-root/volatile-root.c',
2843 include_directories : includes,
2844 link_with : [libshared],
2845 install_rpath : rootlibexecdir,
2846 install : conf.get('ENABLE_INITRD') == 1,
2847 install_dir : rootlibexecdir)
2850 'systemd-cgroups-agent',
2851 'src/cgroups-agent/cgroups-agent.c',
2852 include_directories : includes,
2853 link_with : [libshared],
2854 install_rpath : rootlibexecdir,
2856 install_dir : rootlibexecdir)
2858 public_programs += executable(
2860 'src/id128/id128.c',
2861 include_directories : includes,
2862 link_with : [libshared],
2863 install_rpath : rootlibexecdir,
2866 public_programs += executable(
2869 include_directories : includes,
2870 link_with : [libshared],
2871 install_rpath : rootlibexecdir,
2874 public_programs += executable(
2875 'systemd-ask-password',
2876 'src/ask-password/ask-password.c',
2877 include_directories : includes,
2878 link_with : [libshared],
2879 install_rpath : rootlibexecdir,
2881 install_dir : rootbindir)
2884 'systemd-reply-password',
2885 'src/reply-password/reply-password.c',
2886 include_directories : includes,
2887 link_with : [libshared],
2888 install_rpath : rootlibexecdir,
2890 install_dir : rootlibexecdir)
2892 public_programs += executable(
2893 'systemd-tty-ask-password-agent',
2894 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2895 include_directories : includes,
2896 link_with : [libshared],
2897 install_rpath : rootlibexecdir,
2899 install_dir : rootbindir)
2901 public_programs += executable(
2904 include_directories : includes,
2905 link_with : [libshared],
2906 install_rpath : rootlibexecdir,
2909 public_programs += executable(
2911 'src/cgtop/cgtop.c',
2912 include_directories : includes,
2913 link_with : [libshared],
2914 install_rpath : rootlibexecdir,
2919 'src/initctl/initctl.c',
2920 include_directories : includes,
2921 link_with : [libshared],
2922 install_rpath : rootlibexecdir,
2923 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
2924 install_dir : rootlibexecdir)
2926 public_programs += executable(
2928 'src/mount/mount-tool.c',
2929 include_directories : includes,
2930 link_with : [libshared],
2931 dependencies: [libmount],
2932 install_rpath : rootlibexecdir,
2935 meson.add_install_script(meson_make_symlink,
2936 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2938 public_programs += executable(
2941 include_directories : includes,
2942 link_with : [libshared],
2943 install_rpath : rootlibexecdir,
2946 public_programs += executable(
2947 'systemd-stdio-bridge',
2948 'src/stdio-bridge/stdio-bridge.c',
2949 include_directories : includes,
2950 link_with : [libshared],
2951 dependencies : [versiondep],
2952 install_rpath : rootlibexecdir,
2955 public_programs += executable(
2957 'src/busctl/busctl.c',
2958 'src/busctl/busctl-introspect.c',
2959 'src/busctl/busctl-introspect.h',
2960 include_directories : includes,
2961 link_with : [libshared],
2962 install_rpath : rootlibexecdir,
2965 if conf.get('ENABLE_SYSUSERS') == 1
2966 public_programs += executable(
2968 'src/sysusers/sysusers.c',
2969 include_directories : includes,
2970 link_with : [libshared],
2971 install_rpath : rootlibexecdir,
2973 install_dir : rootbindir)
2975 if have_standalone_binaries
2976 public_programs += executable(
2977 'systemd-sysusers.standalone',
2978 'src/sysusers/sysusers.c',
2979 include_directories : includes,
2980 link_with : [libshared_static,
2986 install_dir : rootbindir)
2990 if conf.get('ENABLE_TMPFILES') == 1
2993 systemd_tmpfiles_sources,
2994 include_directories : includes,
2995 link_with : [libshared],
2996 dependencies : [libacl],
2997 install_rpath : rootlibexecdir,
2999 install_dir : rootbindir)
3000 public_programs += exe
3002 if want_tests != 'false'
3003 test('test-systemd-tmpfiles',
3004 test_systemd_tmpfiles_py,
3005 # https://github.com/mesonbuild/meson/issues/2681
3006 args : exe.full_path())
3009 if have_standalone_binaries
3010 public_programs += executable(
3011 'systemd-tmpfiles.standalone',
3012 systemd_tmpfiles_sources,
3013 include_directories : includes,
3014 link_with : [libshared_static,
3019 dependencies : [libacl],
3021 install_dir : rootbindir)
3025 if conf.get('ENABLE_HWDB') == 1
3026 public_programs += executable(
3029 'src/libsystemd/sd-hwdb/hwdb-internal.h',
3030 include_directories : includes,
3031 link_with : [libudev_static],
3032 install_rpath : udev_rpath,
3034 install_dir : rootbindir)
3037 if conf.get('ENABLE_QUOTACHECK') == 1
3039 'systemd-quotacheck',
3040 'src/quotacheck/quotacheck.c',
3041 include_directories : includes,
3042 link_with : [libshared],
3043 install_rpath : rootlibexecdir,
3045 install_dir : rootlibexecdir)
3048 public_programs += executable(
3049 'systemd-socket-proxyd',
3050 'src/socket-proxy/socket-proxyd.c',
3051 include_directories : includes,
3052 link_with : [libshared],
3053 dependencies : [threads],
3054 install_rpath : rootlibexecdir,
3056 install_dir : rootlibexecdir)
3058 public_programs += executable(
3061 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
3062 include_directories : includes,
3063 link_with : [libudev_core,
3066 dependencies : [versiondep,
3072 install_rpath : udev_rpath,
3074 install_dir : rootbindir)
3078 systemd_shutdown_sources,
3079 include_directories : includes,
3080 link_with : [libcore_shared,
3082 dependencies : [libmount],
3083 install_rpath : rootlibexecdir,
3085 install_dir : rootlibexecdir)
3088 'systemd-update-done',
3089 'src/update-done/update-done.c',
3090 include_directories : includes,
3091 link_with : [libshared],
3092 install_rpath : rootlibexecdir,
3094 install_dir : rootlibexecdir)
3097 'systemd-update-utmp',
3098 'src/update-utmp/update-utmp.c',
3099 include_directories : includes,
3100 link_with : [libshared],
3101 dependencies : [libaudit],
3102 install_rpath : rootlibexecdir,
3103 install : (conf.get('ENABLE_UTMP') == 1),
3104 install_dir : rootlibexecdir)
3106 if conf.get('HAVE_KMOD') == 1
3108 'systemd-modules-load',
3109 'src/modules-load/modules-load.c',
3110 include_directories : includes,
3111 link_with : [libshared],
3112 dependencies : [libkmod],
3113 install_rpath : rootlibexecdir,
3115 install_dir : rootlibexecdir)
3117 meson.add_install_script('sh', '-c',
3118 mkdir_p.format(modulesloaddir))
3119 meson.add_install_script('sh', '-c',
3120 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
3123 public_programs += executable(
3125 systemd_nspawn_sources,
3126 include_directories : includes,
3127 link_with : [libcore_shared,
3130 dependencies : [libblkid,
3132 install_rpath : rootlibexecdir,
3135 if conf.get('ENABLE_NETWORKD') == 1
3138 systemd_networkd_sources,
3139 include_directories : network_include_dir,
3140 link_with : [libnetworkd_core,
3143 networkd_link_with],
3144 dependencies : [threads],
3145 install_rpath : rootlibexecdir,
3147 install_dir : rootlibexecdir)
3150 'systemd-networkd-wait-online',
3151 systemd_networkd_wait_online_sources,
3152 include_directories : includes,
3153 link_with : [libnetworkd_core,
3154 networkd_link_with],
3155 install_rpath : rootlibexecdir,
3157 install_dir : rootlibexecdir)
3159 public_programs += executable(
3162 include_directories : includes,
3163 link_with : [libsystemd_network,
3164 networkd_link_with],
3165 install_rpath : rootlibexecdir,
3167 install_dir : rootbindir)
3170 'systemd-network-generator',
3171 network_generator_sources,
3172 include_directories : includes,
3173 link_with : [networkd_link_with],
3174 install_rpath : rootlibexecdir,
3176 install_dir : rootlibexecdir)
3178 if want_tests != 'false'
3179 test('test-network-generator-conversion',
3180 test_network_generator_conversion_sh,
3181 # https://github.com/mesonbuild/meson/issues/2681
3182 args : exe.full_path())
3187 'systemd-sulogin-shell',
3188 ['src/sulogin-shell/sulogin-shell.c'],
3189 include_directories : includes,
3190 link_with : [libshared],
3191 install_rpath : rootlibexecdir,
3193 install_dir : rootlibexecdir)
3195 ############################################################
3198 'systemd-runtest.env',
3199 output : 'systemd-runtest.env',
3200 command : ['sh', '-c', '{ ' +
3201 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
3202 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
3204 build_by_default : true)
3206 foreach tuple : tests
3208 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3209 dependencies = tuple[2]
3210 condition = tuple.length() >= 4 ? tuple[3] : ''
3211 type = tuple.length() >= 5 ? tuple[4] : ''
3212 defs = tuple.length() >= 6 ? tuple[5] : []
3213 incs = tuple.length() >= 7 ? tuple[6] : includes
3216 name = sources[0].split('/')[-1].split('.')[0]
3217 if type.startswith('timeout=')
3218 timeout = type.split('=')[1].to_int()
3222 if condition == '' or conf.get(condition) == 1
3226 include_directories : incs,
3227 link_with : link_with,
3228 dependencies : [versiondep,
3231 build_by_default : want_tests != 'false',
3232 install_rpath : rootlibexecdir,
3233 install : install_tests,
3234 install_dir : join_paths(testsdir, type))
3237 message('@0@ is a manual test'.format(name))
3238 elif type == 'unsafe' and want_tests != 'unsafe'
3239 message('@0@ is an unsafe test'.format(name))
3240 elif want_tests != 'false'
3246 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3251 'test-libsystemd-sym',
3252 test_libsystemd_sym_c,
3253 include_directories : includes,
3254 link_with : [libsystemd],
3255 build_by_default : want_tests != 'false',
3256 install : install_tests,
3257 install_dir : testsdir)
3258 if want_tests != 'false'
3259 test('test-libsystemd-sym', exe)
3263 'test-libsystemd-static-sym',
3264 test_libsystemd_sym_c,
3265 include_directories : includes,
3266 link_with : [install_libsystemd_static],
3267 dependencies : [threads], # threads is already included in dependencies on the library,
3268 # but does not seem to get propagated. Add here as a work-around.
3269 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3270 install : install_tests and static_libsystemd_pic,
3271 install_dir : testsdir)
3272 if want_tests != 'false' and static_libsystemd_pic
3273 test('test-libsystemd-static-sym', exe)
3279 include_directories : includes,
3280 c_args : '-Wno-deprecated-declarations',
3281 link_with : [libudev],
3282 build_by_default : want_tests != 'false',
3283 install : install_tests,
3284 install_dir : testsdir)
3285 if want_tests != 'false'
3286 test('test-libudev-sym', exe)
3290 'test-libudev-static-sym',
3292 include_directories : includes,
3293 c_args : '-Wno-deprecated-declarations',
3294 link_with : [install_libudev_static],
3295 build_by_default : want_tests != 'false' and static_libudev_pic,
3296 install : install_tests and static_libudev_pic,
3297 install_dir : testsdir)
3298 if want_tests != 'false' and static_libudev_pic
3299 test('test-libudev-static-sym', exe)
3302 ############################################################
3306 if get_option('tests') != 'false'
3307 foreach tuple : fuzzers
3309 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3310 dependencies = tuple[2]
3311 defs = tuple.length() >= 4 ? tuple[3] : []
3312 incs = tuple.length() >= 5 ? tuple[4] : includes
3316 dependencies += fuzzing_engine
3318 if fuzzing_engine.found()
3319 dependencies += fuzzing_engine
3321 link_args += ['-fsanitize=fuzzer']
3324 sources += 'src/fuzz/fuzz-main.c'
3327 name = sources[0].split('/')[-1].split('.')[0]
3329 fuzzer_exes += executable(
3332 include_directories : [incs, include_directories('src/fuzz')],
3333 link_with : link_with,
3334 dependencies : dependencies,
3336 link_args: link_args,
3343 depends : fuzzer_exes,
3346 ############################################################
3349 subdir('sysusers.d')
3350 subdir('tmpfiles.d')
3356 subdir('shell-completion/bash')
3357 subdir('shell-completion/zsh')
3358 subdir('docs/sysvinit')
3359 subdir('docs/var-log')
3361 install_subdir('factory/etc',
3362 install_dir : factorydir)
3364 install_data('xorg/50-systemd-user.sh',
3365 install_dir : xinitrcdir)
3366 install_data('modprobe.d/systemd.conf',
3367 install_dir : modprobedir)
3368 install_data('LICENSE.GPL2',
3372 'docs/CODING_STYLE.md',
3373 'docs/DISTRO_PORTING.md',
3374 'docs/ENVIRONMENT.md',
3376 'docs/TRANSIENT-SETTINGS.md',
3377 'docs/TRANSLATORS.md',
3378 'docs/UIDS-GIDS.md',
3379 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3380 install_dir : docdir)
3382 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3383 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3385 ############################################################
3387 check_help = find_program('tools/check-help.sh')
3389 foreach exec : public_programs
3390 name = exec.full_path().split('/')[-1]
3391 if want_tests != 'false'
3392 test('check-help-' + name,
3394 args : exec.full_path())
3398 ############################################################
3400 check_directives_sh = find_program('tools/check-directives.sh')
3402 if want_tests != 'false'
3403 test('check-directives',
3404 check_directives_sh,
3405 args : project_source_root)
3408 ############################################################
3410 # Enable tests for all supported sanitizers
3411 foreach tuple : sanitizers
3412 sanitizer = tuple[0]
3415 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3417 foreach p : fuzz_regression_tests
3418 b = p.split('/')[-2]
3419 c = p.split('/')[-1]
3421 name = '@0@:@1@'.format(b, sanitizer)
3424 if want_tests == 'false'
3425 message('Not compiling @0@ because tests is set to false'.format(name))
3426 elif slow_tests or fuzz_tests
3427 exe = custom_target(
3431 command : [env, 'ln', '-fs',
3432 join_paths(build.full_path(), b),
3434 build_by_default : true)
3436 message('Not compiling @0@ because slow-tests/fuzz-tests is set to false'.format(name))
3441 if want_tests != 'false' and (slow_tests or fuzz_tests)
3442 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3444 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
3446 args : [exe.full_path(),
3447 join_paths(project_source_root, p)])
3454 ############################################################
3457 all_files = run_command(
3459 ['--git-dir=@0@/.git'.format(project_source_root),
3462 all_files = files(all_files.stdout().split())
3467 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3470 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3474 git_contrib_sh = find_program('tools/git-contrib.sh')
3477 command : [git_contrib_sh])
3481 git_head = run_command(
3483 ['--git-dir=@0@/.git'.format(project_source_root),
3484 'rev-parse', 'HEAD']).stdout().strip()
3485 git_head_short = run_command(
3487 ['--git-dir=@0@/.git'.format(project_source_root),
3488 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3492 command : ['git', 'archive',
3493 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3495 '--prefix', 'systemd-@0@/'.format(git_head),
3499 ############################################################
3501 check_api_docs_sh = find_program('tools/check-api-docs.sh')
3504 depends : [man, libsystemd, libudev],
3505 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3507 ############################################################
3508 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3511 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3513 'build mode: @0@'.format(get_option('mode')),
3514 'split /usr: @0@'.format(split_usr),
3515 'split bin-sbin: @0@'.format(split_bin),
3516 'prefix directory: @0@'.format(prefixdir),
3517 'rootprefix directory: @0@'.format(rootprefixdir),
3518 'sysconf directory: @0@'.format(sysconfdir),
3519 'include directory: @0@'.format(includedir),
3520 'lib directory: @0@'.format(libdir),
3521 'rootlib directory: @0@'.format(rootlibdir),
3522 'SysV init scripts: @0@'.format(sysvinit_path),
3523 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3524 'PAM modules directory: @0@'.format(pamlibdir),
3525 'PAM configuration directory: @0@'.format(pamconfdir),
3526 'RPM macros directory: @0@'.format(rpmmacrosdir),
3527 'modprobe.d directory: @0@'.format(modprobedir),
3528 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3529 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3530 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3531 'bash completions directory: @0@'.format(bashcompletiondir),
3532 'zsh completions directory: @0@'.format(zshcompletiondir),
3533 'extra start script: @0@'.format(get_option('rc-local')),
3534 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3535 get_option('debug-tty')),
3536 'TTY GID: @0@'.format(tty_gid),
3537 'users GID: @0@'.format(substs.get('USERS_GID')),
3538 'system UIDs: <=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_UID_MAX'),
3539 conf.get('SYSTEM_ALLOC_UID_MIN')),
3540 'system GIDs: <=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_GID_MAX'),
3541 conf.get('SYSTEM_ALLOC_GID_MIN')),
3542 'dynamic UIDs: @0@–@1@'.format(dynamic_uid_min, dynamic_uid_max),
3543 'container UID bases: @0@–@1@'.format(container_uid_base_min, container_uid_base_max),
3544 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3545 'render group access mode: @0@'.format(get_option('group-render-mode')),
3546 'certificate root directory: @0@'.format(get_option('certificate-root')),
3547 'support URL: @0@'.format(support_url),
3548 'nobody user name: @0@'.format(nobody_user),
3549 'nobody group name: @0@'.format(nobody_group),
3550 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3551 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3553 'default DNSSEC mode: @0@'.format(default_dnssec),
3554 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3555 'default mDNS mode: @0@'.format(default_mdns),
3556 'default LLMNR mode: @0@'.format(default_llmnr),
3557 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3558 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3559 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3560 'default locale: @0@'.format(default_locale),
3561 'default user $PATH: @0@'.format(default_user_path_display),
3562 'systemd service watchdog: @0@'.format(watchdog_opt)]
3564 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3565 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3567 'default DNS servers: @0@'.format(alt_dns_servers),
3568 'default NTP servers: @0@'.format(alt_ntp_servers)]
3570 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3571 '@@0@'.format(time_epoch)).stdout().strip()
3573 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3576 'static libsystemd: @0@'.format(static_libsystemd),
3577 'static libudev: @0@'.format(static_libudev)]
3580 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3581 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3582 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3584 if conf.get('ENABLE_EFI') == 1
3585 status += 'efi arch: @0@'.format(efi_arch)
3589 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3590 'EFI CC @0@'.format(' '.join(efi_cc)),
3591 'EFI lds: @0@'.format(efi_lds),
3592 'EFI crt0: @0@'.format(efi_crt0),
3593 'EFI include directory: @0@'.format(efi_incdir)]
3627 ['compat-mutable-uid-boundaries'],
3656 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3657 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3661 ['legacy pkla', install_polkit_pkla],
3663 ['gnu-efi', have_gnu_efi],
3676 ['man pages', want_man],
3677 ['html pages', want_html],
3678 ['man page indices', want_man and have_lxml],
3683 ['adm group', get_option('adm-group')],
3684 ['wheel group', get_option('wheel-group')],
3687 ['debug mmap cache'],
3689 ['valgrind', conf.get('VALGRIND') == 1],
3690 ['trace logging', conf.get('LOG_TRACE') == 1],
3691 ['install tests', install_tests],
3692 ['link-udev-shared', get_option('link-udev-shared')],
3693 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3694 ['link-networkd-shared', get_option('link-networkd-shared')],
3695 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3696 ['kernel-install', get_option('kernel-install')],
3697 ['systemd-analyze', conf.get('ENABLE_ANALYZE') == 1],
3700 if tuple.length() >= 2
3703 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3704 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3705 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3716 'enabled features: @0@'.format(', '.join(found)),
3718 'disabled features: @0@'.format(', '.join(missing)),
3720 message('\n '.join(status))
3722 if rootprefixdir != rootprefix_default
3724 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3725 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3726 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))