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_preferred_method', crypt_header],
889 ['crypt_gensalt_ra', crypt_header]]
891 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE',
892 dependencies : libcrypt)
893 conf.set10('HAVE_' + ident[0].to_upper(), have)
896 libcap = dependency('libcap', required : false)
897 if not libcap.found()
898 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
899 libcap = cc.find_library('cap')
902 libmount = dependency('mount',
903 version : fuzzer_build ? '>= 0' : '>= 2.30')
905 want_libfdisk = get_option('fdisk')
906 if want_libfdisk != 'false' and not skip_deps
907 libfdisk = dependency('fdisk',
909 required : want_libfdisk == 'true')
910 have = libfdisk.found()
915 conf.set10('HAVE_LIBFDISK', have)
917 want_pwquality = get_option('pwquality')
918 if want_pwquality != 'false' and not skip_deps
919 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
920 have = libpwquality.found()
925 conf.set10('HAVE_PWQUALITY', have)
927 want_seccomp = get_option('seccomp')
928 if want_seccomp != 'false' and not skip_deps
929 libseccomp = dependency('libseccomp',
930 version : '>= 2.3.1',
931 required : want_seccomp == 'true')
932 have = libseccomp.found()
937 conf.set10('HAVE_SECCOMP', have)
939 want_selinux = get_option('selinux')
940 if want_selinux != 'false' and not skip_deps
941 libselinux = dependency('libselinux',
942 version : '>= 2.1.9',
943 required : want_selinux == 'true')
944 have = libselinux.found()
949 conf.set10('HAVE_SELINUX', have)
951 want_apparmor = get_option('apparmor')
952 if want_apparmor != 'false' and not skip_deps
953 libapparmor = dependency('libapparmor',
955 required : want_apparmor == 'true')
956 have = libapparmor.found()
961 conf.set10('HAVE_APPARMOR', have)
963 smack_run_label = get_option('smack-run-label')
964 if smack_run_label != ''
965 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
968 want_polkit = get_option('polkit')
969 install_polkit = false
970 install_polkit_pkla = false
971 if want_polkit != 'false' and not skip_deps
972 install_polkit = true
974 libpolkit = dependency('polkit-gobject-1',
976 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
977 message('Old polkit detected, will install pkla files')
978 install_polkit_pkla = true
981 conf.set10('ENABLE_POLKIT', install_polkit)
983 want_acl = get_option('acl')
984 if want_acl != 'false' and not skip_deps
985 libacl = cc.find_library('acl', required : want_acl == 'true')
986 have = libacl.found()
991 conf.set10('HAVE_ACL', have)
993 want_audit = get_option('audit')
994 if want_audit != 'false' and not skip_deps
995 libaudit = dependency('audit', required : want_audit == 'true')
996 have = libaudit.found()
1001 conf.set10('HAVE_AUDIT', have)
1003 want_blkid = get_option('blkid')
1004 if want_blkid != 'false' and not skip_deps
1005 libblkid = dependency('blkid', required : want_blkid == 'true')
1006 have = libblkid.found()
1011 conf.set10('HAVE_BLKID', have)
1013 want_kmod = get_option('kmod')
1014 if want_kmod != 'false' and not skip_deps
1015 libkmod = dependency('libkmod',
1017 required : want_kmod == 'true')
1018 have = libkmod.found()
1023 conf.set10('HAVE_KMOD', have)
1025 want_pam = get_option('pam')
1026 if want_pam != 'false' and not skip_deps
1027 libpam = cc.find_library('pam', required : want_pam == 'true')
1028 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
1029 have = libpam.found() and libpam_misc.found()
1035 conf.set10('HAVE_PAM', have)
1037 want_microhttpd = get_option('microhttpd')
1038 if want_microhttpd != 'false' and not skip_deps
1039 libmicrohttpd = dependency('libmicrohttpd',
1040 version : '>= 0.9.33',
1041 required : want_microhttpd == 'true')
1042 have = libmicrohttpd.found()
1047 conf.set10('HAVE_MICROHTTPD', have)
1049 want_libcryptsetup = get_option('libcryptsetup')
1050 if want_libcryptsetup != 'false' and not skip_deps
1051 libcryptsetup = dependency('libcryptsetup',
1052 version : '>= 2.0.1',
1053 required : want_libcryptsetup == 'true')
1054 have = libcryptsetup.found()
1056 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1057 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
1058 conf.set10('HAVE_CRYPT_ACTIVATE_BY_SIGNED_KEY',
1059 have and cc.has_function('crypt_activate_by_signed_key', dependencies : libcryptsetup))
1064 conf.set10('HAVE_LIBCRYPTSETUP', have)
1066 want_libcurl = get_option('libcurl')
1067 if want_libcurl != 'false' and not skip_deps
1068 libcurl = dependency('libcurl',
1069 version : '>= 7.32.0',
1070 required : want_libcurl == 'true')
1071 have = libcurl.found()
1076 conf.set10('HAVE_LIBCURL', have)
1078 want_libidn = get_option('libidn')
1079 want_libidn2 = get_option('libidn2')
1080 if want_libidn == 'true' and want_libidn2 == 'true'
1081 error('libidn and libidn2 cannot be requested simultaneously')
1084 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1085 libidn = dependency('libidn2',
1086 required : want_libidn2 == 'true')
1087 have = libidn.found()
1092 conf.set10('HAVE_LIBIDN2', have)
1093 if not have and want_libidn != 'false' and not skip_deps
1094 # libidn is used for both libidn and libidn2 objects
1095 libidn = dependency('libidn',
1096 required : want_libidn == 'true')
1097 have = libidn.found()
1101 conf.set10('HAVE_LIBIDN', have)
1103 want_libiptc = get_option('libiptc')
1104 if want_libiptc != 'false' and not skip_deps
1105 libiptc = dependency('libiptc',
1106 required : want_libiptc == 'true')
1107 have = libiptc.found()
1112 conf.set10('HAVE_LIBIPTC', have)
1114 want_qrencode = get_option('qrencode')
1115 if want_qrencode != 'false' and not skip_deps
1116 libqrencode = dependency('libqrencode',
1117 required : want_qrencode == 'true')
1118 have = libqrencode.found()
1123 conf.set10('HAVE_QRENCODE', have)
1125 want_gcrypt = get_option('gcrypt')
1126 if want_gcrypt != 'false' and not skip_deps
1127 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1128 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1129 have = libgcrypt.found() and libgpg_error.found()
1134 # link to neither of the libs if one is not found
1138 conf.set10('HAVE_GCRYPT', have)
1140 want_gnutls = get_option('gnutls')
1141 if want_gnutls != 'false' and not skip_deps
1142 libgnutls = dependency('gnutls',
1143 version : '>= 3.1.4',
1144 required : want_gnutls == 'true')
1145 have = libgnutls.found()
1150 conf.set10('HAVE_GNUTLS', have)
1152 want_openssl = get_option('openssl')
1153 if want_openssl != 'false' and not skip_deps
1154 libopenssl = dependency('openssl',
1155 version : '>= 1.1.0',
1156 required : want_openssl == 'true')
1157 have = libopenssl.found()
1162 conf.set10('HAVE_OPENSSL', have)
1164 want_p11kit = get_option('p11kit')
1165 if want_p11kit != 'false' and not skip_deps
1166 libp11kit = dependency('p11-kit-1',
1167 version : '>= 0.23.3',
1168 required : want_p11kit == 'true')
1169 have = libp11kit.found()
1174 conf.set10('HAVE_P11KIT', have)
1176 want_libfido2 = get_option('libfido2')
1177 if want_libfido2 != 'false' and not skip_deps
1178 libfido2 = dependency('libfido2',
1179 required : want_libfido2 == 'true')
1180 have = libfido2.found()
1185 conf.set10('HAVE_LIBFIDO2', have)
1187 want_elfutils = get_option('elfutils')
1188 if want_elfutils != 'false' and not skip_deps
1189 libdw = dependency('libdw',
1190 required : want_elfutils == 'true')
1191 have = libdw.found()
1196 conf.set10('HAVE_ELFUTILS', have)
1198 want_zlib = get_option('zlib')
1199 if want_zlib != 'false' and not skip_deps
1200 libz = dependency('zlib',
1201 required : want_zlib == 'true')
1207 conf.set10('HAVE_ZLIB', have)
1209 want_bzip2 = get_option('bzip2')
1210 if want_bzip2 != 'false' and not skip_deps
1211 libbzip2 = cc.find_library('bz2',
1212 required : want_bzip2 == 'true')
1213 have = libbzip2.found()
1218 conf.set10('HAVE_BZIP2', have)
1220 want_xz = get_option('xz')
1221 if want_xz != 'false' and not skip_deps
1222 libxz = dependency('liblzma',
1223 required : want_xz == 'true')
1224 have_xz = libxz.found()
1229 conf.set10('HAVE_XZ', have_xz)
1231 want_lz4 = get_option('lz4')
1232 if want_lz4 != 'false' and not skip_deps
1233 liblz4 = dependency('liblz4',
1234 version : '>= 1.3.0',
1235 required : want_lz4 == 'true')
1236 have_lz4 = liblz4.found()
1241 conf.set10('HAVE_LZ4', have_lz4)
1243 want_zstd = get_option('zstd')
1244 if want_zstd != 'false' and not skip_deps
1245 libzstd = dependency('libzstd',
1246 required : want_zstd == 'true',
1247 version : '>= 1.4.0')
1248 have_zstd = libzstd.found()
1253 conf.set10('HAVE_ZSTD', have_zstd)
1255 conf.set10('HAVE_COMPRESSION', have_xz or have_lz4 or have_zstd)
1257 want_xkbcommon = get_option('xkbcommon')
1258 if want_xkbcommon != 'false' and not skip_deps
1259 libxkbcommon = dependency('xkbcommon',
1260 version : '>= 0.3.0',
1261 required : want_xkbcommon == 'true')
1262 have = libxkbcommon.found()
1267 conf.set10('HAVE_XKBCOMMON', have)
1269 want_pcre2 = get_option('pcre2')
1270 if want_pcre2 != 'false'
1271 libpcre2 = dependency('libpcre2-8',
1272 required : want_pcre2 == 'true')
1273 have = libpcre2.found()
1278 conf.set10('HAVE_PCRE2', have)
1280 want_glib = get_option('glib')
1281 if want_glib != 'false' and not skip_deps
1282 libglib = dependency('glib-2.0',
1283 version : '>= 2.22.0',
1284 required : want_glib == 'true')
1285 libgobject = dependency('gobject-2.0',
1286 version : '>= 2.22.0',
1287 required : want_glib == 'true')
1288 libgio = dependency('gio-2.0',
1289 required : want_glib == 'true')
1290 have = libglib.found() and libgobject.found() and libgio.found()
1297 conf.set10('HAVE_GLIB', have)
1299 want_dbus = get_option('dbus')
1300 if want_dbus != 'false' and not skip_deps
1301 libdbus = dependency('dbus-1',
1302 version : '>= 1.3.2',
1303 required : want_dbus == 'true')
1304 have = libdbus.found()
1309 conf.set10('HAVE_DBUS', have)
1311 default_dnssec = get_option('default-dnssec')
1313 default_dnssec = 'no'
1315 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1316 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1317 default_dnssec = 'no'
1319 conf.set('DEFAULT_DNSSEC_MODE',
1320 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1321 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1323 dns_over_tls = get_option('dns-over-tls')
1324 if dns_over_tls != 'false'
1325 if dns_over_tls == 'openssl'
1328 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1329 if dns_over_tls == 'gnutls' and not have_gnutls
1330 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1333 if dns_over_tls == 'gnutls' or have_gnutls
1334 have_openssl = false
1336 have_openssl = conf.get('HAVE_OPENSSL') == 1
1337 if dns_over_tls != 'auto' and not have_openssl
1338 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1339 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1342 have = have_gnutls or have_openssl
1346 have_openssl = false
1348 conf.set10('ENABLE_DNS_OVER_TLS', have)
1349 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1350 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1352 default_dns_over_tls = get_option('default-dns-over-tls')
1354 default_dns_over_tls = 'no'
1356 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1357 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.')
1358 default_dns_over_tls = 'no'
1360 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1361 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1362 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1364 default_mdns = get_option('default-mdns')
1365 conf.set('DEFAULT_MDNS_MODE',
1366 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
1367 substs.set('DEFAULT_MDNS_MODE', default_mdns)
1369 default_llmnr = get_option('default-llmnr')
1370 conf.set('DEFAULT_LLMNR_MODE',
1371 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
1372 substs.set('DEFAULT_LLMNR_MODE', default_llmnr)
1374 want_repart = get_option('repart')
1375 if want_repart != 'false'
1376 have = (conf.get('HAVE_OPENSSL') == 1 and
1377 conf.get('HAVE_LIBFDISK') == 1)
1378 if want_repart == 'true' and not have
1379 error('repart support was requested, but dependencies are not available')
1384 conf.set10('ENABLE_REPART', have)
1386 want_importd = get_option('importd')
1387 if want_importd != 'false'
1388 have = (conf.get('HAVE_LIBCURL') == 1 and
1389 conf.get('HAVE_ZLIB') == 1 and
1390 conf.get('HAVE_XZ') == 1 and
1391 conf.get('HAVE_GCRYPT') == 1)
1392 if want_importd == 'true' and not have
1393 error('importd support was requested, but dependencies are not available')
1398 conf.set10('ENABLE_IMPORTD', have)
1400 want_homed = get_option('homed')
1401 if want_homed != 'false'
1402 have = (conf.get('HAVE_OPENSSL') == 1 and
1403 conf.get('HAVE_LIBFDISK') == 1 and
1404 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1405 if want_homed == 'true' and not have
1406 error('homed support was requested, but dependencies are not available')
1411 conf.set10('ENABLE_HOMED', have)
1413 have = have and conf.get('HAVE_PAM') == 1
1414 conf.set10('ENABLE_PAM_HOME', have)
1416 want_remote = get_option('remote')
1417 if want_remote != 'false'
1418 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1419 conf.get('HAVE_LIBCURL') == 1]
1420 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1421 # it's possible to build one without the other. Complain only if
1422 # support was explicitly requested. The auxiliary files like sysusers
1423 # config should be installed when any of the programs are built.
1424 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1425 error('remote support was requested, but dependencies are not available')
1427 have = have_deps[0] or have_deps[1]
1431 conf.set10('ENABLE_REMOTE', have)
1433 foreach term : ['analyze',
1470 have = get_option(term)
1471 name = 'ENABLE_' + term.underscorify().to_upper()
1472 conf.set10(name, have)
1475 foreach tuple : [['nss-mymachines', 'machined'],
1476 ['nss-resolve', 'resolve']]
1477 want = get_option(tuple[0])
1479 have = get_option(tuple[1])
1480 if want == 'true' and not have
1481 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1486 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1487 conf.set10(name, have)
1491 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1492 'ENABLE_NSS_MYMACHINES',
1493 'ENABLE_NSS_RESOLVE',
1494 'ENABLE_NSS_SYSTEMD']
1495 if conf.get(term) == 1
1499 conf.set10('ENABLE_NSS', enable_nss)
1501 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1506 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1508 #####################################################################
1510 if get_option('efi')
1511 efi_arch = host_machine.cpu_family()
1513 if efi_arch == 'x86'
1514 EFI_MACHINE_TYPE_NAME = 'ia32'
1515 gnu_efi_arch = 'ia32'
1516 elif efi_arch == 'x86_64'
1517 EFI_MACHINE_TYPE_NAME = 'x64'
1518 gnu_efi_arch = 'x86_64'
1519 elif efi_arch == 'arm'
1520 EFI_MACHINE_TYPE_NAME = 'arm'
1521 gnu_efi_arch = 'arm'
1522 elif efi_arch == 'aarch64'
1523 EFI_MACHINE_TYPE_NAME = 'aa64'
1524 gnu_efi_arch = 'aarch64'
1526 EFI_MACHINE_TYPE_NAME = ''
1531 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1533 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1537 conf.set10('ENABLE_EFI', have)
1539 #####################################################################
1541 config_h = configure_file(
1542 output : 'config.h',
1543 configuration : conf)
1545 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1547 includes = include_directories('src/basic',
1553 'src/journal-remote',
1557 'src/time-wait-sync',
1563 'src/xdg-autostart-generator',
1564 'src/libsystemd/sd-bus',
1565 'src/libsystemd/sd-device',
1566 'src/libsystemd/sd-event',
1567 'src/libsystemd/sd-hwdb',
1568 'src/libsystemd/sd-id128',
1569 'src/libsystemd/sd-netlink',
1570 'src/libsystemd/sd-network',
1571 'src/libsystemd/sd-resolve',
1572 'src/libsystemd-network',
1575 add_project_arguments('-include', 'config.h', language : 'c')
1577 generate_gperfs = find_program('tools/generate-gperfs.py')
1581 subdir('src/systemd')
1583 subdir('src/libsystemd')
1584 subdir('src/libsystemd-network')
1585 subdir('src/journal')
1588 libjournal_core = static_library(
1590 libjournal_core_sources,
1592 include_directories : includes,
1595 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1596 libsystemd = shared_library(
1599 version : libsystemd_version,
1600 include_directories : includes,
1601 link_args : ['-shared',
1602 '-Wl,--version-script=' + libsystemd_sym_path],
1603 link_with : [libbasic,
1605 link_whole : [libsystemd_static,
1607 dependencies : [threads,
1612 link_depends : libsystemd_sym,
1614 install_dir : rootlibdir)
1616 static_libsystemd = get_option('static-libsystemd')
1617 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1619 install_libsystemd_static = static_library(
1622 journal_client_sources,
1624 basic_gcrypt_sources,
1626 include_directories : includes,
1627 build_by_default : static_libsystemd != 'false',
1628 install : static_libsystemd != 'false',
1629 install_dir : rootlibdir,
1630 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1631 dependencies : [threads,
1641 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1643 ############################################################
1645 autosuspend_update_sh = find_program('tools/autosuspend-update.sh')
1646 hwdb_update_sh = find_program('tools/hwdb-update.sh')
1647 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1648 make_directive_index_py = find_program('tools/make-directive-index.py')
1649 make_man_index_py = find_program('tools/make-man-index.py')
1650 syscall_names_update_sh = find_program('tools/syscall-names-update.sh')
1651 xml_helper_py = find_program('tools/xml_helper.py')
1652 update_dbus_docs_py = find_program('tools/update-dbus-docs.py')
1654 ############################################################
1656 # binaries that have --help and are intended for use by humans,
1657 # usually, but not always, installed in /bin.
1658 public_programs = []
1660 subdir('src/libudev')
1661 subdir('src/shared')
1663 subdir('src/shutdown')
1665 subdir('src/network')
1667 subdir('src/analyze')
1668 subdir('src/journal-remote')
1669 subdir('src/coredump')
1670 subdir('src/pstore')
1671 subdir('src/hostname')
1672 subdir('src/import')
1673 subdir('src/partition')
1674 subdir('src/kernel-install')
1675 subdir('src/locale')
1676 subdir('src/machine')
1677 subdir('src/portable')
1678 subdir('src/userdb')
1680 subdir('src/nspawn')
1681 subdir('src/resolve')
1682 subdir('src/timedate')
1683 subdir('src/timesync')
1684 subdir('src/tmpfiles')
1685 subdir('src/vconsole')
1686 subdir('src/boot/efi')
1693 ############################################################
1695 # only static linking apart from libdl, to make sure that the
1696 # module is linked to all libraries that it uses.
1697 test_dlopen = executable(
1701 include_directories : includes,
1702 link_with : [libbasic],
1703 dependencies : [libdl],
1704 build_by_default : want_tests != 'false')
1706 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1707 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h src/nss-systemd/nss-systemd.h'],
1708 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1709 ['resolve', 'ENABLE_NSS_RESOLVE']]
1711 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1715 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1716 version_script_arg = join_paths(project_source_root, sym)
1718 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1719 if tuple.length() > 2
1720 sources += tuple[2].split()
1723 nss = shared_library(
1728 include_directories : includes,
1729 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1730 link_args : ['-Wl,-z,nodelete',
1732 '-Wl,--version-script=' + version_script_arg],
1733 link_with : [libsystemd_static,
1736 dependencies : [threads,
1740 install_dir : rootlibdir)
1742 # We cannot use shared_module because it does not support version suffix.
1743 # Unfortunately shared_library insists on creating the symlink…
1744 meson.add_install_script('sh', '-c',
1745 'rm $DESTDIR@0@/libnss_@1@.so'
1746 .format(rootlibdir, module))
1748 if want_tests != 'false'
1749 test('dlopen-nss_' + module,
1751 # path to dlopen must include a slash
1752 args : nss.full_path())
1757 ############################################################
1762 include_directories : includes,
1763 link_with : [libcore,
1765 dependencies : [versiondep,
1772 install_rpath : rootlibexecdir,
1774 install_dir : rootlibexecdir)
1776 meson.add_install_script(meson_make_symlink,
1777 join_paths(rootlibexecdir, 'systemd'),
1778 join_paths(rootsbindir, 'init'))
1780 public_programs += executable(
1782 systemd_analyze_sources,
1783 include_directories : includes,
1784 link_with : [libcore,
1786 dependencies : [versiondep,
1793 install_rpath : rootlibexecdir,
1794 install : conf.get('ENABLE_ANALYZE'))
1798 systemd_journald_sources,
1799 include_directories : includes,
1800 link_with : [libjournal_core,
1802 dependencies : [threads,
1807 install_rpath : rootlibexecdir,
1809 install_dir : rootlibexecdir)
1811 public_programs += executable(
1813 systemd_cat_sources,
1814 include_directories : includes,
1815 link_with : [libjournal_core,
1817 dependencies : [threads],
1818 install_rpath : rootlibexecdir,
1821 public_programs += executable(
1824 include_directories : includes,
1825 link_with : [libshared],
1826 dependencies : [threads,
1832 install_rpath : rootlibexecdir,
1834 install_dir : rootbindir)
1837 'systemd-getty-generator',
1838 'src/getty-generator/getty-generator.c',
1839 include_directories : includes,
1840 link_with : [libshared],
1841 install_rpath : rootlibexecdir,
1843 install_dir : systemgeneratordir)
1846 'systemd-debug-generator',
1847 'src/debug-generator/debug-generator.c',
1848 include_directories : includes,
1849 link_with : [libshared],
1850 install_rpath : rootlibexecdir,
1852 install_dir : systemgeneratordir)
1855 'systemd-run-generator',
1856 'src/run-generator/run-generator.c',
1857 include_directories : includes,
1858 link_with : [libshared],
1859 install_rpath : rootlibexecdir,
1861 install_dir : systemgeneratordir)
1864 'systemd-fstab-generator',
1865 'src/fstab-generator/fstab-generator.c',
1866 include_directories : includes,
1867 link_with : [libcore_shared,
1869 install_rpath : rootlibexecdir,
1871 install_dir : systemgeneratordir)
1873 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1875 '30-systemd-environment-d-generator',
1876 'src/environment-d-generator/environment-d-generator.c',
1877 include_directories : includes,
1878 link_with : [libshared],
1879 install_rpath : rootlibexecdir,
1881 install_dir : userenvgeneratordir)
1883 meson.add_install_script(meson_make_symlink,
1884 join_paths(sysconfdir, 'environment'),
1885 join_paths(environmentdir, '99-environment.conf'))
1888 if conf.get('ENABLE_HIBERNATE') == 1
1890 'systemd-hibernate-resume-generator',
1891 'src/hibernate-resume/hibernate-resume-generator.c',
1892 include_directories : includes,
1893 link_with : [libshared],
1894 install_rpath : rootlibexecdir,
1896 install_dir : systemgeneratordir)
1899 'systemd-hibernate-resume',
1900 'src/hibernate-resume/hibernate-resume.c',
1901 include_directories : includes,
1902 link_with : [libshared],
1903 install_rpath : rootlibexecdir,
1905 install_dir : rootlibexecdir)
1908 if conf.get('HAVE_BLKID') == 1
1910 'systemd-gpt-auto-generator',
1911 'src/gpt-auto-generator/gpt-auto-generator.c',
1912 'src/shared/blkid-util.h',
1913 include_directories : includes,
1914 link_with : [libshared],
1915 dependencies : libblkid,
1916 install_rpath : rootlibexecdir,
1918 install_dir : systemgeneratordir)
1920 public_programs += executable(
1922 'src/dissect/dissect.c',
1923 include_directories : includes,
1924 link_with : [libshared],
1925 install_rpath : rootlibexecdir,
1929 if conf.get('ENABLE_RESOLVE') == 1
1932 systemd_resolved_sources,
1933 include_directories : includes,
1934 link_with : [libshared,
1936 libsystemd_resolve_core],
1937 dependencies : systemd_resolved_dependencies,
1938 install_rpath : rootlibexecdir,
1940 install_dir : rootlibexecdir)
1942 public_programs += executable(
1945 include_directories : includes,
1946 link_with : [libshared,
1948 libsystemd_resolve_core],
1949 dependencies : [threads,
1953 install_rpath : rootlibexecdir,
1956 meson.add_install_script(meson_make_symlink,
1957 join_paths(bindir, 'resolvectl'),
1958 join_paths(rootsbindir, 'resolvconf'))
1960 meson.add_install_script(meson_make_symlink,
1961 join_paths(bindir, 'resolvectl'),
1962 join_paths(bindir, 'systemd-resolve'))
1965 if conf.get('ENABLE_LOGIND') == 1
1968 systemd_logind_sources,
1969 include_directories : includes,
1970 link_with : [liblogind_core,
1972 dependencies : [threads,
1974 install_rpath : rootlibexecdir,
1976 install_dir : rootlibexecdir)
1978 public_programs += executable(
1981 include_directories : includes,
1982 link_with : [libshared],
1983 dependencies : [threads,
1987 install_rpath : rootlibexecdir,
1989 install_dir : rootbindir)
1991 public_programs += executable(
1993 'src/login/inhibit.c',
1994 include_directories : includes,
1995 link_with : [libshared],
1996 install_rpath : rootlibexecdir,
1998 install_dir : rootbindir)
2000 if conf.get('HAVE_PAM') == 1
2001 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
2002 pam_systemd = shared_library(
2006 include_directories : includes,
2007 link_args : ['-shared',
2008 '-Wl,--version-script=' + version_script_arg],
2009 link_with : [libsystemd_static,
2011 dependencies : [threads,
2014 link_depends : pam_systemd_sym,
2016 install_dir : pamlibdir)
2018 if want_tests != 'false'
2019 test('dlopen-pam_systemd',
2021 # path to dlopen must include a slash
2022 args : pam_systemd.full_path())
2027 'systemd-user-runtime-dir',
2028 user_runtime_dir_sources,
2029 include_directories : includes,
2030 link_with : [libshared],
2031 install_rpath : rootlibexecdir,
2033 install_dir : rootlibexecdir)
2036 if conf.get('HAVE_PAM') == 1
2038 'systemd-user-sessions',
2039 'src/user-sessions/user-sessions.c',
2040 include_directories : includes,
2041 link_with : [libshared],
2042 install_rpath : rootlibexecdir,
2044 install_dir : rootlibexecdir)
2047 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
2048 public_programs += executable(
2050 'src/boot/bootctl.c',
2051 include_directories : includes,
2052 link_with : [libshared],
2053 dependencies : [libblkid],
2054 install_rpath : rootlibexecdir,
2057 public_programs += executable(
2058 'systemd-bless-boot',
2059 'src/boot/bless-boot.c',
2060 include_directories : includes,
2061 link_with : [libshared],
2062 dependencies : [libblkid],
2063 install_rpath : rootlibexecdir,
2065 install_dir : rootlibexecdir)
2068 'systemd-bless-boot-generator',
2069 'src/boot/bless-boot-generator.c',
2070 include_directories : includes,
2071 link_with : [libshared],
2072 install_rpath : rootlibexecdir,
2074 install_dir : systemgeneratordir)
2078 'systemd-boot-check-no-failures',
2079 'src/boot/boot-check-no-failures.c',
2080 include_directories : includes,
2081 link_with : [libshared],
2082 dependencies : [libblkid],
2083 install_rpath : rootlibexecdir,
2085 install_dir : rootlibexecdir)
2087 public_programs += executable(
2088 'systemd-socket-activate',
2089 'src/activate/activate.c',
2090 include_directories : includes,
2091 link_with : [libshared],
2092 dependencies : [threads],
2093 install_rpath : rootlibexecdir,
2096 if get_option('link-systemctl-shared')
2097 systemctl_link_with = [libshared]
2099 systemctl_link_with = [libsystemd_static,
2105 public_programs += executable(
2107 'src/systemctl/systemctl.c',
2108 'src/systemctl/sysv-compat.h',
2109 'src/systemctl/sysv-compat.c',
2110 include_directories : includes,
2111 link_with : systemctl_link_with,
2112 dependencies : [threads,
2118 install_rpath : rootlibexecdir,
2120 install_dir : rootbindir)
2122 if conf.get('ENABLE_PORTABLED') == 1
2124 'systemd-portabled',
2125 systemd_portabled_sources,
2126 include_directories : includes,
2127 link_with : [libshared],
2128 dependencies : [threads],
2129 install_rpath : rootlibexecdir,
2131 install_dir : rootlibexecdir)
2133 public_programs += executable(
2135 'src/portable/portablectl.c',
2136 include_directories : includes,
2137 link_with : [libshared],
2138 dependencies : [threads],
2139 install_rpath : rootlibexecdir,
2141 install_dir : rootbindir)
2144 if conf.get('ENABLE_USERDB') == 1
2147 systemd_userwork_sources,
2148 include_directories : includes,
2149 link_with : [libshared],
2150 dependencies : [threads],
2151 install_rpath : rootlibexecdir,
2153 install_dir : rootlibexecdir)
2157 systemd_userdbd_sources,
2158 include_directories : includes,
2159 link_with : [libshared],
2160 dependencies : [threads],
2161 install_rpath : rootlibexecdir,
2163 install_dir : rootlibexecdir)
2165 public_programs += executable(
2168 include_directories : includes,
2169 link_with : [libshared],
2170 dependencies : [threads],
2171 install_rpath : rootlibexecdir,
2173 install_dir : rootbindir)
2176 if conf.get('ENABLE_HOMED') == 1
2179 systemd_homework_sources,
2180 include_directories : includes,
2181 link_with : [libshared],
2182 dependencies : [threads,
2190 install_rpath : rootlibexecdir,
2192 install_dir : rootlibexecdir)
2196 systemd_homed_sources,
2197 include_directories : includes,
2198 link_with : [libshared],
2199 dependencies : [threads,
2202 install_rpath : rootlibexecdir,
2204 install_dir : rootlibexecdir)
2206 public_programs += executable(
2209 include_directories : includes,
2210 link_with : [libshared],
2211 dependencies : [threads,
2217 install_rpath : rootlibexecdir,
2219 install_dir : rootbindir)
2221 if conf.get('HAVE_PAM') == 1
2222 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2223 pam_systemd = shared_library(
2227 include_directories : includes,
2228 link_args : ['-shared',
2229 '-Wl,--version-script=' + version_script_arg],
2230 link_with : [libsystemd_static,
2232 dependencies : [threads,
2236 link_depends : pam_systemd_home_sym,
2238 install_dir : pamlibdir)
2242 foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
2243 (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
2244 meson.add_install_script(meson_make_symlink,
2245 join_paths(rootbindir, 'systemctl'),
2246 join_paths(rootsbindir, alias))
2249 meson.add_install_script(meson_make_symlink,
2250 join_paths(rootbindir, 'udevadm'),
2251 join_paths(rootlibexecdir, 'systemd-udevd'))
2253 if conf.get('ENABLE_BACKLIGHT') == 1
2255 'systemd-backlight',
2256 'src/backlight/backlight.c',
2257 include_directories : includes,
2258 link_with : [libshared],
2259 install_rpath : rootlibexecdir,
2261 install_dir : rootlibexecdir)
2264 if conf.get('ENABLE_RFKILL') == 1
2267 'src/rfkill/rfkill.c',
2268 include_directories : includes,
2269 link_with : [libshared],
2270 install_rpath : rootlibexecdir,
2272 install_dir : rootlibexecdir)
2276 'systemd-system-update-generator',
2277 'src/system-update-generator/system-update-generator.c',
2278 include_directories : includes,
2279 link_with : [libshared],
2280 install_rpath : rootlibexecdir,
2282 install_dir : systemgeneratordir)
2284 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2285 systemd_cryptsetup_sources = files('''
2286 src/cryptsetup/cryptsetup-pkcs11.h
2287 src/cryptsetup/cryptsetup-keyfile.c
2288 src/cryptsetup/cryptsetup-keyfile.h
2289 src/cryptsetup/cryptsetup.c
2292 if conf.get('HAVE_P11KIT') == 1
2293 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2297 'systemd-cryptsetup',
2298 systemd_cryptsetup_sources,
2299 include_directories : includes,
2300 link_with : [libshared],
2301 dependencies : [libcryptsetup,
2303 install_rpath : rootlibexecdir,
2305 install_dir : rootlibexecdir)
2308 'systemd-cryptsetup-generator',
2309 'src/cryptsetup/cryptsetup-generator.c',
2310 include_directories : includes,
2311 link_with : [libshared],
2312 install_rpath : rootlibexecdir,
2314 install_dir : systemgeneratordir)
2317 'systemd-veritysetup',
2318 'src/veritysetup/veritysetup.c',
2319 include_directories : includes,
2320 link_with : [libshared],
2321 dependencies : [libcryptsetup],
2322 install_rpath : rootlibexecdir,
2324 install_dir : rootlibexecdir)
2327 'systemd-veritysetup-generator',
2328 'src/veritysetup/veritysetup-generator.c',
2329 include_directories : includes,
2330 link_with : [libshared],
2331 install_rpath : rootlibexecdir,
2333 install_dir : systemgeneratordir)
2336 if conf.get('HAVE_SYSV_COMPAT') == 1
2338 'systemd-sysv-generator',
2339 'src/sysv-generator/sysv-generator.c',
2340 include_directories : includes,
2341 link_with : [libshared],
2342 install_rpath : rootlibexecdir,
2344 install_dir : systemgeneratordir)
2347 'systemd-rc-local-generator',
2348 'src/rc-local-generator/rc-local-generator.c',
2349 include_directories : includes,
2350 link_with : [libshared],
2351 install_rpath : rootlibexecdir,
2353 install_dir : systemgeneratordir)
2356 if conf.get('ENABLE_XDG_AUTOSTART') == 1
2358 'systemd-xdg-autostart-generator',
2359 'src/xdg-autostart-generator/xdg-autostart-generator.c',
2360 'src/xdg-autostart-generator/xdg-autostart-service.c',
2361 include_directories : includes,
2362 link_with : [libshared],
2363 install_rpath : rootlibexecdir,
2365 install_dir : usergeneratordir)
2368 'systemd-xdg-autostart-condition',
2369 'src/xdg-autostart-generator/xdg-autostart-condition.c',
2370 include_directories : includes,
2371 link_with : [libshared],
2372 install_rpath : rootlibexecdir,
2374 install_dir : rootlibexecdir)
2377 if conf.get('ENABLE_HOSTNAMED') == 1
2379 'systemd-hostnamed',
2380 'src/hostname/hostnamed.c',
2381 include_directories : includes,
2382 link_with : [libshared],
2383 install_rpath : rootlibexecdir,
2385 install_dir : rootlibexecdir)
2387 public_programs += executable(
2389 'src/hostname/hostnamectl.c',
2390 include_directories : includes,
2391 link_with : [libshared],
2392 install_rpath : rootlibexecdir,
2396 if conf.get('ENABLE_LOCALED') == 1
2397 if conf.get('HAVE_XKBCOMMON') == 1
2398 # logind will load libxkbcommon.so dynamically on its own
2406 systemd_localed_sources,
2407 include_directories : includes,
2408 link_with : [libshared],
2409 dependencies : deps,
2410 install_rpath : rootlibexecdir,
2412 install_dir : rootlibexecdir)
2414 public_programs += executable(
2417 include_directories : includes,
2418 link_with : [libshared],
2419 install_rpath : rootlibexecdir,
2423 if conf.get('ENABLE_TIMEDATED') == 1
2425 'systemd-timedated',
2426 'src/timedate/timedated.c',
2427 include_directories : includes,
2428 link_with : [libshared],
2429 install_rpath : rootlibexecdir,
2431 install_dir : rootlibexecdir)
2434 if conf.get('ENABLE_TIMEDATECTL') == 1
2435 public_programs += executable(
2437 'src/timedate/timedatectl.c',
2438 include_directories : includes,
2439 install_rpath : rootlibexecdir,
2440 link_with : [libshared],
2441 dependencies : [libm],
2445 if conf.get('ENABLE_TIMESYNCD') == 1
2446 if get_option('link-timesyncd-shared')
2447 timesyncd_link_with = [libshared]
2449 timesyncd_link_with = [libsystemd_static,
2456 'systemd-timesyncd',
2457 systemd_timesyncd_sources,
2458 include_directories : includes,
2459 link_with : [timesyncd_link_with],
2460 dependencies : [threads,
2462 install_rpath : rootlibexecdir,
2464 install_dir : rootlibexecdir)
2467 'systemd-time-wait-sync',
2468 'src/time-wait-sync/time-wait-sync.c',
2469 include_directories : includes,
2470 link_with : [timesyncd_link_with],
2471 install_rpath : rootlibexecdir,
2473 install_dir : rootlibexecdir)
2476 if conf.get('ENABLE_MACHINED') == 1
2479 systemd_machined_sources,
2480 include_directories : includes,
2481 link_with : [libmachine_core,
2483 install_rpath : rootlibexecdir,
2485 install_dir : rootlibexecdir)
2487 public_programs += executable(
2489 'src/machine/machinectl.c',
2490 include_directories : includes,
2491 link_with : [libshared],
2492 dependencies : [threads,
2496 install_rpath : rootlibexecdir,
2498 install_dir : rootbindir)
2501 if conf.get('ENABLE_IMPORTD') == 1
2504 systemd_importd_sources,
2505 include_directories : includes,
2506 link_with : [libshared],
2507 dependencies : [threads],
2508 install_rpath : rootlibexecdir,
2510 install_dir : rootlibexecdir)
2512 systemd_pull = executable(
2514 systemd_pull_sources,
2515 include_directories : includes,
2516 link_with : [libshared],
2517 dependencies : [versiondep,
2523 install_rpath : rootlibexecdir,
2525 install_dir : rootlibexecdir)
2527 systemd_import = executable(
2529 systemd_import_sources,
2530 include_directories : includes,
2531 link_with : [libshared],
2532 dependencies : [libcurl,
2536 install_rpath : rootlibexecdir,
2538 install_dir : rootlibexecdir)
2540 systemd_import_fs = executable(
2541 'systemd-import-fs',
2542 systemd_import_fs_sources,
2543 include_directories : includes,
2544 link_with : [libshared],
2545 install_rpath : rootlibexecdir,
2547 install_dir : rootlibexecdir)
2549 systemd_export = executable(
2551 systemd_export_sources,
2552 include_directories : includes,
2553 link_with : [libshared],
2554 dependencies : [libcurl,
2558 install_rpath : rootlibexecdir,
2560 install_dir : rootlibexecdir)
2562 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2565 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2566 public_programs += executable(
2567 'systemd-journal-upload',
2568 systemd_journal_upload_sources,
2569 include_directories : includes,
2570 link_with : [libshared],
2571 dependencies : [versiondep,
2578 install_rpath : rootlibexecdir,
2580 install_dir : rootlibexecdir)
2583 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2584 public_programs += executable(
2585 'systemd-journal-remote',
2586 systemd_journal_remote_sources,
2587 include_directories : includes,
2588 link_with : [libshared,
2589 libsystemd_journal_remote],
2590 dependencies : [threads,
2596 install_rpath : rootlibexecdir,
2598 install_dir : rootlibexecdir)
2600 public_programs += executable(
2601 'systemd-journal-gatewayd',
2602 systemd_journal_gatewayd_sources,
2603 include_directories : includes,
2604 link_with : [libshared],
2605 dependencies : [threads,
2611 install_rpath : rootlibexecdir,
2613 install_dir : rootlibexecdir)
2616 if conf.get('ENABLE_COREDUMP') == 1
2619 systemd_coredump_sources,
2620 include_directories : includes,
2621 link_with : [libshared],
2622 dependencies : [threads,
2628 install_rpath : rootlibexecdir,
2630 install_dir : rootlibexecdir)
2632 public_programs += executable(
2634 coredumpctl_sources,
2635 include_directories : includes,
2636 link_with : [libshared],
2637 dependencies : [threads,
2641 install_rpath : rootlibexecdir,
2645 if conf.get('ENABLE_PSTORE') == 1
2648 systemd_pstore_sources,
2649 include_directories : includes,
2650 link_with : [libshared],
2651 dependencies : [threads,
2657 install_rpath : rootlibexecdir,
2659 install_dir : rootlibexecdir)
2662 if conf.get('ENABLE_BINFMT') == 1
2663 public_programs += executable(
2665 'src/binfmt/binfmt.c',
2666 include_directories : includes,
2667 link_with : [libshared],
2668 install_rpath : rootlibexecdir,
2670 install_dir : rootlibexecdir)
2672 meson.add_install_script('sh', '-c',
2673 mkdir_p.format(binfmtdir))
2674 meson.add_install_script('sh', '-c',
2675 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2678 if conf.get('ENABLE_REPART') == 1
2681 systemd_repart_sources,
2682 include_directories : includes,
2683 link_with : [libshared],
2684 dependencies : [threads,
2688 install_rpath : rootlibexecdir,
2690 install_dir : rootbindir)
2691 public_programs += exe
2693 if want_tests != 'false'
2696 args : exe.full_path())
2700 if conf.get('ENABLE_VCONSOLE') == 1
2702 'systemd-vconsole-setup',
2703 'src/vconsole/vconsole-setup.c',
2704 include_directories : includes,
2705 link_with : [libshared],
2706 install_rpath : rootlibexecdir,
2708 install_dir : rootlibexecdir)
2711 if conf.get('ENABLE_RANDOMSEED') == 1
2713 'systemd-random-seed',
2714 'src/random-seed/random-seed.c',
2715 include_directories : includes,
2716 link_with : [libshared],
2717 install_rpath : rootlibexecdir,
2719 install_dir : rootlibexecdir)
2722 if conf.get('ENABLE_FIRSTBOOT') == 1
2724 'systemd-firstboot',
2725 'src/firstboot/firstboot.c',
2726 include_directories : includes,
2727 link_with : [libshared],
2728 dependencies : [libcrypt],
2729 install_rpath : rootlibexecdir,
2731 install_dir : rootbindir)
2735 'systemd-remount-fs',
2736 'src/remount-fs/remount-fs.c',
2737 include_directories : includes,
2738 link_with : [libcore_shared,
2740 install_rpath : rootlibexecdir,
2742 install_dir : rootlibexecdir)
2745 'systemd-machine-id-setup',
2746 'src/machine-id-setup/machine-id-setup-main.c',
2747 include_directories : includes,
2748 link_with : [libcore_shared,
2750 install_rpath : rootlibexecdir,
2752 install_dir : rootbindir)
2757 include_directories : includes,
2758 link_with : [libshared],
2759 install_rpath : rootlibexecdir,
2761 install_dir : rootlibexecdir)
2763 executable('systemd-growfs',
2764 'src/partition/growfs.c',
2765 include_directories : includes,
2766 link_with : [libshared],
2767 install_rpath : rootlibexecdir,
2769 install_dir : rootlibexecdir)
2773 'src/partition/makefs.c',
2774 include_directories : includes,
2775 link_with : [libshared],
2776 install_rpath : rootlibexecdir,
2778 install_dir : rootlibexecdir)
2782 'src/sleep/sleep.c',
2783 include_directories : includes,
2784 link_with : [libshared],
2785 install_rpath : rootlibexecdir,
2787 install_dir : rootlibexecdir)
2789 install_data('src/sleep/sleep.conf',
2790 install_dir : pkgsysconfdir)
2792 public_programs += executable(
2794 'src/sysctl/sysctl.c',
2795 include_directories : includes,
2796 link_with : [libshared],
2797 install_rpath : rootlibexecdir,
2799 install_dir : rootlibexecdir)
2803 'src/ac-power/ac-power.c',
2804 include_directories : includes,
2805 link_with : [libshared],
2806 install_rpath : rootlibexecdir,
2808 install_dir : rootlibexecdir)
2810 public_programs += executable(
2811 'systemd-detect-virt',
2812 'src/detect-virt/detect-virt.c',
2813 include_directories : includes,
2814 link_with : [libshared],
2815 install_rpath : rootlibexecdir,
2818 public_programs += executable(
2820 'src/delta/delta.c',
2821 include_directories : includes,
2822 link_with : [libshared],
2823 install_rpath : rootlibexecdir,
2826 public_programs += executable(
2828 'src/escape/escape.c',
2829 include_directories : includes,
2830 link_with : [libshared],
2831 install_rpath : rootlibexecdir,
2833 install_dir : rootbindir)
2835 public_programs += executable(
2837 'src/notify/notify.c',
2838 include_directories : includes,
2839 link_with : [libshared],
2840 install_rpath : rootlibexecdir,
2842 install_dir : rootbindir)
2845 'systemd-volatile-root',
2846 'src/volatile-root/volatile-root.c',
2847 include_directories : includes,
2848 link_with : [libshared],
2849 install_rpath : rootlibexecdir,
2850 install : conf.get('ENABLE_INITRD') == 1,
2851 install_dir : rootlibexecdir)
2854 'systemd-cgroups-agent',
2855 'src/cgroups-agent/cgroups-agent.c',
2856 include_directories : includes,
2857 link_with : [libshared],
2858 install_rpath : rootlibexecdir,
2860 install_dir : rootlibexecdir)
2862 public_programs += executable(
2864 'src/id128/id128.c',
2865 include_directories : includes,
2866 link_with : [libshared],
2867 install_rpath : rootlibexecdir,
2870 public_programs += executable(
2873 include_directories : includes,
2874 link_with : [libshared],
2875 install_rpath : rootlibexecdir,
2878 public_programs += executable(
2879 'systemd-ask-password',
2880 'src/ask-password/ask-password.c',
2881 include_directories : includes,
2882 link_with : [libshared],
2883 install_rpath : rootlibexecdir,
2885 install_dir : rootbindir)
2888 'systemd-reply-password',
2889 'src/reply-password/reply-password.c',
2890 include_directories : includes,
2891 link_with : [libshared],
2892 install_rpath : rootlibexecdir,
2894 install_dir : rootlibexecdir)
2896 public_programs += executable(
2897 'systemd-tty-ask-password-agent',
2898 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2899 include_directories : includes,
2900 link_with : [libshared],
2901 install_rpath : rootlibexecdir,
2903 install_dir : rootbindir)
2905 public_programs += executable(
2908 include_directories : includes,
2909 link_with : [libshared],
2910 install_rpath : rootlibexecdir,
2913 public_programs += executable(
2915 'src/cgtop/cgtop.c',
2916 include_directories : includes,
2917 link_with : [libshared],
2918 install_rpath : rootlibexecdir,
2923 'src/initctl/initctl.c',
2924 include_directories : includes,
2925 link_with : [libshared],
2926 install_rpath : rootlibexecdir,
2927 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
2928 install_dir : rootlibexecdir)
2930 public_programs += executable(
2932 'src/mount/mount-tool.c',
2933 include_directories : includes,
2934 link_with : [libshared],
2935 dependencies: [libmount],
2936 install_rpath : rootlibexecdir,
2939 meson.add_install_script(meson_make_symlink,
2940 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2942 public_programs += executable(
2945 include_directories : includes,
2946 link_with : [libshared],
2947 install_rpath : rootlibexecdir,
2950 public_programs += executable(
2951 'systemd-stdio-bridge',
2952 'src/stdio-bridge/stdio-bridge.c',
2953 include_directories : includes,
2954 link_with : [libshared],
2955 dependencies : [versiondep],
2956 install_rpath : rootlibexecdir,
2959 public_programs += executable(
2961 'src/busctl/busctl.c',
2962 'src/busctl/busctl-introspect.c',
2963 'src/busctl/busctl-introspect.h',
2964 include_directories : includes,
2965 link_with : [libshared],
2966 install_rpath : rootlibexecdir,
2969 if conf.get('ENABLE_SYSUSERS') == 1
2970 public_programs += executable(
2972 'src/sysusers/sysusers.c',
2973 include_directories : includes,
2974 link_with : [libshared],
2975 install_rpath : rootlibexecdir,
2977 install_dir : rootbindir)
2979 if have_standalone_binaries
2980 public_programs += executable(
2981 'systemd-sysusers.standalone',
2982 'src/sysusers/sysusers.c',
2983 include_directories : includes,
2984 link_with : [libshared_static,
2990 install_dir : rootbindir)
2994 if conf.get('ENABLE_TMPFILES') == 1
2997 systemd_tmpfiles_sources,
2998 include_directories : includes,
2999 link_with : [libshared],
3000 dependencies : [libacl],
3001 install_rpath : rootlibexecdir,
3003 install_dir : rootbindir)
3004 public_programs += exe
3006 if want_tests != 'false'
3007 test('test-systemd-tmpfiles',
3008 test_systemd_tmpfiles_py,
3009 # https://github.com/mesonbuild/meson/issues/2681
3010 args : exe.full_path())
3013 if have_standalone_binaries
3014 public_programs += executable(
3015 'systemd-tmpfiles.standalone',
3016 systemd_tmpfiles_sources,
3017 include_directories : includes,
3018 link_with : [libshared_static,
3023 dependencies : [libacl],
3025 install_dir : rootbindir)
3029 if conf.get('ENABLE_HWDB') == 1
3030 public_programs += executable(
3033 'src/libsystemd/sd-hwdb/hwdb-internal.h',
3034 include_directories : includes,
3035 link_with : [libudev_static],
3036 install_rpath : udev_rpath,
3038 install_dir : rootbindir)
3041 if conf.get('ENABLE_QUOTACHECK') == 1
3043 'systemd-quotacheck',
3044 'src/quotacheck/quotacheck.c',
3045 include_directories : includes,
3046 link_with : [libshared],
3047 install_rpath : rootlibexecdir,
3049 install_dir : rootlibexecdir)
3052 public_programs += executable(
3053 'systemd-socket-proxyd',
3054 'src/socket-proxy/socket-proxyd.c',
3055 include_directories : includes,
3056 link_with : [libshared],
3057 dependencies : [threads],
3058 install_rpath : rootlibexecdir,
3060 install_dir : rootlibexecdir)
3062 public_programs += executable(
3065 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
3066 include_directories : includes,
3067 link_with : [libudev_core,
3070 dependencies : [versiondep,
3076 install_rpath : udev_rpath,
3078 install_dir : rootbindir)
3082 systemd_shutdown_sources,
3083 include_directories : includes,
3084 link_with : [libcore_shared,
3086 dependencies : [libmount],
3087 install_rpath : rootlibexecdir,
3089 install_dir : rootlibexecdir)
3092 'systemd-update-done',
3093 'src/update-done/update-done.c',
3094 include_directories : includes,
3095 link_with : [libshared],
3096 install_rpath : rootlibexecdir,
3098 install_dir : rootlibexecdir)
3101 'systemd-update-utmp',
3102 'src/update-utmp/update-utmp.c',
3103 include_directories : includes,
3104 link_with : [libshared],
3105 dependencies : [libaudit],
3106 install_rpath : rootlibexecdir,
3107 install : (conf.get('ENABLE_UTMP') == 1),
3108 install_dir : rootlibexecdir)
3110 if conf.get('HAVE_KMOD') == 1
3112 'systemd-modules-load',
3113 'src/modules-load/modules-load.c',
3114 include_directories : includes,
3115 link_with : [libshared],
3116 dependencies : [libkmod],
3117 install_rpath : rootlibexecdir,
3119 install_dir : rootlibexecdir)
3121 meson.add_install_script('sh', '-c',
3122 mkdir_p.format(modulesloaddir))
3123 meson.add_install_script('sh', '-c',
3124 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
3127 public_programs += executable(
3129 systemd_nspawn_sources,
3130 include_directories : includes,
3131 link_with : [libcore_shared,
3134 dependencies : [libblkid,
3136 install_rpath : rootlibexecdir,
3139 if conf.get('ENABLE_NETWORKD') == 1
3142 systemd_networkd_sources,
3143 include_directories : network_include_dir,
3144 link_with : [libnetworkd_core,
3147 networkd_link_with],
3148 dependencies : [threads],
3149 install_rpath : rootlibexecdir,
3151 install_dir : rootlibexecdir)
3154 'systemd-networkd-wait-online',
3155 systemd_networkd_wait_online_sources,
3156 include_directories : includes,
3157 link_with : [libnetworkd_core,
3158 networkd_link_with],
3159 install_rpath : rootlibexecdir,
3161 install_dir : rootlibexecdir)
3163 public_programs += executable(
3166 include_directories : includes,
3167 link_with : [libsystemd_network,
3168 networkd_link_with],
3169 install_rpath : rootlibexecdir,
3171 install_dir : rootbindir)
3174 'systemd-network-generator',
3175 network_generator_sources,
3176 include_directories : includes,
3177 link_with : [networkd_link_with],
3178 install_rpath : rootlibexecdir,
3180 install_dir : rootlibexecdir)
3182 if want_tests != 'false'
3183 test('test-network-generator-conversion',
3184 test_network_generator_conversion_sh,
3185 # https://github.com/mesonbuild/meson/issues/2681
3186 args : exe.full_path())
3191 'systemd-sulogin-shell',
3192 ['src/sulogin-shell/sulogin-shell.c'],
3193 include_directories : includes,
3194 link_with : [libshared],
3195 install_rpath : rootlibexecdir,
3197 install_dir : rootlibexecdir)
3199 ############################################################
3202 'systemd-runtest.env',
3203 output : 'systemd-runtest.env',
3204 command : ['sh', '-c', '{ ' +
3205 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
3206 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
3208 build_by_default : true)
3210 foreach tuple : tests
3212 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3213 dependencies = tuple[2]
3214 condition = tuple.length() >= 4 ? tuple[3] : ''
3215 type = tuple.length() >= 5 ? tuple[4] : ''
3216 defs = tuple.length() >= 6 ? tuple[5] : []
3217 incs = tuple.length() >= 7 ? tuple[6] : includes
3220 name = sources[0].split('/')[-1].split('.')[0]
3221 if type.startswith('timeout=')
3222 timeout = type.split('=')[1].to_int()
3226 if condition == '' or conf.get(condition) == 1
3230 include_directories : incs,
3231 link_with : link_with,
3232 dependencies : [versiondep,
3235 build_by_default : want_tests != 'false',
3236 install_rpath : rootlibexecdir,
3237 install : install_tests,
3238 install_dir : join_paths(testsdir, type))
3241 message('@0@ is a manual test'.format(name))
3242 elif type == 'unsafe' and want_tests != 'unsafe'
3243 message('@0@ is an unsafe test'.format(name))
3244 elif want_tests != 'false'
3250 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3255 'test-libsystemd-sym',
3256 test_libsystemd_sym_c,
3257 include_directories : includes,
3258 link_with : [libsystemd],
3259 build_by_default : want_tests != 'false',
3260 install : install_tests,
3261 install_dir : testsdir)
3262 if want_tests != 'false'
3263 test('test-libsystemd-sym', exe)
3267 'test-libsystemd-static-sym',
3268 test_libsystemd_sym_c,
3269 include_directories : includes,
3270 link_with : [install_libsystemd_static],
3271 dependencies : [threads], # threads is already included in dependencies on the library,
3272 # but does not seem to get propagated. Add here as a work-around.
3273 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3274 install : install_tests and static_libsystemd_pic,
3275 install_dir : testsdir)
3276 if want_tests != 'false' and static_libsystemd_pic
3277 test('test-libsystemd-static-sym', exe)
3283 include_directories : includes,
3284 c_args : '-Wno-deprecated-declarations',
3285 link_with : [libudev],
3286 build_by_default : want_tests != 'false',
3287 install : install_tests,
3288 install_dir : testsdir)
3289 if want_tests != 'false'
3290 test('test-libudev-sym', exe)
3294 'test-libudev-static-sym',
3296 include_directories : includes,
3297 c_args : '-Wno-deprecated-declarations',
3298 link_with : [install_libudev_static],
3299 build_by_default : want_tests != 'false' and static_libudev_pic,
3300 install : install_tests and static_libudev_pic,
3301 install_dir : testsdir)
3302 if want_tests != 'false' and static_libudev_pic
3303 test('test-libudev-static-sym', exe)
3306 ############################################################
3310 if get_option('tests') != 'false'
3311 foreach tuple : fuzzers
3313 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3314 dependencies = tuple[2]
3315 defs = tuple.length() >= 4 ? tuple[3] : []
3316 incs = tuple.length() >= 5 ? tuple[4] : includes
3320 dependencies += fuzzing_engine
3322 if fuzzing_engine.found()
3323 dependencies += fuzzing_engine
3325 link_args += ['-fsanitize=fuzzer']
3328 sources += 'src/fuzz/fuzz-main.c'
3331 name = sources[0].split('/')[-1].split('.')[0]
3333 fuzzer_exes += executable(
3336 include_directories : [incs, include_directories('src/fuzz')],
3337 link_with : link_with,
3338 dependencies : dependencies,
3340 link_args: link_args,
3347 depends : fuzzer_exes,
3350 ############################################################
3353 subdir('sysusers.d')
3354 subdir('tmpfiles.d')
3360 subdir('shell-completion/bash')
3361 subdir('shell-completion/zsh')
3362 subdir('docs/sysvinit')
3363 subdir('docs/var-log')
3365 install_subdir('factory/etc',
3366 install_dir : factorydir)
3368 install_data('xorg/50-systemd-user.sh',
3369 install_dir : xinitrcdir)
3370 install_data('modprobe.d/systemd.conf',
3371 install_dir : modprobedir)
3372 install_data('LICENSE.GPL2',
3376 'docs/CODING_STYLE.md',
3377 'docs/DISTRO_PORTING.md',
3378 'docs/ENVIRONMENT.md',
3380 'docs/TRANSIENT-SETTINGS.md',
3381 'docs/TRANSLATORS.md',
3382 'docs/UIDS-GIDS.md',
3383 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3384 install_dir : docdir)
3386 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3387 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3389 ############################################################
3391 check_help = find_program('tools/check-help.sh')
3393 foreach exec : public_programs
3394 name = exec.full_path().split('/')[-1]
3395 if want_tests != 'false'
3396 test('check-help-' + name,
3398 args : exec.full_path())
3402 ############################################################
3404 check_directives_sh = find_program('tools/check-directives.sh')
3406 if want_tests != 'false'
3407 test('check-directives',
3408 check_directives_sh,
3409 args : project_source_root)
3412 ############################################################
3414 # Enable tests for all supported sanitizers
3415 foreach tuple : sanitizers
3416 sanitizer = tuple[0]
3419 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3421 foreach p : fuzz_regression_tests
3422 b = p.split('/')[-2]
3423 c = p.split('/')[-1]
3425 name = '@0@:@1@'.format(b, sanitizer)
3428 if want_tests == 'false'
3429 message('Not compiling @0@ because tests is set to false'.format(name))
3430 elif slow_tests or fuzz_tests
3431 exe = custom_target(
3435 command : [env, 'ln', '-fs',
3436 join_paths(build.full_path(), b),
3438 build_by_default : true)
3440 message('Not compiling @0@ because slow-tests/fuzz-tests is set to false'.format(name))
3445 if want_tests != 'false' and (slow_tests or fuzz_tests)
3446 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3448 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
3450 args : [exe.full_path(),
3451 join_paths(project_source_root, p)])
3458 ############################################################
3461 all_files = run_command(
3463 ['--git-dir=@0@/.git'.format(project_source_root),
3466 all_files = files(all_files.stdout().split())
3471 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3474 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3478 git_contrib_sh = find_program('tools/git-contrib.sh')
3481 command : [git_contrib_sh])
3485 git_head = run_command(
3487 ['--git-dir=@0@/.git'.format(project_source_root),
3488 'rev-parse', 'HEAD']).stdout().strip()
3489 git_head_short = run_command(
3491 ['--git-dir=@0@/.git'.format(project_source_root),
3492 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3496 command : ['git', 'archive',
3497 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3499 '--prefix', 'systemd-@0@/'.format(git_head),
3503 ############################################################
3505 check_api_docs_sh = find_program('tools/check-api-docs.sh')
3508 depends : [man, libsystemd, libudev],
3509 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3511 ############################################################
3512 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3515 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3517 'build mode: @0@'.format(get_option('mode')),
3518 'split /usr: @0@'.format(split_usr),
3519 'split bin-sbin: @0@'.format(split_bin),
3520 'prefix directory: @0@'.format(prefixdir),
3521 'rootprefix directory: @0@'.format(rootprefixdir),
3522 'sysconf directory: @0@'.format(sysconfdir),
3523 'include directory: @0@'.format(includedir),
3524 'lib directory: @0@'.format(libdir),
3525 'rootlib directory: @0@'.format(rootlibdir),
3526 'SysV init scripts: @0@'.format(sysvinit_path),
3527 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3528 'PAM modules directory: @0@'.format(pamlibdir),
3529 'PAM configuration directory: @0@'.format(pamconfdir),
3530 'RPM macros directory: @0@'.format(rpmmacrosdir),
3531 'modprobe.d directory: @0@'.format(modprobedir),
3532 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3533 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3534 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3535 'bash completions directory: @0@'.format(bashcompletiondir),
3536 'zsh completions directory: @0@'.format(zshcompletiondir),
3537 'extra start script: @0@'.format(get_option('rc-local')),
3538 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3539 get_option('debug-tty')),
3540 'TTY GID: @0@'.format(tty_gid),
3541 'users GID: @0@'.format(substs.get('USERS_GID')),
3542 'maximum system UID: @0@'.format(system_uid_max),
3543 'maximum system GID: @0@'.format(system_gid_max),
3544 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3545 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3546 'minimum container UID base: @0@'.format(container_uid_base_min),
3547 'maximum container UID base: @0@'.format(container_uid_base_max),
3548 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3549 'render group access mode: @0@'.format(get_option('group-render-mode')),
3550 'certificate root directory: @0@'.format(get_option('certificate-root')),
3551 'support URL: @0@'.format(support_url),
3552 'nobody user name: @0@'.format(nobody_user),
3553 'nobody group name: @0@'.format(nobody_group),
3554 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3555 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3557 'default DNSSEC mode: @0@'.format(default_dnssec),
3558 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3559 'default mDNS mode: @0@'.format(default_mdns),
3560 'default LLMNR mode: @0@'.format(default_llmnr),
3561 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3562 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3563 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3564 'default locale: @0@'.format(default_locale),
3565 'default user $PATH: @0@'.format(default_user_path_display),
3566 'systemd service watchdog: @0@'.format(watchdog_opt)]
3568 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3569 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3571 'default DNS servers: @0@'.format(alt_dns_servers),
3572 'default NTP servers: @0@'.format(alt_ntp_servers)]
3574 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3575 '@@0@'.format(time_epoch)).stdout().strip()
3577 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3580 'static libsystemd: @0@'.format(static_libsystemd),
3581 'static libudev: @0@'.format(static_libudev)]
3584 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3585 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3586 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3588 if conf.get('ENABLE_EFI') == 1
3589 status += 'efi arch: @0@'.format(efi_arch)
3593 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3594 'EFI CC @0@'.format(' '.join(efi_cc)),
3595 'EFI lds: @0@'.format(efi_lds),
3596 'EFI crt0: @0@'.format(efi_crt0),
3597 'EFI include directory: @0@'.format(efi_incdir)]
3659 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3660 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3664 ['legacy pkla', install_polkit_pkla],
3666 ['gnu-efi', have_gnu_efi],
3679 ['man pages', want_man],
3680 ['html pages', want_html],
3681 ['man page indices', want_man and have_lxml],
3686 ['adm group', get_option('adm-group')],
3687 ['wheel group', get_option('wheel-group')],
3690 ['debug mmap cache'],
3692 ['valgrind', conf.get('VALGRIND') == 1],
3693 ['trace logging', conf.get('LOG_TRACE') == 1],
3694 ['install tests', install_tests],
3695 ['link-udev-shared', get_option('link-udev-shared')],
3696 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3697 ['link-networkd-shared', get_option('link-networkd-shared')],
3698 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3699 ['kernel-install', get_option('kernel-install')],
3700 ['systemd-analyze', conf.get('ENABLE_ANALYZE') == 1],
3703 if tuple.length() >= 2
3706 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3707 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3708 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3719 'enabled features: @0@'.format(', '.join(found)),
3721 'disabled features: @0@'.format(', '.join(missing)),
3723 message('\n '.join(status))
3725 if rootprefixdir != rootprefix_default
3727 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3728 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3729 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))