1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
13 meson_version : '>= 0.46',
16 libsystemd_version = '0.28.0'
17 libudev_version = '1.6.17'
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 want_ossfuzz = get_option('oss-fuzz')
42 want_libfuzzer = get_option('llvm-fuzz')
43 if want_ossfuzz + want_libfuzzer > 1
44 error('only one of oss-fuzz or llvm-fuzz can be specified')
47 skip_deps = want_ossfuzz or want_libfuzzer
48 fuzzer_build = want_ossfuzz or want_libfuzzer
50 #####################################################################
52 # Try to install the git pre-commit hook
53 add_git_hook_sh = find_program('tools/add-git-hook.sh', required : false)
54 if add_git_hook_sh.found()
55 git_hook = run_command(add_git_hook_sh)
56 if git_hook.returncode() == 0
57 message(git_hook.stdout().strip())
61 #####################################################################
63 if get_option('split-usr') == 'auto'
64 split_usr = run_command('test', '-L', '/bin').returncode() != 0
66 split_usr = get_option('split-usr') == 'true'
68 conf.set10('HAVE_SPLIT_USR', split_usr,
69 description : '/usr/bin and /bin directories are separate')
71 if get_option('split-bin') == 'auto'
72 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
74 split_bin = get_option('split-bin') == 'true'
76 conf.set10('HAVE_SPLIT_BIN', split_bin,
77 description : 'bin and sbin directories are separate')
79 rootprefixdir = get_option('rootprefix')
80 # Unusual rootprefixdir values are used by some distros
81 # (see https://github.com/systemd/systemd/pull/7461).
82 rootprefix_default = split_usr ? '/' : '/usr'
83 if rootprefixdir == ''
84 rootprefixdir = rootprefix_default
86 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
88 sysvinit_path = get_option('sysvinit-path')
89 sysvrcnd_path = get_option('sysvrcnd-path')
90 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
91 description : 'SysV init scripts and rcN.d links are supported')
93 if get_option('hibernate') and not get_option('initrd')
94 error('hibernate depends on initrd')
97 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
98 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
99 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
101 # join_paths ignores the preceding arguments if an absolute component is
102 # encountered, so this should canonicalize various paths when they are
103 # absolute or relative.
104 prefixdir = get_option('prefix')
105 if not prefixdir.startswith('/')
106 error('Prefix is not absolute: "@0@"'.format(prefixdir))
108 bindir = join_paths(prefixdir, get_option('bindir'))
109 libdir = join_paths(prefixdir, get_option('libdir'))
110 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
111 includedir = join_paths(prefixdir, get_option('includedir'))
112 datadir = join_paths(prefixdir, get_option('datadir'))
113 localstatedir = join_paths('/', get_option('localstatedir'))
115 rootbindir = join_paths(rootprefixdir, 'bin')
116 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
117 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
119 rootlibdir = get_option('rootlibdir')
121 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
124 # Dirs of external packages
125 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
126 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
127 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
128 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
129 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
130 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
131 rpmmacrosdir = get_option('rpmmacrosdir')
132 if rpmmacrosdir != 'no'
133 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
135 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
138 pkgdatadir = join_paths(datadir, 'systemd')
139 environmentdir = join_paths(prefixdir, 'lib/environment.d')
140 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
141 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
142 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
143 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
144 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
145 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
146 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
147 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
148 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
149 pkgincludedir = join_paths(includedir, 'systemd')
150 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
151 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
152 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
153 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
154 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
155 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
156 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
157 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
158 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
159 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
160 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
161 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
162 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
163 factorydir = join_paths(datadir, 'factory')
164 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
165 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
166 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
167 catalogstatedir = join_paths(systemdstatedir, 'catalog')
168 randomseeddir = join_paths(localstatedir, 'lib/systemd')
169 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
170 ntpservicelistdir = join_paths(rootprefixdir, 'lib/systemd/ntp-units.d')
172 docdir = get_option('docdir')
174 docdir = join_paths(datadir, 'doc/systemd')
177 dbuspolicydir = get_option('dbuspolicydir')
178 if dbuspolicydir == ''
179 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
182 dbussessionservicedir = get_option('dbussessionservicedir')
183 if dbussessionservicedir == ''
184 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
187 dbussystemservicedir = get_option('dbussystemservicedir')
188 if dbussystemservicedir == ''
189 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
192 pamlibdir = get_option('pamlibdir')
194 pamlibdir = join_paths(rootlibdir, 'security')
197 pamconfdir = get_option('pamconfdir')
199 pamconfdir = join_paths(sysconfdir, 'pam.d')
202 memory_accounting_default = get_option('memory-accounting-default')
203 status_unit_format_default = get_option('status-unit-format-default')
205 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
206 conf.set_quoted('SYSTEM_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'system'))
207 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
208 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
209 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
210 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
212 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
214 conf.set_quoted('USER_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'user'))
215 conf.set_quoted('USER_DATA_UNIT_DIR', userunitdir)
216 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
217 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
218 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
219 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
220 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
221 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
222 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
223 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
224 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
225 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
226 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
227 conf.set_quoted('ROOTPREFIX', rootprefixdir)
228 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
229 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
230 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
231 conf.set_quoted('SYSTEM_GENERATOR_DIR', systemgeneratordir)
232 conf.set_quoted('USER_GENERATOR_DIR', usergeneratordir)
233 conf.set_quoted('SYSTEM_ENV_GENERATOR_DIR', systemenvgeneratordir)
234 conf.set_quoted('USER_ENV_GENERATOR_DIR', userenvgeneratordir)
235 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
236 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
237 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
238 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
239 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
240 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
241 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
242 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
243 conf.set_quoted('LIBDIR', libdir)
244 conf.set_quoted('ROOTLIBDIR', rootlibdir)
245 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
246 conf.set_quoted('BOOTLIBDIR', bootlibdir)
247 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
248 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
249 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
250 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
251 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
252 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
253 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
254 conf.set_quoted('SYSTEMD_HOMEWORK_PATH', join_paths(rootlibexecdir, 'systemd-homework'))
255 conf.set_quoted('SYSTEMD_USERWORK_PATH', join_paths(rootlibexecdir, 'systemd-userwork'))
256 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
257 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
258 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
260 substs.set('prefix', prefixdir)
261 substs.set('rootprefix', rootprefixdir)
262 substs.set('rootprefix_noslash', rootprefixdir_noslash)
263 substs.set('exec_prefix', prefixdir)
264 substs.set('libdir', libdir)
265 substs.set('rootlibdir', rootlibdir)
266 substs.set('includedir', includedir)
267 substs.set('sysconfdir', sysconfdir)
268 substs.set('bindir', bindir)
269 substs.set('rootbindir', rootbindir)
270 substs.set('rootlibexecdir', rootlibexecdir)
271 substs.set('systemunitdir', systemunitdir)
272 substs.set('userunitdir', userunitdir)
273 substs.set('systempresetdir', systempresetdir)
274 substs.set('userpresetdir', userpresetdir)
275 substs.set('udevhwdbdir', udevhwdbdir)
276 substs.set('udevrulesdir', udevrulesdir)
277 substs.set('udevlibexecdir', udevlibexecdir)
278 substs.set('environmentdir', environmentdir)
279 substs.set('catalogdir', catalogdir)
280 substs.set('tmpfilesdir', tmpfilesdir)
281 substs.set('sysusersdir', sysusersdir)
282 substs.set('sysctldir', sysctldir)
283 substs.set('binfmtdir', binfmtdir)
284 substs.set('modulesloaddir', modulesloaddir)
285 substs.set('modprobedir', modprobedir)
286 substs.set('systemgeneratordir', systemgeneratordir)
287 substs.set('usergeneratordir', usergeneratordir)
288 substs.set('systemenvgeneratordir', systemenvgeneratordir)
289 substs.set('userenvgeneratordir', userenvgeneratordir)
290 substs.set('systemshutdowndir', systemshutdowndir)
291 substs.set('systemsleepdir', systemsleepdir)
292 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
293 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
294 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
295 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
296 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
297 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
298 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
299 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
300 substs.set('BUILD_ROOT', project_build_root)
302 #####################################################################
304 cc = meson.get_compiler('c')
305 pkgconfig = import('pkgconfig')
306 check_compilation_sh = find_program('tools/check-compilation.sh')
307 meson_build_sh = find_program('tools/meson-build.sh')
309 want_tests = get_option('tests')
310 slow_tests = want_tests != 'false' and get_option('slow-tests')
311 install_tests = get_option('install-tests')
313 if add_languages('cpp', required : fuzzer_build)
314 # Used only for tests
315 cxx = meson.get_compiler('cpp')
316 cxx_cmd = ' '.join(cxx.cmd_array())
322 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
323 if fuzzing_engine.found()
324 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
325 elif cc.has_argument('-fsanitize=fuzzer-no-link')
326 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
328 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
331 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
334 # Those generate many false positives, and we do not want to change the code to
336 basic_disabled_warnings = [
337 '-Wno-unused-parameter',
338 '-Wno-missing-field-initializers',
339 '-Wno-unused-result',
340 '-Wno-format-signedness',
343 possible_cc_flags = [
346 '-Wmissing-include-dirs',
347 '-Wold-style-definition',
351 '-Wsuggest-attribute=noreturn',
352 '-Werror=missing-prototypes',
353 '-Werror=implicit-function-declaration',
354 '-Werror=missing-declarations',
355 '-Werror=return-type',
356 '-Werror=incompatible-pointer-types',
358 '-Wstrict-prototypes',
360 '-Wmissing-noreturn',
361 '-Wimplicit-fallthrough=5',
364 '-Wstrict-aliasing=2',
367 '-Werror=shift-count-overflow',
368 '-Werror=shift-overflow=2',
372 # negative arguments are correctly detected starting with meson 0.46.
373 '-Wno-error=#warnings', # clang
374 '-Wno-string-plus-int', # clang
376 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
377 # optimizations enabled, producing essentially false positives.
378 '-Wno-maybe-uninitialized',
382 '-fdiagnostics-show-option',
383 '-fno-strict-aliasing',
384 '-fvisibility=hidden',
386 '-fstack-protector-strong',
387 '--param=ssp-buffer-size=4',
390 # --as-needed and --no-undefined are provided by meson by default,
391 # run mesonconf to see what is enabled
392 possible_link_flags = [
398 if cc.get_id() == 'clang'
399 possible_cc_flags += [
400 '-Wno-typedef-redefinition',
401 '-Wno-gnu-variable-sized-type-not-at-end',
405 if get_option('buildtype') != 'debug'
406 possible_cc_flags += [
407 '-ffunction-sections',
411 possible_link_flags += '-Wl,--gc-sections'
414 add_project_arguments(cc.get_supported_arguments(basic_disabled_warnings), language : 'c')
415 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
416 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
418 have = cc.has_argument('-Wzero-length-bounds')
419 conf.set10('HAVE_ZERO_LENGTH_BOUNDS', have)
423 #include <inttypes.h>
424 typedef uint64_t usec_t;
425 usec_t now(clockid_t clock);
430 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
431 add_project_arguments('-Werror=shadow', language : 'c')
435 add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp')
438 cpp = ' '.join(cc.cmd_array()) + ' -E'
440 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
442 #####################################################################
443 # compilation result tests
445 conf.set('_GNU_SOURCE', true)
446 conf.set('__SANE_USERSPACE_TYPES__', true)
447 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
449 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
450 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
451 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
452 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
456 #include <sys/stat.h>
459 foreach decl : ['char16_t',
464 # We get -1 if the size cannot be determined
465 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
467 if decl == 'struct statx'
469 want_linux_stat_h = false
471 have = cc.sizeof(decl,
472 prefix : decl_headers + '#include <linux/stat.h>',
473 args : '-D_GNU_SOURCE') > 0
474 want_linux_stat_h = have
478 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
481 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
483 foreach ident : ['secure_getenv', '__secure_getenv']
484 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
488 ['memfd_create', '''#include <sys/mman.h>'''],
489 ['gettid', '''#include <sys/types.h>
490 #include <unistd.h>'''],
491 ['pivot_root', '''#include <stdlib.h>
492 #include <unistd.h>'''], # no known header declares pivot_root
493 ['name_to_handle_at', '''#include <sys/types.h>
494 #include <sys/stat.h>
495 #include <fcntl.h>'''],
496 ['setns', '''#include <sched.h>'''],
497 ['renameat2', '''#include <stdio.h>
498 #include <fcntl.h>'''],
499 ['kcmp', '''#include <linux/kcmp.h>'''],
500 ['keyctl', '''#include <sys/types.h>
501 #include <keyutils.h>'''],
502 ['copy_file_range', '''#include <sys/syscall.h>
503 #include <unistd.h>'''],
504 ['bpf', '''#include <sys/syscall.h>
505 #include <unistd.h>'''],
506 ['statx', '''#include <sys/types.h>
507 #include <sys/stat.h>
508 #include <unistd.h>'''],
509 ['explicit_bzero' , '''#include <string.h>'''],
510 ['reallocarray', '''#include <malloc.h>'''],
511 ['set_mempolicy', '''#include <stdlib.h>
512 #include <unistd.h>'''],
513 ['get_mempolicy', '''#include <stdlib.h>
514 #include <unistd.h>'''],
515 ['pidfd_send_signal', '''#include <stdlib.h>
518 #include <sys/wait.h>'''],
519 ['pidfd_open', '''#include <stdlib.h>
522 #include <sys/wait.h>'''],
523 ['rt_sigqueueinfo', '''#include <stdlib.h>
526 #include <sys/wait.h>'''],
529 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
530 conf.set10('HAVE_' + ident[0].to_upper(), have)
533 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
534 conf.set10('USE_SYS_RANDOM_H', true)
535 conf.set10('HAVE_GETRANDOM', true)
537 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
538 conf.set10('USE_SYS_RANDOM_H', false)
539 conf.set10('HAVE_GETRANDOM', have)
542 #####################################################################
544 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
546 get_option('version-tag'),
547 meson.project_version()]
550 input : 'src/version/version.h.in',
551 output : 'version.h',
554 versiondep = declare_dependency(sources: version_h)
556 sed = find_program('sed')
557 awk = find_program('awk')
558 m4 = find_program('m4')
559 stat = find_program('stat')
560 git = find_program('git', required : false)
561 env = find_program('env')
562 perl = find_program('perl', required : false)
564 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
565 mkdir_p = 'mkdir -p $DESTDIR/@0@'
566 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
567 splash_bmp = files('test/splash.bmp')
569 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
570 # /usr/sbin, /sbin, and fall back to the default from middle column.
571 progs = [['quotaon', '/usr/sbin/quotaon' ],
572 ['quotacheck', '/usr/sbin/quotacheck' ],
573 ['kmod', '/usr/bin/kmod' ],
574 ['kexec', '/usr/sbin/kexec' ],
575 ['sulogin', '/usr/sbin/sulogin' ],
576 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
577 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
578 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
579 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
580 ['nologin', '/usr/sbin/nologin', ],
583 path = get_option(prog[0] + '-path')
585 message('Using @1@ for @0@'.format(prog[0], path))
587 exe = find_program(prog[0],
588 '/usr/sbin/' + prog[0],
591 path = exe.found() ? exe.path() : prog[1]
593 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
594 conf.set_quoted(name, path)
595 substs.set(name, path)
598 conf.set_quoted('TELINIT', get_option('telinit-path'))
600 if run_command('ln', '--relative', '--help').returncode() != 0
601 error('ln does not support --relative (added in coreutils 8.16)')
604 ############################################################
606 gperf = find_program('gperf')
608 gperf_test_format = '''
610 const char * in_word_set(const char *, @0@);
613 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
614 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
615 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
616 if cc.compiles(gperf_test)
617 gperf_len_type = 'size_t'
619 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
620 if cc.compiles(gperf_test)
621 gperf_len_type = 'unsigned'
623 error('unable to determine gperf len type')
626 message('gperf len type is @0@'.format(gperf_len_type))
627 conf.set('GPERF_LEN_TYPE', gperf_len_type,
628 description : 'The type of gperf "len" parameter')
630 ############################################################
632 if not cc.has_header('sys/capability.h')
633 error('POSIX caps headers not found')
635 foreach header : ['crypt.h',
637 'linux/vm_sockets.h',
639 'valgrind/memcheck.h',
640 'valgrind/valgrind.h',
643 conf.set10('HAVE_' + header.underscorify().to_upper(),
644 cc.has_header(header))
647 ############################################################
649 fallback_hostname = get_option('fallback-hostname')
650 if fallback_hostname == '' or fallback_hostname[0] == '.' or fallback_hostname[0] == '-'
651 error('Invalid fallback-hostname configuration')
652 # A more extensive test is done in test-hostname-util. Let's catch
653 # the most obvious errors here so we don't fail with an assert later.
655 conf.set_quoted('FALLBACK_HOSTNAME', fallback_hostname)
657 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
658 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
660 default_hierarchy = get_option('default-hierarchy')
661 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
662 description : 'default cgroup hierarchy as string')
663 if default_hierarchy == 'legacy'
664 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
665 elif default_hierarchy == 'hybrid'
666 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
668 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
671 default_net_naming_scheme = get_option('default-net-naming-scheme')
672 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
674 time_epoch = get_option('time-epoch')
676 source_date_epoch = run_command('sh', ['-c', 'echo "$SOURCE_DATE_EPOCH"']).stdout().strip()
677 if source_date_epoch != ''
678 time_epoch = source_date_epoch.to_int()
681 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
684 conf.set('TIME_EPOCH', time_epoch)
686 system_uid_max = get_option('system-uid-max')
687 if system_uid_max == -1
688 system_uid_max = run_command(
690 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
691 '/etc/login.defs').stdout().strip()
692 if system_uid_max == ''
695 system_uid_max = system_uid_max.to_int()
698 conf.set('SYSTEM_UID_MAX', system_uid_max)
699 substs.set('systemuidmax', system_uid_max)
701 system_gid_max = get_option('system-gid-max')
702 if system_gid_max == -1
703 system_gid_max = run_command(
705 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
706 '/etc/login.defs').stdout().strip()
707 if system_gid_max == ''
710 system_gid_max = system_gid_max.to_int()
713 conf.set('SYSTEM_GID_MAX', system_gid_max)
714 substs.set('systemgidmax', system_gid_max)
716 dynamic_uid_min = get_option('dynamic-uid-min')
717 dynamic_uid_max = get_option('dynamic-uid-max')
718 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
719 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
720 substs.set('dynamicuidmin', dynamic_uid_min)
721 substs.set('dynamicuidmax', dynamic_uid_max)
723 container_uid_base_min = get_option('container-uid-base-min')
724 container_uid_base_max = get_option('container-uid-base-max')
725 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
726 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
727 substs.set('containeruidbasemin', container_uid_base_min)
728 substs.set('containeruidbasemax', container_uid_base_max)
730 nobody_user = get_option('nobody-user')
731 nobody_group = get_option('nobody-group')
733 if not meson.is_cross_build()
734 getent_result = run_command('getent', 'passwd', '65534')
735 if getent_result.returncode() == 0
736 name = getent_result.stdout().split(':')[0]
737 if name != nobody_user
739 '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) +
740 'Your build will result in an user table setup that is incompatible with the local system.')
743 id_result = run_command('id', '-u', nobody_user)
744 if id_result.returncode() == 0
745 id = id_result.stdout().to_int()
748 '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) +
749 'Your build will result in an user table setup that is incompatible with the local system.')
753 getent_result = run_command('getent', 'group', '65534')
754 if getent_result.returncode() == 0
755 name = getent_result.stdout().split(':')[0]
756 if name != nobody_group
758 '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) +
759 'Your build will result in an group table setup that is incompatible with the local system.')
762 id_result = run_command('id', '-g', nobody_group)
763 if id_result.returncode() == 0
764 id = id_result.stdout().to_int()
767 '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) +
768 'Your build will result in an group table setup that is incompatible with the local system.')
772 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
774 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
775 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
778 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
779 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
780 substs.set('NOBODY_USER_NAME', nobody_user)
781 substs.set('NOBODY_GROUP_NAME', nobody_group)
783 tty_gid = get_option('tty-gid')
784 conf.set('TTY_GID', tty_gid)
785 substs.set('TTY_GID', tty_gid)
787 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
788 users_gid = get_option('users-gid')
789 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
791 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
792 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
794 dev_kvm_mode = get_option('dev-kvm-mode')
795 substs.set('DEV_KVM_MODE', dev_kvm_mode)
796 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
797 group_render_mode = get_option('group-render-mode')
798 substs.set('GROUP_RENDER_MODE', group_render_mode)
799 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
801 kill_user_processes = get_option('default-kill-user-processes')
802 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
803 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
804 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
806 dns_servers = get_option('dns-servers')
807 conf.set_quoted('DNS_SERVERS', dns_servers)
808 substs.set('DNS_SERVERS', dns_servers)
810 ntp_servers = get_option('ntp-servers')
811 conf.set_quoted('NTP_SERVERS', ntp_servers)
812 substs.set('NTP_SERVERS', ntp_servers)
814 default_locale = get_option('default-locale')
815 if default_locale == ''
816 if not meson.is_cross_build()
817 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
818 default_locale = run_command(choose_default_locale_sh).stdout().strip()
820 default_locale = 'C.UTF-8'
823 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
825 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
827 service_watchdog = get_option('service-watchdog')
828 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
829 substs.set('SERVICE_WATCHDOG', watchdog_value)
831 substs.set('SUSHELL', get_option('debug-shell'))
832 substs.set('DEBUGTTY', get_option('debug-tty'))
833 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
835 enable_debug_hashmap = false
836 enable_debug_mmap_cache = false
837 enable_debug_siphash = false
838 foreach name : get_option('debug-extra')
840 enable_debug_hashmap = true
841 elif name == 'mmap-cache'
842 enable_debug_mmap_cache = true
843 elif name == 'siphash'
844 enable_debug_siphash = true
846 message('unknown debug option "@0@", ignoring'.format(name))
849 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
850 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
851 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
853 conf.set10('VALGRIND', get_option('valgrind'))
854 conf.set10('LOG_TRACE', get_option('log-trace'))
856 default_user_path = get_option('user-path')
857 if default_user_path != ''
858 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
859 default_user_path_display = default_user_path
861 # meson 0.49 fails when ?: is used in .format()
862 default_user_path_display = '(same as system services)'
866 #####################################################################
868 threads = dependency('threads')
869 librt = cc.find_library('rt')
870 libm = cc.find_library('m')
871 libdl = cc.find_library('dl')
872 libcrypt = cc.find_library('crypt')
874 libcap = dependency('libcap', required : false)
875 if not libcap.found()
876 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
877 libcap = cc.find_library('cap')
880 libmount = dependency('mount',
881 version : fuzzer_build ? '>= 0' : '>= 2.30')
883 want_libfdisk = get_option('fdisk')
884 if want_libfdisk != 'false' and not skip_deps
885 libfdisk = dependency('fdisk',
886 required : want_libfdisk == 'true')
887 have = libfdisk.found()
892 conf.set10('HAVE_LIBFDISK', have)
894 want_pwquality = get_option('pwquality')
895 if want_pwquality != 'false' and not skip_deps
896 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
897 have = libpwquality.found()
902 conf.set10('HAVE_PWQUALITY', have)
904 want_seccomp = get_option('seccomp')
905 if want_seccomp != 'false' and not skip_deps
906 libseccomp = dependency('libseccomp',
907 version : '>= 2.3.1',
908 required : want_seccomp == 'true')
909 have = libseccomp.found()
914 conf.set10('HAVE_SECCOMP', have)
916 want_selinux = get_option('selinux')
917 if want_selinux != 'false' and not skip_deps
918 libselinux = dependency('libselinux',
919 version : '>= 2.1.9',
920 required : want_selinux == 'true')
921 have = libselinux.found()
926 conf.set10('HAVE_SELINUX', have)
928 want_apparmor = get_option('apparmor')
929 if want_apparmor != 'false' and not skip_deps
930 libapparmor = dependency('libapparmor',
931 required : want_apparmor == 'true')
932 have = libapparmor.found()
937 conf.set10('HAVE_APPARMOR', have)
939 smack_run_label = get_option('smack-run-label')
940 if smack_run_label != ''
941 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
944 want_polkit = get_option('polkit')
945 install_polkit = false
946 install_polkit_pkla = false
947 if want_polkit != 'false' and not skip_deps
948 install_polkit = true
950 libpolkit = dependency('polkit-gobject-1',
952 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
953 message('Old polkit detected, will install pkla files')
954 install_polkit_pkla = true
957 conf.set10('ENABLE_POLKIT', install_polkit)
959 want_acl = get_option('acl')
960 if want_acl != 'false' and not skip_deps
961 libacl = cc.find_library('acl', required : want_acl == 'true')
962 have = libacl.found()
967 conf.set10('HAVE_ACL', have)
969 want_audit = get_option('audit')
970 if want_audit != 'false' and not skip_deps
971 libaudit = dependency('audit', required : want_audit == 'true')
972 have = libaudit.found()
977 conf.set10('HAVE_AUDIT', have)
979 want_blkid = get_option('blkid')
980 if want_blkid != 'false' and not skip_deps
981 libblkid = dependency('blkid', required : want_blkid == 'true')
982 have = libblkid.found()
987 conf.set10('HAVE_BLKID', have)
989 want_kmod = get_option('kmod')
990 if want_kmod != 'false' and not skip_deps
991 libkmod = dependency('libkmod',
993 required : want_kmod == 'true')
994 have = libkmod.found()
999 conf.set10('HAVE_KMOD', have)
1001 want_pam = get_option('pam')
1002 if want_pam != 'false' and not skip_deps
1003 libpam = cc.find_library('pam', required : want_pam == 'true')
1004 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
1005 have = libpam.found() and libpam_misc.found()
1011 conf.set10('HAVE_PAM', have)
1013 want_microhttpd = get_option('microhttpd')
1014 if want_microhttpd != 'false' and not skip_deps
1015 libmicrohttpd = dependency('libmicrohttpd',
1016 version : '>= 0.9.33',
1017 required : want_microhttpd == 'true')
1018 have = libmicrohttpd.found()
1023 conf.set10('HAVE_MICROHTTPD', have)
1025 want_libcryptsetup = get_option('libcryptsetup')
1026 if want_libcryptsetup != 'false' and not skip_deps
1027 libcryptsetup = dependency('libcryptsetup',
1028 version : '>= 2.0.1',
1029 required : want_libcryptsetup == 'true')
1030 have = libcryptsetup.found()
1032 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1033 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
1038 conf.set10('HAVE_LIBCRYPTSETUP', have)
1040 want_libcurl = get_option('libcurl')
1041 if want_libcurl != 'false' and not skip_deps
1042 libcurl = dependency('libcurl',
1043 version : '>= 7.32.0',
1044 required : want_libcurl == 'true')
1045 have = libcurl.found()
1050 conf.set10('HAVE_LIBCURL', have)
1052 want_libidn = get_option('libidn')
1053 want_libidn2 = get_option('libidn2')
1054 if want_libidn == 'true' and want_libidn2 == 'true'
1055 error('libidn and libidn2 cannot be requested simultaneously')
1058 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1059 libidn = dependency('libidn2',
1060 required : want_libidn2 == 'true')
1061 have = libidn.found()
1066 conf.set10('HAVE_LIBIDN2', have)
1067 if not have and want_libidn != 'false' and not skip_deps
1068 # libidn is used for both libidn and libidn2 objects
1069 libidn = dependency('libidn',
1070 required : want_libidn == 'true')
1071 have = libidn.found()
1075 conf.set10('HAVE_LIBIDN', have)
1077 want_libiptc = get_option('libiptc')
1078 if want_libiptc != 'false' and not skip_deps
1079 libiptc = dependency('libiptc',
1080 required : want_libiptc == 'true')
1081 have = libiptc.found()
1086 conf.set10('HAVE_LIBIPTC', have)
1088 want_qrencode = get_option('qrencode')
1089 if want_qrencode != 'false' and not skip_deps
1090 libqrencode = dependency('libqrencode',
1091 required : want_qrencode == 'true')
1092 have = libqrencode.found()
1097 conf.set10('HAVE_QRENCODE', have)
1099 want_gcrypt = get_option('gcrypt')
1100 if want_gcrypt != 'false' and not skip_deps
1101 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1102 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1103 have = libgcrypt.found() and libgpg_error.found()
1108 # link to neither of the libs if one is not found
1112 conf.set10('HAVE_GCRYPT', have)
1114 want_gnutls = get_option('gnutls')
1115 if want_gnutls != 'false' and not skip_deps
1116 libgnutls = dependency('gnutls',
1117 version : '>= 3.1.4',
1118 required : want_gnutls == 'true')
1119 have = libgnutls.found()
1124 conf.set10('HAVE_GNUTLS', have)
1126 want_openssl = get_option('openssl')
1127 if want_openssl != 'false' and not skip_deps
1128 libopenssl = dependency('openssl',
1129 version : '>= 1.1.0',
1130 required : want_openssl == 'true')
1131 have = libopenssl.found()
1136 conf.set10('HAVE_OPENSSL', have)
1138 want_p11kit = get_option('p11kit')
1139 if want_p11kit != 'false' and not skip_deps
1140 libp11kit = dependency('p11-kit-1',
1141 version : '>= 0.23.3',
1142 required : want_p11kit == 'true')
1143 have = libp11kit.found()
1148 conf.set10('HAVE_P11KIT', have)
1150 want_elfutils = get_option('elfutils')
1151 if want_elfutils != 'false' and not skip_deps
1152 libdw = dependency('libdw',
1153 required : want_elfutils == 'true')
1154 have = libdw.found()
1159 conf.set10('HAVE_ELFUTILS', have)
1161 want_zlib = get_option('zlib')
1162 if want_zlib != 'false' and not skip_deps
1163 libz = dependency('zlib',
1164 required : want_zlib == 'true')
1170 conf.set10('HAVE_ZLIB', have)
1172 want_bzip2 = get_option('bzip2')
1173 if want_bzip2 != 'false' and not skip_deps
1174 libbzip2 = cc.find_library('bz2',
1175 required : want_bzip2 == 'true')
1176 have = libbzip2.found()
1181 conf.set10('HAVE_BZIP2', have)
1183 want_xz = get_option('xz')
1184 if want_xz != 'false' and not skip_deps
1185 libxz = dependency('liblzma',
1186 required : want_xz == 'true')
1187 have = libxz.found()
1192 conf.set10('HAVE_XZ', have)
1194 want_lz4 = get_option('lz4')
1195 if want_lz4 != 'false' and not skip_deps
1196 liblz4 = dependency('liblz4',
1197 version : '>= 1.3.0',
1198 required : want_lz4 == 'true')
1199 have = liblz4.found()
1204 conf.set10('HAVE_LZ4', have)
1206 want_zstd = get_option('zstd')
1207 if want_zstd != 'false' and not skip_deps
1208 libzstd = dependency('libzstd',
1209 required : want_zstd == 'true',
1210 version : '>= 1.4.0')
1211 have = libzstd.found()
1216 conf.set10('HAVE_ZSTD', have)
1218 want_xkbcommon = get_option('xkbcommon')
1219 if want_xkbcommon != 'false' and not skip_deps
1220 libxkbcommon = dependency('xkbcommon',
1221 version : '>= 0.3.0',
1222 required : want_xkbcommon == 'true')
1223 have = libxkbcommon.found()
1228 conf.set10('HAVE_XKBCOMMON', have)
1230 want_pcre2 = get_option('pcre2')
1231 if want_pcre2 != 'false'
1232 libpcre2 = dependency('libpcre2-8',
1233 required : want_pcre2 == 'true')
1234 have = libpcre2.found()
1239 conf.set10('HAVE_PCRE2', have)
1241 want_glib = get_option('glib')
1242 if want_glib != 'false' and not skip_deps
1243 libglib = dependency('glib-2.0',
1244 version : '>= 2.22.0',
1245 required : want_glib == 'true')
1246 libgobject = dependency('gobject-2.0',
1247 version : '>= 2.22.0',
1248 required : want_glib == 'true')
1249 libgio = dependency('gio-2.0',
1250 required : want_glib == 'true')
1251 have = libglib.found() and libgobject.found() and libgio.found()
1258 conf.set10('HAVE_GLIB', have)
1260 want_dbus = get_option('dbus')
1261 if want_dbus != 'false' and not skip_deps
1262 libdbus = dependency('dbus-1',
1263 version : '>= 1.3.2',
1264 required : want_dbus == 'true')
1265 have = libdbus.found()
1270 conf.set10('HAVE_DBUS', have)
1272 default_dnssec = get_option('default-dnssec')
1274 default_dnssec = 'no'
1276 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1277 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1278 default_dnssec = 'no'
1280 conf.set('DEFAULT_DNSSEC_MODE',
1281 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1282 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1284 dns_over_tls = get_option('dns-over-tls')
1285 if dns_over_tls != 'false'
1286 if dns_over_tls == 'openssl'
1289 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1290 if dns_over_tls == 'gnutls' and not have_gnutls
1291 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1294 if dns_over_tls == 'gnutls' or have_gnutls
1295 have_openssl = false
1297 have_openssl = conf.get('HAVE_OPENSSL') == 1
1298 if dns_over_tls != 'auto' and not have_openssl
1299 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1300 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1303 have = have_gnutls or have_openssl
1307 have_openssl = false
1309 conf.set10('ENABLE_DNS_OVER_TLS', have)
1310 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1311 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1313 default_dns_over_tls = get_option('default-dns-over-tls')
1315 default_dns_over_tls = 'no'
1317 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1318 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.')
1319 default_dns_over_tls = 'no'
1321 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1322 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1323 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1325 default_mdns = get_option('default-mdns')
1326 conf.set('DEFAULT_MDNS_MODE',
1327 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
1328 substs.set('DEFAULT_MDNS_MODE', default_mdns)
1330 default_llmnr = get_option('default-llmnr')
1331 conf.set('DEFAULT_LLMNR_MODE',
1332 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
1333 substs.set('DEFAULT_LLMNR_MODE', default_llmnr)
1335 want_repart = get_option('repart')
1336 if want_repart != 'false'
1337 have = (conf.get('HAVE_OPENSSL') == 1 and
1338 conf.get('HAVE_LIBFDISK') == 1)
1339 if want_repart == 'true' and not have
1340 error('repart support was requested, but dependencies are not available')
1345 conf.set10('ENABLE_REPART', have)
1347 want_importd = get_option('importd')
1348 if want_importd != 'false'
1349 have = (conf.get('HAVE_LIBCURL') == 1 and
1350 conf.get('HAVE_ZLIB') == 1 and
1351 conf.get('HAVE_XZ') == 1 and
1352 conf.get('HAVE_GCRYPT') == 1)
1353 if want_importd == 'true' and not have
1354 error('importd support was requested, but dependencies are not available')
1359 conf.set10('ENABLE_IMPORTD', have)
1361 want_homed = get_option('homed')
1362 if want_homed != 'false'
1363 have = (conf.get('HAVE_OPENSSL') == 1 and
1364 conf.get('HAVE_LIBFDISK') == 1 and
1365 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1366 if want_homed == 'true' and not have
1367 error('homed support was requested, but dependencies are not available')
1372 conf.set10('ENABLE_HOMED', have)
1374 have = have and conf.get('HAVE_PAM') == 1
1375 conf.set10('ENABLE_PAM_HOME', have)
1377 want_remote = get_option('remote')
1378 if want_remote != 'false'
1379 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1380 conf.get('HAVE_LIBCURL') == 1]
1381 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1382 # it's possible to build one without the other. Complain only if
1383 # support was explicitly requested. The auxiliary files like sysusers
1384 # config should be installed when any of the programs are built.
1385 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1386 error('remote support was requested, but dependencies are not available')
1388 have = have_deps[0] or have_deps[1]
1392 conf.set10('ENABLE_REMOTE', have)
1394 foreach term : ['utmp',
1429 have = get_option(term)
1430 name = 'ENABLE_' + term.underscorify().to_upper()
1431 conf.set10(name, have)
1434 foreach tuple : [['nss-mymachines', 'machined'],
1435 ['nss-resolve', 'resolve']]
1436 want = get_option(tuple[0])
1438 have = get_option(tuple[1])
1439 if want == 'true' and not have
1440 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1445 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1446 conf.set10(name, have)
1450 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1451 'ENABLE_NSS_MYMACHINES',
1452 'ENABLE_NSS_RESOLVE',
1453 'ENABLE_NSS_SYSTEMD']
1454 if conf.get(term) == 1
1458 conf.set10('ENABLE_NSS', enable_nss)
1460 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1465 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1467 #####################################################################
1469 if get_option('efi')
1470 efi_arch = host_machine.cpu_family()
1472 if efi_arch == 'x86'
1473 EFI_MACHINE_TYPE_NAME = 'ia32'
1474 gnu_efi_arch = 'ia32'
1475 elif efi_arch == 'x86_64'
1476 EFI_MACHINE_TYPE_NAME = 'x64'
1477 gnu_efi_arch = 'x86_64'
1478 elif efi_arch == 'arm'
1479 EFI_MACHINE_TYPE_NAME = 'arm'
1480 gnu_efi_arch = 'arm'
1481 elif efi_arch == 'aarch64'
1482 EFI_MACHINE_TYPE_NAME = 'aa64'
1483 gnu_efi_arch = 'aarch64'
1485 EFI_MACHINE_TYPE_NAME = ''
1490 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1492 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1496 conf.set10('ENABLE_EFI', have)
1498 #####################################################################
1500 config_h = configure_file(
1501 output : 'config.h',
1502 configuration : conf)
1504 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1506 includes = include_directories('src/basic',
1512 'src/journal-remote',
1516 'src/time-wait-sync',
1522 'src/libsystemd/sd-bus',
1523 'src/libsystemd/sd-device',
1524 'src/libsystemd/sd-event',
1525 'src/libsystemd/sd-hwdb',
1526 'src/libsystemd/sd-id128',
1527 'src/libsystemd/sd-netlink',
1528 'src/libsystemd/sd-network',
1529 'src/libsystemd/sd-resolve',
1530 'src/libsystemd-network',
1533 add_project_arguments('-include', 'config.h', language : 'c')
1535 generate_gperfs = find_program('tools/generate-gperfs.py')
1539 subdir('src/systemd')
1541 subdir('src/libsystemd')
1542 subdir('src/libsystemd-network')
1543 subdir('src/journal')
1546 libjournal_core = static_library(
1548 libjournal_core_sources,
1550 include_directories : includes,
1553 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1554 libsystemd = shared_library(
1557 version : libsystemd_version,
1558 include_directories : includes,
1559 link_args : ['-shared',
1560 '-Wl,--version-script=' + libsystemd_sym_path],
1561 link_with : [libbasic,
1563 link_whole : [libsystemd_static,
1565 dependencies : [threads,
1570 link_depends : libsystemd_sym,
1572 install_dir : rootlibdir)
1574 static_libsystemd = get_option('static-libsystemd')
1575 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1577 install_libsystemd_static = static_library(
1580 journal_client_sources,
1582 basic_gcrypt_sources,
1584 include_directories : includes,
1585 build_by_default : static_libsystemd != 'false',
1586 install : static_libsystemd != 'false',
1587 install_dir : rootlibdir,
1588 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1589 dependencies : [threads,
1599 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1601 # Generate autosuspend rules
1602 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1604 ############################################################
1606 # binaries that have --help and are intended for use by humans,
1607 # usually, but not always, installed in /bin.
1608 public_programs = []
1610 subdir('src/libudev')
1611 subdir('src/shared')
1613 subdir('src/shutdown')
1615 subdir('src/network')
1617 subdir('src/analyze')
1618 subdir('src/journal-remote')
1619 subdir('src/coredump')
1620 subdir('src/pstore')
1621 subdir('src/hostname')
1622 subdir('src/import')
1623 subdir('src/partition')
1624 subdir('src/kernel-install')
1625 subdir('src/locale')
1626 subdir('src/machine')
1627 subdir('src/portable')
1628 subdir('src/userdb')
1630 subdir('src/nspawn')
1631 subdir('src/resolve')
1632 subdir('src/timedate')
1633 subdir('src/timesync')
1634 subdir('src/vconsole')
1635 subdir('src/boot/efi')
1642 ############################################################
1644 # only static linking apart from libdl, to make sure that the
1645 # module is linked to all libraries that it uses.
1646 test_dlopen = executable(
1650 include_directories : includes,
1651 link_with : [libbasic],
1652 dependencies : [libdl],
1653 build_by_default : want_tests != 'false')
1655 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1656 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h'],
1657 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1658 ['resolve', 'ENABLE_NSS_RESOLVE']]
1660 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1664 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1665 version_script_arg = join_paths(project_source_root, sym)
1667 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1668 if tuple.length() > 2
1669 sources += tuple[2].split()
1672 nss = shared_library(
1677 include_directories : includes,
1678 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1679 link_args : ['-Wl,-z,nodelete',
1681 '-Wl,--version-script=' + version_script_arg],
1682 link_with : [libsystemd_static,
1685 dependencies : [threads,
1689 install_dir : rootlibdir)
1691 # We cannot use shared_module because it does not support version suffix.
1692 # Unfortunately shared_library insists on creating the symlink…
1693 meson.add_install_script('sh', '-c',
1694 'rm $DESTDIR@0@/libnss_@1@.so'
1695 .format(rootlibdir, module))
1697 if want_tests != 'false'
1698 test('dlopen-nss_' + module,
1700 # path to dlopen must include a slash
1701 args : nss.full_path())
1706 ############################################################
1711 include_directories : includes,
1712 link_with : [libcore,
1714 dependencies : [versiondep,
1721 install_rpath : rootlibexecdir,
1723 install_dir : rootlibexecdir)
1725 meson.add_install_script(meson_make_symlink,
1726 join_paths(rootlibexecdir, 'systemd'),
1727 join_paths(rootsbindir, 'init'))
1729 public_programs += executable(
1731 systemd_analyze_sources,
1732 include_directories : includes,
1733 link_with : [libcore,
1735 dependencies : [versiondep,
1742 install_rpath : rootlibexecdir,
1743 install : get_option('analyze'))
1747 systemd_journald_sources,
1748 include_directories : includes,
1749 link_with : [libjournal_core,
1751 dependencies : [threads,
1756 install_rpath : rootlibexecdir,
1758 install_dir : rootlibexecdir)
1760 public_programs += executable(
1762 systemd_cat_sources,
1763 include_directories : includes,
1764 link_with : [libjournal_core,
1766 dependencies : [threads],
1767 install_rpath : rootlibexecdir,
1770 public_programs += executable(
1773 include_directories : includes,
1774 link_with : [libshared],
1775 dependencies : [threads,
1781 install_rpath : rootlibexecdir,
1783 install_dir : rootbindir)
1786 'systemd-getty-generator',
1787 'src/getty-generator/getty-generator.c',
1788 include_directories : includes,
1789 link_with : [libshared],
1790 install_rpath : rootlibexecdir,
1792 install_dir : systemgeneratordir)
1795 'systemd-debug-generator',
1796 'src/debug-generator/debug-generator.c',
1797 include_directories : includes,
1798 link_with : [libshared],
1799 install_rpath : rootlibexecdir,
1801 install_dir : systemgeneratordir)
1804 'systemd-run-generator',
1805 'src/run-generator/run-generator.c',
1806 include_directories : includes,
1807 link_with : [libshared],
1808 install_rpath : rootlibexecdir,
1810 install_dir : systemgeneratordir)
1813 'systemd-fstab-generator',
1814 'src/fstab-generator/fstab-generator.c',
1815 include_directories : includes,
1816 link_with : [libcore_shared,
1818 install_rpath : rootlibexecdir,
1820 install_dir : systemgeneratordir)
1822 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1824 '30-systemd-environment-d-generator',
1825 'src/environment-d-generator/environment-d-generator.c',
1826 include_directories : includes,
1827 link_with : [libshared],
1828 install_rpath : rootlibexecdir,
1830 install_dir : userenvgeneratordir)
1832 meson.add_install_script(meson_make_symlink,
1833 join_paths(sysconfdir, 'environment'),
1834 join_paths(environmentdir, '99-environment.conf'))
1837 if conf.get('ENABLE_HIBERNATE') == 1
1839 'systemd-hibernate-resume-generator',
1840 'src/hibernate-resume/hibernate-resume-generator.c',
1841 include_directories : includes,
1842 link_with : [libshared],
1843 install_rpath : rootlibexecdir,
1845 install_dir : systemgeneratordir)
1848 'systemd-hibernate-resume',
1849 'src/hibernate-resume/hibernate-resume.c',
1850 include_directories : includes,
1851 link_with : [libshared],
1852 install_rpath : rootlibexecdir,
1854 install_dir : rootlibexecdir)
1857 if conf.get('HAVE_BLKID') == 1
1859 'systemd-gpt-auto-generator',
1860 'src/gpt-auto-generator/gpt-auto-generator.c',
1861 'src/shared/blkid-util.h',
1862 include_directories : includes,
1863 link_with : [libshared],
1864 dependencies : libblkid,
1865 install_rpath : rootlibexecdir,
1867 install_dir : systemgeneratordir)
1869 public_programs += executable(
1871 'src/dissect/dissect.c',
1872 include_directories : includes,
1873 link_with : [libshared],
1874 install_rpath : rootlibexecdir,
1876 install_dir : rootlibexecdir)
1879 if conf.get('ENABLE_RESOLVE') == 1
1882 systemd_resolved_sources,
1883 include_directories : includes,
1884 link_with : [libshared,
1886 libsystemd_resolve_core],
1887 dependencies : systemd_resolved_dependencies,
1888 install_rpath : rootlibexecdir,
1890 install_dir : rootlibexecdir)
1892 public_programs += executable(
1895 include_directories : includes,
1896 link_with : [libshared,
1898 libsystemd_resolve_core],
1899 dependencies : [threads,
1903 install_rpath : rootlibexecdir,
1906 meson.add_install_script(meson_make_symlink,
1907 join_paths(bindir, 'resolvectl'),
1908 join_paths(rootsbindir, 'resolvconf'))
1910 meson.add_install_script(meson_make_symlink,
1911 join_paths(bindir, 'resolvectl'),
1912 join_paths(bindir, 'systemd-resolve'))
1915 if conf.get('ENABLE_LOGIND') == 1
1918 systemd_logind_sources,
1919 include_directories : includes,
1920 link_with : [liblogind_core,
1922 dependencies : [threads,
1924 install_rpath : rootlibexecdir,
1926 install_dir : rootlibexecdir)
1928 public_programs += executable(
1931 include_directories : includes,
1932 link_with : [libshared],
1933 dependencies : [threads,
1937 install_rpath : rootlibexecdir,
1939 install_dir : rootbindir)
1941 public_programs += executable(
1943 'src/login/inhibit.c',
1944 include_directories : includes,
1945 link_with : [libshared],
1946 install_rpath : rootlibexecdir,
1948 install_dir : rootbindir)
1950 if conf.get('HAVE_PAM') == 1
1951 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1952 pam_systemd = shared_library(
1956 include_directories : includes,
1957 link_args : ['-shared',
1958 '-Wl,--version-script=' + version_script_arg],
1959 link_with : [libsystemd_static,
1961 dependencies : [threads,
1964 link_depends : pam_systemd_sym,
1966 install_dir : pamlibdir)
1968 if want_tests != 'false'
1969 test('dlopen-pam_systemd',
1971 # path to dlopen must include a slash
1972 args : pam_systemd.full_path())
1977 'systemd-user-runtime-dir',
1978 user_runtime_dir_sources,
1979 include_directories : includes,
1980 link_with : [libshared],
1981 install_rpath : rootlibexecdir,
1983 install_dir : rootlibexecdir)
1986 if conf.get('HAVE_PAM') == 1
1988 'systemd-user-sessions',
1989 'src/user-sessions/user-sessions.c',
1990 include_directories : includes,
1991 link_with : [libshared],
1992 install_rpath : rootlibexecdir,
1994 install_dir : rootlibexecdir)
1997 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1998 public_programs += executable(
2000 'src/boot/bootctl.c',
2001 include_directories : includes,
2002 link_with : [libshared],
2003 dependencies : [libblkid],
2004 install_rpath : rootlibexecdir,
2007 public_programs += executable(
2008 'systemd-bless-boot',
2009 'src/boot/bless-boot.c',
2010 include_directories : includes,
2011 link_with : [libshared],
2012 dependencies : [libblkid],
2013 install_rpath : rootlibexecdir,
2015 install_dir : rootlibexecdir)
2018 'systemd-bless-boot-generator',
2019 'src/boot/bless-boot-generator.c',
2020 include_directories : includes,
2021 link_with : [libshared],
2022 install_rpath : rootlibexecdir,
2024 install_dir : systemgeneratordir)
2028 'systemd-boot-check-no-failures',
2029 'src/boot/boot-check-no-failures.c',
2030 include_directories : includes,
2031 link_with : [libshared],
2032 dependencies : [libblkid],
2033 install_rpath : rootlibexecdir,
2035 install_dir : rootlibexecdir)
2037 public_programs += executable(
2038 'systemd-socket-activate',
2039 'src/activate/activate.c',
2040 include_directories : includes,
2041 link_with : [libshared],
2042 dependencies : [threads],
2043 install_rpath : rootlibexecdir,
2046 if get_option('link-systemctl-shared')
2047 systemctl_link_with = [libshared]
2049 systemctl_link_with = [libsystemd_static,
2055 public_programs += executable(
2057 'src/systemctl/systemctl.c',
2058 'src/systemctl/sysv-compat.h',
2059 'src/systemctl/sysv-compat.c',
2060 include_directories : includes,
2061 link_with : systemctl_link_with,
2062 dependencies : [threads,
2068 install_rpath : rootlibexecdir,
2070 install_dir : rootbindir)
2072 if conf.get('ENABLE_PORTABLED') == 1
2074 'systemd-portabled',
2075 systemd_portabled_sources,
2076 include_directories : includes,
2077 link_with : [libshared],
2078 dependencies : [threads],
2079 install_rpath : rootlibexecdir,
2081 install_dir : rootlibexecdir)
2083 public_programs += executable(
2085 'src/portable/portablectl.c',
2086 include_directories : includes,
2087 link_with : [libshared],
2088 dependencies : [threads],
2089 install_rpath : rootlibexecdir,
2091 install_dir : rootbindir)
2094 if conf.get('ENABLE_USERDB') == 1
2097 systemd_userwork_sources,
2098 include_directories : includes,
2099 link_with : [libshared],
2100 dependencies : [threads],
2101 install_rpath : rootlibexecdir,
2103 install_dir : rootlibexecdir)
2107 systemd_userdbd_sources,
2108 include_directories : includes,
2109 link_with : [libshared],
2110 dependencies : [threads],
2111 install_rpath : rootlibexecdir,
2113 install_dir : rootlibexecdir)
2115 public_programs += executable(
2118 include_directories : includes,
2119 link_with : [libshared],
2120 dependencies : [threads],
2121 install_rpath : rootlibexecdir,
2123 install_dir : rootbindir)
2126 if conf.get('ENABLE_HOMED') == 1
2129 systemd_homework_sources,
2130 include_directories : includes,
2131 link_with : [libshared],
2132 dependencies : [threads,
2139 install_rpath : rootlibexecdir,
2141 install_dir : rootlibexecdir)
2145 systemd_homed_sources,
2146 include_directories : includes,
2147 link_with : [libshared],
2148 dependencies : [threads,
2152 install_rpath : rootlibexecdir,
2154 install_dir : rootlibexecdir)
2156 public_programs += executable(
2159 include_directories : includes,
2160 link_with : [libshared],
2161 dependencies : [threads,
2166 install_rpath : rootlibexecdir,
2168 install_dir : rootbindir)
2170 if conf.get('HAVE_PAM') == 1
2171 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2172 pam_systemd = shared_library(
2176 include_directories : includes,
2177 link_args : ['-shared',
2178 '-Wl,--version-script=' + version_script_arg],
2179 link_with : [libsystemd_static,
2181 dependencies : [threads,
2185 link_depends : pam_systemd_home_sym,
2187 install_dir : pamlibdir)
2191 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
2192 meson.add_install_script(meson_make_symlink,
2193 join_paths(rootbindir, 'systemctl'),
2194 join_paths(rootsbindir, alias))
2197 if conf.get('ENABLE_BACKLIGHT') == 1
2199 'systemd-backlight',
2200 'src/backlight/backlight.c',
2201 include_directories : includes,
2202 link_with : [libshared],
2203 install_rpath : rootlibexecdir,
2205 install_dir : rootlibexecdir)
2208 if conf.get('ENABLE_RFKILL') == 1
2211 'src/rfkill/rfkill.c',
2212 include_directories : includes,
2213 link_with : [libshared],
2214 install_rpath : rootlibexecdir,
2216 install_dir : rootlibexecdir)
2220 'systemd-system-update-generator',
2221 'src/system-update-generator/system-update-generator.c',
2222 include_directories : includes,
2223 link_with : [libshared],
2224 install_rpath : rootlibexecdir,
2226 install_dir : systemgeneratordir)
2228 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2229 systemd_cryptsetup_sources = files('''
2230 src/cryptsetup/cryptsetup-pkcs11.h
2231 src/cryptsetup/cryptsetup-util.c
2232 src/cryptsetup/cryptsetup-util.h
2233 src/cryptsetup/cryptsetup.c
2236 if conf.get('HAVE_P11KIT') == 1
2237 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2241 'systemd-cryptsetup',
2242 systemd_cryptsetup_sources,
2243 include_directories : includes,
2244 link_with : [libshared],
2245 dependencies : [libcryptsetup,
2247 install_rpath : rootlibexecdir,
2249 install_dir : rootlibexecdir)
2252 'systemd-cryptsetup-generator',
2253 'src/cryptsetup/cryptsetup-generator.c',
2254 include_directories : includes,
2255 link_with : [libshared],
2256 dependencies : [libcryptsetup],
2257 install_rpath : rootlibexecdir,
2259 install_dir : systemgeneratordir)
2262 'systemd-veritysetup',
2263 'src/veritysetup/veritysetup.c',
2264 include_directories : includes,
2265 link_with : [libshared],
2266 dependencies : [libcryptsetup],
2267 install_rpath : rootlibexecdir,
2269 install_dir : rootlibexecdir)
2272 'systemd-veritysetup-generator',
2273 'src/veritysetup/veritysetup-generator.c',
2274 include_directories : includes,
2275 link_with : [libshared],
2276 dependencies : [libcryptsetup],
2277 install_rpath : rootlibexecdir,
2279 install_dir : systemgeneratordir)
2282 if conf.get('HAVE_SYSV_COMPAT') == 1
2284 'systemd-sysv-generator',
2285 'src/sysv-generator/sysv-generator.c',
2286 include_directories : includes,
2287 link_with : [libshared],
2288 install_rpath : rootlibexecdir,
2290 install_dir : systemgeneratordir)
2293 'systemd-rc-local-generator',
2294 'src/rc-local-generator/rc-local-generator.c',
2295 include_directories : includes,
2296 link_with : [libshared],
2297 install_rpath : rootlibexecdir,
2299 install_dir : systemgeneratordir)
2302 if conf.get('ENABLE_HOSTNAMED') == 1
2304 'systemd-hostnamed',
2305 'src/hostname/hostnamed.c',
2306 include_directories : includes,
2307 link_with : [libshared],
2308 install_rpath : rootlibexecdir,
2310 install_dir : rootlibexecdir)
2312 public_programs += executable(
2314 'src/hostname/hostnamectl.c',
2315 include_directories : includes,
2316 link_with : [libshared],
2317 install_rpath : rootlibexecdir,
2321 if conf.get('ENABLE_LOCALED') == 1
2322 if conf.get('HAVE_XKBCOMMON') == 1
2323 # logind will load libxkbcommon.so dynamically on its own
2331 systemd_localed_sources,
2332 include_directories : includes,
2333 link_with : [libshared],
2334 dependencies : deps,
2335 install_rpath : rootlibexecdir,
2337 install_dir : rootlibexecdir)
2339 public_programs += executable(
2342 include_directories : includes,
2343 link_with : [libshared],
2344 install_rpath : rootlibexecdir,
2348 if conf.get('ENABLE_TIMEDATED') == 1
2350 'systemd-timedated',
2351 'src/timedate/timedated.c',
2352 include_directories : includes,
2353 link_with : [libshared],
2354 install_rpath : rootlibexecdir,
2356 install_dir : rootlibexecdir)
2359 if conf.get('ENABLE_TIMEDATECTL') == 1
2360 public_programs += executable(
2362 'src/timedate/timedatectl.c',
2363 include_directories : includes,
2364 install_rpath : rootlibexecdir,
2365 link_with : [libshared],
2366 dependencies : [libm],
2370 if conf.get('ENABLE_TIMESYNCD') == 1
2371 if get_option('link-timesyncd-shared')
2372 timesyncd_link_with = [libshared]
2374 timesyncd_link_with = [libsystemd_static,
2381 'systemd-timesyncd',
2382 systemd_timesyncd_sources,
2383 include_directories : includes,
2384 link_with : [timesyncd_link_with],
2385 dependencies : [threads,
2387 install_rpath : rootlibexecdir,
2389 install_dir : rootlibexecdir)
2392 'systemd-time-wait-sync',
2393 'src/time-wait-sync/time-wait-sync.c',
2394 include_directories : includes,
2395 link_with : [timesyncd_link_with],
2396 install_rpath : rootlibexecdir,
2398 install_dir : rootlibexecdir)
2401 if conf.get('ENABLE_MACHINED') == 1
2404 systemd_machined_sources,
2405 include_directories : includes,
2406 link_with : [libmachine_core,
2408 install_rpath : rootlibexecdir,
2410 install_dir : rootlibexecdir)
2412 public_programs += executable(
2414 'src/machine/machinectl.c',
2415 include_directories : includes,
2416 link_with : [libshared],
2417 dependencies : [threads,
2421 install_rpath : rootlibexecdir,
2423 install_dir : rootbindir)
2426 if conf.get('ENABLE_IMPORTD') == 1
2429 systemd_importd_sources,
2430 include_directories : includes,
2431 link_with : [libshared],
2432 dependencies : [threads],
2433 install_rpath : rootlibexecdir,
2435 install_dir : rootlibexecdir)
2437 systemd_pull = executable(
2439 systemd_pull_sources,
2440 include_directories : includes,
2441 link_with : [libshared],
2442 dependencies : [versiondep,
2448 install_rpath : rootlibexecdir,
2450 install_dir : rootlibexecdir)
2452 systemd_import = executable(
2454 systemd_import_sources,
2455 include_directories : includes,
2456 link_with : [libshared],
2457 dependencies : [libcurl,
2461 install_rpath : rootlibexecdir,
2463 install_dir : rootlibexecdir)
2465 systemd_import_fs = executable(
2466 'systemd-import-fs',
2467 systemd_import_fs_sources,
2468 include_directories : includes,
2469 link_with : [libshared],
2470 install_rpath : rootlibexecdir,
2472 install_dir : rootlibexecdir)
2474 systemd_export = executable(
2476 systemd_export_sources,
2477 include_directories : includes,
2478 link_with : [libshared],
2479 dependencies : [libcurl,
2483 install_rpath : rootlibexecdir,
2485 install_dir : rootlibexecdir)
2487 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2490 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2491 public_programs += executable(
2492 'systemd-journal-upload',
2493 systemd_journal_upload_sources,
2494 include_directories : includes,
2495 link_with : [libshared],
2496 dependencies : [versiondep,
2503 install_rpath : rootlibexecdir,
2505 install_dir : rootlibexecdir)
2508 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2509 public_programs += executable(
2510 'systemd-journal-remote',
2511 systemd_journal_remote_sources,
2512 include_directories : includes,
2513 link_with : [libshared,
2514 libsystemd_journal_remote],
2515 dependencies : [threads,
2521 install_rpath : rootlibexecdir,
2523 install_dir : rootlibexecdir)
2525 public_programs += executable(
2526 'systemd-journal-gatewayd',
2527 systemd_journal_gatewayd_sources,
2528 include_directories : includes,
2529 link_with : [libshared],
2530 dependencies : [threads,
2536 install_rpath : rootlibexecdir,
2538 install_dir : rootlibexecdir)
2541 if conf.get('ENABLE_COREDUMP') == 1
2544 systemd_coredump_sources,
2545 include_directories : includes,
2546 link_with : [libshared],
2547 dependencies : [threads,
2553 install_rpath : rootlibexecdir,
2555 install_dir : rootlibexecdir)
2557 public_programs += executable(
2559 coredumpctl_sources,
2560 include_directories : includes,
2561 link_with : [libshared],
2562 dependencies : [threads,
2566 install_rpath : rootlibexecdir,
2570 if conf.get('ENABLE_PSTORE') == 1
2573 systemd_pstore_sources,
2574 include_directories : includes,
2575 link_with : [libshared],
2576 dependencies : [threads,
2582 install_rpath : rootlibexecdir,
2584 install_dir : rootlibexecdir)
2587 if conf.get('ENABLE_BINFMT') == 1
2588 public_programs += executable(
2590 'src/binfmt/binfmt.c',
2591 include_directories : includes,
2592 link_with : [libshared],
2593 install_rpath : rootlibexecdir,
2595 install_dir : rootlibexecdir)
2597 meson.add_install_script('sh', '-c',
2598 mkdir_p.format(binfmtdir))
2599 meson.add_install_script('sh', '-c',
2600 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2603 if conf.get('ENABLE_REPART') == 1
2606 systemd_repart_sources,
2607 include_directories : includes,
2608 link_with : [libshared],
2609 dependencies : [threads,
2614 install_rpath : rootlibexecdir,
2616 install_dir : rootbindir)
2618 if want_tests != 'false'
2621 args : exe.full_path())
2625 if conf.get('ENABLE_VCONSOLE') == 1
2627 'systemd-vconsole-setup',
2628 'src/vconsole/vconsole-setup.c',
2629 include_directories : includes,
2630 link_with : [libshared],
2631 install_rpath : rootlibexecdir,
2633 install_dir : rootlibexecdir)
2636 if conf.get('ENABLE_RANDOMSEED') == 1
2638 'systemd-random-seed',
2639 'src/random-seed/random-seed.c',
2640 include_directories : includes,
2641 link_with : [libshared],
2642 install_rpath : rootlibexecdir,
2644 install_dir : rootlibexecdir)
2647 if conf.get('ENABLE_FIRSTBOOT') == 1
2649 'systemd-firstboot',
2650 'src/firstboot/firstboot.c',
2651 include_directories : includes,
2652 link_with : [libshared],
2653 dependencies : [libcrypt],
2654 install_rpath : rootlibexecdir,
2656 install_dir : rootbindir)
2660 'systemd-remount-fs',
2661 'src/remount-fs/remount-fs.c',
2662 include_directories : includes,
2663 link_with : [libcore_shared,
2665 install_rpath : rootlibexecdir,
2667 install_dir : rootlibexecdir)
2670 'systemd-machine-id-setup',
2671 'src/machine-id-setup/machine-id-setup-main.c',
2672 include_directories : includes,
2673 link_with : [libcore_shared,
2675 install_rpath : rootlibexecdir,
2677 install_dir : rootbindir)
2682 include_directories : includes,
2683 link_with : [libshared],
2684 install_rpath : rootlibexecdir,
2686 install_dir : rootlibexecdir)
2688 executable('systemd-growfs',
2689 'src/partition/growfs.c',
2690 include_directories : includes,
2691 link_with : [libshared],
2692 dependencies : [libcryptsetup],
2693 install_rpath : rootlibexecdir,
2695 install_dir : rootlibexecdir)
2699 'src/partition/makefs.c',
2700 include_directories : includes,
2701 link_with : [libshared],
2702 install_rpath : rootlibexecdir,
2704 install_dir : rootlibexecdir)
2708 'src/sleep/sleep.c',
2709 include_directories : includes,
2710 link_with : [libshared],
2711 install_rpath : rootlibexecdir,
2713 install_dir : rootlibexecdir)
2715 install_data('src/sleep/sleep.conf',
2716 install_dir : pkgsysconfdir)
2718 public_programs += executable(
2720 'src/sysctl/sysctl.c',
2721 include_directories : includes,
2722 link_with : [libshared],
2723 install_rpath : rootlibexecdir,
2725 install_dir : rootlibexecdir)
2729 'src/ac-power/ac-power.c',
2730 include_directories : includes,
2731 link_with : [libshared],
2732 install_rpath : rootlibexecdir,
2734 install_dir : rootlibexecdir)
2736 public_programs += executable(
2737 'systemd-detect-virt',
2738 'src/detect-virt/detect-virt.c',
2739 include_directories : includes,
2740 link_with : [libshared],
2741 install_rpath : rootlibexecdir,
2744 public_programs += executable(
2746 'src/delta/delta.c',
2747 include_directories : includes,
2748 link_with : [libshared],
2749 install_rpath : rootlibexecdir,
2752 public_programs += executable(
2754 'src/escape/escape.c',
2755 include_directories : includes,
2756 link_with : [libshared],
2757 install_rpath : rootlibexecdir,
2759 install_dir : rootbindir)
2761 public_programs += executable(
2763 'src/notify/notify.c',
2764 include_directories : includes,
2765 link_with : [libshared],
2766 install_rpath : rootlibexecdir,
2768 install_dir : rootbindir)
2771 'systemd-volatile-root',
2772 'src/volatile-root/volatile-root.c',
2773 include_directories : includes,
2774 link_with : [libshared],
2775 install_rpath : rootlibexecdir,
2776 install : conf.get('ENABLE_INITRD') == 1,
2777 install_dir : rootlibexecdir)
2780 'systemd-cgroups-agent',
2781 'src/cgroups-agent/cgroups-agent.c',
2782 include_directories : includes,
2783 link_with : [libshared],
2784 install_rpath : rootlibexecdir,
2786 install_dir : rootlibexecdir)
2788 public_programs += executable(
2790 'src/id128/id128.c',
2791 include_directories : includes,
2792 link_with : [libshared],
2793 install_rpath : rootlibexecdir,
2796 public_programs += executable(
2799 include_directories : includes,
2800 link_with : [libshared],
2801 install_rpath : rootlibexecdir,
2804 public_programs += executable(
2805 'systemd-ask-password',
2806 'src/ask-password/ask-password.c',
2807 include_directories : includes,
2808 link_with : [libshared],
2809 install_rpath : rootlibexecdir,
2811 install_dir : rootbindir)
2814 'systemd-reply-password',
2815 'src/reply-password/reply-password.c',
2816 include_directories : includes,
2817 link_with : [libshared],
2818 install_rpath : rootlibexecdir,
2820 install_dir : rootlibexecdir)
2822 public_programs += executable(
2823 'systemd-tty-ask-password-agent',
2824 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2825 include_directories : includes,
2826 link_with : [libshared],
2827 install_rpath : rootlibexecdir,
2829 install_dir : rootbindir)
2831 public_programs += executable(
2834 include_directories : includes,
2835 link_with : [libshared],
2836 install_rpath : rootlibexecdir,
2839 public_programs += executable(
2841 'src/cgtop/cgtop.c',
2842 include_directories : includes,
2843 link_with : [libshared],
2844 install_rpath : rootlibexecdir,
2849 'src/initctl/initctl.c',
2850 include_directories : includes,
2851 link_with : [libshared],
2852 install_rpath : rootlibexecdir,
2854 install_dir : rootlibexecdir)
2856 public_programs += executable(
2858 'src/mount/mount-tool.c',
2859 include_directories : includes,
2860 link_with : [libshared],
2861 dependencies: [libmount],
2862 install_rpath : rootlibexecdir,
2865 meson.add_install_script(meson_make_symlink,
2866 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2868 public_programs += executable(
2871 include_directories : includes,
2872 link_with : [libshared],
2873 install_rpath : rootlibexecdir,
2876 public_programs += executable(
2877 'systemd-stdio-bridge',
2878 'src/stdio-bridge/stdio-bridge.c',
2879 include_directories : includes,
2880 link_with : [libshared],
2881 dependencies : [versiondep],
2882 install_rpath : rootlibexecdir,
2885 public_programs += executable(
2887 'src/busctl/busctl.c',
2888 'src/busctl/busctl-introspect.c',
2889 'src/busctl/busctl-introspect.h',
2890 include_directories : includes,
2891 link_with : [libshared],
2892 install_rpath : rootlibexecdir,
2895 if conf.get('ENABLE_SYSUSERS') == 1
2896 public_programs += executable(
2898 'src/sysusers/sysusers.c',
2899 include_directories : includes,
2900 link_with : [libshared],
2901 install_rpath : rootlibexecdir,
2903 install_dir : rootbindir)
2906 if conf.get('ENABLE_TMPFILES') == 1
2909 'src/tmpfiles/tmpfiles.c',
2910 'src/tmpfiles/offline-passwd.c',
2911 'src/tmpfiles/offline-passwd.h',
2912 include_directories : includes,
2913 link_with : [libshared],
2914 dependencies : [libacl],
2915 install_rpath : rootlibexecdir,
2917 install_dir : rootbindir)
2918 public_programs += exe
2920 if want_tests != 'false'
2921 test('test-systemd-tmpfiles',
2922 test_systemd_tmpfiles_py,
2923 # https://github.com/mesonbuild/meson/issues/2681
2924 args : exe.full_path())
2928 if conf.get('ENABLE_HWDB') == 1
2929 public_programs += executable(
2932 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2933 include_directories : includes,
2934 link_with : [libudev_static],
2935 install_rpath : udev_rpath,
2937 install_dir : rootbindir)
2940 if conf.get('ENABLE_QUOTACHECK') == 1
2942 'systemd-quotacheck',
2943 'src/quotacheck/quotacheck.c',
2944 include_directories : includes,
2945 link_with : [libshared],
2946 install_rpath : rootlibexecdir,
2948 install_dir : rootlibexecdir)
2951 public_programs += executable(
2952 'systemd-socket-proxyd',
2953 'src/socket-proxy/socket-proxyd.c',
2954 include_directories : includes,
2955 link_with : [libshared],
2956 dependencies : [threads],
2957 install_rpath : rootlibexecdir,
2959 install_dir : rootlibexecdir)
2961 public_programs += executable(
2963 systemd_udevd_sources,
2964 include_directories : includes,
2965 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2966 link_with : [libudev_core,
2969 dependencies : [versiondep,
2975 install_rpath : udev_rpath,
2977 install_dir : rootlibexecdir)
2979 public_programs += executable(
2982 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2983 include_directories : includes,
2984 link_with : [libudev_core,
2987 dependencies : [versiondep,
2993 install_rpath : udev_rpath,
2995 install_dir : rootbindir)
2999 systemd_shutdown_sources,
3000 include_directories : includes,
3001 link_with : [libcore_shared,
3003 dependencies : [libmount],
3004 install_rpath : rootlibexecdir,
3006 install_dir : rootlibexecdir)
3009 'systemd-update-done',
3010 'src/update-done/update-done.c',
3011 include_directories : includes,
3012 link_with : [libshared],
3013 install_rpath : rootlibexecdir,
3015 install_dir : rootlibexecdir)
3018 'systemd-update-utmp',
3019 'src/update-utmp/update-utmp.c',
3020 include_directories : includes,
3021 link_with : [libshared],
3022 dependencies : [libaudit],
3023 install_rpath : rootlibexecdir,
3025 install_dir : rootlibexecdir)
3027 if conf.get('HAVE_KMOD') == 1
3029 'systemd-modules-load',
3030 'src/modules-load/modules-load.c',
3031 include_directories : includes,
3032 link_with : [libshared],
3033 dependencies : [libkmod],
3034 install_rpath : rootlibexecdir,
3036 install_dir : rootlibexecdir)
3038 meson.add_install_script('sh', '-c',
3039 mkdir_p.format(modulesloaddir))
3040 meson.add_install_script('sh', '-c',
3041 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
3044 public_programs += executable(
3046 systemd_nspawn_sources,
3047 include_directories : includes,
3048 link_with : [libcore_shared,
3051 dependencies : [libblkid,
3053 install_rpath : rootlibexecdir,
3056 if conf.get('ENABLE_NETWORKD') == 1
3059 systemd_networkd_sources,
3060 include_directories : network_include_dir,
3061 link_with : [libnetworkd_core,
3064 networkd_link_with],
3065 dependencies : [threads],
3066 install_rpath : rootlibexecdir,
3068 install_dir : rootlibexecdir)
3071 'systemd-networkd-wait-online',
3072 systemd_networkd_wait_online_sources,
3073 include_directories : includes,
3074 link_with : [libnetworkd_core,
3075 networkd_link_with],
3076 install_rpath : rootlibexecdir,
3078 install_dir : rootlibexecdir)
3080 public_programs += executable(
3083 include_directories : includes,
3084 link_with : [libsystemd_network,
3085 networkd_link_with],
3086 install_rpath : rootlibexecdir,
3088 install_dir : rootbindir)
3091 'systemd-network-generator',
3092 network_generator_sources,
3093 include_directories : includes,
3094 link_with : [networkd_link_with],
3095 install_rpath : rootlibexecdir,
3097 install_dir : rootlibexecdir)
3099 if want_tests != 'false'
3100 test('test-network-generator-conversion',
3101 test_network_generator_conversion_sh,
3102 # https://github.com/mesonbuild/meson/issues/2681
3103 args : exe.full_path())
3108 'systemd-sulogin-shell',
3109 ['src/sulogin-shell/sulogin-shell.c'],
3110 include_directories : includes,
3111 link_with : [libshared],
3112 install_rpath : rootlibexecdir,
3114 install_dir : rootlibexecdir)
3116 ############################################################
3119 'systemd-runtest.env',
3120 output : 'systemd-runtest.env',
3121 command : ['sh', '-c', '{ ' +
3122 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
3123 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
3125 build_by_default : true)
3127 foreach tuple : tests
3129 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3130 dependencies = tuple[2]
3131 condition = tuple.length() >= 4 ? tuple[3] : ''
3132 type = tuple.length() >= 5 ? tuple[4] : ''
3133 defs = tuple.length() >= 6 ? tuple[5] : []
3134 incs = tuple.length() >= 7 ? tuple[6] : includes
3137 name = sources[0].split('/')[-1].split('.')[0]
3138 if type.startswith('timeout=')
3139 timeout = type.split('=')[1].to_int()
3143 if condition == '' or conf.get(condition) == 1
3147 include_directories : incs,
3148 link_with : link_with,
3149 dependencies : [versiondep,
3152 build_by_default : want_tests != 'false',
3153 install_rpath : rootlibexecdir,
3154 install : install_tests,
3155 install_dir : join_paths(testsdir, type))
3158 message('@0@ is a manual test'.format(name))
3159 elif type == 'unsafe' and want_tests != 'unsafe'
3160 message('@0@ is an unsafe test'.format(name))
3161 elif want_tests != 'false'
3167 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3172 'test-libsystemd-sym',
3173 test_libsystemd_sym_c,
3174 include_directories : includes,
3175 link_with : [libsystemd],
3176 build_by_default : want_tests != 'false',
3177 install : install_tests,
3178 install_dir : testsdir)
3179 if want_tests != 'false'
3180 test('test-libsystemd-sym', exe)
3184 'test-libsystemd-static-sym',
3185 test_libsystemd_sym_c,
3186 include_directories : includes,
3187 link_with : [install_libsystemd_static],
3188 dependencies : [threads], # threads is already included in dependencies on the library,
3189 # but does not seem to get propagated. Add here as a work-around.
3190 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3191 install : install_tests and static_libsystemd_pic,
3192 install_dir : testsdir)
3193 if want_tests != 'false' and static_libsystemd_pic
3194 test('test-libsystemd-static-sym', exe)
3200 include_directories : includes,
3201 c_args : '-Wno-deprecated-declarations',
3202 link_with : [libudev],
3203 build_by_default : want_tests != 'false',
3204 install : install_tests,
3205 install_dir : testsdir)
3206 if want_tests != 'false'
3207 test('test-libudev-sym', exe)
3211 'test-libudev-static-sym',
3213 include_directories : includes,
3214 c_args : '-Wno-deprecated-declarations',
3215 link_with : [install_libudev_static],
3216 build_by_default : want_tests != 'false' and static_libudev_pic,
3217 install : install_tests and static_libudev_pic,
3218 install_dir : testsdir)
3219 if want_tests != 'false' and static_libudev_pic
3220 test('test-libudev-static-sym', exe)
3223 ############################################################
3227 if get_option('tests') != 'false'
3228 foreach tuple : fuzzers
3230 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3231 dependencies = tuple[2]
3232 defs = tuple.length() >= 4 ? tuple[3] : []
3233 incs = tuple.length() >= 5 ? tuple[4] : includes
3237 dependencies += fuzzing_engine
3239 if fuzzing_engine.found()
3240 dependencies += fuzzing_engine
3242 link_args += ['-fsanitize=fuzzer']
3245 sources += 'src/fuzz/fuzz-main.c'
3248 name = sources[0].split('/')[-1].split('.')[0]
3250 fuzzer_exes += executable(
3253 include_directories : [incs, include_directories('src/fuzz')],
3254 link_with : link_with,
3255 dependencies : dependencies,
3257 link_args: link_args,
3264 depends : fuzzer_exes,
3267 ############################################################
3269 make_directive_index_py = find_program('tools/make-directive-index.py')
3270 make_man_index_py = find_program('tools/make-man-index.py')
3271 xml_helper_py = find_program('tools/xml_helper.py')
3272 hwdb_update_sh = find_program('tools/hwdb-update.sh')
3273 autosuspend_update_sh = find_program('tools/autosuspend-update.sh')
3276 subdir('sysusers.d')
3277 subdir('tmpfiles.d')
3283 subdir('shell-completion/bash')
3284 subdir('shell-completion/zsh')
3285 subdir('docs/sysvinit')
3286 subdir('docs/var-log')
3288 install_subdir('factory/etc',
3289 install_dir : factorydir)
3291 install_data('xorg/50-systemd-user.sh',
3292 install_dir : xinitrcdir)
3293 install_data('modprobe.d/systemd.conf',
3294 install_dir : modprobedir)
3295 install_data('LICENSE.GPL2',
3299 'docs/CODING_STYLE.md',
3300 'docs/DISTRO_PORTING.md',
3301 'docs/ENVIRONMENT.md',
3303 'docs/TRANSIENT-SETTINGS.md',
3304 'docs/TRANSLATORS.md',
3305 'docs/UIDS-GIDS.md',
3306 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3307 install_dir : docdir)
3309 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3310 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3312 ############################################################
3314 check_help = find_program('tools/check-help.sh')
3316 foreach exec : public_programs
3317 name = exec.full_path().split('/')[-1]
3318 if want_tests != 'false'
3319 test('check-help-' + name,
3321 args : exec.full_path())
3325 ############################################################
3327 check_directives_sh = find_program('tools/check-directives.sh')
3329 if want_tests != 'false'
3330 test('check-directives',
3331 check_directives_sh,
3332 args : project_source_root)
3335 ############################################################
3337 # Enable tests for all supported sanitizers
3338 foreach tuple : sanitizers
3339 sanitizer = tuple[0]
3342 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3344 foreach p : fuzz_regression_tests
3345 b = p.split('/')[-2]
3346 c = p.split('/')[-1]
3348 name = '@0@:@1@'.format(b, sanitizer)
3351 if want_tests == 'false'
3352 message('Not compiling @0@ because tests is set to false'.format(name))
3354 exe = custom_target(
3358 command : [env, 'ln', '-fs',
3359 join_paths(build.full_path(), b),
3361 build_by_default : true)
3363 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3368 if want_tests != 'false' and slow_tests
3369 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3371 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
3373 args : [exe.full_path(),
3374 join_paths(project_source_root, p)])
3381 ############################################################
3384 all_files = run_command(
3386 ['--git-dir=@0@/.git'.format(project_source_root),
3389 all_files = files(all_files.stdout().split())
3394 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3397 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3401 git_contrib_sh = find_program('tools/git-contrib.sh')
3404 command : [git_contrib_sh])
3408 git_head = run_command(
3410 ['--git-dir=@0@/.git'.format(project_source_root),
3411 'rev-parse', 'HEAD']).stdout().strip()
3412 git_head_short = run_command(
3414 ['--git-dir=@0@/.git'.format(project_source_root),
3415 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3419 command : ['git', 'archive',
3420 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3422 '--prefix', 'systemd-@0@/'.format(git_head),
3426 ############################################################
3428 check_api_docs_sh = find_program('tools/check-api-docs.sh')
3431 depends : [man, libsystemd, libudev],
3432 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3434 ############################################################
3435 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3438 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3440 'split /usr: @0@'.format(split_usr),
3441 'split bin-sbin: @0@'.format(split_bin),
3442 'prefix directory: @0@'.format(prefixdir),
3443 'rootprefix directory: @0@'.format(rootprefixdir),
3444 'sysconf directory: @0@'.format(sysconfdir),
3445 'include directory: @0@'.format(includedir),
3446 'lib directory: @0@'.format(libdir),
3447 'rootlib directory: @0@'.format(rootlibdir),
3448 'SysV init scripts: @0@'.format(sysvinit_path),
3449 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3450 'PAM modules directory: @0@'.format(pamlibdir),
3451 'PAM configuration directory: @0@'.format(pamconfdir),
3452 'RPM macros directory: @0@'.format(rpmmacrosdir),
3453 'modprobe.d directory: @0@'.format(modprobedir),
3454 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3455 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3456 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3457 'bash completions directory: @0@'.format(bashcompletiondir),
3458 'zsh completions directory: @0@'.format(zshcompletiondir),
3459 'extra start script: @0@'.format(get_option('rc-local')),
3460 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3461 get_option('debug-tty')),
3462 'TTY GID: @0@'.format(tty_gid),
3463 'users GID: @0@'.format(substs.get('USERS_GID')),
3464 'maximum system UID: @0@'.format(system_uid_max),
3465 'maximum system GID: @0@'.format(system_gid_max),
3466 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3467 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3468 'minimum container UID base: @0@'.format(container_uid_base_min),
3469 'maximum container UID base: @0@'.format(container_uid_base_max),
3470 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3471 'render group access mode: @0@'.format(get_option('group-render-mode')),
3472 'certificate root directory: @0@'.format(get_option('certificate-root')),
3473 'support URL: @0@'.format(support_url),
3474 'nobody user name: @0@'.format(nobody_user),
3475 'nobody group name: @0@'.format(nobody_group),
3476 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3477 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3479 'default DNSSEC mode: @0@'.format(default_dnssec),
3480 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3481 'default mDNS mode: @0@'.format(default_mdns),
3482 'default LLMNR mode: @0@'.format(default_llmnr),
3483 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3484 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3485 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3486 'default locale: @0@'.format(default_locale),
3487 'default user $PATH: @0@'.format(default_user_path_display),
3488 'systemd service watchdog: @0@'.format(watchdog_opt)]
3490 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3491 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3493 'default DNS servers: @0@'.format(alt_dns_servers),
3494 'default NTP servers: @0@'.format(alt_ntp_servers)]
3496 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3497 '@@0@'.format(time_epoch)).stdout().strip()
3499 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3502 'static libsystemd: @0@'.format(static_libsystemd),
3503 'static libudev: @0@'.format(static_libudev)]
3506 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3507 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3508 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3510 if conf.get('ENABLE_EFI') == 1
3511 status += 'efi arch: @0@'.format(efi_arch)
3515 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3516 'EFI CC @0@'.format(' '.join(efi_cc)),
3517 'EFI lds: @0@'.format(efi_lds),
3518 'EFI crt0: @0@'.format(efi_crt0),
3519 'EFI include directory: @0@'.format(efi_incdir)]
3579 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3580 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3584 ['legacy pkla', install_polkit_pkla],
3586 ['gnu-efi', have_gnu_efi],
3599 ['man pages', want_man],
3600 ['html pages', want_html],
3601 ['man page indices', want_man and have_lxml],
3606 ['adm group', get_option('adm-group')],
3607 ['wheel group', get_option('wheel-group')],
3610 ['debug mmap cache'],
3612 ['valgrind', conf.get('VALGRIND') == 1],
3613 ['trace logging', conf.get('LOG_TRACE') == 1],
3614 ['install tests', install_tests],
3615 ['link-udev-shared', get_option('link-udev-shared')],
3616 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3617 ['link-networkd-shared', get_option('link-networkd-shared')],
3618 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3619 ['kernel-install', get_option('kernel-install')],
3620 ['systemd-analyze', get_option('analyze')],
3623 if tuple.length() >= 2
3626 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3627 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3628 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3639 'enabled features: @0@'.format(', '.join(found)),
3641 'disabled features: @0@'.format(', '.join(missing)),
3643 message('\n '.join(status))
3645 if rootprefixdir != rootprefix_default
3647 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3648 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3649 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))