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 system_uid_max = get_option('system-uid-max')
698 if system_uid_max == -1
699 system_uid_max = run_command(
701 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
702 '/etc/login.defs').stdout().strip()
703 if system_uid_max == ''
706 system_uid_max = system_uid_max.to_int()
709 conf.set('SYSTEM_UID_MAX', system_uid_max)
710 substs.set('systemuidmax', system_uid_max)
712 system_gid_max = get_option('system-gid-max')
713 if system_gid_max == -1
714 system_gid_max = run_command(
716 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
717 '/etc/login.defs').stdout().strip()
718 if system_gid_max == ''
721 system_gid_max = system_gid_max.to_int()
724 conf.set('SYSTEM_GID_MAX', system_gid_max)
725 substs.set('systemgidmax', system_gid_max)
727 dynamic_uid_min = get_option('dynamic-uid-min')
728 dynamic_uid_max = get_option('dynamic-uid-max')
729 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
730 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
731 substs.set('dynamicuidmin', dynamic_uid_min)
732 substs.set('dynamicuidmax', dynamic_uid_max)
734 container_uid_base_min = get_option('container-uid-base-min')
735 container_uid_base_max = get_option('container-uid-base-max')
736 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
737 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
738 substs.set('containeruidbasemin', container_uid_base_min)
739 substs.set('containeruidbasemax', container_uid_base_max)
741 nobody_user = get_option('nobody-user')
742 nobody_group = get_option('nobody-group')
744 if not meson.is_cross_build()
745 getent_result = run_command('getent', 'passwd', '65534')
746 if getent_result.returncode() == 0
747 name = getent_result.stdout().split(':')[0]
748 if name != nobody_user
750 '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) +
751 'Your build will result in an user table setup that is incompatible with the local system.')
754 id_result = run_command('id', '-u', nobody_user)
755 if id_result.returncode() == 0
756 id = id_result.stdout().to_int()
759 '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) +
760 'Your build will result in an user table setup that is incompatible with the local system.')
764 getent_result = run_command('getent', 'group', '65534')
765 if getent_result.returncode() == 0
766 name = getent_result.stdout().split(':')[0]
767 if name != nobody_group
769 '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) +
770 'Your build will result in an group table setup that is incompatible with the local system.')
773 id_result = run_command('id', '-g', nobody_group)
774 if id_result.returncode() == 0
775 id = id_result.stdout().to_int()
778 '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) +
779 'Your build will result in an group table setup that is incompatible with the local system.')
783 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
785 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
786 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
789 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
790 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
791 substs.set('NOBODY_USER_NAME', nobody_user)
792 substs.set('NOBODY_GROUP_NAME', nobody_group)
794 tty_gid = get_option('tty-gid')
795 conf.set('TTY_GID', tty_gid)
796 substs.set('TTY_GID', tty_gid)
798 # Ensure provided GID argument is numeric, otherwise fall back to default assignment
799 users_gid = get_option('users-gid')
800 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
802 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
803 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
805 dev_kvm_mode = get_option('dev-kvm-mode')
806 substs.set('DEV_KVM_MODE', dev_kvm_mode)
807 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
808 group_render_mode = get_option('group-render-mode')
809 substs.set('GROUP_RENDER_MODE', group_render_mode)
810 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
812 kill_user_processes = get_option('default-kill-user-processes')
813 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
814 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
815 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
817 dns_servers = get_option('dns-servers')
818 conf.set_quoted('DNS_SERVERS', dns_servers)
819 substs.set('DNS_SERVERS', dns_servers)
821 ntp_servers = get_option('ntp-servers')
822 conf.set_quoted('NTP_SERVERS', ntp_servers)
823 substs.set('NTP_SERVERS', ntp_servers)
825 default_locale = get_option('default-locale')
826 if default_locale == ''
827 if not meson.is_cross_build()
828 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
829 default_locale = run_command(choose_default_locale_sh).stdout().strip()
831 default_locale = 'C.UTF-8'
834 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
836 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
838 service_watchdog = get_option('service-watchdog')
839 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
840 substs.set('SERVICE_WATCHDOG', watchdog_value)
842 substs.set('SUSHELL', get_option('debug-shell'))
843 substs.set('DEBUGTTY', get_option('debug-tty'))
844 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
846 enable_debug_hashmap = false
847 enable_debug_mmap_cache = false
848 enable_debug_siphash = false
849 foreach name : get_option('debug-extra')
851 enable_debug_hashmap = true
852 elif name == 'mmap-cache'
853 enable_debug_mmap_cache = true
854 elif name == 'siphash'
855 enable_debug_siphash = true
857 message('unknown debug option "@0@", ignoring'.format(name))
860 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
861 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
862 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
864 conf.set10('VALGRIND', get_option('valgrind'))
865 conf.set10('LOG_TRACE', get_option('log-trace'))
867 default_user_path = get_option('user-path')
868 if default_user_path != ''
869 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
870 default_user_path_display = default_user_path
872 # meson 0.49 fails when ?: is used in .format()
873 default_user_path_display = '(same as system services)'
877 #####################################################################
879 threads = dependency('threads')
880 librt = cc.find_library('rt')
881 libm = cc.find_library('m')
882 libdl = cc.find_library('dl')
883 libcrypt = cc.find_library('crypt')
885 crypt_header = conf.get('HAVE_CRYPT_H') == 1 ? '''#include <crypt.h>''' : '''#include <unistd.h>'''
887 ['crypt_ra', crypt_header],
888 ['crypt_gensalt_ra', crypt_header]]
890 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE',
891 dependencies : libcrypt)
892 conf.set10('HAVE_' + ident[0].to_upper(), have)
895 libcap = dependency('libcap', required : false)
896 if not libcap.found()
897 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
898 libcap = cc.find_library('cap')
901 libmount = dependency('mount',
902 version : fuzzer_build ? '>= 0' : '>= 2.30')
904 want_libfdisk = get_option('fdisk')
905 if want_libfdisk != 'false' and not skip_deps
906 libfdisk = dependency('fdisk',
908 required : want_libfdisk == 'true')
909 have = libfdisk.found()
914 conf.set10('HAVE_LIBFDISK', have)
916 want_pwquality = get_option('pwquality')
917 if want_pwquality != 'false' and not skip_deps
918 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
919 have = libpwquality.found()
924 conf.set10('HAVE_PWQUALITY', have)
926 want_seccomp = get_option('seccomp')
927 if want_seccomp != 'false' and not skip_deps
928 libseccomp = dependency('libseccomp',
929 version : '>= 2.3.1',
930 required : want_seccomp == 'true')
931 have = libseccomp.found()
936 conf.set10('HAVE_SECCOMP', have)
938 want_selinux = get_option('selinux')
939 if want_selinux != 'false' and not skip_deps
940 libselinux = dependency('libselinux',
941 version : '>= 2.1.9',
942 required : want_selinux == 'true')
943 have = libselinux.found()
948 conf.set10('HAVE_SELINUX', have)
950 want_apparmor = get_option('apparmor')
951 if want_apparmor != 'false' and not skip_deps
952 libapparmor = dependency('libapparmor',
954 required : want_apparmor == 'true')
955 have = libapparmor.found()
960 conf.set10('HAVE_APPARMOR', have)
962 smack_run_label = get_option('smack-run-label')
963 if smack_run_label != ''
964 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
967 want_polkit = get_option('polkit')
968 install_polkit = false
969 install_polkit_pkla = false
970 if want_polkit != 'false' and not skip_deps
971 install_polkit = true
973 libpolkit = dependency('polkit-gobject-1',
975 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
976 message('Old polkit detected, will install pkla files')
977 install_polkit_pkla = true
980 conf.set10('ENABLE_POLKIT', install_polkit)
982 want_acl = get_option('acl')
983 if want_acl != 'false' and not skip_deps
984 libacl = cc.find_library('acl', required : want_acl == 'true')
985 have = libacl.found()
990 conf.set10('HAVE_ACL', have)
992 want_audit = get_option('audit')
993 if want_audit != 'false' and not skip_deps
994 libaudit = dependency('audit', required : want_audit == 'true')
995 have = libaudit.found()
1000 conf.set10('HAVE_AUDIT', have)
1002 want_blkid = get_option('blkid')
1003 if want_blkid != 'false' and not skip_deps
1004 libblkid = dependency('blkid', required : want_blkid == 'true')
1005 have = libblkid.found()
1010 conf.set10('HAVE_BLKID', have)
1012 want_kmod = get_option('kmod')
1013 if want_kmod != 'false' and not skip_deps
1014 libkmod = dependency('libkmod',
1016 required : want_kmod == 'true')
1017 have = libkmod.found()
1022 conf.set10('HAVE_KMOD', have)
1024 want_pam = get_option('pam')
1025 if want_pam != 'false' and not skip_deps
1026 libpam = cc.find_library('pam', required : want_pam == 'true')
1027 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
1028 have = libpam.found() and libpam_misc.found()
1034 conf.set10('HAVE_PAM', have)
1036 want_microhttpd = get_option('microhttpd')
1037 if want_microhttpd != 'false' and not skip_deps
1038 libmicrohttpd = dependency('libmicrohttpd',
1039 version : '>= 0.9.33',
1040 required : want_microhttpd == 'true')
1041 have = libmicrohttpd.found()
1046 conf.set10('HAVE_MICROHTTPD', have)
1048 want_libcryptsetup = get_option('libcryptsetup')
1049 if want_libcryptsetup != 'false' and not skip_deps
1050 libcryptsetup = dependency('libcryptsetup',
1051 version : '>= 2.0.1',
1052 required : want_libcryptsetup == 'true')
1053 have = libcryptsetup.found()
1055 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1056 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
1057 conf.set10('HAVE_CRYPT_ACTIVATE_BY_SIGNED_KEY',
1058 have and cc.has_function('crypt_activate_by_signed_key', dependencies : libcryptsetup))
1063 conf.set10('HAVE_LIBCRYPTSETUP', have)
1065 want_libcurl = get_option('libcurl')
1066 if want_libcurl != 'false' and not skip_deps
1067 libcurl = dependency('libcurl',
1068 version : '>= 7.32.0',
1069 required : want_libcurl == 'true')
1070 have = libcurl.found()
1075 conf.set10('HAVE_LIBCURL', have)
1077 want_libidn = get_option('libidn')
1078 want_libidn2 = get_option('libidn2')
1079 if want_libidn == 'true' and want_libidn2 == 'true'
1080 error('libidn and libidn2 cannot be requested simultaneously')
1083 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1084 libidn = dependency('libidn2',
1085 required : want_libidn2 == 'true')
1086 have = libidn.found()
1091 conf.set10('HAVE_LIBIDN2', have)
1092 if not have and want_libidn != 'false' and not skip_deps
1093 # libidn is used for both libidn and libidn2 objects
1094 libidn = dependency('libidn',
1095 required : want_libidn == 'true')
1096 have = libidn.found()
1100 conf.set10('HAVE_LIBIDN', have)
1102 want_libiptc = get_option('libiptc')
1103 if want_libiptc != 'false' and not skip_deps
1104 libiptc = dependency('libiptc',
1105 required : want_libiptc == 'true')
1106 have = libiptc.found()
1111 conf.set10('HAVE_LIBIPTC', have)
1113 want_qrencode = get_option('qrencode')
1114 if want_qrencode != 'false' and not skip_deps
1115 libqrencode = dependency('libqrencode',
1116 required : want_qrencode == 'true')
1117 have = libqrencode.found()
1122 conf.set10('HAVE_QRENCODE', have)
1124 want_gcrypt = get_option('gcrypt')
1125 if want_gcrypt != 'false' and not skip_deps
1126 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1127 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1128 have = libgcrypt.found() and libgpg_error.found()
1133 # link to neither of the libs if one is not found
1137 conf.set10('HAVE_GCRYPT', have)
1139 want_gnutls = get_option('gnutls')
1140 if want_gnutls != 'false' and not skip_deps
1141 libgnutls = dependency('gnutls',
1142 version : '>= 3.1.4',
1143 required : want_gnutls == 'true')
1144 have = libgnutls.found()
1149 conf.set10('HAVE_GNUTLS', have)
1151 want_openssl = get_option('openssl')
1152 if want_openssl != 'false' and not skip_deps
1153 libopenssl = dependency('openssl',
1154 version : '>= 1.1.0',
1155 required : want_openssl == 'true')
1156 have = libopenssl.found()
1161 conf.set10('HAVE_OPENSSL', have)
1163 want_p11kit = get_option('p11kit')
1164 if want_p11kit != 'false' and not skip_deps
1165 libp11kit = dependency('p11-kit-1',
1166 version : '>= 0.23.3',
1167 required : want_p11kit == 'true')
1168 have = libp11kit.found()
1173 conf.set10('HAVE_P11KIT', have)
1175 want_libfido2 = get_option('libfido2')
1176 if want_libfido2 != 'false' and not skip_deps
1177 libfido2 = dependency('libfido2',
1178 required : want_libfido2 == 'true')
1179 have = libfido2.found()
1184 conf.set10('HAVE_LIBFIDO2', have)
1186 want_elfutils = get_option('elfutils')
1187 if want_elfutils != 'false' and not skip_deps
1188 libdw = dependency('libdw',
1189 required : want_elfutils == 'true')
1190 have = libdw.found()
1195 conf.set10('HAVE_ELFUTILS', have)
1197 want_zlib = get_option('zlib')
1198 if want_zlib != 'false' and not skip_deps
1199 libz = dependency('zlib',
1200 required : want_zlib == 'true')
1206 conf.set10('HAVE_ZLIB', have)
1208 want_bzip2 = get_option('bzip2')
1209 if want_bzip2 != 'false' and not skip_deps
1210 libbzip2 = cc.find_library('bz2',
1211 required : want_bzip2 == 'true')
1212 have = libbzip2.found()
1217 conf.set10('HAVE_BZIP2', have)
1219 want_xz = get_option('xz')
1220 if want_xz != 'false' and not skip_deps
1221 libxz = dependency('liblzma',
1222 required : want_xz == 'true')
1223 have_xz = libxz.found()
1228 conf.set10('HAVE_XZ', have_xz)
1230 want_lz4 = get_option('lz4')
1231 if want_lz4 != 'false' and not skip_deps
1232 liblz4 = dependency('liblz4',
1233 version : '>= 1.3.0',
1234 required : want_lz4 == 'true')
1235 have_lz4 = liblz4.found()
1240 conf.set10('HAVE_LZ4', have_lz4)
1242 want_zstd = get_option('zstd')
1243 if want_zstd != 'false' and not skip_deps
1244 libzstd = dependency('libzstd',
1245 required : want_zstd == 'true',
1246 version : '>= 1.4.0')
1247 have_zstd = libzstd.found()
1252 conf.set10('HAVE_ZSTD', have_zstd)
1254 conf.set10('HAVE_COMPRESSION', have_xz or have_lz4 or have_zstd)
1256 want_xkbcommon = get_option('xkbcommon')
1257 if want_xkbcommon != 'false' and not skip_deps
1258 libxkbcommon = dependency('xkbcommon',
1259 version : '>= 0.3.0',
1260 required : want_xkbcommon == 'true')
1261 have = libxkbcommon.found()
1266 conf.set10('HAVE_XKBCOMMON', have)
1268 want_pcre2 = get_option('pcre2')
1269 if want_pcre2 != 'false'
1270 libpcre2 = dependency('libpcre2-8',
1271 required : want_pcre2 == 'true')
1272 have = libpcre2.found()
1277 conf.set10('HAVE_PCRE2', have)
1279 want_glib = get_option('glib')
1280 if want_glib != 'false' and not skip_deps
1281 libglib = dependency('glib-2.0',
1282 version : '>= 2.22.0',
1283 required : want_glib == 'true')
1284 libgobject = dependency('gobject-2.0',
1285 version : '>= 2.22.0',
1286 required : want_glib == 'true')
1287 libgio = dependency('gio-2.0',
1288 required : want_glib == 'true')
1289 have = libglib.found() and libgobject.found() and libgio.found()
1296 conf.set10('HAVE_GLIB', have)
1298 want_dbus = get_option('dbus')
1299 if want_dbus != 'false' and not skip_deps
1300 libdbus = dependency('dbus-1',
1301 version : '>= 1.3.2',
1302 required : want_dbus == 'true')
1303 have = libdbus.found()
1308 conf.set10('HAVE_DBUS', have)
1310 default_dnssec = get_option('default-dnssec')
1312 default_dnssec = 'no'
1314 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1315 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1316 default_dnssec = 'no'
1318 conf.set('DEFAULT_DNSSEC_MODE',
1319 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1320 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1322 dns_over_tls = get_option('dns-over-tls')
1323 if dns_over_tls != 'false'
1324 if dns_over_tls == 'openssl'
1327 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1328 if dns_over_tls == 'gnutls' and not have_gnutls
1329 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1332 if dns_over_tls == 'gnutls' or have_gnutls
1333 have_openssl = false
1335 have_openssl = conf.get('HAVE_OPENSSL') == 1
1336 if dns_over_tls != 'auto' and not have_openssl
1337 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1338 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1341 have = have_gnutls or have_openssl
1345 have_openssl = false
1347 conf.set10('ENABLE_DNS_OVER_TLS', have)
1348 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1349 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1351 default_dns_over_tls = get_option('default-dns-over-tls')
1353 default_dns_over_tls = 'no'
1355 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1356 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.')
1357 default_dns_over_tls = 'no'
1359 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1360 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1361 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1363 default_mdns = get_option('default-mdns')
1364 conf.set('DEFAULT_MDNS_MODE',
1365 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
1366 substs.set('DEFAULT_MDNS_MODE', default_mdns)
1368 default_llmnr = get_option('default-llmnr')
1369 conf.set('DEFAULT_LLMNR_MODE',
1370 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
1371 substs.set('DEFAULT_LLMNR_MODE', default_llmnr)
1373 want_repart = get_option('repart')
1374 if want_repart != 'false'
1375 have = (conf.get('HAVE_OPENSSL') == 1 and
1376 conf.get('HAVE_LIBFDISK') == 1)
1377 if want_repart == 'true' and not have
1378 error('repart support was requested, but dependencies are not available')
1383 conf.set10('ENABLE_REPART', have)
1385 want_importd = get_option('importd')
1386 if want_importd != 'false'
1387 have = (conf.get('HAVE_LIBCURL') == 1 and
1388 conf.get('HAVE_ZLIB') == 1 and
1389 conf.get('HAVE_XZ') == 1 and
1390 conf.get('HAVE_GCRYPT') == 1)
1391 if want_importd == 'true' and not have
1392 error('importd support was requested, but dependencies are not available')
1397 conf.set10('ENABLE_IMPORTD', have)
1399 want_homed = get_option('homed')
1400 if want_homed != 'false'
1401 have = (conf.get('HAVE_OPENSSL') == 1 and
1402 conf.get('HAVE_LIBFDISK') == 1 and
1403 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1404 if want_homed == 'true' and not have
1405 error('homed support was requested, but dependencies are not available')
1410 conf.set10('ENABLE_HOMED', have)
1412 have = have and conf.get('HAVE_PAM') == 1
1413 conf.set10('ENABLE_PAM_HOME', have)
1415 want_remote = get_option('remote')
1416 if want_remote != 'false'
1417 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1418 conf.get('HAVE_LIBCURL') == 1]
1419 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1420 # it's possible to build one without the other. Complain only if
1421 # support was explicitly requested. The auxiliary files like sysusers
1422 # config should be installed when any of the programs are built.
1423 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1424 error('remote support was requested, but dependencies are not available')
1426 have = have_deps[0] or have_deps[1]
1430 conf.set10('ENABLE_REMOTE', have)
1432 foreach term : ['analyze',
1469 have = get_option(term)
1470 name = 'ENABLE_' + term.underscorify().to_upper()
1471 conf.set10(name, have)
1474 foreach tuple : [['nss-mymachines', 'machined'],
1475 ['nss-resolve', 'resolve']]
1476 want = get_option(tuple[0])
1478 have = get_option(tuple[1])
1479 if want == 'true' and not have
1480 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1485 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1486 conf.set10(name, have)
1490 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1491 'ENABLE_NSS_MYMACHINES',
1492 'ENABLE_NSS_RESOLVE',
1493 'ENABLE_NSS_SYSTEMD']
1494 if conf.get(term) == 1
1498 conf.set10('ENABLE_NSS', enable_nss)
1500 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1505 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1507 #####################################################################
1509 if get_option('efi')
1510 efi_arch = host_machine.cpu_family()
1512 if efi_arch == 'x86'
1513 EFI_MACHINE_TYPE_NAME = 'ia32'
1514 gnu_efi_arch = 'ia32'
1515 elif efi_arch == 'x86_64'
1516 EFI_MACHINE_TYPE_NAME = 'x64'
1517 gnu_efi_arch = 'x86_64'
1518 elif efi_arch == 'arm'
1519 EFI_MACHINE_TYPE_NAME = 'arm'
1520 gnu_efi_arch = 'arm'
1521 elif efi_arch == 'aarch64'
1522 EFI_MACHINE_TYPE_NAME = 'aa64'
1523 gnu_efi_arch = 'aarch64'
1525 EFI_MACHINE_TYPE_NAME = ''
1530 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1532 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1536 conf.set10('ENABLE_EFI', have)
1538 #####################################################################
1540 config_h = configure_file(
1541 output : 'config.h',
1542 configuration : conf)
1544 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1546 includes = include_directories('src/basic',
1552 'src/journal-remote',
1556 'src/time-wait-sync',
1562 'src/xdg-autostart-generator',
1563 'src/libsystemd/sd-bus',
1564 'src/libsystemd/sd-device',
1565 'src/libsystemd/sd-event',
1566 'src/libsystemd/sd-hwdb',
1567 'src/libsystemd/sd-id128',
1568 'src/libsystemd/sd-netlink',
1569 'src/libsystemd/sd-network',
1570 'src/libsystemd/sd-resolve',
1571 'src/libsystemd-network',
1574 add_project_arguments('-include', 'config.h', language : 'c')
1576 generate_gperfs = find_program('tools/generate-gperfs.py')
1580 subdir('src/systemd')
1582 subdir('src/libsystemd')
1583 subdir('src/libsystemd-network')
1584 subdir('src/journal')
1587 libjournal_core = static_library(
1589 libjournal_core_sources,
1591 include_directories : includes,
1594 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1595 libsystemd = shared_library(
1598 version : libsystemd_version,
1599 include_directories : includes,
1600 link_args : ['-shared',
1601 '-Wl,--version-script=' + libsystemd_sym_path],
1602 link_with : [libbasic,
1604 link_whole : [libsystemd_static,
1606 dependencies : [threads,
1611 link_depends : libsystemd_sym,
1613 install_dir : rootlibdir)
1615 static_libsystemd = get_option('static-libsystemd')
1616 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1618 install_libsystemd_static = static_library(
1621 journal_client_sources,
1623 basic_gcrypt_sources,
1625 include_directories : includes,
1626 build_by_default : static_libsystemd != 'false',
1627 install : static_libsystemd != 'false',
1628 install_dir : rootlibdir,
1629 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1630 dependencies : [threads,
1640 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1642 ############################################################
1644 autosuspend_update_sh = find_program('tools/autosuspend-update.sh')
1645 hwdb_update_sh = find_program('tools/hwdb-update.sh')
1646 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1647 make_directive_index_py = find_program('tools/make-directive-index.py')
1648 make_man_index_py = find_program('tools/make-man-index.py')
1649 syscall_names_update_sh = find_program('tools/syscall-names-update.sh')
1650 xml_helper_py = find_program('tools/xml_helper.py')
1651 update_dbus_docs_py = find_program('tools/update-dbus-docs.py')
1653 ############################################################
1655 # binaries that have --help and are intended for use by humans,
1656 # usually, but not always, installed in /bin.
1657 public_programs = []
1659 subdir('src/libudev')
1660 subdir('src/shared')
1662 subdir('src/shutdown')
1664 subdir('src/network')
1666 subdir('src/analyze')
1667 subdir('src/journal-remote')
1668 subdir('src/coredump')
1669 subdir('src/pstore')
1670 subdir('src/hostname')
1671 subdir('src/import')
1672 subdir('src/partition')
1673 subdir('src/kernel-install')
1674 subdir('src/locale')
1675 subdir('src/machine')
1676 subdir('src/portable')
1677 subdir('src/userdb')
1679 subdir('src/nspawn')
1680 subdir('src/resolve')
1681 subdir('src/timedate')
1682 subdir('src/timesync')
1683 subdir('src/tmpfiles')
1684 subdir('src/vconsole')
1685 subdir('src/boot/efi')
1692 ############################################################
1694 # only static linking apart from libdl, to make sure that the
1695 # module is linked to all libraries that it uses.
1696 test_dlopen = executable(
1700 include_directories : includes,
1701 link_with : [libbasic],
1702 dependencies : [libdl],
1703 build_by_default : want_tests != 'false')
1705 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1706 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h src/nss-systemd/nss-systemd.h'],
1707 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1708 ['resolve', 'ENABLE_NSS_RESOLVE']]
1710 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1714 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1715 version_script_arg = join_paths(project_source_root, sym)
1717 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1718 if tuple.length() > 2
1719 sources += tuple[2].split()
1722 nss = shared_library(
1727 include_directories : includes,
1728 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1729 link_args : ['-Wl,-z,nodelete',
1731 '-Wl,--version-script=' + version_script_arg],
1732 link_with : [libsystemd_static,
1735 dependencies : [threads,
1739 install_dir : rootlibdir)
1741 # We cannot use shared_module because it does not support version suffix.
1742 # Unfortunately shared_library insists on creating the symlink…
1743 meson.add_install_script('sh', '-c',
1744 'rm $DESTDIR@0@/libnss_@1@.so'
1745 .format(rootlibdir, module))
1747 if want_tests != 'false'
1748 test('dlopen-nss_' + module,
1750 # path to dlopen must include a slash
1751 args : nss.full_path())
1756 ############################################################
1761 include_directories : includes,
1762 link_with : [libcore,
1764 dependencies : [versiondep,
1771 install_rpath : rootlibexecdir,
1773 install_dir : rootlibexecdir)
1775 meson.add_install_script(meson_make_symlink,
1776 join_paths(rootlibexecdir, 'systemd'),
1777 join_paths(rootsbindir, 'init'))
1779 public_programs += executable(
1781 systemd_analyze_sources,
1782 include_directories : includes,
1783 link_with : [libcore,
1785 dependencies : [versiondep,
1792 install_rpath : rootlibexecdir,
1793 install : conf.get('ENABLE_ANALYZE'))
1797 systemd_journald_sources,
1798 include_directories : includes,
1799 link_with : [libjournal_core,
1801 dependencies : [threads,
1806 install_rpath : rootlibexecdir,
1808 install_dir : rootlibexecdir)
1810 public_programs += executable(
1812 systemd_cat_sources,
1813 include_directories : includes,
1814 link_with : [libjournal_core,
1816 dependencies : [threads],
1817 install_rpath : rootlibexecdir,
1820 public_programs += executable(
1823 include_directories : includes,
1824 link_with : [libshared],
1825 dependencies : [threads,
1831 install_rpath : rootlibexecdir,
1833 install_dir : rootbindir)
1836 'systemd-getty-generator',
1837 'src/getty-generator/getty-generator.c',
1838 include_directories : includes,
1839 link_with : [libshared],
1840 install_rpath : rootlibexecdir,
1842 install_dir : systemgeneratordir)
1845 'systemd-debug-generator',
1846 'src/debug-generator/debug-generator.c',
1847 include_directories : includes,
1848 link_with : [libshared],
1849 install_rpath : rootlibexecdir,
1851 install_dir : systemgeneratordir)
1854 'systemd-run-generator',
1855 'src/run-generator/run-generator.c',
1856 include_directories : includes,
1857 link_with : [libshared],
1858 install_rpath : rootlibexecdir,
1860 install_dir : systemgeneratordir)
1863 'systemd-fstab-generator',
1864 'src/fstab-generator/fstab-generator.c',
1865 include_directories : includes,
1866 link_with : [libcore_shared,
1868 install_rpath : rootlibexecdir,
1870 install_dir : systemgeneratordir)
1872 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1874 '30-systemd-environment-d-generator',
1875 'src/environment-d-generator/environment-d-generator.c',
1876 include_directories : includes,
1877 link_with : [libshared],
1878 install_rpath : rootlibexecdir,
1880 install_dir : userenvgeneratordir)
1882 meson.add_install_script(meson_make_symlink,
1883 join_paths(sysconfdir, 'environment'),
1884 join_paths(environmentdir, '99-environment.conf'))
1887 if conf.get('ENABLE_HIBERNATE') == 1
1889 'systemd-hibernate-resume-generator',
1890 'src/hibernate-resume/hibernate-resume-generator.c',
1891 include_directories : includes,
1892 link_with : [libshared],
1893 install_rpath : rootlibexecdir,
1895 install_dir : systemgeneratordir)
1898 'systemd-hibernate-resume',
1899 'src/hibernate-resume/hibernate-resume.c',
1900 include_directories : includes,
1901 link_with : [libshared],
1902 install_rpath : rootlibexecdir,
1904 install_dir : rootlibexecdir)
1907 if conf.get('HAVE_BLKID') == 1
1909 'systemd-gpt-auto-generator',
1910 'src/gpt-auto-generator/gpt-auto-generator.c',
1911 'src/shared/blkid-util.h',
1912 include_directories : includes,
1913 link_with : [libshared],
1914 dependencies : libblkid,
1915 install_rpath : rootlibexecdir,
1917 install_dir : systemgeneratordir)
1919 public_programs += executable(
1921 'src/dissect/dissect.c',
1922 include_directories : includes,
1923 link_with : [libshared],
1924 install_rpath : rootlibexecdir,
1928 if conf.get('ENABLE_RESOLVE') == 1
1931 systemd_resolved_sources,
1932 include_directories : includes,
1933 link_with : [libshared,
1935 libsystemd_resolve_core],
1936 dependencies : systemd_resolved_dependencies,
1937 install_rpath : rootlibexecdir,
1939 install_dir : rootlibexecdir)
1941 public_programs += executable(
1944 include_directories : includes,
1945 link_with : [libshared,
1947 libsystemd_resolve_core],
1948 dependencies : [threads,
1952 install_rpath : rootlibexecdir,
1955 meson.add_install_script(meson_make_symlink,
1956 join_paths(bindir, 'resolvectl'),
1957 join_paths(rootsbindir, 'resolvconf'))
1959 meson.add_install_script(meson_make_symlink,
1960 join_paths(bindir, 'resolvectl'),
1961 join_paths(bindir, 'systemd-resolve'))
1964 if conf.get('ENABLE_LOGIND') == 1
1967 systemd_logind_sources,
1968 include_directories : includes,
1969 link_with : [liblogind_core,
1971 dependencies : [threads,
1973 install_rpath : rootlibexecdir,
1975 install_dir : rootlibexecdir)
1977 public_programs += executable(
1980 include_directories : includes,
1981 link_with : [libshared],
1982 dependencies : [threads,
1986 install_rpath : rootlibexecdir,
1988 install_dir : rootbindir)
1990 public_programs += executable(
1992 'src/login/inhibit.c',
1993 include_directories : includes,
1994 link_with : [libshared],
1995 install_rpath : rootlibexecdir,
1997 install_dir : rootbindir)
1999 if conf.get('HAVE_PAM') == 1
2000 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
2001 pam_systemd = shared_library(
2005 include_directories : includes,
2006 link_args : ['-shared',
2007 '-Wl,--version-script=' + version_script_arg],
2008 link_with : [libsystemd_static,
2010 dependencies : [threads,
2013 link_depends : pam_systemd_sym,
2015 install_dir : pamlibdir)
2017 if want_tests != 'false'
2018 test('dlopen-pam_systemd',
2020 # path to dlopen must include a slash
2021 args : pam_systemd.full_path())
2026 'systemd-user-runtime-dir',
2027 user_runtime_dir_sources,
2028 include_directories : includes,
2029 link_with : [libshared],
2030 install_rpath : rootlibexecdir,
2032 install_dir : rootlibexecdir)
2035 if conf.get('HAVE_PAM') == 1
2037 'systemd-user-sessions',
2038 'src/user-sessions/user-sessions.c',
2039 include_directories : includes,
2040 link_with : [libshared],
2041 install_rpath : rootlibexecdir,
2043 install_dir : rootlibexecdir)
2046 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
2047 public_programs += executable(
2049 'src/boot/bootctl.c',
2050 include_directories : includes,
2051 link_with : [libshared],
2052 dependencies : [libblkid],
2053 install_rpath : rootlibexecdir,
2056 public_programs += executable(
2057 'systemd-bless-boot',
2058 'src/boot/bless-boot.c',
2059 include_directories : includes,
2060 link_with : [libshared],
2061 dependencies : [libblkid],
2062 install_rpath : rootlibexecdir,
2064 install_dir : rootlibexecdir)
2067 'systemd-bless-boot-generator',
2068 'src/boot/bless-boot-generator.c',
2069 include_directories : includes,
2070 link_with : [libshared],
2071 install_rpath : rootlibexecdir,
2073 install_dir : systemgeneratordir)
2077 'systemd-boot-check-no-failures',
2078 'src/boot/boot-check-no-failures.c',
2079 include_directories : includes,
2080 link_with : [libshared],
2081 dependencies : [libblkid],
2082 install_rpath : rootlibexecdir,
2084 install_dir : rootlibexecdir)
2086 public_programs += executable(
2087 'systemd-socket-activate',
2088 'src/activate/activate.c',
2089 include_directories : includes,
2090 link_with : [libshared],
2091 dependencies : [threads],
2092 install_rpath : rootlibexecdir,
2095 if get_option('link-systemctl-shared')
2096 systemctl_link_with = [libshared]
2098 systemctl_link_with = [libsystemd_static,
2104 public_programs += executable(
2106 'src/systemctl/systemctl.c',
2107 'src/systemctl/sysv-compat.h',
2108 'src/systemctl/sysv-compat.c',
2109 include_directories : includes,
2110 link_with : systemctl_link_with,
2111 dependencies : [threads,
2117 install_rpath : rootlibexecdir,
2119 install_dir : rootbindir)
2121 if conf.get('ENABLE_PORTABLED') == 1
2123 'systemd-portabled',
2124 systemd_portabled_sources,
2125 include_directories : includes,
2126 link_with : [libshared],
2127 dependencies : [threads],
2128 install_rpath : rootlibexecdir,
2130 install_dir : rootlibexecdir)
2132 public_programs += executable(
2134 'src/portable/portablectl.c',
2135 include_directories : includes,
2136 link_with : [libshared],
2137 dependencies : [threads],
2138 install_rpath : rootlibexecdir,
2140 install_dir : rootbindir)
2143 if conf.get('ENABLE_USERDB') == 1
2146 systemd_userwork_sources,
2147 include_directories : includes,
2148 link_with : [libshared],
2149 dependencies : [threads],
2150 install_rpath : rootlibexecdir,
2152 install_dir : rootlibexecdir)
2156 systemd_userdbd_sources,
2157 include_directories : includes,
2158 link_with : [libshared],
2159 dependencies : [threads],
2160 install_rpath : rootlibexecdir,
2162 install_dir : rootlibexecdir)
2164 public_programs += executable(
2167 include_directories : includes,
2168 link_with : [libshared],
2169 dependencies : [threads],
2170 install_rpath : rootlibexecdir,
2172 install_dir : rootbindir)
2175 if conf.get('ENABLE_HOMED') == 1
2178 systemd_homework_sources,
2179 include_directories : includes,
2180 link_with : [libshared],
2181 dependencies : [threads,
2189 install_rpath : rootlibexecdir,
2191 install_dir : rootlibexecdir)
2195 systemd_homed_sources,
2196 include_directories : includes,
2197 link_with : [libshared],
2198 dependencies : [threads,
2201 install_rpath : rootlibexecdir,
2203 install_dir : rootlibexecdir)
2205 public_programs += executable(
2208 include_directories : includes,
2209 link_with : [libshared],
2210 dependencies : [threads,
2216 install_rpath : rootlibexecdir,
2218 install_dir : rootbindir)
2220 if conf.get('HAVE_PAM') == 1
2221 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2222 pam_systemd = shared_library(
2226 include_directories : includes,
2227 link_args : ['-shared',
2228 '-Wl,--version-script=' + version_script_arg],
2229 link_with : [libsystemd_static,
2231 dependencies : [threads,
2235 link_depends : pam_systemd_home_sym,
2237 install_dir : pamlibdir)
2241 foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
2242 (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
2243 meson.add_install_script(meson_make_symlink,
2244 join_paths(rootbindir, 'systemctl'),
2245 join_paths(rootsbindir, alias))
2248 meson.add_install_script(meson_make_symlink,
2249 join_paths(rootbindir, 'udevadm'),
2250 join_paths(rootlibexecdir, 'systemd-udevd'))
2252 if conf.get('ENABLE_BACKLIGHT') == 1
2254 'systemd-backlight',
2255 'src/backlight/backlight.c',
2256 include_directories : includes,
2257 link_with : [libshared],
2258 install_rpath : rootlibexecdir,
2260 install_dir : rootlibexecdir)
2263 if conf.get('ENABLE_RFKILL') == 1
2266 'src/rfkill/rfkill.c',
2267 include_directories : includes,
2268 link_with : [libshared],
2269 install_rpath : rootlibexecdir,
2271 install_dir : rootlibexecdir)
2275 'systemd-system-update-generator',
2276 'src/system-update-generator/system-update-generator.c',
2277 include_directories : includes,
2278 link_with : [libshared],
2279 install_rpath : rootlibexecdir,
2281 install_dir : systemgeneratordir)
2283 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2284 systemd_cryptsetup_sources = files('''
2285 src/cryptsetup/cryptsetup-pkcs11.h
2286 src/cryptsetup/cryptsetup-keyfile.c
2287 src/cryptsetup/cryptsetup-keyfile.h
2288 src/cryptsetup/cryptsetup.c
2291 if conf.get('HAVE_P11KIT') == 1
2292 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2296 'systemd-cryptsetup',
2297 systemd_cryptsetup_sources,
2298 include_directories : includes,
2299 link_with : [libshared],
2300 dependencies : [libcryptsetup,
2302 install_rpath : rootlibexecdir,
2304 install_dir : rootlibexecdir)
2307 'systemd-cryptsetup-generator',
2308 'src/cryptsetup/cryptsetup-generator.c',
2309 include_directories : includes,
2310 link_with : [libshared],
2311 install_rpath : rootlibexecdir,
2313 install_dir : systemgeneratordir)
2316 'systemd-veritysetup',
2317 'src/veritysetup/veritysetup.c',
2318 include_directories : includes,
2319 link_with : [libshared],
2320 dependencies : [libcryptsetup],
2321 install_rpath : rootlibexecdir,
2323 install_dir : rootlibexecdir)
2326 'systemd-veritysetup-generator',
2327 'src/veritysetup/veritysetup-generator.c',
2328 include_directories : includes,
2329 link_with : [libshared],
2330 install_rpath : rootlibexecdir,
2332 install_dir : systemgeneratordir)
2335 if conf.get('HAVE_SYSV_COMPAT') == 1
2337 'systemd-sysv-generator',
2338 'src/sysv-generator/sysv-generator.c',
2339 include_directories : includes,
2340 link_with : [libshared],
2341 install_rpath : rootlibexecdir,
2343 install_dir : systemgeneratordir)
2346 'systemd-rc-local-generator',
2347 'src/rc-local-generator/rc-local-generator.c',
2348 include_directories : includes,
2349 link_with : [libshared],
2350 install_rpath : rootlibexecdir,
2352 install_dir : systemgeneratordir)
2355 if conf.get('ENABLE_XDG_AUTOSTART') == 1
2357 'systemd-xdg-autostart-generator',
2358 'src/xdg-autostart-generator/xdg-autostart-generator.c',
2359 'src/xdg-autostart-generator/xdg-autostart-service.c',
2360 include_directories : includes,
2361 link_with : [libshared],
2362 install_rpath : rootlibexecdir,
2364 install_dir : usergeneratordir)
2367 'systemd-xdg-autostart-condition',
2368 'src/xdg-autostart-generator/xdg-autostart-condition.c',
2369 include_directories : includes,
2370 link_with : [libshared],
2371 install_rpath : rootlibexecdir,
2373 install_dir : rootlibexecdir)
2376 if conf.get('ENABLE_HOSTNAMED') == 1
2378 'systemd-hostnamed',
2379 'src/hostname/hostnamed.c',
2380 include_directories : includes,
2381 link_with : [libshared],
2382 install_rpath : rootlibexecdir,
2384 install_dir : rootlibexecdir)
2386 public_programs += executable(
2388 'src/hostname/hostnamectl.c',
2389 include_directories : includes,
2390 link_with : [libshared],
2391 install_rpath : rootlibexecdir,
2395 if conf.get('ENABLE_LOCALED') == 1
2396 if conf.get('HAVE_XKBCOMMON') == 1
2397 # logind will load libxkbcommon.so dynamically on its own
2405 systemd_localed_sources,
2406 include_directories : includes,
2407 link_with : [libshared],
2408 dependencies : deps,
2409 install_rpath : rootlibexecdir,
2411 install_dir : rootlibexecdir)
2413 public_programs += executable(
2416 include_directories : includes,
2417 link_with : [libshared],
2418 install_rpath : rootlibexecdir,
2422 if conf.get('ENABLE_TIMEDATED') == 1
2424 'systemd-timedated',
2425 'src/timedate/timedated.c',
2426 include_directories : includes,
2427 link_with : [libshared],
2428 install_rpath : rootlibexecdir,
2430 install_dir : rootlibexecdir)
2433 if conf.get('ENABLE_TIMEDATECTL') == 1
2434 public_programs += executable(
2436 'src/timedate/timedatectl.c',
2437 include_directories : includes,
2438 install_rpath : rootlibexecdir,
2439 link_with : [libshared],
2440 dependencies : [libm],
2444 if conf.get('ENABLE_TIMESYNCD') == 1
2445 if get_option('link-timesyncd-shared')
2446 timesyncd_link_with = [libshared]
2448 timesyncd_link_with = [libsystemd_static,
2455 'systemd-timesyncd',
2456 systemd_timesyncd_sources,
2457 include_directories : includes,
2458 link_with : [timesyncd_link_with],
2459 dependencies : [threads,
2461 install_rpath : rootlibexecdir,
2463 install_dir : rootlibexecdir)
2466 'systemd-time-wait-sync',
2467 'src/time-wait-sync/time-wait-sync.c',
2468 include_directories : includes,
2469 link_with : [timesyncd_link_with],
2470 install_rpath : rootlibexecdir,
2472 install_dir : rootlibexecdir)
2475 if conf.get('ENABLE_MACHINED') == 1
2478 systemd_machined_sources,
2479 include_directories : includes,
2480 link_with : [libmachine_core,
2482 install_rpath : rootlibexecdir,
2484 install_dir : rootlibexecdir)
2486 public_programs += executable(
2488 'src/machine/machinectl.c',
2489 include_directories : includes,
2490 link_with : [libshared],
2491 dependencies : [threads,
2495 install_rpath : rootlibexecdir,
2497 install_dir : rootbindir)
2500 if conf.get('ENABLE_IMPORTD') == 1
2503 systemd_importd_sources,
2504 include_directories : includes,
2505 link_with : [libshared],
2506 dependencies : [threads],
2507 install_rpath : rootlibexecdir,
2509 install_dir : rootlibexecdir)
2511 systemd_pull = executable(
2513 systemd_pull_sources,
2514 include_directories : includes,
2515 link_with : [libshared],
2516 dependencies : [versiondep,
2522 install_rpath : rootlibexecdir,
2524 install_dir : rootlibexecdir)
2526 systemd_import = executable(
2528 systemd_import_sources,
2529 include_directories : includes,
2530 link_with : [libshared],
2531 dependencies : [libcurl,
2535 install_rpath : rootlibexecdir,
2537 install_dir : rootlibexecdir)
2539 systemd_import_fs = executable(
2540 'systemd-import-fs',
2541 systemd_import_fs_sources,
2542 include_directories : includes,
2543 link_with : [libshared],
2544 install_rpath : rootlibexecdir,
2546 install_dir : rootlibexecdir)
2548 systemd_export = executable(
2550 systemd_export_sources,
2551 include_directories : includes,
2552 link_with : [libshared],
2553 dependencies : [libcurl,
2557 install_rpath : rootlibexecdir,
2559 install_dir : rootlibexecdir)
2561 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2564 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2565 public_programs += executable(
2566 'systemd-journal-upload',
2567 systemd_journal_upload_sources,
2568 include_directories : includes,
2569 link_with : [libshared],
2570 dependencies : [versiondep,
2577 install_rpath : rootlibexecdir,
2579 install_dir : rootlibexecdir)
2582 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2583 public_programs += executable(
2584 'systemd-journal-remote',
2585 systemd_journal_remote_sources,
2586 include_directories : includes,
2587 link_with : [libshared,
2588 libsystemd_journal_remote],
2589 dependencies : [threads,
2595 install_rpath : rootlibexecdir,
2597 install_dir : rootlibexecdir)
2599 public_programs += executable(
2600 'systemd-journal-gatewayd',
2601 systemd_journal_gatewayd_sources,
2602 include_directories : includes,
2603 link_with : [libshared],
2604 dependencies : [threads,
2610 install_rpath : rootlibexecdir,
2612 install_dir : rootlibexecdir)
2615 if conf.get('ENABLE_COREDUMP') == 1
2618 systemd_coredump_sources,
2619 include_directories : includes,
2620 link_with : [libshared],
2621 dependencies : [threads,
2627 install_rpath : rootlibexecdir,
2629 install_dir : rootlibexecdir)
2631 public_programs += executable(
2633 coredumpctl_sources,
2634 include_directories : includes,
2635 link_with : [libshared],
2636 dependencies : [threads,
2640 install_rpath : rootlibexecdir,
2644 if conf.get('ENABLE_PSTORE') == 1
2647 systemd_pstore_sources,
2648 include_directories : includes,
2649 link_with : [libshared],
2650 dependencies : [threads,
2656 install_rpath : rootlibexecdir,
2658 install_dir : rootlibexecdir)
2661 if conf.get('ENABLE_BINFMT') == 1
2662 public_programs += executable(
2664 'src/binfmt/binfmt.c',
2665 include_directories : includes,
2666 link_with : [libshared],
2667 install_rpath : rootlibexecdir,
2669 install_dir : rootlibexecdir)
2671 meson.add_install_script('sh', '-c',
2672 mkdir_p.format(binfmtdir))
2673 meson.add_install_script('sh', '-c',
2674 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2677 if conf.get('ENABLE_REPART') == 1
2680 systemd_repart_sources,
2681 include_directories : includes,
2682 link_with : [libshared],
2683 dependencies : [threads,
2687 install_rpath : rootlibexecdir,
2689 install_dir : rootbindir)
2690 public_programs += exe
2692 if want_tests != 'false'
2695 args : exe.full_path())
2699 if conf.get('ENABLE_VCONSOLE') == 1
2701 'systemd-vconsole-setup',
2702 'src/vconsole/vconsole-setup.c',
2703 include_directories : includes,
2704 link_with : [libshared],
2705 install_rpath : rootlibexecdir,
2707 install_dir : rootlibexecdir)
2710 if conf.get('ENABLE_RANDOMSEED') == 1
2712 'systemd-random-seed',
2713 'src/random-seed/random-seed.c',
2714 include_directories : includes,
2715 link_with : [libshared],
2716 install_rpath : rootlibexecdir,
2718 install_dir : rootlibexecdir)
2721 if conf.get('ENABLE_FIRSTBOOT') == 1
2723 'systemd-firstboot',
2724 'src/firstboot/firstboot.c',
2725 include_directories : includes,
2726 link_with : [libshared],
2727 dependencies : [libcrypt],
2728 install_rpath : rootlibexecdir,
2730 install_dir : rootbindir)
2734 'systemd-remount-fs',
2735 'src/remount-fs/remount-fs.c',
2736 include_directories : includes,
2737 link_with : [libcore_shared,
2739 install_rpath : rootlibexecdir,
2741 install_dir : rootlibexecdir)
2744 'systemd-machine-id-setup',
2745 'src/machine-id-setup/machine-id-setup-main.c',
2746 include_directories : includes,
2747 link_with : [libcore_shared,
2749 install_rpath : rootlibexecdir,
2751 install_dir : rootbindir)
2756 include_directories : includes,
2757 link_with : [libshared],
2758 install_rpath : rootlibexecdir,
2760 install_dir : rootlibexecdir)
2762 executable('systemd-growfs',
2763 'src/partition/growfs.c',
2764 include_directories : includes,
2765 link_with : [libshared],
2766 install_rpath : rootlibexecdir,
2768 install_dir : rootlibexecdir)
2772 'src/partition/makefs.c',
2773 include_directories : includes,
2774 link_with : [libshared],
2775 install_rpath : rootlibexecdir,
2777 install_dir : rootlibexecdir)
2781 'src/sleep/sleep.c',
2782 include_directories : includes,
2783 link_with : [libshared],
2784 install_rpath : rootlibexecdir,
2786 install_dir : rootlibexecdir)
2788 install_data('src/sleep/sleep.conf',
2789 install_dir : pkgsysconfdir)
2791 public_programs += executable(
2793 'src/sysctl/sysctl.c',
2794 include_directories : includes,
2795 link_with : [libshared],
2796 install_rpath : rootlibexecdir,
2798 install_dir : rootlibexecdir)
2802 'src/ac-power/ac-power.c',
2803 include_directories : includes,
2804 link_with : [libshared],
2805 install_rpath : rootlibexecdir,
2807 install_dir : rootlibexecdir)
2809 public_programs += executable(
2810 'systemd-detect-virt',
2811 'src/detect-virt/detect-virt.c',
2812 include_directories : includes,
2813 link_with : [libshared],
2814 install_rpath : rootlibexecdir,
2817 public_programs += executable(
2819 'src/delta/delta.c',
2820 include_directories : includes,
2821 link_with : [libshared],
2822 install_rpath : rootlibexecdir,
2825 public_programs += executable(
2827 'src/escape/escape.c',
2828 include_directories : includes,
2829 link_with : [libshared],
2830 install_rpath : rootlibexecdir,
2832 install_dir : rootbindir)
2834 public_programs += executable(
2836 'src/notify/notify.c',
2837 include_directories : includes,
2838 link_with : [libshared],
2839 install_rpath : rootlibexecdir,
2841 install_dir : rootbindir)
2844 'systemd-volatile-root',
2845 'src/volatile-root/volatile-root.c',
2846 include_directories : includes,
2847 link_with : [libshared],
2848 install_rpath : rootlibexecdir,
2849 install : conf.get('ENABLE_INITRD') == 1,
2850 install_dir : rootlibexecdir)
2853 'systemd-cgroups-agent',
2854 'src/cgroups-agent/cgroups-agent.c',
2855 include_directories : includes,
2856 link_with : [libshared],
2857 install_rpath : rootlibexecdir,
2859 install_dir : rootlibexecdir)
2861 public_programs += executable(
2863 'src/id128/id128.c',
2864 include_directories : includes,
2865 link_with : [libshared],
2866 install_rpath : rootlibexecdir,
2869 public_programs += executable(
2872 include_directories : includes,
2873 link_with : [libshared],
2874 install_rpath : rootlibexecdir,
2877 public_programs += executable(
2878 'systemd-ask-password',
2879 'src/ask-password/ask-password.c',
2880 include_directories : includes,
2881 link_with : [libshared],
2882 install_rpath : rootlibexecdir,
2884 install_dir : rootbindir)
2887 'systemd-reply-password',
2888 'src/reply-password/reply-password.c',
2889 include_directories : includes,
2890 link_with : [libshared],
2891 install_rpath : rootlibexecdir,
2893 install_dir : rootlibexecdir)
2895 public_programs += executable(
2896 'systemd-tty-ask-password-agent',
2897 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2898 include_directories : includes,
2899 link_with : [libshared],
2900 install_rpath : rootlibexecdir,
2902 install_dir : rootbindir)
2904 public_programs += executable(
2907 include_directories : includes,
2908 link_with : [libshared],
2909 install_rpath : rootlibexecdir,
2912 public_programs += executable(
2914 'src/cgtop/cgtop.c',
2915 include_directories : includes,
2916 link_with : [libshared],
2917 install_rpath : rootlibexecdir,
2922 'src/initctl/initctl.c',
2923 include_directories : includes,
2924 link_with : [libshared],
2925 install_rpath : rootlibexecdir,
2926 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
2927 install_dir : rootlibexecdir)
2929 public_programs += executable(
2931 'src/mount/mount-tool.c',
2932 include_directories : includes,
2933 link_with : [libshared],
2934 dependencies: [libmount],
2935 install_rpath : rootlibexecdir,
2938 meson.add_install_script(meson_make_symlink,
2939 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2941 public_programs += executable(
2944 include_directories : includes,
2945 link_with : [libshared],
2946 install_rpath : rootlibexecdir,
2949 public_programs += executable(
2950 'systemd-stdio-bridge',
2951 'src/stdio-bridge/stdio-bridge.c',
2952 include_directories : includes,
2953 link_with : [libshared],
2954 dependencies : [versiondep],
2955 install_rpath : rootlibexecdir,
2958 public_programs += executable(
2960 'src/busctl/busctl.c',
2961 'src/busctl/busctl-introspect.c',
2962 'src/busctl/busctl-introspect.h',
2963 include_directories : includes,
2964 link_with : [libshared],
2965 install_rpath : rootlibexecdir,
2968 if conf.get('ENABLE_SYSUSERS') == 1
2969 public_programs += executable(
2971 'src/sysusers/sysusers.c',
2972 include_directories : includes,
2973 link_with : [libshared],
2974 install_rpath : rootlibexecdir,
2976 install_dir : rootbindir)
2978 if have_standalone_binaries
2979 public_programs += executable(
2980 'systemd-sysusers.standalone',
2981 'src/sysusers/sysusers.c',
2982 include_directories : includes,
2983 link_with : [libshared_static,
2989 install_dir : rootbindir)
2993 if conf.get('ENABLE_TMPFILES') == 1
2996 systemd_tmpfiles_sources,
2997 include_directories : includes,
2998 link_with : [libshared],
2999 dependencies : [libacl],
3000 install_rpath : rootlibexecdir,
3002 install_dir : rootbindir)
3003 public_programs += exe
3005 if want_tests != 'false'
3006 test('test-systemd-tmpfiles',
3007 test_systemd_tmpfiles_py,
3008 # https://github.com/mesonbuild/meson/issues/2681
3009 args : exe.full_path())
3012 if have_standalone_binaries
3013 public_programs += executable(
3014 'systemd-tmpfiles.standalone',
3015 systemd_tmpfiles_sources,
3016 include_directories : includes,
3017 link_with : [libshared_static,
3022 dependencies : [libacl],
3024 install_dir : rootbindir)
3028 if conf.get('ENABLE_HWDB') == 1
3029 public_programs += executable(
3032 'src/libsystemd/sd-hwdb/hwdb-internal.h',
3033 include_directories : includes,
3034 link_with : [libudev_static],
3035 install_rpath : udev_rpath,
3037 install_dir : rootbindir)
3040 if conf.get('ENABLE_QUOTACHECK') == 1
3042 'systemd-quotacheck',
3043 'src/quotacheck/quotacheck.c',
3044 include_directories : includes,
3045 link_with : [libshared],
3046 install_rpath : rootlibexecdir,
3048 install_dir : rootlibexecdir)
3051 public_programs += executable(
3052 'systemd-socket-proxyd',
3053 'src/socket-proxy/socket-proxyd.c',
3054 include_directories : includes,
3055 link_with : [libshared],
3056 dependencies : [threads],
3057 install_rpath : rootlibexecdir,
3059 install_dir : rootlibexecdir)
3061 public_programs += executable(
3064 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
3065 include_directories : includes,
3066 link_with : [libudev_core,
3069 dependencies : [versiondep,
3075 install_rpath : udev_rpath,
3077 install_dir : rootbindir)
3081 systemd_shutdown_sources,
3082 include_directories : includes,
3083 link_with : [libcore_shared,
3085 dependencies : [libmount],
3086 install_rpath : rootlibexecdir,
3088 install_dir : rootlibexecdir)
3091 'systemd-update-done',
3092 'src/update-done/update-done.c',
3093 include_directories : includes,
3094 link_with : [libshared],
3095 install_rpath : rootlibexecdir,
3097 install_dir : rootlibexecdir)
3100 'systemd-update-utmp',
3101 'src/update-utmp/update-utmp.c',
3102 include_directories : includes,
3103 link_with : [libshared],
3104 dependencies : [libaudit],
3105 install_rpath : rootlibexecdir,
3106 install : (conf.get('ENABLE_UTMP') == 1),
3107 install_dir : rootlibexecdir)
3109 if conf.get('HAVE_KMOD') == 1
3111 'systemd-modules-load',
3112 'src/modules-load/modules-load.c',
3113 include_directories : includes,
3114 link_with : [libshared],
3115 dependencies : [libkmod],
3116 install_rpath : rootlibexecdir,
3118 install_dir : rootlibexecdir)
3120 meson.add_install_script('sh', '-c',
3121 mkdir_p.format(modulesloaddir))
3122 meson.add_install_script('sh', '-c',
3123 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
3126 public_programs += executable(
3128 systemd_nspawn_sources,
3129 include_directories : includes,
3130 link_with : [libcore_shared,
3133 dependencies : [libblkid,
3135 install_rpath : rootlibexecdir,
3138 if conf.get('ENABLE_NETWORKD') == 1
3141 systemd_networkd_sources,
3142 include_directories : network_include_dir,
3143 link_with : [libnetworkd_core,
3146 networkd_link_with],
3147 dependencies : [threads],
3148 install_rpath : rootlibexecdir,
3150 install_dir : rootlibexecdir)
3153 'systemd-networkd-wait-online',
3154 systemd_networkd_wait_online_sources,
3155 include_directories : includes,
3156 link_with : [libnetworkd_core,
3157 networkd_link_with],
3158 install_rpath : rootlibexecdir,
3160 install_dir : rootlibexecdir)
3162 public_programs += executable(
3165 include_directories : includes,
3166 link_with : [libsystemd_network,
3167 networkd_link_with],
3168 install_rpath : rootlibexecdir,
3170 install_dir : rootbindir)
3173 'systemd-network-generator',
3174 network_generator_sources,
3175 include_directories : includes,
3176 link_with : [networkd_link_with],
3177 install_rpath : rootlibexecdir,
3179 install_dir : rootlibexecdir)
3181 if want_tests != 'false'
3182 test('test-network-generator-conversion',
3183 test_network_generator_conversion_sh,
3184 # https://github.com/mesonbuild/meson/issues/2681
3185 args : exe.full_path())
3190 'systemd-sulogin-shell',
3191 ['src/sulogin-shell/sulogin-shell.c'],
3192 include_directories : includes,
3193 link_with : [libshared],
3194 install_rpath : rootlibexecdir,
3196 install_dir : rootlibexecdir)
3198 ############################################################
3201 'systemd-runtest.env',
3202 output : 'systemd-runtest.env',
3203 command : ['sh', '-c', '{ ' +
3204 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
3205 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
3207 build_by_default : true)
3209 foreach tuple : tests
3211 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3212 dependencies = tuple[2]
3213 condition = tuple.length() >= 4 ? tuple[3] : ''
3214 type = tuple.length() >= 5 ? tuple[4] : ''
3215 defs = tuple.length() >= 6 ? tuple[5] : []
3216 incs = tuple.length() >= 7 ? tuple[6] : includes
3219 name = sources[0].split('/')[-1].split('.')[0]
3220 if type.startswith('timeout=')
3221 timeout = type.split('=')[1].to_int()
3225 if condition == '' or conf.get(condition) == 1
3229 include_directories : incs,
3230 link_with : link_with,
3231 dependencies : [versiondep,
3234 build_by_default : want_tests != 'false',
3235 install_rpath : rootlibexecdir,
3236 install : install_tests,
3237 install_dir : join_paths(testsdir, type))
3240 message('@0@ is a manual test'.format(name))
3241 elif type == 'unsafe' and want_tests != 'unsafe'
3242 message('@0@ is an unsafe test'.format(name))
3243 elif want_tests != 'false'
3249 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3254 'test-libsystemd-sym',
3255 test_libsystemd_sym_c,
3256 include_directories : includes,
3257 link_with : [libsystemd],
3258 build_by_default : want_tests != 'false',
3259 install : install_tests,
3260 install_dir : testsdir)
3261 if want_tests != 'false'
3262 test('test-libsystemd-sym', exe)
3266 'test-libsystemd-static-sym',
3267 test_libsystemd_sym_c,
3268 include_directories : includes,
3269 link_with : [install_libsystemd_static],
3270 dependencies : [threads], # threads is already included in dependencies on the library,
3271 # but does not seem to get propagated. Add here as a work-around.
3272 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3273 install : install_tests and static_libsystemd_pic,
3274 install_dir : testsdir)
3275 if want_tests != 'false' and static_libsystemd_pic
3276 test('test-libsystemd-static-sym', exe)
3282 include_directories : includes,
3283 c_args : '-Wno-deprecated-declarations',
3284 link_with : [libudev],
3285 build_by_default : want_tests != 'false',
3286 install : install_tests,
3287 install_dir : testsdir)
3288 if want_tests != 'false'
3289 test('test-libudev-sym', exe)
3293 'test-libudev-static-sym',
3295 include_directories : includes,
3296 c_args : '-Wno-deprecated-declarations',
3297 link_with : [install_libudev_static],
3298 build_by_default : want_tests != 'false' and static_libudev_pic,
3299 install : install_tests and static_libudev_pic,
3300 install_dir : testsdir)
3301 if want_tests != 'false' and static_libudev_pic
3302 test('test-libudev-static-sym', exe)
3305 ############################################################
3309 if get_option('tests') != 'false'
3310 foreach tuple : fuzzers
3312 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3313 dependencies = tuple[2]
3314 defs = tuple.length() >= 4 ? tuple[3] : []
3315 incs = tuple.length() >= 5 ? tuple[4] : includes
3319 dependencies += fuzzing_engine
3321 if fuzzing_engine.found()
3322 dependencies += fuzzing_engine
3324 link_args += ['-fsanitize=fuzzer']
3327 sources += 'src/fuzz/fuzz-main.c'
3330 name = sources[0].split('/')[-1].split('.')[0]
3332 fuzzer_exes += executable(
3335 include_directories : [incs, include_directories('src/fuzz')],
3336 link_with : link_with,
3337 dependencies : dependencies,
3339 link_args: link_args,
3346 depends : fuzzer_exes,
3349 ############################################################
3352 subdir('sysusers.d')
3353 subdir('tmpfiles.d')
3359 subdir('shell-completion/bash')
3360 subdir('shell-completion/zsh')
3361 subdir('docs/sysvinit')
3362 subdir('docs/var-log')
3364 install_subdir('factory/etc',
3365 install_dir : factorydir)
3367 install_data('xorg/50-systemd-user.sh',
3368 install_dir : xinitrcdir)
3369 install_data('modprobe.d/systemd.conf',
3370 install_dir : modprobedir)
3371 install_data('LICENSE.GPL2',
3375 'docs/CODING_STYLE.md',
3376 'docs/DISTRO_PORTING.md',
3377 'docs/ENVIRONMENT.md',
3379 'docs/TRANSIENT-SETTINGS.md',
3380 'docs/TRANSLATORS.md',
3381 'docs/UIDS-GIDS.md',
3382 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3383 install_dir : docdir)
3385 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3386 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3388 ############################################################
3390 check_help = find_program('tools/check-help.sh')
3392 foreach exec : public_programs
3393 name = exec.full_path().split('/')[-1]
3394 if want_tests != 'false'
3395 test('check-help-' + name,
3397 args : exec.full_path())
3401 ############################################################
3403 check_directives_sh = find_program('tools/check-directives.sh')
3405 if want_tests != 'false'
3406 test('check-directives',
3407 check_directives_sh,
3408 args : project_source_root)
3411 ############################################################
3413 # Enable tests for all supported sanitizers
3414 foreach tuple : sanitizers
3415 sanitizer = tuple[0]
3418 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3420 foreach p : fuzz_regression_tests
3421 b = p.split('/')[-2]
3422 c = p.split('/')[-1]
3424 name = '@0@:@1@'.format(b, sanitizer)
3427 if want_tests == 'false'
3428 message('Not compiling @0@ because tests is set to false'.format(name))
3429 elif slow_tests or fuzz_tests
3430 exe = custom_target(
3434 command : [env, 'ln', '-fs',
3435 join_paths(build.full_path(), b),
3437 build_by_default : true)
3439 message('Not compiling @0@ because slow-tests/fuzz-tests is set to false'.format(name))
3444 if want_tests != 'false' and (slow_tests or fuzz_tests)
3445 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3447 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
3449 args : [exe.full_path(),
3450 join_paths(project_source_root, p)])
3457 ############################################################
3460 all_files = run_command(
3462 ['--git-dir=@0@/.git'.format(project_source_root),
3465 all_files = files(all_files.stdout().split())
3470 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3473 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3477 git_contrib_sh = find_program('tools/git-contrib.sh')
3480 command : [git_contrib_sh])
3484 git_head = run_command(
3486 ['--git-dir=@0@/.git'.format(project_source_root),
3487 'rev-parse', 'HEAD']).stdout().strip()
3488 git_head_short = run_command(
3490 ['--git-dir=@0@/.git'.format(project_source_root),
3491 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3495 command : ['git', 'archive',
3496 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3498 '--prefix', 'systemd-@0@/'.format(git_head),
3502 ############################################################
3504 check_api_docs_sh = find_program('tools/check-api-docs.sh')
3507 depends : [man, libsystemd, libudev],
3508 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3510 ############################################################
3511 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3514 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3516 'build mode: @0@'.format(get_option('mode')),
3517 'split /usr: @0@'.format(split_usr),
3518 'split bin-sbin: @0@'.format(split_bin),
3519 'prefix directory: @0@'.format(prefixdir),
3520 'rootprefix directory: @0@'.format(rootprefixdir),
3521 'sysconf directory: @0@'.format(sysconfdir),
3522 'include directory: @0@'.format(includedir),
3523 'lib directory: @0@'.format(libdir),
3524 'rootlib directory: @0@'.format(rootlibdir),
3525 'SysV init scripts: @0@'.format(sysvinit_path),
3526 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3527 'PAM modules directory: @0@'.format(pamlibdir),
3528 'PAM configuration directory: @0@'.format(pamconfdir),
3529 'RPM macros directory: @0@'.format(rpmmacrosdir),
3530 'modprobe.d directory: @0@'.format(modprobedir),
3531 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3532 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3533 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3534 'bash completions directory: @0@'.format(bashcompletiondir),
3535 'zsh completions directory: @0@'.format(zshcompletiondir),
3536 'extra start script: @0@'.format(get_option('rc-local')),
3537 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3538 get_option('debug-tty')),
3539 'TTY GID: @0@'.format(tty_gid),
3540 'users GID: @0@'.format(substs.get('USERS_GID')),
3541 'maximum system UID: @0@'.format(system_uid_max),
3542 'maximum system GID: @0@'.format(system_gid_max),
3543 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3544 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3545 'minimum container UID base: @0@'.format(container_uid_base_min),
3546 'maximum container UID base: @0@'.format(container_uid_base_max),
3547 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3548 'render group access mode: @0@'.format(get_option('group-render-mode')),
3549 'certificate root directory: @0@'.format(get_option('certificate-root')),
3550 'support URL: @0@'.format(support_url),
3551 'nobody user name: @0@'.format(nobody_user),
3552 'nobody group name: @0@'.format(nobody_group),
3553 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3554 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3556 'default DNSSEC mode: @0@'.format(default_dnssec),
3557 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3558 'default mDNS mode: @0@'.format(default_mdns),
3559 'default LLMNR mode: @0@'.format(default_llmnr),
3560 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3561 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3562 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3563 'default locale: @0@'.format(default_locale),
3564 'default user $PATH: @0@'.format(default_user_path_display),
3565 'systemd service watchdog: @0@'.format(watchdog_opt)]
3567 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3568 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3570 'default DNS servers: @0@'.format(alt_dns_servers),
3571 'default NTP servers: @0@'.format(alt_ntp_servers)]
3573 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3574 '@@0@'.format(time_epoch)).stdout().strip()
3576 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3579 'static libsystemd: @0@'.format(static_libsystemd),
3580 'static libudev: @0@'.format(static_libudev)]
3583 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3584 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3585 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3587 if conf.get('ENABLE_EFI') == 1
3588 status += 'efi arch: @0@'.format(efi_arch)
3592 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3593 'EFI CC @0@'.format(' '.join(efi_cc)),
3594 'EFI lds: @0@'.format(efi_lds),
3595 'EFI crt0: @0@'.format(efi_crt0),
3596 'EFI include directory: @0@'.format(efi_incdir)]
3658 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3659 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3663 ['legacy pkla', install_polkit_pkla],
3665 ['gnu-efi', have_gnu_efi],
3678 ['man pages', want_man],
3679 ['html pages', want_html],
3680 ['man page indices', want_man and have_lxml],
3685 ['adm group', get_option('adm-group')],
3686 ['wheel group', get_option('wheel-group')],
3689 ['debug mmap cache'],
3691 ['valgrind', conf.get('VALGRIND') == 1],
3692 ['trace logging', conf.get('LOG_TRACE') == 1],
3693 ['install tests', install_tests],
3694 ['link-udev-shared', get_option('link-udev-shared')],
3695 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3696 ['link-networkd-shared', get_option('link-networkd-shared')],
3697 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3698 ['kernel-install', get_option('kernel-install')],
3699 ['systemd-analyze', conf.get('ENABLE_ANALYZE') == 1],
3702 if tuple.length() >= 2
3705 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3706 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3707 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3718 'enabled features: @0@'.format(', '.join(found)),
3720 'disabled features: @0@'.format(', '.join(missing)),
3722 message('\n '.join(status))
3724 if rootprefixdir != rootprefix_default
3726 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3727 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3728 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))