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 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
94 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
95 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
97 # join_paths ignores the preceding arguments if an absolute component is
98 # encountered, so this should canonicalize various paths when they are
99 # absolute or relative.
100 prefixdir = get_option('prefix')
101 if not prefixdir.startswith('/')
102 error('Prefix is not absolute: "@0@"'.format(prefixdir))
104 bindir = join_paths(prefixdir, get_option('bindir'))
105 libdir = join_paths(prefixdir, get_option('libdir'))
106 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
107 includedir = join_paths(prefixdir, get_option('includedir'))
108 datadir = join_paths(prefixdir, get_option('datadir'))
109 localstatedir = join_paths('/', get_option('localstatedir'))
111 rootbindir = join_paths(rootprefixdir, 'bin')
112 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
113 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
115 rootlibdir = get_option('rootlibdir')
117 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
120 # Dirs of external packages
121 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
122 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
123 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
124 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
125 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
126 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
127 rpmmacrosdir = get_option('rpmmacrosdir')
128 if rpmmacrosdir != 'no'
129 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
131 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
134 pkgdatadir = join_paths(datadir, 'systemd')
135 environmentdir = join_paths(prefixdir, 'lib/environment.d')
136 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
137 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
138 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
139 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
140 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
141 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
142 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
143 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
144 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
145 pkgincludedir = join_paths(includedir, 'systemd')
146 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
147 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
148 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
149 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
150 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
151 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
152 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
153 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
154 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
155 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
156 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
157 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
158 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
159 factorydir = join_paths(datadir, 'factory')
160 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
161 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
162 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
163 catalogstatedir = join_paths(systemdstatedir, 'catalog')
164 randomseeddir = join_paths(localstatedir, 'lib/systemd')
165 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
166 ntpservicelistdir = join_paths(rootprefixdir, 'lib/systemd/ntp-units.d')
168 docdir = get_option('docdir')
170 docdir = join_paths(datadir, 'doc/systemd')
173 dbuspolicydir = get_option('dbuspolicydir')
174 if dbuspolicydir == ''
175 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
178 dbussessionservicedir = get_option('dbussessionservicedir')
179 if dbussessionservicedir == ''
180 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
183 dbussystemservicedir = get_option('dbussystemservicedir')
184 if dbussystemservicedir == ''
185 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
188 pamlibdir = get_option('pamlibdir')
190 pamlibdir = join_paths(rootlibdir, 'security')
193 pamconfdir = get_option('pamconfdir')
195 pamconfdir = join_paths(sysconfdir, 'pam.d')
198 memory_accounting_default = get_option('memory-accounting-default')
199 status_unit_format_default = get_option('status-unit-format-default')
201 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
202 conf.set_quoted('SYSTEM_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'system'))
203 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
204 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
205 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
206 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
208 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
210 conf.set_quoted('USER_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'user'))
211 conf.set_quoted('USER_DATA_UNIT_DIR', userunitdir)
212 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
213 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
214 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
215 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
216 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
217 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
218 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
219 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
220 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
221 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
222 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
223 conf.set_quoted('ROOTPREFIX', rootprefixdir)
224 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
225 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
226 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
227 conf.set_quoted('SYSTEM_GENERATOR_DIR', systemgeneratordir)
228 conf.set_quoted('USER_GENERATOR_DIR', usergeneratordir)
229 conf.set_quoted('SYSTEM_ENV_GENERATOR_DIR', systemenvgeneratordir)
230 conf.set_quoted('USER_ENV_GENERATOR_DIR', userenvgeneratordir)
231 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
232 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
233 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
234 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
235 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
236 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
237 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
238 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
239 conf.set_quoted('LIBDIR', libdir)
240 conf.set_quoted('ROOTLIBDIR', rootlibdir)
241 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
242 conf.set_quoted('BOOTLIBDIR', bootlibdir)
243 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
244 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
245 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
246 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
247 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
248 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
249 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
250 conf.set_quoted('SYSTEMD_HOMEWORK_PATH', join_paths(rootlibexecdir, 'systemd-homework'))
251 conf.set_quoted('SYSTEMD_USERWORK_PATH', join_paths(rootlibexecdir, 'systemd-userwork'))
252 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
253 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
254 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
256 substs.set('prefix', prefixdir)
257 substs.set('rootprefix', rootprefixdir)
258 substs.set('rootprefix_noslash', rootprefixdir_noslash)
259 substs.set('exec_prefix', prefixdir)
260 substs.set('libdir', libdir)
261 substs.set('rootlibdir', rootlibdir)
262 substs.set('includedir', includedir)
263 substs.set('sysconfdir', sysconfdir)
264 substs.set('bindir', bindir)
265 substs.set('rootbindir', rootbindir)
266 substs.set('rootlibexecdir', rootlibexecdir)
267 substs.set('systemunitdir', systemunitdir)
268 substs.set('userunitdir', userunitdir)
269 substs.set('systempresetdir', systempresetdir)
270 substs.set('userpresetdir', userpresetdir)
271 substs.set('udevhwdbdir', udevhwdbdir)
272 substs.set('udevrulesdir', udevrulesdir)
273 substs.set('udevlibexecdir', udevlibexecdir)
274 substs.set('environmentdir', environmentdir)
275 substs.set('catalogdir', catalogdir)
276 substs.set('tmpfilesdir', tmpfilesdir)
277 substs.set('sysusersdir', sysusersdir)
278 substs.set('sysctldir', sysctldir)
279 substs.set('binfmtdir', binfmtdir)
280 substs.set('modulesloaddir', modulesloaddir)
281 substs.set('modprobedir', modprobedir)
282 substs.set('systemgeneratordir', systemgeneratordir)
283 substs.set('usergeneratordir', usergeneratordir)
284 substs.set('systemenvgeneratordir', systemenvgeneratordir)
285 substs.set('userenvgeneratordir', userenvgeneratordir)
286 substs.set('systemshutdowndir', systemshutdowndir)
287 substs.set('systemsleepdir', systemsleepdir)
288 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
289 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
290 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
291 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
292 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
293 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
294 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
295 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
296 substs.set('BUILD_ROOT', project_build_root)
298 #####################################################################
300 cc = meson.get_compiler('c')
301 pkgconfig = import('pkgconfig')
302 check_compilation_sh = find_program('tools/check-compilation.sh')
303 meson_build_sh = find_program('tools/meson-build.sh')
305 want_tests = get_option('tests')
306 slow_tests = want_tests != 'false' and get_option('slow-tests')
307 install_tests = get_option('install-tests')
309 if add_languages('cpp', required : fuzzer_build)
310 # Used only for tests
311 cxx = meson.get_compiler('cpp')
312 cxx_cmd = ' '.join(cxx.cmd_array())
318 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
319 if fuzzing_engine.found()
320 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
321 elif cc.has_argument('-fsanitize=fuzzer-no-link')
322 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
324 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
327 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
330 # Those generate many false positives, and we do not want to change the code to
332 basic_disabled_warnings = [
333 '-Wno-unused-parameter',
334 '-Wno-missing-field-initializers',
335 '-Wno-unused-result',
336 '-Wno-format-signedness',
339 possible_cc_flags = [
342 '-Wmissing-include-dirs',
343 '-Wold-style-definition',
347 '-Wsuggest-attribute=noreturn',
348 '-Werror=missing-prototypes',
349 '-Werror=implicit-function-declaration',
350 '-Werror=missing-declarations',
351 '-Werror=return-type',
352 '-Werror=incompatible-pointer-types',
354 '-Wstrict-prototypes',
356 '-Wmissing-noreturn',
357 '-Wimplicit-fallthrough=5',
360 '-Wstrict-aliasing=2',
363 '-Werror=shift-count-overflow',
364 '-Werror=shift-overflow=2',
368 # negative arguments are correctly detected starting with meson 0.46.
369 '-Wno-error=#warnings', # clang
370 '-Wno-string-plus-int', # clang
372 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
373 # optimizations enabled, producing essentially false positives.
374 '-Wno-maybe-uninitialized',
378 '-fdiagnostics-show-option',
379 '-fno-strict-aliasing',
380 '-fvisibility=hidden',
382 '-fstack-protector-strong',
383 '--param=ssp-buffer-size=4',
386 # --as-needed and --no-undefined are provided by meson by default,
387 # run mesonconf to see what is enabled
388 possible_link_flags = [
394 if cc.get_id() == 'clang'
395 possible_cc_flags += [
396 '-Wno-typedef-redefinition',
397 '-Wno-gnu-variable-sized-type-not-at-end',
401 if get_option('buildtype') != 'debug'
402 possible_cc_flags += [
403 '-ffunction-sections',
407 possible_link_flags += '-Wl,--gc-sections'
410 add_project_arguments(cc.get_supported_arguments(basic_disabled_warnings), language : 'c')
411 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
412 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
414 have = cc.has_argument('-Wzero-length-bounds')
415 conf.set10('HAVE_ZERO_LENGTH_BOUNDS', have)
419 #include <inttypes.h>
420 typedef uint64_t usec_t;
421 usec_t now(clockid_t clock);
426 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
427 add_project_arguments('-Werror=shadow', language : 'c')
431 add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp')
434 cpp = ' '.join(cc.cmd_array()) + ' -E'
436 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
438 #####################################################################
439 # compilation result tests
441 conf.set('_GNU_SOURCE', true)
442 conf.set('__SANE_USERSPACE_TYPES__', true)
443 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
445 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
446 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
447 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
448 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
452 #include <sys/stat.h>
455 foreach decl : ['char16_t',
460 # We get -1 if the size cannot be determined
461 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
463 if decl == 'struct statx'
465 want_linux_stat_h = false
467 have = cc.sizeof(decl,
468 prefix : decl_headers + '#include <linux/stat.h>',
469 args : '-D_GNU_SOURCE') > 0
470 want_linux_stat_h = have
474 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
477 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
479 foreach ident : ['secure_getenv', '__secure_getenv']
480 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
484 ['memfd_create', '''#include <sys/mman.h>'''],
485 ['gettid', '''#include <sys/types.h>
486 #include <unistd.h>'''],
487 ['pivot_root', '''#include <stdlib.h>
488 #include <unistd.h>'''], # no known header declares pivot_root
489 ['name_to_handle_at', '''#include <sys/types.h>
490 #include <sys/stat.h>
491 #include <fcntl.h>'''],
492 ['setns', '''#include <sched.h>'''],
493 ['renameat2', '''#include <stdio.h>
494 #include <fcntl.h>'''],
495 ['kcmp', '''#include <linux/kcmp.h>'''],
496 ['keyctl', '''#include <sys/types.h>
497 #include <keyutils.h>'''],
498 ['copy_file_range', '''#include <sys/syscall.h>
499 #include <unistd.h>'''],
500 ['bpf', '''#include <sys/syscall.h>
501 #include <unistd.h>'''],
502 ['statx', '''#include <sys/types.h>
503 #include <sys/stat.h>
504 #include <unistd.h>'''],
505 ['explicit_bzero' , '''#include <string.h>'''],
506 ['reallocarray', '''#include <malloc.h>'''],
507 ['set_mempolicy', '''#include <stdlib.h>
508 #include <unistd.h>'''],
509 ['get_mempolicy', '''#include <stdlib.h>
510 #include <unistd.h>'''],
511 ['pidfd_send_signal', '''#include <stdlib.h>
514 #include <sys/wait.h>'''],
515 ['pidfd_open', '''#include <stdlib.h>
518 #include <sys/wait.h>'''],
519 ['rt_sigqueueinfo', '''#include <stdlib.h>
522 #include <sys/wait.h>'''],
525 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
526 conf.set10('HAVE_' + ident[0].to_upper(), have)
529 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
530 conf.set10('USE_SYS_RANDOM_H', true)
531 conf.set10('HAVE_GETRANDOM', true)
533 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
534 conf.set10('USE_SYS_RANDOM_H', false)
535 conf.set10('HAVE_GETRANDOM', have)
538 #####################################################################
540 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
542 get_option('version-tag'),
543 meson.project_version()]
546 input : 'src/version/version.h.in',
547 output : 'version.h',
550 versiondep = declare_dependency(sources: version_h)
552 sed = find_program('sed')
553 awk = find_program('awk')
554 m4 = find_program('m4')
555 stat = find_program('stat')
556 git = find_program('git', required : false)
557 env = find_program('env')
558 perl = find_program('perl', required : false)
560 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
561 mkdir_p = 'mkdir -p $DESTDIR/@0@'
562 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
563 splash_bmp = files('test/splash.bmp')
565 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
566 # /usr/sbin, /sbin, and fall back to the default from middle column.
567 progs = [['quotaon', '/usr/sbin/quotaon' ],
568 ['quotacheck', '/usr/sbin/quotacheck' ],
569 ['kmod', '/usr/bin/kmod' ],
570 ['kexec', '/usr/sbin/kexec' ],
571 ['sulogin', '/usr/sbin/sulogin' ],
572 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
573 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
574 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
575 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
576 ['nologin', '/usr/sbin/nologin', ],
579 path = get_option(prog[0] + '-path')
581 message('Using @1@ for @0@'.format(prog[0], path))
583 exe = find_program(prog[0],
584 '/usr/sbin/' + prog[0],
587 path = exe.found() ? exe.path() : prog[1]
589 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
590 conf.set_quoted(name, path)
591 substs.set(name, path)
594 conf.set_quoted('TELINIT', get_option('telinit-path'))
596 if run_command('ln', '--relative', '--help').returncode() != 0
597 error('ln does not support --relative (added in coreutils 8.16)')
600 ############################################################
602 gperf = find_program('gperf')
604 gperf_test_format = '''
606 const char * in_word_set(const char *, @0@);
609 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
610 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
611 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
612 if cc.compiles(gperf_test)
613 gperf_len_type = 'size_t'
615 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
616 if cc.compiles(gperf_test)
617 gperf_len_type = 'unsigned'
619 error('unable to determine gperf len type')
622 message('gperf len type is @0@'.format(gperf_len_type))
623 conf.set('GPERF_LEN_TYPE', gperf_len_type,
624 description : 'The type of gperf "len" parameter')
626 ############################################################
628 if not cc.has_header('sys/capability.h')
629 error('POSIX caps headers not found')
631 foreach header : ['crypt.h',
633 'linux/vm_sockets.h',
635 'valgrind/memcheck.h',
636 'valgrind/valgrind.h',
639 conf.set10('HAVE_' + header.underscorify().to_upper(),
640 cc.has_header(header))
643 ############################################################
645 fallback_hostname = get_option('fallback-hostname')
646 if fallback_hostname == '' or fallback_hostname[0] == '.' or fallback_hostname[0] == '-'
647 error('Invalid fallback-hostname configuration')
648 # A more extensive test is done in test-hostname-util. Let's catch
649 # the most obvious errors here so we don't fail with an assert later.
651 conf.set_quoted('FALLBACK_HOSTNAME', fallback_hostname)
653 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
654 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
656 default_hierarchy = get_option('default-hierarchy')
657 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
658 description : 'default cgroup hierarchy as string')
659 if default_hierarchy == 'legacy'
660 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
661 elif default_hierarchy == 'hybrid'
662 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
664 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
667 default_net_naming_scheme = get_option('default-net-naming-scheme')
668 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
670 time_epoch = get_option('time-epoch')
673 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
675 conf.set('TIME_EPOCH', time_epoch)
677 system_uid_max = get_option('system-uid-max')
678 if system_uid_max == -1
679 system_uid_max = run_command(
681 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
682 '/etc/login.defs').stdout().strip()
683 if system_uid_max == ''
686 system_uid_max = system_uid_max.to_int()
689 conf.set('SYSTEM_UID_MAX', system_uid_max)
690 substs.set('systemuidmax', system_uid_max)
692 system_gid_max = get_option('system-gid-max')
693 if system_gid_max == -1
694 system_gid_max = run_command(
696 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
697 '/etc/login.defs').stdout().strip()
698 if system_gid_max == ''
701 system_gid_max = system_gid_max.to_int()
704 conf.set('SYSTEM_GID_MAX', system_gid_max)
705 substs.set('systemgidmax', system_gid_max)
707 dynamic_uid_min = get_option('dynamic-uid-min')
708 dynamic_uid_max = get_option('dynamic-uid-max')
709 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
710 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
711 substs.set('dynamicuidmin', dynamic_uid_min)
712 substs.set('dynamicuidmax', dynamic_uid_max)
714 container_uid_base_min = get_option('container-uid-base-min')
715 container_uid_base_max = get_option('container-uid-base-max')
716 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
717 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
718 substs.set('containeruidbasemin', container_uid_base_min)
719 substs.set('containeruidbasemax', container_uid_base_max)
721 nobody_user = get_option('nobody-user')
722 nobody_group = get_option('nobody-group')
724 if not meson.is_cross_build()
725 getent_result = run_command('getent', 'passwd', '65534')
726 if getent_result.returncode() == 0
727 name = getent_result.stdout().split(':')[0]
728 if name != nobody_user
730 '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) +
731 'Your build will result in an user table setup that is incompatible with the local system.')
734 id_result = run_command('id', '-u', nobody_user)
735 if id_result.returncode() == 0
736 id = id_result.stdout().to_int()
739 '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) +
740 'Your build will result in an user table setup that is incompatible with the local system.')
744 getent_result = run_command('getent', 'group', '65534')
745 if getent_result.returncode() == 0
746 name = getent_result.stdout().split(':')[0]
747 if name != nobody_group
749 '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) +
750 'Your build will result in an group table setup that is incompatible with the local system.')
753 id_result = run_command('id', '-g', nobody_group)
754 if id_result.returncode() == 0
755 id = id_result.stdout().to_int()
758 '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) +
759 'Your build will result in an group table setup that is incompatible with the local system.')
763 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
765 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
766 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
769 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
770 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
771 substs.set('NOBODY_USER_NAME', nobody_user)
772 substs.set('NOBODY_GROUP_NAME', nobody_group)
774 tty_gid = get_option('tty-gid')
775 conf.set('TTY_GID', tty_gid)
776 substs.set('TTY_GID', tty_gid)
778 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
779 users_gid = get_option('users-gid')
780 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
782 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
783 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
785 dev_kvm_mode = get_option('dev-kvm-mode')
786 substs.set('DEV_KVM_MODE', dev_kvm_mode)
787 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
788 group_render_mode = get_option('group-render-mode')
789 substs.set('GROUP_RENDER_MODE', group_render_mode)
790 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
792 kill_user_processes = get_option('default-kill-user-processes')
793 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
794 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
795 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
797 dns_servers = get_option('dns-servers')
798 conf.set_quoted('DNS_SERVERS', dns_servers)
799 substs.set('DNS_SERVERS', dns_servers)
801 ntp_servers = get_option('ntp-servers')
802 conf.set_quoted('NTP_SERVERS', ntp_servers)
803 substs.set('NTP_SERVERS', ntp_servers)
805 default_locale = get_option('default-locale')
806 if default_locale == ''
807 if not meson.is_cross_build()
808 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
809 default_locale = run_command(choose_default_locale_sh).stdout().strip()
811 default_locale = 'C.UTF-8'
814 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
816 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
818 service_watchdog = get_option('service-watchdog')
819 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
820 substs.set('SERVICE_WATCHDOG', watchdog_value)
822 substs.set('SUSHELL', get_option('debug-shell'))
823 substs.set('DEBUGTTY', get_option('debug-tty'))
824 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
826 enable_debug_hashmap = false
827 enable_debug_mmap_cache = false
828 enable_debug_siphash = false
829 foreach name : get_option('debug-extra')
831 enable_debug_hashmap = true
832 elif name == 'mmap-cache'
833 enable_debug_mmap_cache = true
834 elif name == 'siphash'
835 enable_debug_siphash = true
837 message('unknown debug option "@0@", ignoring'.format(name))
840 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
841 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
842 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
844 conf.set10('VALGRIND', get_option('valgrind'))
845 conf.set10('LOG_TRACE', get_option('log-trace'))
847 default_user_path = get_option('user-path')
848 if default_user_path != ''
849 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
850 default_user_path_display = default_user_path
852 # meson 0.49 fails when ?: is used in .format()
853 default_user_path_display = '(same as system services)'
857 #####################################################################
859 threads = dependency('threads')
860 librt = cc.find_library('rt')
861 libm = cc.find_library('m')
862 libdl = cc.find_library('dl')
863 libcrypt = cc.find_library('crypt')
865 libcap = dependency('libcap', required : false)
866 if not libcap.found()
867 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
868 libcap = cc.find_library('cap')
871 libmount = dependency('mount',
872 version : fuzzer_build ? '>= 0' : '>= 2.30')
874 want_libfdisk = get_option('fdisk')
875 if want_libfdisk != 'false' and not skip_deps
876 libfdisk = dependency('fdisk',
877 required : want_libfdisk == 'true')
878 have = libfdisk.found()
883 conf.set10('HAVE_LIBFDISK', have)
885 want_pwquality = get_option('pwquality')
886 if want_pwquality != 'false' and not skip_deps
887 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
888 have = libpwquality.found()
893 conf.set10('HAVE_PWQUALITY', have)
895 want_seccomp = get_option('seccomp')
896 if want_seccomp != 'false' and not skip_deps
897 libseccomp = dependency('libseccomp',
898 version : '>= 2.3.1',
899 required : want_seccomp == 'true')
900 have = libseccomp.found()
905 conf.set10('HAVE_SECCOMP', have)
907 want_selinux = get_option('selinux')
908 if want_selinux != 'false' and not skip_deps
909 libselinux = dependency('libselinux',
910 version : '>= 2.1.9',
911 required : want_selinux == 'true')
912 have = libselinux.found()
917 conf.set10('HAVE_SELINUX', have)
919 want_apparmor = get_option('apparmor')
920 if want_apparmor != 'false' and not skip_deps
921 libapparmor = dependency('libapparmor',
922 required : want_apparmor == 'true')
923 have = libapparmor.found()
928 conf.set10('HAVE_APPARMOR', have)
930 smack_run_label = get_option('smack-run-label')
931 if smack_run_label != ''
932 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
935 want_polkit = get_option('polkit')
936 install_polkit = false
937 install_polkit_pkla = false
938 if want_polkit != 'false' and not skip_deps
939 install_polkit = true
941 libpolkit = dependency('polkit-gobject-1',
943 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
944 message('Old polkit detected, will install pkla files')
945 install_polkit_pkla = true
948 conf.set10('ENABLE_POLKIT', install_polkit)
950 want_acl = get_option('acl')
951 if want_acl != 'false' and not skip_deps
952 libacl = cc.find_library('acl', required : want_acl == 'true')
953 have = libacl.found()
958 conf.set10('HAVE_ACL', have)
960 want_audit = get_option('audit')
961 if want_audit != 'false' and not skip_deps
962 libaudit = dependency('audit', required : want_audit == 'true')
963 have = libaudit.found()
968 conf.set10('HAVE_AUDIT', have)
970 want_blkid = get_option('blkid')
971 if want_blkid != 'false' and not skip_deps
972 libblkid = dependency('blkid', required : want_blkid == 'true')
973 have = libblkid.found()
978 conf.set10('HAVE_BLKID', have)
980 want_kmod = get_option('kmod')
981 if want_kmod != 'false' and not skip_deps
982 libkmod = dependency('libkmod',
984 required : want_kmod == 'true')
985 have = libkmod.found()
990 conf.set10('HAVE_KMOD', have)
992 want_pam = get_option('pam')
993 if want_pam != 'false' and not skip_deps
994 libpam = cc.find_library('pam', required : want_pam == 'true')
995 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
996 have = libpam.found() and libpam_misc.found()
1002 conf.set10('HAVE_PAM', have)
1004 want_microhttpd = get_option('microhttpd')
1005 if want_microhttpd != 'false' and not skip_deps
1006 libmicrohttpd = dependency('libmicrohttpd',
1007 version : '>= 0.9.33',
1008 required : want_microhttpd == 'true')
1009 have = libmicrohttpd.found()
1014 conf.set10('HAVE_MICROHTTPD', have)
1016 want_libcryptsetup = get_option('libcryptsetup')
1017 if want_libcryptsetup != 'false' and not skip_deps
1018 libcryptsetup = dependency('libcryptsetup',
1019 version : '>= 2.0.1',
1020 required : want_libcryptsetup == 'true')
1021 have = libcryptsetup.found()
1023 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1024 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
1029 conf.set10('HAVE_LIBCRYPTSETUP', have)
1031 want_libcurl = get_option('libcurl')
1032 if want_libcurl != 'false' and not skip_deps
1033 libcurl = dependency('libcurl',
1034 version : '>= 7.32.0',
1035 required : want_libcurl == 'true')
1036 have = libcurl.found()
1041 conf.set10('HAVE_LIBCURL', have)
1043 want_libidn = get_option('libidn')
1044 want_libidn2 = get_option('libidn2')
1045 if want_libidn == 'true' and want_libidn2 == 'true'
1046 error('libidn and libidn2 cannot be requested simultaneously')
1049 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1050 libidn = dependency('libidn2',
1051 required : want_libidn2 == 'true')
1052 have = libidn.found()
1057 conf.set10('HAVE_LIBIDN2', have)
1058 if not have and want_libidn != 'false' and not skip_deps
1059 # libidn is used for both libidn and libidn2 objects
1060 libidn = dependency('libidn',
1061 required : want_libidn == 'true')
1062 have = libidn.found()
1066 conf.set10('HAVE_LIBIDN', have)
1068 want_libiptc = get_option('libiptc')
1069 if want_libiptc != 'false' and not skip_deps
1070 libiptc = dependency('libiptc',
1071 required : want_libiptc == 'true')
1072 have = libiptc.found()
1077 conf.set10('HAVE_LIBIPTC', have)
1079 want_qrencode = get_option('qrencode')
1080 if want_qrencode != 'false' and not skip_deps
1081 libqrencode = dependency('libqrencode',
1082 required : want_qrencode == 'true')
1083 have = libqrencode.found()
1088 conf.set10('HAVE_QRENCODE', have)
1090 want_gcrypt = get_option('gcrypt')
1091 if want_gcrypt != 'false' and not skip_deps
1092 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1093 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1094 have = libgcrypt.found() and libgpg_error.found()
1099 # link to neither of the libs if one is not found
1103 conf.set10('HAVE_GCRYPT', have)
1105 want_gnutls = get_option('gnutls')
1106 if want_gnutls != 'false' and not skip_deps
1107 libgnutls = dependency('gnutls',
1108 version : '>= 3.1.4',
1109 required : want_gnutls == 'true')
1110 have = libgnutls.found()
1115 conf.set10('HAVE_GNUTLS', have)
1117 want_openssl = get_option('openssl')
1118 if want_openssl != 'false' and not skip_deps
1119 libopenssl = dependency('openssl',
1120 version : '>= 1.1.0',
1121 required : want_openssl == 'true')
1122 have = libopenssl.found()
1127 conf.set10('HAVE_OPENSSL', have)
1129 want_p11kit = get_option('p11kit')
1130 if want_p11kit != 'false' and not skip_deps
1131 libp11kit = dependency('p11-kit-1',
1132 version : '>= 0.23.3',
1133 required : want_p11kit == 'true')
1134 have = libp11kit.found()
1139 conf.set10('HAVE_P11KIT', have)
1141 want_elfutils = get_option('elfutils')
1142 if want_elfutils != 'false' and not skip_deps
1143 libdw = dependency('libdw',
1144 required : want_elfutils == 'true')
1145 have = libdw.found()
1150 conf.set10('HAVE_ELFUTILS', have)
1152 want_zlib = get_option('zlib')
1153 if want_zlib != 'false' and not skip_deps
1154 libz = dependency('zlib',
1155 required : want_zlib == 'true')
1161 conf.set10('HAVE_ZLIB', have)
1163 want_bzip2 = get_option('bzip2')
1164 if want_bzip2 != 'false' and not skip_deps
1165 libbzip2 = cc.find_library('bz2',
1166 required : want_bzip2 == 'true')
1167 have = libbzip2.found()
1172 conf.set10('HAVE_BZIP2', have)
1174 want_xz = get_option('xz')
1175 if want_xz != 'false' and not skip_deps
1176 libxz = dependency('liblzma',
1177 required : want_xz == 'true')
1178 have = libxz.found()
1183 conf.set10('HAVE_XZ', have)
1185 want_lz4 = get_option('lz4')
1186 if want_lz4 != 'false' and not skip_deps
1187 liblz4 = dependency('liblz4',
1188 version : '>= 1.3.0',
1189 required : want_lz4 == 'true')
1190 have = liblz4.found()
1195 conf.set10('HAVE_LZ4', have)
1197 want_zstd = get_option('zstd')
1198 if want_zstd != 'false' and not skip_deps
1199 libzstd = dependency('libzstd',
1200 required : want_zstd == 'true',
1201 version : '>= 1.4.0')
1202 have = libzstd.found()
1207 conf.set10('HAVE_ZSTD', have)
1209 want_xkbcommon = get_option('xkbcommon')
1210 if want_xkbcommon != 'false' and not skip_deps
1211 libxkbcommon = dependency('xkbcommon',
1212 version : '>= 0.3.0',
1213 required : want_xkbcommon == 'true')
1214 have = libxkbcommon.found()
1219 conf.set10('HAVE_XKBCOMMON', have)
1221 want_pcre2 = get_option('pcre2')
1222 if want_pcre2 != 'false'
1223 libpcre2 = dependency('libpcre2-8',
1224 required : want_pcre2 == 'true')
1225 have = libpcre2.found()
1230 conf.set10('HAVE_PCRE2', have)
1232 want_glib = get_option('glib')
1233 if want_glib != 'false' and not skip_deps
1234 libglib = dependency('glib-2.0',
1235 version : '>= 2.22.0',
1236 required : want_glib == 'true')
1237 libgobject = dependency('gobject-2.0',
1238 version : '>= 2.22.0',
1239 required : want_glib == 'true')
1240 libgio = dependency('gio-2.0',
1241 required : want_glib == 'true')
1242 have = libglib.found() and libgobject.found() and libgio.found()
1249 conf.set10('HAVE_GLIB', have)
1251 want_dbus = get_option('dbus')
1252 if want_dbus != 'false' and not skip_deps
1253 libdbus = dependency('dbus-1',
1254 version : '>= 1.3.2',
1255 required : want_dbus == 'true')
1256 have = libdbus.found()
1261 conf.set10('HAVE_DBUS', have)
1263 default_dnssec = get_option('default-dnssec')
1265 default_dnssec = 'no'
1267 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1268 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1269 default_dnssec = 'no'
1271 conf.set('DEFAULT_DNSSEC_MODE',
1272 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1273 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1275 dns_over_tls = get_option('dns-over-tls')
1276 if dns_over_tls != 'false'
1277 if dns_over_tls == 'openssl'
1280 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1281 if dns_over_tls == 'gnutls' and not have_gnutls
1282 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1285 if dns_over_tls == 'gnutls' or have_gnutls
1286 have_openssl = false
1288 have_openssl = conf.get('HAVE_OPENSSL') == 1
1289 if dns_over_tls != 'auto' and not have_openssl
1290 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1291 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1294 have = have_gnutls or have_openssl
1298 have_openssl = false
1300 conf.set10('ENABLE_DNS_OVER_TLS', have)
1301 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1302 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1304 default_dns_over_tls = get_option('default-dns-over-tls')
1306 default_dns_over_tls = 'no'
1308 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1309 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.')
1310 default_dns_over_tls = 'no'
1312 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1313 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1314 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1316 default_mdns = get_option('default-mdns')
1317 conf.set('DEFAULT_MDNS_MODE',
1318 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
1319 substs.set('DEFAULT_MDNS_MODE', default_mdns)
1321 default_llmnr = get_option('default-llmnr')
1322 conf.set('DEFAULT_LLMNR_MODE',
1323 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
1324 substs.set('DEFAULT_LLMNR_MODE', default_llmnr)
1326 want_repart = get_option('repart')
1327 if want_repart != 'false'
1328 have = (conf.get('HAVE_OPENSSL') == 1 and
1329 conf.get('HAVE_LIBFDISK') == 1)
1330 if want_repart == 'true' and not have
1331 error('repart support was requested, but dependencies are not available')
1336 conf.set10('ENABLE_REPART', have)
1338 want_importd = get_option('importd')
1339 if want_importd != 'false'
1340 have = (conf.get('HAVE_LIBCURL') == 1 and
1341 conf.get('HAVE_ZLIB') == 1 and
1342 conf.get('HAVE_XZ') == 1 and
1343 conf.get('HAVE_GCRYPT') == 1)
1344 if want_importd == 'true' and not have
1345 error('importd support was requested, but dependencies are not available')
1350 conf.set10('ENABLE_IMPORTD', have)
1352 want_homed = get_option('homed')
1353 if want_homed != 'false'
1354 have = (conf.get('HAVE_OPENSSL') == 1 and
1355 conf.get('HAVE_LIBFDISK') == 1 and
1356 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1357 if want_homed == 'true' and not have
1358 error('homed support was requested, but dependencies are not available')
1363 conf.set10('ENABLE_HOMED', have)
1365 have = have and conf.get('HAVE_PAM') == 1
1366 conf.set10('ENABLE_PAM_HOME', have)
1368 want_remote = get_option('remote')
1369 if want_remote != 'false'
1370 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1371 conf.get('HAVE_LIBCURL') == 1]
1372 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1373 # it's possible to build one without the other. Complain only if
1374 # support was explicitly requested. The auxiliary files like sysusers
1375 # config should be installed when any of the programs are built.
1376 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1377 error('remote support was requested, but dependencies are not available')
1379 have = have_deps[0] or have_deps[1]
1383 conf.set10('ENABLE_REMOTE', have)
1385 foreach term : ['utmp',
1419 have = get_option(term)
1420 name = 'ENABLE_' + term.underscorify().to_upper()
1421 conf.set10(name, have)
1424 foreach tuple : [['nss-mymachines', 'machined'],
1425 ['nss-resolve', 'resolve']]
1426 want = get_option(tuple[0])
1428 have = get_option(tuple[1])
1429 if want == 'true' and not have
1430 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1435 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1436 conf.set10(name, have)
1440 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1441 'ENABLE_NSS_MYMACHINES',
1442 'ENABLE_NSS_RESOLVE',
1443 'ENABLE_NSS_SYSTEMD']
1444 if conf.get(term) == 1
1448 conf.set10('ENABLE_NSS', enable_nss)
1450 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1455 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1457 #####################################################################
1459 if get_option('efi')
1460 efi_arch = host_machine.cpu_family()
1462 if efi_arch == 'x86'
1463 EFI_MACHINE_TYPE_NAME = 'ia32'
1464 gnu_efi_arch = 'ia32'
1465 elif efi_arch == 'x86_64'
1466 EFI_MACHINE_TYPE_NAME = 'x64'
1467 gnu_efi_arch = 'x86_64'
1468 elif efi_arch == 'arm'
1469 EFI_MACHINE_TYPE_NAME = 'arm'
1470 gnu_efi_arch = 'arm'
1471 elif efi_arch == 'aarch64'
1472 EFI_MACHINE_TYPE_NAME = 'aa64'
1473 gnu_efi_arch = 'aarch64'
1475 EFI_MACHINE_TYPE_NAME = ''
1480 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1482 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1486 conf.set10('ENABLE_EFI', have)
1488 #####################################################################
1490 config_h = configure_file(
1491 output : 'config.h',
1492 configuration : conf)
1494 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1496 includes = include_directories('src/basic',
1502 'src/journal-remote',
1506 'src/time-wait-sync',
1512 'src/libsystemd/sd-bus',
1513 'src/libsystemd/sd-device',
1514 'src/libsystemd/sd-event',
1515 'src/libsystemd/sd-hwdb',
1516 'src/libsystemd/sd-id128',
1517 'src/libsystemd/sd-netlink',
1518 'src/libsystemd/sd-network',
1519 'src/libsystemd/sd-resolve',
1520 'src/libsystemd-network',
1523 add_project_arguments('-include', 'config.h', language : 'c')
1525 generate_gperfs = find_program('tools/generate-gperfs.py')
1529 subdir('src/systemd')
1531 subdir('src/libsystemd')
1532 subdir('src/libsystemd-network')
1533 subdir('src/journal')
1536 libjournal_core = static_library(
1538 libjournal_core_sources,
1540 include_directories : includes,
1543 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1544 libsystemd = shared_library(
1547 version : libsystemd_version,
1548 include_directories : includes,
1549 link_args : ['-shared',
1550 '-Wl,--version-script=' + libsystemd_sym_path],
1551 link_with : [libbasic,
1553 link_whole : [libsystemd_static,
1555 dependencies : [threads,
1560 link_depends : libsystemd_sym,
1562 install_dir : rootlibdir)
1564 static_libsystemd = get_option('static-libsystemd')
1565 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1567 install_libsystemd_static = static_library(
1570 journal_client_sources,
1572 basic_gcrypt_sources,
1574 include_directories : includes,
1575 build_by_default : static_libsystemd != 'false',
1576 install : static_libsystemd != 'false',
1577 install_dir : rootlibdir,
1578 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1579 dependencies : [threads,
1589 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1591 # Generate autosuspend rules
1592 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1594 ############################################################
1596 # binaries that have --help and are intended for use by humans,
1597 # usually, but not always, installed in /bin.
1598 public_programs = []
1600 subdir('src/libudev')
1601 subdir('src/shared')
1603 subdir('src/shutdown')
1605 subdir('src/network')
1607 subdir('src/analyze')
1608 subdir('src/journal-remote')
1609 subdir('src/coredump')
1610 subdir('src/pstore')
1611 subdir('src/hostname')
1612 subdir('src/import')
1613 subdir('src/partition')
1614 subdir('src/kernel-install')
1615 subdir('src/locale')
1616 subdir('src/machine')
1617 subdir('src/portable')
1618 subdir('src/userdb')
1620 subdir('src/nspawn')
1621 subdir('src/resolve')
1622 subdir('src/timedate')
1623 subdir('src/timesync')
1624 subdir('src/vconsole')
1625 subdir('src/boot/efi')
1632 ############################################################
1634 # only static linking apart from libdl, to make sure that the
1635 # module is linked to all libraries that it uses.
1636 test_dlopen = executable(
1640 include_directories : includes,
1641 link_with : [libbasic],
1642 dependencies : [libdl],
1643 build_by_default : want_tests != 'false')
1645 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1646 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h'],
1647 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1648 ['resolve', 'ENABLE_NSS_RESOLVE']]
1650 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1654 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1655 version_script_arg = join_paths(project_source_root, sym)
1657 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1658 if tuple.length() > 2
1659 sources += tuple[2].split()
1662 nss = shared_library(
1667 include_directories : includes,
1668 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1669 link_args : ['-Wl,-z,nodelete',
1671 '-Wl,--version-script=' + version_script_arg],
1672 link_with : [libsystemd_static,
1675 dependencies : [threads,
1679 install_dir : rootlibdir)
1681 # We cannot use shared_module because it does not support version suffix.
1682 # Unfortunately shared_library insists on creating the symlink…
1683 meson.add_install_script('sh', '-c',
1684 'rm $DESTDIR@0@/libnss_@1@.so'
1685 .format(rootlibdir, module))
1687 if want_tests != 'false'
1688 test('dlopen-nss_' + module,
1690 # path to dlopen must include a slash
1691 args : nss.full_path())
1696 ############################################################
1701 include_directories : includes,
1702 link_with : [libcore,
1704 dependencies : [versiondep,
1711 install_rpath : rootlibexecdir,
1713 install_dir : rootlibexecdir)
1715 meson.add_install_script(meson_make_symlink,
1716 join_paths(rootlibexecdir, 'systemd'),
1717 join_paths(rootsbindir, 'init'))
1719 public_programs += executable(
1721 systemd_analyze_sources,
1722 include_directories : includes,
1723 link_with : [libcore,
1725 dependencies : [versiondep,
1732 install_rpath : rootlibexecdir,
1733 install : get_option('analyze'))
1737 systemd_journald_sources,
1738 include_directories : includes,
1739 link_with : [libjournal_core,
1741 dependencies : [threads,
1746 install_rpath : rootlibexecdir,
1748 install_dir : rootlibexecdir)
1750 public_programs += executable(
1752 systemd_cat_sources,
1753 include_directories : includes,
1754 link_with : [libjournal_core,
1756 dependencies : [threads],
1757 install_rpath : rootlibexecdir,
1760 public_programs += executable(
1763 include_directories : includes,
1764 link_with : [libshared],
1765 dependencies : [threads,
1771 install_rpath : rootlibexecdir,
1773 install_dir : rootbindir)
1776 'systemd-getty-generator',
1777 'src/getty-generator/getty-generator.c',
1778 include_directories : includes,
1779 link_with : [libshared],
1780 install_rpath : rootlibexecdir,
1782 install_dir : systemgeneratordir)
1785 'systemd-debug-generator',
1786 'src/debug-generator/debug-generator.c',
1787 include_directories : includes,
1788 link_with : [libshared],
1789 install_rpath : rootlibexecdir,
1791 install_dir : systemgeneratordir)
1794 'systemd-run-generator',
1795 'src/run-generator/run-generator.c',
1796 include_directories : includes,
1797 link_with : [libshared],
1798 install_rpath : rootlibexecdir,
1800 install_dir : systemgeneratordir)
1803 'systemd-fstab-generator',
1804 'src/fstab-generator/fstab-generator.c',
1805 include_directories : includes,
1806 link_with : [libcore_shared,
1808 install_rpath : rootlibexecdir,
1810 install_dir : systemgeneratordir)
1812 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1814 '30-systemd-environment-d-generator',
1815 'src/environment-d-generator/environment-d-generator.c',
1816 include_directories : includes,
1817 link_with : [libshared],
1818 install_rpath : rootlibexecdir,
1820 install_dir : userenvgeneratordir)
1822 meson.add_install_script(meson_make_symlink,
1823 join_paths(sysconfdir, 'environment'),
1824 join_paths(environmentdir, '99-environment.conf'))
1827 if conf.get('ENABLE_HIBERNATE') == 1
1829 'systemd-hibernate-resume-generator',
1830 'src/hibernate-resume/hibernate-resume-generator.c',
1831 include_directories : includes,
1832 link_with : [libshared],
1833 install_rpath : rootlibexecdir,
1835 install_dir : systemgeneratordir)
1838 'systemd-hibernate-resume',
1839 'src/hibernate-resume/hibernate-resume.c',
1840 include_directories : includes,
1841 link_with : [libshared],
1842 install_rpath : rootlibexecdir,
1844 install_dir : rootlibexecdir)
1847 if conf.get('HAVE_BLKID') == 1
1849 'systemd-gpt-auto-generator',
1850 'src/gpt-auto-generator/gpt-auto-generator.c',
1851 'src/shared/blkid-util.h',
1852 include_directories : includes,
1853 link_with : [libshared],
1854 dependencies : libblkid,
1855 install_rpath : rootlibexecdir,
1857 install_dir : systemgeneratordir)
1859 public_programs += executable(
1861 'src/dissect/dissect.c',
1862 include_directories : includes,
1863 link_with : [libshared],
1864 install_rpath : rootlibexecdir,
1866 install_dir : rootlibexecdir)
1869 if conf.get('ENABLE_RESOLVE') == 1
1872 systemd_resolved_sources,
1873 include_directories : includes,
1874 link_with : [libshared,
1876 libsystemd_resolve_core],
1877 dependencies : systemd_resolved_dependencies,
1878 install_rpath : rootlibexecdir,
1880 install_dir : rootlibexecdir)
1882 public_programs += executable(
1885 include_directories : includes,
1886 link_with : [libshared,
1888 libsystemd_resolve_core],
1889 dependencies : [threads,
1893 install_rpath : rootlibexecdir,
1896 meson.add_install_script(meson_make_symlink,
1897 join_paths(bindir, 'resolvectl'),
1898 join_paths(rootsbindir, 'resolvconf'))
1900 meson.add_install_script(meson_make_symlink,
1901 join_paths(bindir, 'resolvectl'),
1902 join_paths(bindir, 'systemd-resolve'))
1905 if conf.get('ENABLE_LOGIND') == 1
1908 systemd_logind_sources,
1909 include_directories : includes,
1910 link_with : [liblogind_core,
1912 dependencies : [threads,
1914 install_rpath : rootlibexecdir,
1916 install_dir : rootlibexecdir)
1918 public_programs += executable(
1921 include_directories : includes,
1922 link_with : [libshared],
1923 dependencies : [threads,
1927 install_rpath : rootlibexecdir,
1929 install_dir : rootbindir)
1931 public_programs += executable(
1933 'src/login/inhibit.c',
1934 include_directories : includes,
1935 link_with : [libshared],
1936 install_rpath : rootlibexecdir,
1938 install_dir : rootbindir)
1940 if conf.get('HAVE_PAM') == 1
1941 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1942 pam_systemd = shared_library(
1946 include_directories : includes,
1947 link_args : ['-shared',
1948 '-Wl,--version-script=' + version_script_arg],
1949 link_with : [libsystemd_static,
1951 dependencies : [threads,
1954 link_depends : pam_systemd_sym,
1956 install_dir : pamlibdir)
1958 if want_tests != 'false'
1959 test('dlopen-pam_systemd',
1961 # path to dlopen must include a slash
1962 args : pam_systemd.full_path())
1967 'systemd-user-runtime-dir',
1968 user_runtime_dir_sources,
1969 include_directories : includes,
1970 link_with : [libshared],
1971 install_rpath : rootlibexecdir,
1973 install_dir : rootlibexecdir)
1976 if conf.get('HAVE_PAM') == 1
1978 'systemd-user-sessions',
1979 'src/user-sessions/user-sessions.c',
1980 include_directories : includes,
1981 link_with : [libshared],
1982 install_rpath : rootlibexecdir,
1984 install_dir : rootlibexecdir)
1987 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1988 public_programs += executable(
1990 'src/boot/bootctl.c',
1991 include_directories : includes,
1992 link_with : [libshared],
1993 dependencies : [libblkid],
1994 install_rpath : rootlibexecdir,
1997 public_programs += executable(
1998 'systemd-bless-boot',
1999 'src/boot/bless-boot.c',
2000 include_directories : includes,
2001 link_with : [libshared],
2002 dependencies : [libblkid],
2003 install_rpath : rootlibexecdir,
2005 install_dir : rootlibexecdir)
2008 'systemd-bless-boot-generator',
2009 'src/boot/bless-boot-generator.c',
2010 include_directories : includes,
2011 link_with : [libshared],
2012 install_rpath : rootlibexecdir,
2014 install_dir : systemgeneratordir)
2018 'systemd-boot-check-no-failures',
2019 'src/boot/boot-check-no-failures.c',
2020 include_directories : includes,
2021 link_with : [libshared],
2022 dependencies : [libblkid],
2023 install_rpath : rootlibexecdir,
2025 install_dir : rootlibexecdir)
2027 public_programs += executable(
2028 'systemd-socket-activate',
2029 'src/activate/activate.c',
2030 include_directories : includes,
2031 link_with : [libshared],
2032 dependencies : [threads],
2033 install_rpath : rootlibexecdir,
2036 if get_option('link-systemctl-shared')
2037 systemctl_link_with = [libshared]
2039 systemctl_link_with = [libsystemd_static,
2045 public_programs += executable(
2047 'src/systemctl/systemctl.c',
2048 'src/systemctl/sysv-compat.h',
2049 'src/systemctl/sysv-compat.c',
2050 include_directories : includes,
2051 link_with : systemctl_link_with,
2052 dependencies : [threads,
2058 install_rpath : rootlibexecdir,
2060 install_dir : rootbindir)
2062 if conf.get('ENABLE_PORTABLED') == 1
2064 'systemd-portabled',
2065 systemd_portabled_sources,
2066 include_directories : includes,
2067 link_with : [libshared],
2068 dependencies : [threads],
2069 install_rpath : rootlibexecdir,
2071 install_dir : rootlibexecdir)
2073 public_programs += executable(
2075 'src/portable/portablectl.c',
2076 include_directories : includes,
2077 link_with : [libshared],
2078 dependencies : [threads],
2079 install_rpath : rootlibexecdir,
2081 install_dir : rootbindir)
2084 if conf.get('ENABLE_USERDB') == 1
2087 systemd_userwork_sources,
2088 include_directories : includes,
2089 link_with : [libshared],
2090 dependencies : [threads],
2091 install_rpath : rootlibexecdir,
2093 install_dir : rootlibexecdir)
2097 systemd_userdbd_sources,
2098 include_directories : includes,
2099 link_with : [libshared],
2100 dependencies : [threads],
2101 install_rpath : rootlibexecdir,
2103 install_dir : rootlibexecdir)
2105 public_programs += executable(
2108 include_directories : includes,
2109 link_with : [libshared],
2110 dependencies : [threads],
2111 install_rpath : rootlibexecdir,
2113 install_dir : rootbindir)
2116 if conf.get('ENABLE_HOMED') == 1
2119 systemd_homework_sources,
2120 include_directories : includes,
2121 link_with : [libshared],
2122 dependencies : [threads,
2129 install_rpath : rootlibexecdir,
2131 install_dir : rootlibexecdir)
2135 systemd_homed_sources,
2136 include_directories : includes,
2137 link_with : [libshared],
2138 dependencies : [threads,
2142 install_rpath : rootlibexecdir,
2144 install_dir : rootlibexecdir)
2146 public_programs += executable(
2149 include_directories : includes,
2150 link_with : [libshared],
2151 dependencies : [threads,
2156 install_rpath : rootlibexecdir,
2158 install_dir : rootbindir)
2160 if conf.get('HAVE_PAM') == 1
2161 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2162 pam_systemd = shared_library(
2166 include_directories : includes,
2167 link_args : ['-shared',
2168 '-Wl,--version-script=' + version_script_arg],
2169 link_with : [libsystemd_static,
2171 dependencies : [threads,
2175 link_depends : pam_systemd_home_sym,
2177 install_dir : pamlibdir)
2181 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
2182 meson.add_install_script(meson_make_symlink,
2183 join_paths(rootbindir, 'systemctl'),
2184 join_paths(rootsbindir, alias))
2187 if conf.get('ENABLE_BACKLIGHT') == 1
2189 'systemd-backlight',
2190 'src/backlight/backlight.c',
2191 include_directories : includes,
2192 link_with : [libshared],
2193 install_rpath : rootlibexecdir,
2195 install_dir : rootlibexecdir)
2198 if conf.get('ENABLE_RFKILL') == 1
2201 'src/rfkill/rfkill.c',
2202 include_directories : includes,
2203 link_with : [libshared],
2204 install_rpath : rootlibexecdir,
2206 install_dir : rootlibexecdir)
2210 'systemd-system-update-generator',
2211 'src/system-update-generator/system-update-generator.c',
2212 include_directories : includes,
2213 link_with : [libshared],
2214 install_rpath : rootlibexecdir,
2216 install_dir : systemgeneratordir)
2218 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2219 systemd_cryptsetup_sources = files('''
2220 src/cryptsetup/cryptsetup.c
2221 src/cryptsetup/cryptsetup-pkcs11.h
2224 if conf.get('HAVE_P11KIT') == 1
2225 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2229 'systemd-cryptsetup',
2230 systemd_cryptsetup_sources,
2231 include_directories : includes,
2232 link_with : [libshared],
2233 dependencies : [libcryptsetup,
2235 install_rpath : rootlibexecdir,
2237 install_dir : rootlibexecdir)
2240 'systemd-cryptsetup-generator',
2241 'src/cryptsetup/cryptsetup-generator.c',
2242 include_directories : includes,
2243 link_with : [libshared],
2244 dependencies : [libcryptsetup],
2245 install_rpath : rootlibexecdir,
2247 install_dir : systemgeneratordir)
2250 'systemd-veritysetup',
2251 'src/veritysetup/veritysetup.c',
2252 include_directories : includes,
2253 link_with : [libshared],
2254 dependencies : [libcryptsetup],
2255 install_rpath : rootlibexecdir,
2257 install_dir : rootlibexecdir)
2260 'systemd-veritysetup-generator',
2261 'src/veritysetup/veritysetup-generator.c',
2262 include_directories : includes,
2263 link_with : [libshared],
2264 dependencies : [libcryptsetup],
2265 install_rpath : rootlibexecdir,
2267 install_dir : systemgeneratordir)
2270 if conf.get('HAVE_SYSV_COMPAT') == 1
2272 'systemd-sysv-generator',
2273 'src/sysv-generator/sysv-generator.c',
2274 include_directories : includes,
2275 link_with : [libshared],
2276 install_rpath : rootlibexecdir,
2278 install_dir : systemgeneratordir)
2281 'systemd-rc-local-generator',
2282 'src/rc-local-generator/rc-local-generator.c',
2283 include_directories : includes,
2284 link_with : [libshared],
2285 install_rpath : rootlibexecdir,
2287 install_dir : systemgeneratordir)
2290 if conf.get('ENABLE_HOSTNAMED') == 1
2292 'systemd-hostnamed',
2293 'src/hostname/hostnamed.c',
2294 include_directories : includes,
2295 link_with : [libshared],
2296 install_rpath : rootlibexecdir,
2298 install_dir : rootlibexecdir)
2300 public_programs += executable(
2302 'src/hostname/hostnamectl.c',
2303 include_directories : includes,
2304 link_with : [libshared],
2305 install_rpath : rootlibexecdir,
2309 if conf.get('ENABLE_LOCALED') == 1
2310 if conf.get('HAVE_XKBCOMMON') == 1
2311 # logind will load libxkbcommon.so dynamically on its own
2319 systemd_localed_sources,
2320 include_directories : includes,
2321 link_with : [libshared],
2322 dependencies : deps,
2323 install_rpath : rootlibexecdir,
2325 install_dir : rootlibexecdir)
2327 public_programs += executable(
2330 include_directories : includes,
2331 link_with : [libshared],
2332 install_rpath : rootlibexecdir,
2336 if conf.get('ENABLE_TIMEDATED') == 1
2338 'systemd-timedated',
2339 'src/timedate/timedated.c',
2340 include_directories : includes,
2341 link_with : [libshared],
2342 install_rpath : rootlibexecdir,
2344 install_dir : rootlibexecdir)
2347 if conf.get('ENABLE_TIMEDATECTL') == 1
2348 public_programs += executable(
2350 'src/timedate/timedatectl.c',
2351 include_directories : includes,
2352 install_rpath : rootlibexecdir,
2353 link_with : [libshared],
2354 dependencies : [libm],
2358 if conf.get('ENABLE_TIMESYNCD') == 1
2359 if get_option('link-timesyncd-shared')
2360 timesyncd_link_with = [libshared]
2362 timesyncd_link_with = [libsystemd_static,
2369 'systemd-timesyncd',
2370 systemd_timesyncd_sources,
2371 include_directories : includes,
2372 link_with : [timesyncd_link_with],
2373 dependencies : [threads,
2375 install_rpath : rootlibexecdir,
2377 install_dir : rootlibexecdir)
2380 'systemd-time-wait-sync',
2381 'src/time-wait-sync/time-wait-sync.c',
2382 include_directories : includes,
2383 link_with : [timesyncd_link_with],
2384 install_rpath : rootlibexecdir,
2386 install_dir : rootlibexecdir)
2389 if conf.get('ENABLE_MACHINED') == 1
2392 systemd_machined_sources,
2393 include_directories : includes,
2394 link_with : [libmachine_core,
2396 install_rpath : rootlibexecdir,
2398 install_dir : rootlibexecdir)
2400 public_programs += executable(
2402 'src/machine/machinectl.c',
2403 include_directories : includes,
2404 link_with : [libshared],
2405 dependencies : [threads,
2409 install_rpath : rootlibexecdir,
2411 install_dir : rootbindir)
2414 if conf.get('ENABLE_IMPORTD') == 1
2417 systemd_importd_sources,
2418 include_directories : includes,
2419 link_with : [libshared],
2420 dependencies : [threads],
2421 install_rpath : rootlibexecdir,
2423 install_dir : rootlibexecdir)
2425 systemd_pull = executable(
2427 systemd_pull_sources,
2428 include_directories : includes,
2429 link_with : [libshared],
2430 dependencies : [versiondep,
2436 install_rpath : rootlibexecdir,
2438 install_dir : rootlibexecdir)
2440 systemd_import = executable(
2442 systemd_import_sources,
2443 include_directories : includes,
2444 link_with : [libshared],
2445 dependencies : [libcurl,
2449 install_rpath : rootlibexecdir,
2451 install_dir : rootlibexecdir)
2453 systemd_import_fs = executable(
2454 'systemd-import-fs',
2455 systemd_import_fs_sources,
2456 include_directories : includes,
2457 link_with : [libshared],
2458 install_rpath : rootlibexecdir,
2460 install_dir : rootlibexecdir)
2462 systemd_export = executable(
2464 systemd_export_sources,
2465 include_directories : includes,
2466 link_with : [libshared],
2467 dependencies : [libcurl,
2471 install_rpath : rootlibexecdir,
2473 install_dir : rootlibexecdir)
2475 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2478 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2479 public_programs += executable(
2480 'systemd-journal-upload',
2481 systemd_journal_upload_sources,
2482 include_directories : includes,
2483 link_with : [libshared],
2484 dependencies : [versiondep,
2491 install_rpath : rootlibexecdir,
2493 install_dir : rootlibexecdir)
2496 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2497 public_programs += executable(
2498 'systemd-journal-remote',
2499 systemd_journal_remote_sources,
2500 include_directories : includes,
2501 link_with : [libshared,
2502 libsystemd_journal_remote],
2503 dependencies : [threads,
2509 install_rpath : rootlibexecdir,
2511 install_dir : rootlibexecdir)
2513 public_programs += executable(
2514 'systemd-journal-gatewayd',
2515 systemd_journal_gatewayd_sources,
2516 include_directories : includes,
2517 link_with : [libshared],
2518 dependencies : [threads,
2524 install_rpath : rootlibexecdir,
2526 install_dir : rootlibexecdir)
2529 if conf.get('ENABLE_COREDUMP') == 1
2532 systemd_coredump_sources,
2533 include_directories : includes,
2534 link_with : [libshared],
2535 dependencies : [threads,
2541 install_rpath : rootlibexecdir,
2543 install_dir : rootlibexecdir)
2545 public_programs += executable(
2547 coredumpctl_sources,
2548 include_directories : includes,
2549 link_with : [libshared],
2550 dependencies : [threads,
2554 install_rpath : rootlibexecdir,
2558 if conf.get('ENABLE_PSTORE') == 1
2561 systemd_pstore_sources,
2562 include_directories : includes,
2563 link_with : [libshared],
2564 dependencies : [threads,
2570 install_rpath : rootlibexecdir,
2572 install_dir : rootlibexecdir)
2575 if conf.get('ENABLE_BINFMT') == 1
2576 public_programs += executable(
2578 'src/binfmt/binfmt.c',
2579 include_directories : includes,
2580 link_with : [libshared],
2581 install_rpath : rootlibexecdir,
2583 install_dir : rootlibexecdir)
2585 meson.add_install_script('sh', '-c',
2586 mkdir_p.format(binfmtdir))
2587 meson.add_install_script('sh', '-c',
2588 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2591 if conf.get('ENABLE_REPART') == 1
2594 systemd_repart_sources,
2595 include_directories : includes,
2596 link_with : [libshared],
2597 dependencies : [threads,
2602 install_rpath : rootlibexecdir,
2604 install_dir : rootbindir)
2606 if want_tests != 'false'
2609 args : exe.full_path())
2613 if conf.get('ENABLE_VCONSOLE') == 1
2615 'systemd-vconsole-setup',
2616 'src/vconsole/vconsole-setup.c',
2617 include_directories : includes,
2618 link_with : [libshared],
2619 install_rpath : rootlibexecdir,
2621 install_dir : rootlibexecdir)
2624 if conf.get('ENABLE_RANDOMSEED') == 1
2626 'systemd-random-seed',
2627 'src/random-seed/random-seed.c',
2628 include_directories : includes,
2629 link_with : [libshared],
2630 install_rpath : rootlibexecdir,
2632 install_dir : rootlibexecdir)
2635 if conf.get('ENABLE_FIRSTBOOT') == 1
2637 'systemd-firstboot',
2638 'src/firstboot/firstboot.c',
2639 include_directories : includes,
2640 link_with : [libshared],
2641 dependencies : [libcrypt],
2642 install_rpath : rootlibexecdir,
2644 install_dir : rootbindir)
2648 'systemd-remount-fs',
2649 'src/remount-fs/remount-fs.c',
2650 include_directories : includes,
2651 link_with : [libcore_shared,
2653 install_rpath : rootlibexecdir,
2655 install_dir : rootlibexecdir)
2658 'systemd-machine-id-setup',
2659 'src/machine-id-setup/machine-id-setup-main.c',
2660 include_directories : includes,
2661 link_with : [libcore_shared,
2663 install_rpath : rootlibexecdir,
2665 install_dir : rootbindir)
2670 include_directories : includes,
2671 link_with : [libshared],
2672 install_rpath : rootlibexecdir,
2674 install_dir : rootlibexecdir)
2676 executable('systemd-growfs',
2677 'src/partition/growfs.c',
2678 include_directories : includes,
2679 link_with : [libshared],
2680 dependencies : [libcryptsetup],
2681 install_rpath : rootlibexecdir,
2683 install_dir : rootlibexecdir)
2687 'src/partition/makefs.c',
2688 include_directories : includes,
2689 link_with : [libshared],
2690 install_rpath : rootlibexecdir,
2692 install_dir : rootlibexecdir)
2696 'src/sleep/sleep.c',
2697 include_directories : includes,
2698 link_with : [libshared],
2699 install_rpath : rootlibexecdir,
2701 install_dir : rootlibexecdir)
2703 install_data('src/sleep/sleep.conf',
2704 install_dir : pkgsysconfdir)
2706 public_programs += executable(
2708 'src/sysctl/sysctl.c',
2709 include_directories : includes,
2710 link_with : [libshared],
2711 install_rpath : rootlibexecdir,
2713 install_dir : rootlibexecdir)
2717 'src/ac-power/ac-power.c',
2718 include_directories : includes,
2719 link_with : [libshared],
2720 install_rpath : rootlibexecdir,
2722 install_dir : rootlibexecdir)
2724 public_programs += executable(
2725 'systemd-detect-virt',
2726 'src/detect-virt/detect-virt.c',
2727 include_directories : includes,
2728 link_with : [libshared],
2729 install_rpath : rootlibexecdir,
2732 public_programs += executable(
2734 'src/delta/delta.c',
2735 include_directories : includes,
2736 link_with : [libshared],
2737 install_rpath : rootlibexecdir,
2740 public_programs += executable(
2742 'src/escape/escape.c',
2743 include_directories : includes,
2744 link_with : [libshared],
2745 install_rpath : rootlibexecdir,
2747 install_dir : rootbindir)
2749 public_programs += executable(
2751 'src/notify/notify.c',
2752 include_directories : includes,
2753 link_with : [libshared],
2754 install_rpath : rootlibexecdir,
2756 install_dir : rootbindir)
2759 'systemd-volatile-root',
2760 'src/volatile-root/volatile-root.c',
2761 include_directories : includes,
2762 link_with : [libshared],
2763 install_rpath : rootlibexecdir,
2765 install_dir : rootlibexecdir)
2768 'systemd-cgroups-agent',
2769 'src/cgroups-agent/cgroups-agent.c',
2770 include_directories : includes,
2771 link_with : [libshared],
2772 install_rpath : rootlibexecdir,
2774 install_dir : rootlibexecdir)
2776 public_programs += executable(
2778 'src/id128/id128.c',
2779 include_directories : includes,
2780 link_with : [libshared],
2781 install_rpath : rootlibexecdir,
2784 public_programs += executable(
2787 include_directories : includes,
2788 link_with : [libshared],
2789 install_rpath : rootlibexecdir,
2792 public_programs += executable(
2793 'systemd-ask-password',
2794 'src/ask-password/ask-password.c',
2795 include_directories : includes,
2796 link_with : [libshared],
2797 install_rpath : rootlibexecdir,
2799 install_dir : rootbindir)
2802 'systemd-reply-password',
2803 'src/reply-password/reply-password.c',
2804 include_directories : includes,
2805 link_with : [libshared],
2806 install_rpath : rootlibexecdir,
2808 install_dir : rootlibexecdir)
2810 public_programs += executable(
2811 'systemd-tty-ask-password-agent',
2812 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2813 include_directories : includes,
2814 link_with : [libshared],
2815 install_rpath : rootlibexecdir,
2817 install_dir : rootbindir)
2819 public_programs += executable(
2822 include_directories : includes,
2823 link_with : [libshared],
2824 install_rpath : rootlibexecdir,
2827 public_programs += executable(
2829 'src/cgtop/cgtop.c',
2830 include_directories : includes,
2831 link_with : [libshared],
2832 install_rpath : rootlibexecdir,
2837 'src/initctl/initctl.c',
2838 include_directories : includes,
2839 link_with : [libshared],
2840 install_rpath : rootlibexecdir,
2842 install_dir : rootlibexecdir)
2844 public_programs += executable(
2846 'src/mount/mount-tool.c',
2847 include_directories : includes,
2848 link_with : [libshared],
2849 dependencies: [libmount],
2850 install_rpath : rootlibexecdir,
2853 meson.add_install_script(meson_make_symlink,
2854 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2856 public_programs += executable(
2859 include_directories : includes,
2860 link_with : [libshared],
2861 install_rpath : rootlibexecdir,
2864 public_programs += executable(
2865 'systemd-stdio-bridge',
2866 'src/stdio-bridge/stdio-bridge.c',
2867 include_directories : includes,
2868 link_with : [libshared],
2869 dependencies : [versiondep],
2870 install_rpath : rootlibexecdir,
2873 public_programs += executable(
2875 'src/busctl/busctl.c',
2876 'src/busctl/busctl-introspect.c',
2877 'src/busctl/busctl-introspect.h',
2878 include_directories : includes,
2879 link_with : [libshared],
2880 install_rpath : rootlibexecdir,
2883 if conf.get('ENABLE_SYSUSERS') == 1
2884 public_programs += executable(
2886 'src/sysusers/sysusers.c',
2887 include_directories : includes,
2888 link_with : [libshared],
2889 install_rpath : rootlibexecdir,
2891 install_dir : rootbindir)
2894 if conf.get('ENABLE_TMPFILES') == 1
2897 'src/tmpfiles/tmpfiles.c',
2898 'src/tmpfiles/offline-passwd.c',
2899 'src/tmpfiles/offline-passwd.h',
2900 include_directories : includes,
2901 link_with : [libshared],
2902 dependencies : [libacl],
2903 install_rpath : rootlibexecdir,
2905 install_dir : rootbindir)
2906 public_programs += exe
2908 if want_tests != 'false'
2909 test('test-systemd-tmpfiles',
2910 test_systemd_tmpfiles_py,
2911 # https://github.com/mesonbuild/meson/issues/2681
2912 args : exe.full_path())
2916 if conf.get('ENABLE_HWDB') == 1
2917 public_programs += executable(
2920 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2921 include_directories : includes,
2922 link_with : [libudev_static],
2923 install_rpath : udev_rpath,
2925 install_dir : rootbindir)
2928 if conf.get('ENABLE_QUOTACHECK') == 1
2930 'systemd-quotacheck',
2931 'src/quotacheck/quotacheck.c',
2932 include_directories : includes,
2933 link_with : [libshared],
2934 install_rpath : rootlibexecdir,
2936 install_dir : rootlibexecdir)
2939 public_programs += executable(
2940 'systemd-socket-proxyd',
2941 'src/socket-proxy/socket-proxyd.c',
2942 include_directories : includes,
2943 link_with : [libshared],
2944 dependencies : [threads],
2945 install_rpath : rootlibexecdir,
2947 install_dir : rootlibexecdir)
2949 public_programs += executable(
2951 systemd_udevd_sources,
2952 include_directories : includes,
2953 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2954 link_with : [libudev_core,
2957 dependencies : [versiondep,
2963 install_rpath : udev_rpath,
2965 install_dir : rootlibexecdir)
2967 public_programs += executable(
2970 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2971 include_directories : includes,
2972 link_with : [libudev_core,
2975 dependencies : [versiondep,
2981 install_rpath : udev_rpath,
2983 install_dir : rootbindir)
2987 systemd_shutdown_sources,
2988 include_directories : includes,
2989 link_with : [libcore_shared,
2991 dependencies : [libmount],
2992 install_rpath : rootlibexecdir,
2994 install_dir : rootlibexecdir)
2997 'systemd-update-done',
2998 'src/update-done/update-done.c',
2999 include_directories : includes,
3000 link_with : [libshared],
3001 install_rpath : rootlibexecdir,
3003 install_dir : rootlibexecdir)
3006 'systemd-update-utmp',
3007 'src/update-utmp/update-utmp.c',
3008 include_directories : includes,
3009 link_with : [libshared],
3010 dependencies : [libaudit],
3011 install_rpath : rootlibexecdir,
3013 install_dir : rootlibexecdir)
3015 if conf.get('HAVE_KMOD') == 1
3017 'systemd-modules-load',
3018 'src/modules-load/modules-load.c',
3019 include_directories : includes,
3020 link_with : [libshared],
3021 dependencies : [libkmod],
3022 install_rpath : rootlibexecdir,
3024 install_dir : rootlibexecdir)
3026 meson.add_install_script('sh', '-c',
3027 mkdir_p.format(modulesloaddir))
3028 meson.add_install_script('sh', '-c',
3029 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
3032 public_programs += executable(
3034 systemd_nspawn_sources,
3035 include_directories : includes,
3036 link_with : [libcore_shared,
3039 dependencies : [libblkid,
3041 install_rpath : rootlibexecdir,
3044 if conf.get('ENABLE_NETWORKD') == 1
3047 systemd_networkd_sources,
3048 include_directories : network_include_dir,
3049 link_with : [libnetworkd_core,
3052 networkd_link_with],
3053 dependencies : [threads],
3054 install_rpath : rootlibexecdir,
3056 install_dir : rootlibexecdir)
3059 'systemd-networkd-wait-online',
3060 systemd_networkd_wait_online_sources,
3061 include_directories : includes,
3062 link_with : [libnetworkd_core,
3063 networkd_link_with],
3064 install_rpath : rootlibexecdir,
3066 install_dir : rootlibexecdir)
3068 public_programs += executable(
3071 include_directories : includes,
3072 link_with : [libsystemd_network,
3073 networkd_link_with],
3074 install_rpath : rootlibexecdir,
3076 install_dir : rootbindir)
3079 'systemd-network-generator',
3080 network_generator_sources,
3081 include_directories : includes,
3082 link_with : [networkd_link_with],
3083 install_rpath : rootlibexecdir,
3085 install_dir : rootlibexecdir)
3087 if want_tests != 'false'
3088 test('test-network-generator-conversion',
3089 test_network_generator_conversion_sh,
3090 # https://github.com/mesonbuild/meson/issues/2681
3091 args : exe.full_path())
3096 'systemd-sulogin-shell',
3097 ['src/sulogin-shell/sulogin-shell.c'],
3098 include_directories : includes,
3099 link_with : [libshared],
3100 install_rpath : rootlibexecdir,
3102 install_dir : rootlibexecdir)
3104 ############################################################
3107 'systemd-runtest.env',
3108 output : 'systemd-runtest.env',
3109 command : ['sh', '-c', '{ ' +
3110 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
3111 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
3113 build_by_default : true)
3115 foreach tuple : tests
3117 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3118 dependencies = tuple[2]
3119 condition = tuple.length() >= 4 ? tuple[3] : ''
3120 type = tuple.length() >= 5 ? tuple[4] : ''
3121 defs = tuple.length() >= 6 ? tuple[5] : []
3122 incs = tuple.length() >= 7 ? tuple[6] : includes
3125 name = sources[0].split('/')[-1].split('.')[0]
3126 if type.startswith('timeout=')
3127 timeout = type.split('=')[1].to_int()
3131 if condition == '' or conf.get(condition) == 1
3135 include_directories : incs,
3136 link_with : link_with,
3137 dependencies : [versiondep,
3140 build_by_default : want_tests != 'false',
3141 install_rpath : rootlibexecdir,
3142 install : install_tests,
3143 install_dir : join_paths(testsdir, type))
3146 message('@0@ is a manual test'.format(name))
3147 elif type == 'unsafe' and want_tests != 'unsafe'
3148 message('@0@ is an unsafe test'.format(name))
3149 elif want_tests != 'false'
3155 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3160 'test-libsystemd-sym',
3161 test_libsystemd_sym_c,
3162 include_directories : includes,
3163 link_with : [libsystemd],
3164 build_by_default : want_tests != 'false',
3165 install : install_tests,
3166 install_dir : testsdir)
3167 if want_tests != 'false'
3168 test('test-libsystemd-sym', exe)
3172 'test-libsystemd-static-sym',
3173 test_libsystemd_sym_c,
3174 include_directories : includes,
3175 link_with : [install_libsystemd_static],
3176 dependencies : [threads], # threads is already included in dependencies on the library,
3177 # but does not seem to get propagated. Add here as a work-around.
3178 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3179 install : install_tests and static_libsystemd_pic,
3180 install_dir : testsdir)
3181 if want_tests != 'false' and static_libsystemd_pic
3182 test('test-libsystemd-static-sym', exe)
3188 include_directories : includes,
3189 c_args : '-Wno-deprecated-declarations',
3190 link_with : [libudev],
3191 build_by_default : want_tests != 'false',
3192 install : install_tests,
3193 install_dir : testsdir)
3194 if want_tests != 'false'
3195 test('test-libudev-sym', exe)
3199 'test-libudev-static-sym',
3201 include_directories : includes,
3202 c_args : '-Wno-deprecated-declarations',
3203 link_with : [install_libudev_static],
3204 build_by_default : want_tests != 'false' and static_libudev_pic,
3205 install : install_tests and static_libudev_pic,
3206 install_dir : testsdir)
3207 if want_tests != 'false' and static_libudev_pic
3208 test('test-libudev-static-sym', exe)
3211 ############################################################
3215 if get_option('tests') != 'false'
3216 foreach tuple : fuzzers
3218 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3219 dependencies = tuple[2]
3220 defs = tuple.length() >= 4 ? tuple[3] : []
3221 incs = tuple.length() >= 5 ? tuple[4] : includes
3225 dependencies += fuzzing_engine
3227 if fuzzing_engine.found()
3228 dependencies += fuzzing_engine
3230 link_args += ['-fsanitize=fuzzer']
3233 sources += 'src/fuzz/fuzz-main.c'
3236 name = sources[0].split('/')[-1].split('.')[0]
3238 fuzzer_exes += executable(
3241 include_directories : [incs, include_directories('src/fuzz')],
3242 link_with : link_with,
3243 dependencies : dependencies,
3245 link_args: link_args,
3252 depends : fuzzer_exes,
3255 ############################################################
3257 make_directive_index_py = find_program('tools/make-directive-index.py')
3258 make_man_index_py = find_program('tools/make-man-index.py')
3259 xml_helper_py = find_program('tools/xml_helper.py')
3260 hwdb_update_sh = find_program('tools/hwdb-update.sh')
3261 autosuspend_update_sh = find_program('tools/autosuspend-update.sh')
3264 subdir('sysusers.d')
3265 subdir('tmpfiles.d')
3271 subdir('shell-completion/bash')
3272 subdir('shell-completion/zsh')
3273 subdir('docs/sysvinit')
3274 subdir('docs/var-log')
3276 install_subdir('factory/etc',
3277 install_dir : factorydir)
3279 install_data('xorg/50-systemd-user.sh',
3280 install_dir : xinitrcdir)
3281 install_data('modprobe.d/systemd.conf',
3282 install_dir : modprobedir)
3283 install_data('LICENSE.GPL2',
3287 'docs/CODING_STYLE.md',
3288 'docs/DISTRO_PORTING.md',
3289 'docs/ENVIRONMENT.md',
3291 'docs/TRANSIENT-SETTINGS.md',
3292 'docs/TRANSLATORS.md',
3293 'docs/UIDS-GIDS.md',
3294 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3295 install_dir : docdir)
3297 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3298 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3300 ############################################################
3302 check_help = find_program('tools/check-help.sh')
3304 foreach exec : public_programs
3305 name = exec.full_path().split('/')[-1]
3306 if want_tests != 'false'
3307 test('check-help-' + name,
3309 args : exec.full_path())
3313 ############################################################
3315 check_directives_sh = find_program('tools/check-directives.sh')
3317 if want_tests != 'false'
3318 test('check-directives',
3319 check_directives_sh,
3320 args : project_source_root)
3323 ############################################################
3325 # Enable tests for all supported sanitizers
3326 foreach tuple : sanitizers
3327 sanitizer = tuple[0]
3330 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3332 foreach p : fuzz_regression_tests
3333 b = p.split('/')[-2]
3334 c = p.split('/')[-1]
3336 name = '@0@:@1@'.format(b, sanitizer)
3339 if want_tests == 'false'
3340 message('Not compiling @0@ because tests is set to false'.format(name))
3342 exe = custom_target(
3346 command : [env, 'ln', '-fs',
3347 join_paths(build.full_path(), b),
3349 build_by_default : true)
3351 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3356 if want_tests != 'false' and slow_tests
3357 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3359 args : [exe.full_path(),
3360 join_paths(project_source_root, p)])
3367 ############################################################
3370 all_files = run_command(
3372 ['--git-dir=@0@/.git'.format(project_source_root),
3375 all_files = files(all_files.stdout().split())
3380 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3383 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3387 git_contrib_sh = find_program('tools/git-contrib.sh')
3390 command : [git_contrib_sh])
3394 git_head = run_command(
3396 ['--git-dir=@0@/.git'.format(project_source_root),
3397 'rev-parse', 'HEAD']).stdout().strip()
3398 git_head_short = run_command(
3400 ['--git-dir=@0@/.git'.format(project_source_root),
3401 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3405 command : ['git', 'archive',
3406 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3408 '--prefix', 'systemd-@0@/'.format(git_head),
3412 ############################################################
3414 check_api_docs_sh = find_program('tools/check-api-docs.sh')
3417 depends : [man, libsystemd, libudev],
3418 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3420 ############################################################
3421 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3424 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3426 'split /usr: @0@'.format(split_usr),
3427 'split bin-sbin: @0@'.format(split_bin),
3428 'prefix directory: @0@'.format(prefixdir),
3429 'rootprefix directory: @0@'.format(rootprefixdir),
3430 'sysconf directory: @0@'.format(sysconfdir),
3431 'include directory: @0@'.format(includedir),
3432 'lib directory: @0@'.format(libdir),
3433 'rootlib directory: @0@'.format(rootlibdir),
3434 'SysV init scripts: @0@'.format(sysvinit_path),
3435 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3436 'PAM modules directory: @0@'.format(pamlibdir),
3437 'PAM configuration directory: @0@'.format(pamconfdir),
3438 'RPM macros directory: @0@'.format(rpmmacrosdir),
3439 'modprobe.d directory: @0@'.format(modprobedir),
3440 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3441 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3442 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3443 'bash completions directory: @0@'.format(bashcompletiondir),
3444 'zsh completions directory: @0@'.format(zshcompletiondir),
3445 'extra start script: @0@'.format(get_option('rc-local')),
3446 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3447 get_option('debug-tty')),
3448 'TTY GID: @0@'.format(tty_gid),
3449 'users GID: @0@'.format(substs.get('USERS_GID')),
3450 'maximum system UID: @0@'.format(system_uid_max),
3451 'maximum system GID: @0@'.format(system_gid_max),
3452 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3453 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3454 'minimum container UID base: @0@'.format(container_uid_base_min),
3455 'maximum container UID base: @0@'.format(container_uid_base_max),
3456 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3457 'render group access mode: @0@'.format(get_option('group-render-mode')),
3458 'certificate root directory: @0@'.format(get_option('certificate-root')),
3459 'support URL: @0@'.format(support_url),
3460 'nobody user name: @0@'.format(nobody_user),
3461 'nobody group name: @0@'.format(nobody_group),
3462 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3463 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3465 'default DNSSEC mode: @0@'.format(default_dnssec),
3466 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3467 'default mDNS mode: @0@'.format(default_mdns),
3468 'default LLMNR mode: @0@'.format(default_llmnr),
3469 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3470 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3471 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3472 'default locale: @0@'.format(default_locale),
3473 'default user $PATH: @0@'.format(default_user_path_display),
3474 'systemd service watchdog: @0@'.format(watchdog_opt)]
3476 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3477 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3479 'default DNS servers: @0@'.format(alt_dns_servers),
3480 'default NTP servers: @0@'.format(alt_ntp_servers)]
3482 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3483 '@@0@'.format(time_epoch)).stdout().strip()
3485 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3488 'static libsystemd: @0@'.format(static_libsystemd),
3489 'static libudev: @0@'.format(static_libudev)]
3492 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3493 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3494 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3496 if conf.get('ENABLE_EFI') == 1
3497 status += 'efi arch: @0@'.format(efi_arch)
3501 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3502 'EFI CC @0@'.format(' '.join(efi_cc)),
3503 'EFI lds: @0@'.format(efi_lds),
3504 'EFI crt0: @0@'.format(efi_crt0),
3505 'EFI include directory: @0@'.format(efi_incdir)]
3564 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3565 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3569 ['legacy pkla', install_polkit_pkla],
3571 ['gnu-efi', have_gnu_efi],
3584 ['man pages', want_man],
3585 ['html pages', want_html],
3586 ['man page indices', want_man and have_lxml],
3591 ['adm group', get_option('adm-group')],
3592 ['wheel group', get_option('wheel-group')],
3595 ['debug mmap cache'],
3597 ['valgrind', conf.get('VALGRIND') == 1],
3598 ['trace logging', conf.get('LOG_TRACE') == 1],
3599 ['install tests', install_tests],
3600 ['link-udev-shared', get_option('link-udev-shared')],
3601 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3602 ['link-networkd-shared', get_option('link-networkd-shared')],
3603 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3604 ['kernel-install', get_option('kernel-install')],
3605 ['systemd-analyze', get_option('analyze')],
3608 if tuple.length() >= 2
3611 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3612 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3613 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3624 'enabled features: @0@'.format(', '.join(found)),
3626 'disabled features: @0@'.format(', '.join(missing)),
3628 message('\n '.join(status))
3630 if rootprefixdir != rootprefix_default
3632 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3633 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3634 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))