1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
13 meson_version : '>= 0.46',
16 libsystemd_version = '0.29.0'
17 libudev_version = '1.7.0'
19 # We need the same data in two different formats, ugh!
20 # Also, for hysterical reasons, we use different variable
21 # names, sometimes. Not all variables are included in every
23 conf = configuration_data()
24 conf.set('PROJECT_VERSION', meson.project_version(),
25 description : 'Numerical project version (used where a simple number is expected)')
27 substs = configuration_data()
28 substs.set('PROJECT_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
29 substs.set('PROJECT_VERSION', meson.project_version(),
30 description : 'Numerical project version (used where a simple number is expected)')
32 # This is to be used instead of meson.source_root(), as the latter will return
33 # the wrong result when systemd is being built as a meson subproject
34 project_source_root = meson.current_source_dir()
35 project_build_root = meson.current_build_dir()
36 relative_source_path = run_command('realpath',
37 '--relative-to=@0@'.format(project_build_root),
38 project_source_root).stdout().strip()
39 conf.set_quoted('RELATIVE_SOURCE_PATH', relative_source_path)
41 conf.set10('DEVELOPER_MODE', get_option('mode') == 'developer',
42 description : 'enable additional checks only suitable in development')
44 want_ossfuzz = get_option('oss-fuzz')
45 want_libfuzzer = get_option('llvm-fuzz')
46 if want_ossfuzz + want_libfuzzer > 1
47 error('only one of oss-fuzz or llvm-fuzz can be specified')
50 skip_deps = want_ossfuzz or want_libfuzzer
51 fuzzer_build = want_ossfuzz or want_libfuzzer
53 #####################################################################
55 # Try to install the git pre-commit hook
56 add_git_hook_sh = find_program('tools/add-git-hook.sh', required : false)
57 if add_git_hook_sh.found()
58 git_hook = run_command(add_git_hook_sh)
59 if git_hook.returncode() == 0
60 message(git_hook.stdout().strip())
64 #####################################################################
66 if get_option('split-usr') == 'auto'
67 split_usr = run_command('test', '-L', '/bin').returncode() != 0
69 split_usr = get_option('split-usr') == 'true'
71 conf.set10('HAVE_SPLIT_USR', split_usr,
72 description : '/usr/bin and /bin directories are separate')
74 if get_option('split-bin') == 'auto'
75 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
77 split_bin = get_option('split-bin') == 'true'
79 conf.set10('HAVE_SPLIT_BIN', split_bin,
80 description : 'bin and sbin directories are separate')
82 rootprefixdir = get_option('rootprefix')
83 # Unusual rootprefixdir values are used by some distros
84 # (see https://github.com/systemd/systemd/pull/7461).
85 rootprefix_default = split_usr ? '/' : '/usr'
86 if rootprefixdir == ''
87 rootprefixdir = rootprefix_default
89 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
91 have_standalone_binaries = get_option('standalone-binaries')
93 sysvinit_path = get_option('sysvinit-path')
94 sysvrcnd_path = get_option('sysvrcnd-path')
95 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
96 description : 'SysV init scripts and rcN.d links are supported')
98 if get_option('hibernate') and not get_option('initrd')
99 error('hibernate depends on initrd')
102 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
103 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
104 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
106 # join_paths ignores the preceding arguments if an absolute component is
107 # encountered, so this should canonicalize various paths when they are
108 # absolute or relative.
109 prefixdir = get_option('prefix')
110 if not prefixdir.startswith('/')
111 error('Prefix is not absolute: "@0@"'.format(prefixdir))
113 bindir = join_paths(prefixdir, get_option('bindir'))
114 libdir = join_paths(prefixdir, get_option('libdir'))
115 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
116 includedir = join_paths(prefixdir, get_option('includedir'))
117 datadir = join_paths(prefixdir, get_option('datadir'))
118 localstatedir = join_paths('/', get_option('localstatedir'))
120 rootbindir = join_paths(rootprefixdir, 'bin')
121 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
122 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
124 rootlibdir = get_option('rootlibdir')
126 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
129 # Dirs of external packages
130 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
131 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
132 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
133 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
134 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
135 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
136 rpmmacrosdir = get_option('rpmmacrosdir')
137 if rpmmacrosdir != 'no'
138 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
140 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
143 pkgdatadir = join_paths(datadir, 'systemd')
144 environmentdir = join_paths(prefixdir, 'lib/environment.d')
145 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
146 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
147 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
148 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
149 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
150 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
151 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
152 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
153 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
154 pkgincludedir = join_paths(includedir, 'systemd')
155 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
156 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
157 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
158 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
159 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
160 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
161 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
162 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
163 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
164 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
165 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
166 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
167 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
168 factorydir = join_paths(datadir, 'factory')
169 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
170 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
171 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
172 catalogstatedir = join_paths(systemdstatedir, 'catalog')
173 randomseeddir = join_paths(localstatedir, 'lib/systemd')
174 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
175 ntpservicelistdir = join_paths(rootprefixdir, 'lib/systemd/ntp-units.d')
177 docdir = get_option('docdir')
179 docdir = join_paths(datadir, 'doc/systemd')
182 dbuspolicydir = get_option('dbuspolicydir')
183 if dbuspolicydir == ''
184 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
187 dbussessionservicedir = get_option('dbussessionservicedir')
188 if dbussessionservicedir == ''
189 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
192 dbussystemservicedir = get_option('dbussystemservicedir')
193 if dbussystemservicedir == ''
194 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
197 pamlibdir = get_option('pamlibdir')
199 pamlibdir = join_paths(rootlibdir, 'security')
202 pamconfdir = get_option('pamconfdir')
204 pamconfdir = join_paths(prefixdir, 'lib/pam.d')
207 memory_accounting_default = get_option('memory-accounting-default')
208 status_unit_format_default = get_option('status-unit-format-default')
210 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
211 conf.set_quoted('SYSTEM_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'system'))
212 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
213 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
214 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
215 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
217 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
219 conf.set_quoted('USER_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'user'))
220 conf.set_quoted('USER_DATA_UNIT_DIR', userunitdir)
221 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
222 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
223 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
224 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
225 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
226 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
227 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
228 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
229 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
230 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
231 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
232 conf.set_quoted('ROOTPREFIX', rootprefixdir)
233 conf.set_quoted('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_SCRIPT_PATH_START', 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 libcap = dependency('libcap', required : false)
886 if not libcap.found()
887 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
888 libcap = cc.find_library('cap')
891 libmount = dependency('mount',
892 version : fuzzer_build ? '>= 0' : '>= 2.30')
894 want_libfdisk = get_option('fdisk')
895 if want_libfdisk != 'false' and not skip_deps
896 libfdisk = dependency('fdisk',
898 required : want_libfdisk == 'true')
899 have = libfdisk.found()
904 conf.set10('HAVE_LIBFDISK', have)
906 want_pwquality = get_option('pwquality')
907 if want_pwquality != 'false' and not skip_deps
908 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
909 have = libpwquality.found()
914 conf.set10('HAVE_PWQUALITY', have)
916 want_seccomp = get_option('seccomp')
917 if want_seccomp != 'false' and not skip_deps
918 libseccomp = dependency('libseccomp',
919 version : '>= 2.3.1',
920 required : want_seccomp == 'true')
921 have = libseccomp.found()
926 conf.set10('HAVE_SECCOMP', have)
928 want_selinux = get_option('selinux')
929 if want_selinux != 'false' and not skip_deps
930 libselinux = dependency('libselinux',
931 version : '>= 2.1.9',
932 required : want_selinux == 'true')
933 have = libselinux.found()
938 conf.set10('HAVE_SELINUX', have)
940 want_apparmor = get_option('apparmor')
941 if want_apparmor != 'false' and not skip_deps
942 libapparmor = dependency('libapparmor',
944 required : want_apparmor == 'true')
945 have = libapparmor.found()
950 conf.set10('HAVE_APPARMOR', have)
952 smack_run_label = get_option('smack-run-label')
953 if smack_run_label != ''
954 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
957 want_polkit = get_option('polkit')
958 install_polkit = false
959 install_polkit_pkla = false
960 if want_polkit != 'false' and not skip_deps
961 install_polkit = true
963 libpolkit = dependency('polkit-gobject-1',
965 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
966 message('Old polkit detected, will install pkla files')
967 install_polkit_pkla = true
970 conf.set10('ENABLE_POLKIT', install_polkit)
972 want_acl = get_option('acl')
973 if want_acl != 'false' and not skip_deps
974 libacl = cc.find_library('acl', required : want_acl == 'true')
975 have = libacl.found()
980 conf.set10('HAVE_ACL', have)
982 want_audit = get_option('audit')
983 if want_audit != 'false' and not skip_deps
984 libaudit = dependency('audit', required : want_audit == 'true')
985 have = libaudit.found()
990 conf.set10('HAVE_AUDIT', have)
992 want_blkid = get_option('blkid')
993 if want_blkid != 'false' and not skip_deps
994 libblkid = dependency('blkid', required : want_blkid == 'true')
995 have = libblkid.found()
1000 conf.set10('HAVE_BLKID', have)
1002 want_kmod = get_option('kmod')
1003 if want_kmod != 'false' and not skip_deps
1004 libkmod = dependency('libkmod',
1006 required : want_kmod == 'true')
1007 have = libkmod.found()
1012 conf.set10('HAVE_KMOD', have)
1014 want_pam = get_option('pam')
1015 if want_pam != 'false' and not skip_deps
1016 libpam = cc.find_library('pam', required : want_pam == 'true')
1017 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
1018 have = libpam.found() and libpam_misc.found()
1024 conf.set10('HAVE_PAM', have)
1026 want_microhttpd = get_option('microhttpd')
1027 if want_microhttpd != 'false' and not skip_deps
1028 libmicrohttpd = dependency('libmicrohttpd',
1029 version : '>= 0.9.33',
1030 required : want_microhttpd == 'true')
1031 have = libmicrohttpd.found()
1036 conf.set10('HAVE_MICROHTTPD', have)
1038 want_libcryptsetup = get_option('libcryptsetup')
1039 if want_libcryptsetup != 'false' and not skip_deps
1040 libcryptsetup = dependency('libcryptsetup',
1041 version : '>= 2.0.1',
1042 required : want_libcryptsetup == 'true')
1043 have = libcryptsetup.found()
1045 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1046 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
1047 conf.set10('HAVE_CRYPT_ACTIVATE_BY_SIGNED_KEY',
1048 have and cc.has_function('crypt_activate_by_signed_key', dependencies : libcryptsetup))
1053 conf.set10('HAVE_LIBCRYPTSETUP', have)
1055 want_libcurl = get_option('libcurl')
1056 if want_libcurl != 'false' and not skip_deps
1057 libcurl = dependency('libcurl',
1058 version : '>= 7.32.0',
1059 required : want_libcurl == 'true')
1060 have = libcurl.found()
1065 conf.set10('HAVE_LIBCURL', have)
1067 want_libidn = get_option('libidn')
1068 want_libidn2 = get_option('libidn2')
1069 if want_libidn == 'true' and want_libidn2 == 'true'
1070 error('libidn and libidn2 cannot be requested simultaneously')
1073 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1074 libidn = dependency('libidn2',
1075 required : want_libidn2 == 'true')
1076 have = libidn.found()
1081 conf.set10('HAVE_LIBIDN2', have)
1082 if not have and want_libidn != 'false' and not skip_deps
1083 # libidn is used for both libidn and libidn2 objects
1084 libidn = dependency('libidn',
1085 required : want_libidn == 'true')
1086 have = libidn.found()
1090 conf.set10('HAVE_LIBIDN', have)
1092 want_libiptc = get_option('libiptc')
1093 if want_libiptc != 'false' and not skip_deps
1094 libiptc = dependency('libiptc',
1095 required : want_libiptc == 'true')
1096 have = libiptc.found()
1101 conf.set10('HAVE_LIBIPTC', have)
1103 want_qrencode = get_option('qrencode')
1104 if want_qrencode != 'false' and not skip_deps
1105 libqrencode = dependency('libqrencode',
1106 required : want_qrencode == 'true')
1107 have = libqrencode.found()
1112 conf.set10('HAVE_QRENCODE', have)
1114 want_gcrypt = get_option('gcrypt')
1115 if want_gcrypt != 'false' and not skip_deps
1116 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1117 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1118 have = libgcrypt.found() and libgpg_error.found()
1123 # link to neither of the libs if one is not found
1127 conf.set10('HAVE_GCRYPT', have)
1129 want_gnutls = get_option('gnutls')
1130 if want_gnutls != 'false' and not skip_deps
1131 libgnutls = dependency('gnutls',
1132 version : '>= 3.1.4',
1133 required : want_gnutls == 'true')
1134 have = libgnutls.found()
1139 conf.set10('HAVE_GNUTLS', have)
1141 want_openssl = get_option('openssl')
1142 if want_openssl != 'false' and not skip_deps
1143 libopenssl = dependency('openssl',
1144 version : '>= 1.1.0',
1145 required : want_openssl == 'true')
1146 have = libopenssl.found()
1151 conf.set10('HAVE_OPENSSL', have)
1153 want_p11kit = get_option('p11kit')
1154 if want_p11kit != 'false' and not skip_deps
1155 libp11kit = dependency('p11-kit-1',
1156 version : '>= 0.23.3',
1157 required : want_p11kit == 'true')
1158 have = libp11kit.found()
1163 conf.set10('HAVE_P11KIT', have)
1165 want_libfido2 = get_option('libfido2')
1166 if want_libfido2 != 'false' and not skip_deps
1167 libfido2 = dependency('libfido2',
1168 required : want_libfido2 == 'true')
1169 have = libfido2.found()
1174 conf.set10('HAVE_LIBFIDO2', have)
1176 want_elfutils = get_option('elfutils')
1177 if want_elfutils != 'false' and not skip_deps
1178 libdw = dependency('libdw',
1179 required : want_elfutils == 'true')
1180 have = libdw.found()
1185 conf.set10('HAVE_ELFUTILS', have)
1187 want_zlib = get_option('zlib')
1188 if want_zlib != 'false' and not skip_deps
1189 libz = dependency('zlib',
1190 required : want_zlib == 'true')
1196 conf.set10('HAVE_ZLIB', have)
1198 want_bzip2 = get_option('bzip2')
1199 if want_bzip2 != 'false' and not skip_deps
1200 libbzip2 = cc.find_library('bz2',
1201 required : want_bzip2 == 'true')
1202 have = libbzip2.found()
1207 conf.set10('HAVE_BZIP2', have)
1209 want_xz = get_option('xz')
1210 if want_xz != 'false' and not skip_deps
1211 libxz = dependency('liblzma',
1212 required : want_xz == 'true')
1213 have_xz = libxz.found()
1218 conf.set10('HAVE_XZ', have_xz)
1220 want_lz4 = get_option('lz4')
1221 if want_lz4 != 'false' and not skip_deps
1222 liblz4 = dependency('liblz4',
1223 version : '>= 1.3.0',
1224 required : want_lz4 == 'true')
1225 have_lz4 = liblz4.found()
1230 conf.set10('HAVE_LZ4', have_lz4)
1232 want_zstd = get_option('zstd')
1233 if want_zstd != 'false' and not skip_deps
1234 libzstd = dependency('libzstd',
1235 required : want_zstd == 'true',
1236 version : '>= 1.4.0')
1237 have_zstd = libzstd.found()
1242 conf.set10('HAVE_ZSTD', have_zstd)
1244 conf.set10('HAVE_COMPRESSION', have_xz or have_lz4 or have_zstd)
1246 want_xkbcommon = get_option('xkbcommon')
1247 if want_xkbcommon != 'false' and not skip_deps
1248 libxkbcommon = dependency('xkbcommon',
1249 version : '>= 0.3.0',
1250 required : want_xkbcommon == 'true')
1251 have = libxkbcommon.found()
1256 conf.set10('HAVE_XKBCOMMON', have)
1258 want_pcre2 = get_option('pcre2')
1259 if want_pcre2 != 'false'
1260 libpcre2 = dependency('libpcre2-8',
1261 required : want_pcre2 == 'true')
1262 have = libpcre2.found()
1267 conf.set10('HAVE_PCRE2', have)
1269 want_glib = get_option('glib')
1270 if want_glib != 'false' and not skip_deps
1271 libglib = dependency('glib-2.0',
1272 version : '>= 2.22.0',
1273 required : want_glib == 'true')
1274 libgobject = dependency('gobject-2.0',
1275 version : '>= 2.22.0',
1276 required : want_glib == 'true')
1277 libgio = dependency('gio-2.0',
1278 required : want_glib == 'true')
1279 have = libglib.found() and libgobject.found() and libgio.found()
1286 conf.set10('HAVE_GLIB', have)
1288 want_dbus = get_option('dbus')
1289 if want_dbus != 'false' and not skip_deps
1290 libdbus = dependency('dbus-1',
1291 version : '>= 1.3.2',
1292 required : want_dbus == 'true')
1293 have = libdbus.found()
1298 conf.set10('HAVE_DBUS', have)
1300 default_dnssec = get_option('default-dnssec')
1302 default_dnssec = 'no'
1304 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1305 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1306 default_dnssec = 'no'
1308 conf.set('DEFAULT_DNSSEC_MODE',
1309 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1310 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1312 dns_over_tls = get_option('dns-over-tls')
1313 if dns_over_tls != 'false'
1314 if dns_over_tls == 'openssl'
1317 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1318 if dns_over_tls == 'gnutls' and not have_gnutls
1319 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1322 if dns_over_tls == 'gnutls' or have_gnutls
1323 have_openssl = false
1325 have_openssl = conf.get('HAVE_OPENSSL') == 1
1326 if dns_over_tls != 'auto' and not have_openssl
1327 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1328 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1331 have = have_gnutls or have_openssl
1335 have_openssl = false
1337 conf.set10('ENABLE_DNS_OVER_TLS', have)
1338 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1339 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1341 default_dns_over_tls = get_option('default-dns-over-tls')
1343 default_dns_over_tls = 'no'
1345 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1346 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.')
1347 default_dns_over_tls = 'no'
1349 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1350 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1351 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1353 default_mdns = get_option('default-mdns')
1354 conf.set('DEFAULT_MDNS_MODE',
1355 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
1356 substs.set('DEFAULT_MDNS_MODE', default_mdns)
1358 default_llmnr = get_option('default-llmnr')
1359 conf.set('DEFAULT_LLMNR_MODE',
1360 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
1361 substs.set('DEFAULT_LLMNR_MODE', default_llmnr)
1363 want_repart = get_option('repart')
1364 if want_repart != 'false'
1365 have = (conf.get('HAVE_OPENSSL') == 1 and
1366 conf.get('HAVE_LIBFDISK') == 1)
1367 if want_repart == 'true' and not have
1368 error('repart support was requested, but dependencies are not available')
1373 conf.set10('ENABLE_REPART', have)
1375 want_importd = get_option('importd')
1376 if want_importd != 'false'
1377 have = (conf.get('HAVE_LIBCURL') == 1 and
1378 conf.get('HAVE_ZLIB') == 1 and
1379 conf.get('HAVE_XZ') == 1 and
1380 conf.get('HAVE_GCRYPT') == 1)
1381 if want_importd == 'true' and not have
1382 error('importd support was requested, but dependencies are not available')
1387 conf.set10('ENABLE_IMPORTD', have)
1389 want_homed = get_option('homed')
1390 if want_homed != 'false'
1391 have = (conf.get('HAVE_OPENSSL') == 1 and
1392 conf.get('HAVE_LIBFDISK') == 1 and
1393 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1394 if want_homed == 'true' and not have
1395 error('homed support was requested, but dependencies are not available')
1400 conf.set10('ENABLE_HOMED', have)
1402 have = have and conf.get('HAVE_PAM') == 1
1403 conf.set10('ENABLE_PAM_HOME', have)
1405 want_remote = get_option('remote')
1406 if want_remote != 'false'
1407 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1408 conf.get('HAVE_LIBCURL') == 1]
1409 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1410 # it's possible to build one without the other. Complain only if
1411 # support was explicitly requested. The auxiliary files like sysusers
1412 # config should be installed when any of the programs are built.
1413 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1414 error('remote support was requested, but dependencies are not available')
1416 have = have_deps[0] or have_deps[1]
1420 conf.set10('ENABLE_REMOTE', have)
1422 foreach term : ['analyze',
1459 have = get_option(term)
1460 name = 'ENABLE_' + term.underscorify().to_upper()
1461 conf.set10(name, have)
1464 foreach tuple : [['nss-mymachines', 'machined'],
1465 ['nss-resolve', 'resolve']]
1466 want = get_option(tuple[0])
1468 have = get_option(tuple[1])
1469 if want == 'true' and not have
1470 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1475 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1476 conf.set10(name, have)
1480 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1481 'ENABLE_NSS_MYMACHINES',
1482 'ENABLE_NSS_RESOLVE',
1483 'ENABLE_NSS_SYSTEMD']
1484 if conf.get(term) == 1
1488 conf.set10('ENABLE_NSS', enable_nss)
1490 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1495 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1497 #####################################################################
1499 if get_option('efi')
1500 efi_arch = host_machine.cpu_family()
1502 if efi_arch == 'x86'
1503 EFI_MACHINE_TYPE_NAME = 'ia32'
1504 gnu_efi_arch = 'ia32'
1505 elif efi_arch == 'x86_64'
1506 EFI_MACHINE_TYPE_NAME = 'x64'
1507 gnu_efi_arch = 'x86_64'
1508 elif efi_arch == 'arm'
1509 EFI_MACHINE_TYPE_NAME = 'arm'
1510 gnu_efi_arch = 'arm'
1511 elif efi_arch == 'aarch64'
1512 EFI_MACHINE_TYPE_NAME = 'aa64'
1513 gnu_efi_arch = 'aarch64'
1515 EFI_MACHINE_TYPE_NAME = ''
1520 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1522 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1526 conf.set10('ENABLE_EFI', have)
1528 #####################################################################
1530 config_h = configure_file(
1531 output : 'config.h',
1532 configuration : conf)
1534 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1536 includes = include_directories('src/basic',
1542 'src/journal-remote',
1546 'src/time-wait-sync',
1552 'src/xdg-autostart-generator',
1553 'src/libsystemd/sd-bus',
1554 'src/libsystemd/sd-device',
1555 'src/libsystemd/sd-event',
1556 'src/libsystemd/sd-hwdb',
1557 'src/libsystemd/sd-id128',
1558 'src/libsystemd/sd-netlink',
1559 'src/libsystemd/sd-network',
1560 'src/libsystemd/sd-resolve',
1561 'src/libsystemd-network',
1564 add_project_arguments('-include', 'config.h', language : 'c')
1566 generate_gperfs = find_program('tools/generate-gperfs.py')
1570 subdir('src/systemd')
1572 subdir('src/libsystemd')
1573 subdir('src/libsystemd-network')
1574 subdir('src/journal')
1577 libjournal_core = static_library(
1579 libjournal_core_sources,
1581 include_directories : includes,
1584 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1585 libsystemd = shared_library(
1588 version : libsystemd_version,
1589 include_directories : includes,
1590 link_args : ['-shared',
1591 '-Wl,--version-script=' + libsystemd_sym_path],
1592 link_with : [libbasic,
1594 link_whole : [libsystemd_static,
1596 dependencies : [threads,
1601 link_depends : libsystemd_sym,
1603 install_dir : rootlibdir)
1605 static_libsystemd = get_option('static-libsystemd')
1606 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1608 install_libsystemd_static = static_library(
1611 journal_client_sources,
1613 basic_gcrypt_sources,
1615 include_directories : includes,
1616 build_by_default : static_libsystemd != 'false',
1617 install : static_libsystemd != 'false',
1618 install_dir : rootlibdir,
1619 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1620 dependencies : [threads,
1630 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1632 ############################################################
1634 autosuspend_update_sh = find_program('tools/autosuspend-update.sh')
1635 hwdb_update_sh = find_program('tools/hwdb-update.sh')
1636 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1637 make_directive_index_py = find_program('tools/make-directive-index.py')
1638 make_man_index_py = find_program('tools/make-man-index.py')
1639 syscall_names_update_sh = find_program('tools/syscall-names-update.sh')
1640 xml_helper_py = find_program('tools/xml_helper.py')
1641 update_dbus_docs_py = find_program('tools/update-dbus-docs.py')
1643 ############################################################
1645 # binaries that have --help and are intended for use by humans,
1646 # usually, but not always, installed in /bin.
1647 public_programs = []
1649 subdir('src/libudev')
1650 subdir('src/shared')
1652 subdir('src/shutdown')
1654 subdir('src/network')
1656 subdir('src/analyze')
1657 subdir('src/journal-remote')
1658 subdir('src/coredump')
1659 subdir('src/pstore')
1660 subdir('src/hostname')
1661 subdir('src/import')
1662 subdir('src/partition')
1663 subdir('src/kernel-install')
1664 subdir('src/locale')
1665 subdir('src/machine')
1666 subdir('src/portable')
1667 subdir('src/userdb')
1669 subdir('src/nspawn')
1670 subdir('src/resolve')
1671 subdir('src/timedate')
1672 subdir('src/timesync')
1673 subdir('src/tmpfiles')
1674 subdir('src/vconsole')
1675 subdir('src/boot/efi')
1682 ############################################################
1684 # only static linking apart from libdl, to make sure that the
1685 # module is linked to all libraries that it uses.
1686 test_dlopen = executable(
1690 include_directories : includes,
1691 link_with : [libbasic],
1692 dependencies : [libdl],
1693 build_by_default : want_tests != 'false')
1695 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1696 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h src/nss-systemd/nss-systemd.h'],
1697 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1698 ['resolve', 'ENABLE_NSS_RESOLVE']]
1700 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1704 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1705 version_script_arg = join_paths(project_source_root, sym)
1707 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1708 if tuple.length() > 2
1709 sources += tuple[2].split()
1712 nss = shared_library(
1717 include_directories : includes,
1718 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1719 link_args : ['-Wl,-z,nodelete',
1721 '-Wl,--version-script=' + version_script_arg],
1722 link_with : [libsystemd_static,
1725 dependencies : [threads,
1729 install_dir : rootlibdir)
1731 # We cannot use shared_module because it does not support version suffix.
1732 # Unfortunately shared_library insists on creating the symlink…
1733 meson.add_install_script('sh', '-c',
1734 'rm $DESTDIR@0@/libnss_@1@.so'
1735 .format(rootlibdir, module))
1737 if want_tests != 'false'
1738 test('dlopen-nss_' + module,
1740 # path to dlopen must include a slash
1741 args : nss.full_path())
1746 ############################################################
1751 include_directories : includes,
1752 link_with : [libcore,
1754 dependencies : [versiondep,
1761 install_rpath : rootlibexecdir,
1763 install_dir : rootlibexecdir)
1765 meson.add_install_script(meson_make_symlink,
1766 join_paths(rootlibexecdir, 'systemd'),
1767 join_paths(rootsbindir, 'init'))
1769 public_programs += executable(
1771 systemd_analyze_sources,
1772 include_directories : includes,
1773 link_with : [libcore,
1775 dependencies : [versiondep,
1782 install_rpath : rootlibexecdir,
1783 install : conf.get('ENABLE_ANALYZE'))
1787 systemd_journald_sources,
1788 include_directories : includes,
1789 link_with : [libjournal_core,
1791 dependencies : [threads,
1796 install_rpath : rootlibexecdir,
1798 install_dir : rootlibexecdir)
1800 public_programs += executable(
1802 systemd_cat_sources,
1803 include_directories : includes,
1804 link_with : [libjournal_core,
1806 dependencies : [threads],
1807 install_rpath : rootlibexecdir,
1810 public_programs += executable(
1813 include_directories : includes,
1814 link_with : [libshared],
1815 dependencies : [threads,
1821 install_rpath : rootlibexecdir,
1823 install_dir : rootbindir)
1826 'systemd-getty-generator',
1827 'src/getty-generator/getty-generator.c',
1828 include_directories : includes,
1829 link_with : [libshared],
1830 install_rpath : rootlibexecdir,
1832 install_dir : systemgeneratordir)
1835 'systemd-debug-generator',
1836 'src/debug-generator/debug-generator.c',
1837 include_directories : includes,
1838 link_with : [libshared],
1839 install_rpath : rootlibexecdir,
1841 install_dir : systemgeneratordir)
1844 'systemd-run-generator',
1845 'src/run-generator/run-generator.c',
1846 include_directories : includes,
1847 link_with : [libshared],
1848 install_rpath : rootlibexecdir,
1850 install_dir : systemgeneratordir)
1853 'systemd-fstab-generator',
1854 'src/fstab-generator/fstab-generator.c',
1855 include_directories : includes,
1856 link_with : [libcore_shared,
1858 install_rpath : rootlibexecdir,
1860 install_dir : systemgeneratordir)
1862 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1864 '30-systemd-environment-d-generator',
1865 'src/environment-d-generator/environment-d-generator.c',
1866 include_directories : includes,
1867 link_with : [libshared],
1868 install_rpath : rootlibexecdir,
1870 install_dir : userenvgeneratordir)
1872 meson.add_install_script(meson_make_symlink,
1873 join_paths(sysconfdir, 'environment'),
1874 join_paths(environmentdir, '99-environment.conf'))
1877 if conf.get('ENABLE_HIBERNATE') == 1
1879 'systemd-hibernate-resume-generator',
1880 'src/hibernate-resume/hibernate-resume-generator.c',
1881 include_directories : includes,
1882 link_with : [libshared],
1883 install_rpath : rootlibexecdir,
1885 install_dir : systemgeneratordir)
1888 'systemd-hibernate-resume',
1889 'src/hibernate-resume/hibernate-resume.c',
1890 include_directories : includes,
1891 link_with : [libshared],
1892 install_rpath : rootlibexecdir,
1894 install_dir : rootlibexecdir)
1897 if conf.get('HAVE_BLKID') == 1
1899 'systemd-gpt-auto-generator',
1900 'src/gpt-auto-generator/gpt-auto-generator.c',
1901 'src/shared/blkid-util.h',
1902 include_directories : includes,
1903 link_with : [libshared],
1904 dependencies : libblkid,
1905 install_rpath : rootlibexecdir,
1907 install_dir : systemgeneratordir)
1909 public_programs += executable(
1911 'src/dissect/dissect.c',
1912 include_directories : includes,
1913 link_with : [libshared],
1914 install_rpath : rootlibexecdir,
1918 if conf.get('ENABLE_RESOLVE') == 1
1921 systemd_resolved_sources,
1922 include_directories : includes,
1923 link_with : [libshared,
1925 libsystemd_resolve_core],
1926 dependencies : systemd_resolved_dependencies,
1927 install_rpath : rootlibexecdir,
1929 install_dir : rootlibexecdir)
1931 public_programs += executable(
1934 include_directories : includes,
1935 link_with : [libshared,
1937 libsystemd_resolve_core],
1938 dependencies : [threads,
1942 install_rpath : rootlibexecdir,
1945 meson.add_install_script(meson_make_symlink,
1946 join_paths(bindir, 'resolvectl'),
1947 join_paths(rootsbindir, 'resolvconf'))
1949 meson.add_install_script(meson_make_symlink,
1950 join_paths(bindir, 'resolvectl'),
1951 join_paths(bindir, 'systemd-resolve'))
1954 if conf.get('ENABLE_LOGIND') == 1
1957 systemd_logind_sources,
1958 include_directories : includes,
1959 link_with : [liblogind_core,
1961 dependencies : [threads,
1963 install_rpath : rootlibexecdir,
1965 install_dir : rootlibexecdir)
1967 public_programs += executable(
1970 include_directories : includes,
1971 link_with : [libshared],
1972 dependencies : [threads,
1976 install_rpath : rootlibexecdir,
1978 install_dir : rootbindir)
1980 public_programs += executable(
1982 'src/login/inhibit.c',
1983 include_directories : includes,
1984 link_with : [libshared],
1985 install_rpath : rootlibexecdir,
1987 install_dir : rootbindir)
1989 if conf.get('HAVE_PAM') == 1
1990 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1991 pam_systemd = shared_library(
1995 include_directories : includes,
1996 link_args : ['-shared',
1997 '-Wl,--version-script=' + version_script_arg],
1998 link_with : [libsystemd_static,
2000 dependencies : [threads,
2003 link_depends : pam_systemd_sym,
2005 install_dir : pamlibdir)
2007 if want_tests != 'false'
2008 test('dlopen-pam_systemd',
2010 # path to dlopen must include a slash
2011 args : pam_systemd.full_path())
2016 'systemd-user-runtime-dir',
2017 user_runtime_dir_sources,
2018 include_directories : includes,
2019 link_with : [libshared],
2020 install_rpath : rootlibexecdir,
2022 install_dir : rootlibexecdir)
2025 if conf.get('HAVE_PAM') == 1
2027 'systemd-user-sessions',
2028 'src/user-sessions/user-sessions.c',
2029 include_directories : includes,
2030 link_with : [libshared],
2031 install_rpath : rootlibexecdir,
2033 install_dir : rootlibexecdir)
2036 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
2037 public_programs += executable(
2039 'src/boot/bootctl.c',
2040 include_directories : includes,
2041 link_with : [libshared],
2042 dependencies : [libblkid],
2043 install_rpath : rootlibexecdir,
2046 public_programs += executable(
2047 'systemd-bless-boot',
2048 'src/boot/bless-boot.c',
2049 include_directories : includes,
2050 link_with : [libshared],
2051 dependencies : [libblkid],
2052 install_rpath : rootlibexecdir,
2054 install_dir : rootlibexecdir)
2057 'systemd-bless-boot-generator',
2058 'src/boot/bless-boot-generator.c',
2059 include_directories : includes,
2060 link_with : [libshared],
2061 install_rpath : rootlibexecdir,
2063 install_dir : systemgeneratordir)
2067 'systemd-boot-check-no-failures',
2068 'src/boot/boot-check-no-failures.c',
2069 include_directories : includes,
2070 link_with : [libshared],
2071 dependencies : [libblkid],
2072 install_rpath : rootlibexecdir,
2074 install_dir : rootlibexecdir)
2076 public_programs += executable(
2077 'systemd-socket-activate',
2078 'src/activate/activate.c',
2079 include_directories : includes,
2080 link_with : [libshared],
2081 dependencies : [threads],
2082 install_rpath : rootlibexecdir,
2085 if get_option('link-systemctl-shared')
2086 systemctl_link_with = [libshared]
2088 systemctl_link_with = [libsystemd_static,
2094 public_programs += executable(
2096 'src/systemctl/systemctl.c',
2097 'src/systemctl/sysv-compat.h',
2098 'src/systemctl/sysv-compat.c',
2099 include_directories : includes,
2100 link_with : systemctl_link_with,
2101 dependencies : [threads,
2107 install_rpath : rootlibexecdir,
2109 install_dir : rootbindir)
2111 if conf.get('ENABLE_PORTABLED') == 1
2113 'systemd-portabled',
2114 systemd_portabled_sources,
2115 include_directories : includes,
2116 link_with : [libshared],
2117 dependencies : [threads],
2118 install_rpath : rootlibexecdir,
2120 install_dir : rootlibexecdir)
2122 public_programs += executable(
2124 'src/portable/portablectl.c',
2125 include_directories : includes,
2126 link_with : [libshared],
2127 dependencies : [threads],
2128 install_rpath : rootlibexecdir,
2130 install_dir : rootbindir)
2133 if conf.get('ENABLE_USERDB') == 1
2136 systemd_userwork_sources,
2137 include_directories : includes,
2138 link_with : [libshared],
2139 dependencies : [threads],
2140 install_rpath : rootlibexecdir,
2142 install_dir : rootlibexecdir)
2146 systemd_userdbd_sources,
2147 include_directories : includes,
2148 link_with : [libshared],
2149 dependencies : [threads],
2150 install_rpath : rootlibexecdir,
2152 install_dir : rootlibexecdir)
2154 public_programs += executable(
2157 include_directories : includes,
2158 link_with : [libshared],
2159 dependencies : [threads],
2160 install_rpath : rootlibexecdir,
2162 install_dir : rootbindir)
2165 if conf.get('ENABLE_HOMED') == 1
2168 systemd_homework_sources,
2169 include_directories : includes,
2170 link_with : [libshared],
2171 dependencies : [threads,
2179 install_rpath : rootlibexecdir,
2181 install_dir : rootlibexecdir)
2185 systemd_homed_sources,
2186 include_directories : includes,
2187 link_with : [libshared],
2188 dependencies : [threads,
2191 install_rpath : rootlibexecdir,
2193 install_dir : rootlibexecdir)
2195 public_programs += executable(
2198 include_directories : includes,
2199 link_with : [libshared],
2200 dependencies : [threads,
2206 install_rpath : rootlibexecdir,
2208 install_dir : rootbindir)
2210 if conf.get('HAVE_PAM') == 1
2211 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2212 pam_systemd = shared_library(
2216 include_directories : includes,
2217 link_args : ['-shared',
2218 '-Wl,--version-script=' + version_script_arg],
2219 link_with : [libsystemd_static,
2221 dependencies : [threads,
2225 link_depends : pam_systemd_home_sym,
2227 install_dir : pamlibdir)
2231 foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
2232 (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
2233 meson.add_install_script(meson_make_symlink,
2234 join_paths(rootbindir, 'systemctl'),
2235 join_paths(rootsbindir, alias))
2238 meson.add_install_script(meson_make_symlink,
2239 join_paths(rootbindir, 'udevadm'),
2240 join_paths(rootlibexecdir, 'systemd-udevd'))
2242 if conf.get('ENABLE_BACKLIGHT') == 1
2244 'systemd-backlight',
2245 'src/backlight/backlight.c',
2246 include_directories : includes,
2247 link_with : [libshared],
2248 install_rpath : rootlibexecdir,
2250 install_dir : rootlibexecdir)
2253 if conf.get('ENABLE_RFKILL') == 1
2256 'src/rfkill/rfkill.c',
2257 include_directories : includes,
2258 link_with : [libshared],
2259 install_rpath : rootlibexecdir,
2261 install_dir : rootlibexecdir)
2265 'systemd-system-update-generator',
2266 'src/system-update-generator/system-update-generator.c',
2267 include_directories : includes,
2268 link_with : [libshared],
2269 install_rpath : rootlibexecdir,
2271 install_dir : systemgeneratordir)
2273 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2274 systemd_cryptsetup_sources = files('''
2275 src/cryptsetup/cryptsetup-pkcs11.h
2276 src/cryptsetup/cryptsetup-keyfile.c
2277 src/cryptsetup/cryptsetup-keyfile.h
2278 src/cryptsetup/cryptsetup.c
2281 if conf.get('HAVE_P11KIT') == 1
2282 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2286 'systemd-cryptsetup',
2287 systemd_cryptsetup_sources,
2288 include_directories : includes,
2289 link_with : [libshared],
2290 dependencies : [libcryptsetup,
2292 install_rpath : rootlibexecdir,
2294 install_dir : rootlibexecdir)
2297 'systemd-cryptsetup-generator',
2298 'src/cryptsetup/cryptsetup-generator.c',
2299 include_directories : includes,
2300 link_with : [libshared],
2301 install_rpath : rootlibexecdir,
2303 install_dir : systemgeneratordir)
2306 'systemd-veritysetup',
2307 'src/veritysetup/veritysetup.c',
2308 include_directories : includes,
2309 link_with : [libshared],
2310 dependencies : [libcryptsetup],
2311 install_rpath : rootlibexecdir,
2313 install_dir : rootlibexecdir)
2316 'systemd-veritysetup-generator',
2317 'src/veritysetup/veritysetup-generator.c',
2318 include_directories : includes,
2319 link_with : [libshared],
2320 install_rpath : rootlibexecdir,
2322 install_dir : systemgeneratordir)
2325 if conf.get('HAVE_SYSV_COMPAT') == 1
2327 'systemd-sysv-generator',
2328 'src/sysv-generator/sysv-generator.c',
2329 include_directories : includes,
2330 link_with : [libshared],
2331 install_rpath : rootlibexecdir,
2333 install_dir : systemgeneratordir)
2336 'systemd-rc-local-generator',
2337 'src/rc-local-generator/rc-local-generator.c',
2338 include_directories : includes,
2339 link_with : [libshared],
2340 install_rpath : rootlibexecdir,
2342 install_dir : systemgeneratordir)
2345 if conf.get('ENABLE_XDG_AUTOSTART') == 1
2347 'systemd-xdg-autostart-generator',
2348 'src/xdg-autostart-generator/xdg-autostart-generator.c',
2349 'src/xdg-autostart-generator/xdg-autostart-service.c',
2350 include_directories : includes,
2351 link_with : [libshared],
2352 install_rpath : rootlibexecdir,
2354 install_dir : usergeneratordir)
2357 'systemd-xdg-autostart-condition',
2358 'src/xdg-autostart-generator/xdg-autostart-condition.c',
2359 include_directories : includes,
2360 link_with : [libshared],
2361 install_rpath : rootlibexecdir,
2363 install_dir : rootlibexecdir)
2366 if conf.get('ENABLE_HOSTNAMED') == 1
2368 'systemd-hostnamed',
2369 'src/hostname/hostnamed.c',
2370 include_directories : includes,
2371 link_with : [libshared],
2372 install_rpath : rootlibexecdir,
2374 install_dir : rootlibexecdir)
2376 public_programs += executable(
2378 'src/hostname/hostnamectl.c',
2379 include_directories : includes,
2380 link_with : [libshared],
2381 install_rpath : rootlibexecdir,
2385 if conf.get('ENABLE_LOCALED') == 1
2386 if conf.get('HAVE_XKBCOMMON') == 1
2387 # logind will load libxkbcommon.so dynamically on its own
2395 systemd_localed_sources,
2396 include_directories : includes,
2397 link_with : [libshared],
2398 dependencies : deps,
2399 install_rpath : rootlibexecdir,
2401 install_dir : rootlibexecdir)
2403 public_programs += executable(
2406 include_directories : includes,
2407 link_with : [libshared],
2408 install_rpath : rootlibexecdir,
2412 if conf.get('ENABLE_TIMEDATED') == 1
2414 'systemd-timedated',
2415 'src/timedate/timedated.c',
2416 include_directories : includes,
2417 link_with : [libshared],
2418 install_rpath : rootlibexecdir,
2420 install_dir : rootlibexecdir)
2423 if conf.get('ENABLE_TIMEDATECTL') == 1
2424 public_programs += executable(
2426 'src/timedate/timedatectl.c',
2427 include_directories : includes,
2428 install_rpath : rootlibexecdir,
2429 link_with : [libshared],
2430 dependencies : [libm],
2434 if conf.get('ENABLE_TIMESYNCD') == 1
2435 if get_option('link-timesyncd-shared')
2436 timesyncd_link_with = [libshared]
2438 timesyncd_link_with = [libsystemd_static,
2445 'systemd-timesyncd',
2446 systemd_timesyncd_sources,
2447 include_directories : includes,
2448 link_with : [timesyncd_link_with],
2449 dependencies : [threads,
2451 install_rpath : rootlibexecdir,
2453 install_dir : rootlibexecdir)
2456 'systemd-time-wait-sync',
2457 'src/time-wait-sync/time-wait-sync.c',
2458 include_directories : includes,
2459 link_with : [timesyncd_link_with],
2460 install_rpath : rootlibexecdir,
2462 install_dir : rootlibexecdir)
2465 if conf.get('ENABLE_MACHINED') == 1
2468 systemd_machined_sources,
2469 include_directories : includes,
2470 link_with : [libmachine_core,
2472 install_rpath : rootlibexecdir,
2474 install_dir : rootlibexecdir)
2476 public_programs += executable(
2478 'src/machine/machinectl.c',
2479 include_directories : includes,
2480 link_with : [libshared],
2481 dependencies : [threads,
2485 install_rpath : rootlibexecdir,
2487 install_dir : rootbindir)
2490 if conf.get('ENABLE_IMPORTD') == 1
2493 systemd_importd_sources,
2494 include_directories : includes,
2495 link_with : [libshared],
2496 dependencies : [threads],
2497 install_rpath : rootlibexecdir,
2499 install_dir : rootlibexecdir)
2501 systemd_pull = executable(
2503 systemd_pull_sources,
2504 include_directories : includes,
2505 link_with : [libshared],
2506 dependencies : [versiondep,
2512 install_rpath : rootlibexecdir,
2514 install_dir : rootlibexecdir)
2516 systemd_import = executable(
2518 systemd_import_sources,
2519 include_directories : includes,
2520 link_with : [libshared],
2521 dependencies : [libcurl,
2525 install_rpath : rootlibexecdir,
2527 install_dir : rootlibexecdir)
2529 systemd_import_fs = executable(
2530 'systemd-import-fs',
2531 systemd_import_fs_sources,
2532 include_directories : includes,
2533 link_with : [libshared],
2534 install_rpath : rootlibexecdir,
2536 install_dir : rootlibexecdir)
2538 systemd_export = executable(
2540 systemd_export_sources,
2541 include_directories : includes,
2542 link_with : [libshared],
2543 dependencies : [libcurl,
2547 install_rpath : rootlibexecdir,
2549 install_dir : rootlibexecdir)
2551 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2554 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2555 public_programs += executable(
2556 'systemd-journal-upload',
2557 systemd_journal_upload_sources,
2558 include_directories : includes,
2559 link_with : [libshared],
2560 dependencies : [versiondep,
2567 install_rpath : rootlibexecdir,
2569 install_dir : rootlibexecdir)
2572 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2573 public_programs += executable(
2574 'systemd-journal-remote',
2575 systemd_journal_remote_sources,
2576 include_directories : includes,
2577 link_with : [libshared,
2578 libsystemd_journal_remote],
2579 dependencies : [threads,
2585 install_rpath : rootlibexecdir,
2587 install_dir : rootlibexecdir)
2589 public_programs += executable(
2590 'systemd-journal-gatewayd',
2591 systemd_journal_gatewayd_sources,
2592 include_directories : includes,
2593 link_with : [libshared],
2594 dependencies : [threads,
2600 install_rpath : rootlibexecdir,
2602 install_dir : rootlibexecdir)
2605 if conf.get('ENABLE_COREDUMP') == 1
2608 systemd_coredump_sources,
2609 include_directories : includes,
2610 link_with : [libshared],
2611 dependencies : [threads,
2617 install_rpath : rootlibexecdir,
2619 install_dir : rootlibexecdir)
2621 public_programs += executable(
2623 coredumpctl_sources,
2624 include_directories : includes,
2625 link_with : [libshared],
2626 dependencies : [threads,
2630 install_rpath : rootlibexecdir,
2634 if conf.get('ENABLE_PSTORE') == 1
2637 systemd_pstore_sources,
2638 include_directories : includes,
2639 link_with : [libshared],
2640 dependencies : [threads,
2646 install_rpath : rootlibexecdir,
2648 install_dir : rootlibexecdir)
2651 if conf.get('ENABLE_BINFMT') == 1
2652 public_programs += executable(
2654 'src/binfmt/binfmt.c',
2655 include_directories : includes,
2656 link_with : [libshared],
2657 install_rpath : rootlibexecdir,
2659 install_dir : rootlibexecdir)
2661 meson.add_install_script('sh', '-c',
2662 mkdir_p.format(binfmtdir))
2663 meson.add_install_script('sh', '-c',
2664 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2667 if conf.get('ENABLE_REPART') == 1
2670 systemd_repart_sources,
2671 include_directories : includes,
2672 link_with : [libshared],
2673 dependencies : [threads,
2677 install_rpath : rootlibexecdir,
2679 install_dir : rootbindir)
2680 public_programs += exe
2682 if want_tests != 'false'
2685 args : exe.full_path())
2689 if conf.get('ENABLE_VCONSOLE') == 1
2691 'systemd-vconsole-setup',
2692 'src/vconsole/vconsole-setup.c',
2693 include_directories : includes,
2694 link_with : [libshared],
2695 install_rpath : rootlibexecdir,
2697 install_dir : rootlibexecdir)
2700 if conf.get('ENABLE_RANDOMSEED') == 1
2702 'systemd-random-seed',
2703 'src/random-seed/random-seed.c',
2704 include_directories : includes,
2705 link_with : [libshared],
2706 install_rpath : rootlibexecdir,
2708 install_dir : rootlibexecdir)
2711 if conf.get('ENABLE_FIRSTBOOT') == 1
2713 'systemd-firstboot',
2714 'src/firstboot/firstboot.c',
2715 include_directories : includes,
2716 link_with : [libshared],
2717 dependencies : [libcrypt],
2718 install_rpath : rootlibexecdir,
2720 install_dir : rootbindir)
2724 'systemd-remount-fs',
2725 'src/remount-fs/remount-fs.c',
2726 include_directories : includes,
2727 link_with : [libcore_shared,
2729 install_rpath : rootlibexecdir,
2731 install_dir : rootlibexecdir)
2734 'systemd-machine-id-setup',
2735 'src/machine-id-setup/machine-id-setup-main.c',
2736 include_directories : includes,
2737 link_with : [libcore_shared,
2739 install_rpath : rootlibexecdir,
2741 install_dir : rootbindir)
2746 include_directories : includes,
2747 link_with : [libshared],
2748 install_rpath : rootlibexecdir,
2750 install_dir : rootlibexecdir)
2752 executable('systemd-growfs',
2753 'src/partition/growfs.c',
2754 include_directories : includes,
2755 link_with : [libshared],
2756 install_rpath : rootlibexecdir,
2758 install_dir : rootlibexecdir)
2762 'src/partition/makefs.c',
2763 include_directories : includes,
2764 link_with : [libshared],
2765 install_rpath : rootlibexecdir,
2767 install_dir : rootlibexecdir)
2771 'src/sleep/sleep.c',
2772 include_directories : includes,
2773 link_with : [libshared],
2774 install_rpath : rootlibexecdir,
2776 install_dir : rootlibexecdir)
2778 install_data('src/sleep/sleep.conf',
2779 install_dir : pkgsysconfdir)
2781 public_programs += executable(
2783 'src/sysctl/sysctl.c',
2784 include_directories : includes,
2785 link_with : [libshared],
2786 install_rpath : rootlibexecdir,
2788 install_dir : rootlibexecdir)
2792 'src/ac-power/ac-power.c',
2793 include_directories : includes,
2794 link_with : [libshared],
2795 install_rpath : rootlibexecdir,
2797 install_dir : rootlibexecdir)
2799 public_programs += executable(
2800 'systemd-detect-virt',
2801 'src/detect-virt/detect-virt.c',
2802 include_directories : includes,
2803 link_with : [libshared],
2804 install_rpath : rootlibexecdir,
2807 public_programs += executable(
2809 'src/delta/delta.c',
2810 include_directories : includes,
2811 link_with : [libshared],
2812 install_rpath : rootlibexecdir,
2815 public_programs += executable(
2817 'src/escape/escape.c',
2818 include_directories : includes,
2819 link_with : [libshared],
2820 install_rpath : rootlibexecdir,
2822 install_dir : rootbindir)
2824 public_programs += executable(
2826 'src/notify/notify.c',
2827 include_directories : includes,
2828 link_with : [libshared],
2829 install_rpath : rootlibexecdir,
2831 install_dir : rootbindir)
2834 'systemd-volatile-root',
2835 'src/volatile-root/volatile-root.c',
2836 include_directories : includes,
2837 link_with : [libshared],
2838 install_rpath : rootlibexecdir,
2839 install : conf.get('ENABLE_INITRD') == 1,
2840 install_dir : rootlibexecdir)
2843 'systemd-cgroups-agent',
2844 'src/cgroups-agent/cgroups-agent.c',
2845 include_directories : includes,
2846 link_with : [libshared],
2847 install_rpath : rootlibexecdir,
2849 install_dir : rootlibexecdir)
2851 public_programs += executable(
2853 'src/id128/id128.c',
2854 include_directories : includes,
2855 link_with : [libshared],
2856 install_rpath : rootlibexecdir,
2859 public_programs += executable(
2862 include_directories : includes,
2863 link_with : [libshared],
2864 install_rpath : rootlibexecdir,
2867 public_programs += executable(
2868 'systemd-ask-password',
2869 'src/ask-password/ask-password.c',
2870 include_directories : includes,
2871 link_with : [libshared],
2872 install_rpath : rootlibexecdir,
2874 install_dir : rootbindir)
2877 'systemd-reply-password',
2878 'src/reply-password/reply-password.c',
2879 include_directories : includes,
2880 link_with : [libshared],
2881 install_rpath : rootlibexecdir,
2883 install_dir : rootlibexecdir)
2885 public_programs += executable(
2886 'systemd-tty-ask-password-agent',
2887 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2888 include_directories : includes,
2889 link_with : [libshared],
2890 install_rpath : rootlibexecdir,
2892 install_dir : rootbindir)
2894 public_programs += executable(
2897 include_directories : includes,
2898 link_with : [libshared],
2899 install_rpath : rootlibexecdir,
2902 public_programs += executable(
2904 'src/cgtop/cgtop.c',
2905 include_directories : includes,
2906 link_with : [libshared],
2907 install_rpath : rootlibexecdir,
2912 'src/initctl/initctl.c',
2913 include_directories : includes,
2914 link_with : [libshared],
2915 install_rpath : rootlibexecdir,
2916 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
2917 install_dir : rootlibexecdir)
2919 public_programs += executable(
2921 'src/mount/mount-tool.c',
2922 include_directories : includes,
2923 link_with : [libshared],
2924 dependencies: [libmount],
2925 install_rpath : rootlibexecdir,
2928 meson.add_install_script(meson_make_symlink,
2929 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2931 public_programs += executable(
2934 include_directories : includes,
2935 link_with : [libshared],
2936 install_rpath : rootlibexecdir,
2939 public_programs += executable(
2940 'systemd-stdio-bridge',
2941 'src/stdio-bridge/stdio-bridge.c',
2942 include_directories : includes,
2943 link_with : [libshared],
2944 dependencies : [versiondep],
2945 install_rpath : rootlibexecdir,
2948 public_programs += executable(
2950 'src/busctl/busctl.c',
2951 'src/busctl/busctl-introspect.c',
2952 'src/busctl/busctl-introspect.h',
2953 include_directories : includes,
2954 link_with : [libshared],
2955 install_rpath : rootlibexecdir,
2958 if conf.get('ENABLE_SYSUSERS') == 1
2959 public_programs += executable(
2961 'src/sysusers/sysusers.c',
2962 include_directories : includes,
2963 link_with : [libshared],
2964 install_rpath : rootlibexecdir,
2966 install_dir : rootbindir)
2968 if have_standalone_binaries
2969 public_programs += executable(
2970 'systemd-sysusers.standalone',
2971 'src/sysusers/sysusers.c',
2972 include_directories : includes,
2973 link_with : [libshared_static,
2979 install_dir : rootbindir)
2983 if conf.get('ENABLE_TMPFILES') == 1
2986 systemd_tmpfiles_sources,
2987 include_directories : includes,
2988 link_with : [libshared],
2989 dependencies : [libacl],
2990 install_rpath : rootlibexecdir,
2992 install_dir : rootbindir)
2993 public_programs += exe
2995 if want_tests != 'false'
2996 test('test-systemd-tmpfiles',
2997 test_systemd_tmpfiles_py,
2998 # https://github.com/mesonbuild/meson/issues/2681
2999 args : exe.full_path())
3002 if have_standalone_binaries
3003 public_programs += executable(
3004 'systemd-tmpfiles.standalone',
3005 systemd_tmpfiles_sources,
3006 include_directories : includes,
3007 link_with : [libshared_static,
3012 dependencies : [libacl],
3014 install_dir : rootbindir)
3018 if conf.get('ENABLE_HWDB') == 1
3019 public_programs += executable(
3022 'src/libsystemd/sd-hwdb/hwdb-internal.h',
3023 include_directories : includes,
3024 link_with : [libudev_static],
3025 install_rpath : udev_rpath,
3027 install_dir : rootbindir)
3030 if conf.get('ENABLE_QUOTACHECK') == 1
3032 'systemd-quotacheck',
3033 'src/quotacheck/quotacheck.c',
3034 include_directories : includes,
3035 link_with : [libshared],
3036 install_rpath : rootlibexecdir,
3038 install_dir : rootlibexecdir)
3041 public_programs += executable(
3042 'systemd-socket-proxyd',
3043 'src/socket-proxy/socket-proxyd.c',
3044 include_directories : includes,
3045 link_with : [libshared],
3046 dependencies : [threads],
3047 install_rpath : rootlibexecdir,
3049 install_dir : rootlibexecdir)
3051 public_programs += executable(
3054 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
3055 include_directories : includes,
3056 link_with : [libudev_core,
3059 dependencies : [versiondep,
3065 install_rpath : udev_rpath,
3067 install_dir : rootbindir)
3071 systemd_shutdown_sources,
3072 include_directories : includes,
3073 link_with : [libcore_shared,
3075 dependencies : [libmount],
3076 install_rpath : rootlibexecdir,
3078 install_dir : rootlibexecdir)
3081 'systemd-update-done',
3082 'src/update-done/update-done.c',
3083 include_directories : includes,
3084 link_with : [libshared],
3085 install_rpath : rootlibexecdir,
3087 install_dir : rootlibexecdir)
3090 'systemd-update-utmp',
3091 'src/update-utmp/update-utmp.c',
3092 include_directories : includes,
3093 link_with : [libshared],
3094 dependencies : [libaudit],
3095 install_rpath : rootlibexecdir,
3096 install : (conf.get('ENABLE_UTMP') == 1),
3097 install_dir : rootlibexecdir)
3099 if conf.get('HAVE_KMOD') == 1
3101 'systemd-modules-load',
3102 'src/modules-load/modules-load.c',
3103 include_directories : includes,
3104 link_with : [libshared],
3105 dependencies : [libkmod],
3106 install_rpath : rootlibexecdir,
3108 install_dir : rootlibexecdir)
3110 meson.add_install_script('sh', '-c',
3111 mkdir_p.format(modulesloaddir))
3112 meson.add_install_script('sh', '-c',
3113 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
3116 public_programs += executable(
3118 systemd_nspawn_sources,
3119 include_directories : includes,
3120 link_with : [libcore_shared,
3123 dependencies : [libblkid,
3125 install_rpath : rootlibexecdir,
3128 if conf.get('ENABLE_NETWORKD') == 1
3131 systemd_networkd_sources,
3132 include_directories : network_include_dir,
3133 link_with : [libnetworkd_core,
3136 networkd_link_with],
3137 dependencies : [threads],
3138 install_rpath : rootlibexecdir,
3140 install_dir : rootlibexecdir)
3143 'systemd-networkd-wait-online',
3144 systemd_networkd_wait_online_sources,
3145 include_directories : includes,
3146 link_with : [libnetworkd_core,
3147 networkd_link_with],
3148 install_rpath : rootlibexecdir,
3150 install_dir : rootlibexecdir)
3152 public_programs += executable(
3155 include_directories : includes,
3156 link_with : [libsystemd_network,
3157 networkd_link_with],
3158 install_rpath : rootlibexecdir,
3160 install_dir : rootbindir)
3163 'systemd-network-generator',
3164 network_generator_sources,
3165 include_directories : includes,
3166 link_with : [networkd_link_with],
3167 install_rpath : rootlibexecdir,
3169 install_dir : rootlibexecdir)
3171 if want_tests != 'false'
3172 test('test-network-generator-conversion',
3173 test_network_generator_conversion_sh,
3174 # https://github.com/mesonbuild/meson/issues/2681
3175 args : exe.full_path())
3180 'systemd-sulogin-shell',
3181 ['src/sulogin-shell/sulogin-shell.c'],
3182 include_directories : includes,
3183 link_with : [libshared],
3184 install_rpath : rootlibexecdir,
3186 install_dir : rootlibexecdir)
3188 ############################################################
3191 'systemd-runtest.env',
3192 output : 'systemd-runtest.env',
3193 command : ['sh', '-c', '{ ' +
3194 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
3195 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
3197 build_by_default : true)
3199 foreach tuple : tests
3201 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3202 dependencies = tuple[2]
3203 condition = tuple.length() >= 4 ? tuple[3] : ''
3204 type = tuple.length() >= 5 ? tuple[4] : ''
3205 defs = tuple.length() >= 6 ? tuple[5] : []
3206 incs = tuple.length() >= 7 ? tuple[6] : includes
3209 name = sources[0].split('/')[-1].split('.')[0]
3210 if type.startswith('timeout=')
3211 timeout = type.split('=')[1].to_int()
3215 if condition == '' or conf.get(condition) == 1
3219 include_directories : incs,
3220 link_with : link_with,
3221 dependencies : [versiondep,
3224 build_by_default : want_tests != 'false',
3225 install_rpath : rootlibexecdir,
3226 install : install_tests,
3227 install_dir : join_paths(testsdir, type))
3230 message('@0@ is a manual test'.format(name))
3231 elif type == 'unsafe' and want_tests != 'unsafe'
3232 message('@0@ is an unsafe test'.format(name))
3233 elif want_tests != 'false'
3239 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3244 'test-libsystemd-sym',
3245 test_libsystemd_sym_c,
3246 include_directories : includes,
3247 link_with : [libsystemd],
3248 build_by_default : want_tests != 'false',
3249 install : install_tests,
3250 install_dir : testsdir)
3251 if want_tests != 'false'
3252 test('test-libsystemd-sym', exe)
3256 'test-libsystemd-static-sym',
3257 test_libsystemd_sym_c,
3258 include_directories : includes,
3259 link_with : [install_libsystemd_static],
3260 dependencies : [threads], # threads is already included in dependencies on the library,
3261 # but does not seem to get propagated. Add here as a work-around.
3262 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3263 install : install_tests and static_libsystemd_pic,
3264 install_dir : testsdir)
3265 if want_tests != 'false' and static_libsystemd_pic
3266 test('test-libsystemd-static-sym', exe)
3272 include_directories : includes,
3273 c_args : '-Wno-deprecated-declarations',
3274 link_with : [libudev],
3275 build_by_default : want_tests != 'false',
3276 install : install_tests,
3277 install_dir : testsdir)
3278 if want_tests != 'false'
3279 test('test-libudev-sym', exe)
3283 'test-libudev-static-sym',
3285 include_directories : includes,
3286 c_args : '-Wno-deprecated-declarations',
3287 link_with : [install_libudev_static],
3288 build_by_default : want_tests != 'false' and static_libudev_pic,
3289 install : install_tests and static_libudev_pic,
3290 install_dir : testsdir)
3291 if want_tests != 'false' and static_libudev_pic
3292 test('test-libudev-static-sym', exe)
3295 ############################################################
3299 if get_option('tests') != 'false'
3300 foreach tuple : fuzzers
3302 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3303 dependencies = tuple[2]
3304 defs = tuple.length() >= 4 ? tuple[3] : []
3305 incs = tuple.length() >= 5 ? tuple[4] : includes
3309 dependencies += fuzzing_engine
3311 if fuzzing_engine.found()
3312 dependencies += fuzzing_engine
3314 link_args += ['-fsanitize=fuzzer']
3317 sources += 'src/fuzz/fuzz-main.c'
3320 name = sources[0].split('/')[-1].split('.')[0]
3322 fuzzer_exes += executable(
3325 include_directories : [incs, include_directories('src/fuzz')],
3326 link_with : link_with,
3327 dependencies : dependencies,
3329 link_args: link_args,
3336 depends : fuzzer_exes,
3339 ############################################################
3342 subdir('sysusers.d')
3343 subdir('tmpfiles.d')
3349 subdir('shell-completion/bash')
3350 subdir('shell-completion/zsh')
3351 subdir('docs/sysvinit')
3352 subdir('docs/var-log')
3354 install_subdir('factory/etc',
3355 install_dir : factorydir)
3357 install_data('xorg/50-systemd-user.sh',
3358 install_dir : xinitrcdir)
3359 install_data('modprobe.d/systemd.conf',
3360 install_dir : modprobedir)
3361 install_data('LICENSE.GPL2',
3365 'docs/CODING_STYLE.md',
3366 'docs/DISTRO_PORTING.md',
3367 'docs/ENVIRONMENT.md',
3369 'docs/TRANSIENT-SETTINGS.md',
3370 'docs/TRANSLATORS.md',
3371 'docs/UIDS-GIDS.md',
3372 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3373 install_dir : docdir)
3375 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3376 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3378 ############################################################
3380 check_help = find_program('tools/check-help.sh')
3382 foreach exec : public_programs
3383 name = exec.full_path().split('/')[-1]
3384 if want_tests != 'false'
3385 test('check-help-' + name,
3387 args : exec.full_path())
3391 ############################################################
3393 check_directives_sh = find_program('tools/check-directives.sh')
3395 if want_tests != 'false'
3396 test('check-directives',
3397 check_directives_sh,
3398 args : project_source_root)
3401 ############################################################
3403 # Enable tests for all supported sanitizers
3404 foreach tuple : sanitizers
3405 sanitizer = tuple[0]
3408 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3410 foreach p : fuzz_regression_tests
3411 b = p.split('/')[-2]
3412 c = p.split('/')[-1]
3414 name = '@0@:@1@'.format(b, sanitizer)
3417 if want_tests == 'false'
3418 message('Not compiling @0@ because tests is set to false'.format(name))
3419 elif slow_tests or fuzz_tests
3420 exe = custom_target(
3424 command : [env, 'ln', '-fs',
3425 join_paths(build.full_path(), b),
3427 build_by_default : true)
3429 message('Not compiling @0@ because slow-tests/fuzz-tests is set to false'.format(name))
3434 if want_tests != 'false' and (slow_tests or fuzz_tests)
3435 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3437 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
3439 args : [exe.full_path(),
3440 join_paths(project_source_root, p)])
3447 ############################################################
3450 all_files = run_command(
3452 ['--git-dir=@0@/.git'.format(project_source_root),
3455 all_files = files(all_files.stdout().split())
3460 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3463 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3467 git_contrib_sh = find_program('tools/git-contrib.sh')
3470 command : [git_contrib_sh])
3474 git_head = run_command(
3476 ['--git-dir=@0@/.git'.format(project_source_root),
3477 'rev-parse', 'HEAD']).stdout().strip()
3478 git_head_short = run_command(
3480 ['--git-dir=@0@/.git'.format(project_source_root),
3481 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3485 command : ['git', 'archive',
3486 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3488 '--prefix', 'systemd-@0@/'.format(git_head),
3492 ############################################################
3494 check_api_docs_sh = find_program('tools/check-api-docs.sh')
3497 depends : [man, libsystemd, libudev],
3498 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3500 ############################################################
3501 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3504 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3506 'split /usr: @0@'.format(split_usr),
3507 'split bin-sbin: @0@'.format(split_bin),
3508 'prefix directory: @0@'.format(prefixdir),
3509 'rootprefix directory: @0@'.format(rootprefixdir),
3510 'sysconf directory: @0@'.format(sysconfdir),
3511 'include directory: @0@'.format(includedir),
3512 'lib directory: @0@'.format(libdir),
3513 'rootlib directory: @0@'.format(rootlibdir),
3514 'SysV init scripts: @0@'.format(sysvinit_path),
3515 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3516 'PAM modules directory: @0@'.format(pamlibdir),
3517 'PAM configuration directory: @0@'.format(pamconfdir),
3518 'RPM macros directory: @0@'.format(rpmmacrosdir),
3519 'modprobe.d directory: @0@'.format(modprobedir),
3520 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3521 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3522 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3523 'bash completions directory: @0@'.format(bashcompletiondir),
3524 'zsh completions directory: @0@'.format(zshcompletiondir),
3525 'extra start script: @0@'.format(get_option('rc-local')),
3526 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3527 get_option('debug-tty')),
3528 'TTY GID: @0@'.format(tty_gid),
3529 'users GID: @0@'.format(substs.get('USERS_GID')),
3530 'maximum system UID: @0@'.format(system_uid_max),
3531 'maximum system GID: @0@'.format(system_gid_max),
3532 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3533 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3534 'minimum container UID base: @0@'.format(container_uid_base_min),
3535 'maximum container UID base: @0@'.format(container_uid_base_max),
3536 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3537 'render group access mode: @0@'.format(get_option('group-render-mode')),
3538 'certificate root directory: @0@'.format(get_option('certificate-root')),
3539 'support URL: @0@'.format(support_url),
3540 'nobody user name: @0@'.format(nobody_user),
3541 'nobody group name: @0@'.format(nobody_group),
3542 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3543 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3545 'default DNSSEC mode: @0@'.format(default_dnssec),
3546 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3547 'default mDNS mode: @0@'.format(default_mdns),
3548 'default LLMNR mode: @0@'.format(default_llmnr),
3549 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3550 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3551 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3552 'default locale: @0@'.format(default_locale),
3553 'default user $PATH: @0@'.format(default_user_path_display),
3554 'systemd service watchdog: @0@'.format(watchdog_opt)]
3556 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3557 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3559 'default DNS servers: @0@'.format(alt_dns_servers),
3560 'default NTP servers: @0@'.format(alt_ntp_servers)]
3562 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3563 '@@0@'.format(time_epoch)).stdout().strip()
3565 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3568 'static libsystemd: @0@'.format(static_libsystemd),
3569 'static libudev: @0@'.format(static_libudev)]
3572 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3573 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3574 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3576 if conf.get('ENABLE_EFI') == 1
3577 status += 'efi arch: @0@'.format(efi_arch)
3581 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3582 'EFI CC @0@'.format(' '.join(efi_cc)),
3583 'EFI lds: @0@'.format(efi_lds),
3584 'EFI crt0: @0@'.format(efi_crt0),
3585 'EFI include directory: @0@'.format(efi_incdir)]
3647 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3648 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3652 ['legacy pkla', install_polkit_pkla],
3654 ['gnu-efi', have_gnu_efi],
3667 ['man pages', want_man],
3668 ['html pages', want_html],
3669 ['man page indices', want_man and have_lxml],
3674 ['adm group', get_option('adm-group')],
3675 ['wheel group', get_option('wheel-group')],
3678 ['debug mmap cache'],
3680 ['valgrind', conf.get('VALGRIND') == 1],
3681 ['trace logging', conf.get('LOG_TRACE') == 1],
3682 ['install tests', install_tests],
3683 ['link-udev-shared', get_option('link-udev-shared')],
3684 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3685 ['link-networkd-shared', get_option('link-networkd-shared')],
3686 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3687 ['kernel-install', get_option('kernel-install')],
3688 ['systemd-analyze', conf.get('ENABLE_ANALYZE') == 1],
3691 if tuple.length() >= 2
3694 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3695 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3696 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3707 'enabled features: @0@'.format(', '.join(found)),
3709 'disabled features: @0@'.format(', '.join(missing)),
3711 message('\n '.join(status))
3713 if rootprefixdir != rootprefix_default
3715 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3716 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3717 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))