1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
13 meson_version : '>= 0.46',
16 libsystemd_version = '0.29.0'
17 libudev_version = '1.6.18'
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 have_standalone_binaries = get_option('standalone-binaries')
90 sysvinit_path = get_option('sysvinit-path')
91 sysvrcnd_path = get_option('sysvrcnd-path')
92 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
93 description : 'SysV init scripts and rcN.d links are supported')
95 if get_option('hibernate') and not get_option('initrd')
96 error('hibernate depends on initrd')
99 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
100 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
101 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
103 # join_paths ignores the preceding arguments if an absolute component is
104 # encountered, so this should canonicalize various paths when they are
105 # absolute or relative.
106 prefixdir = get_option('prefix')
107 if not prefixdir.startswith('/')
108 error('Prefix is not absolute: "@0@"'.format(prefixdir))
110 bindir = join_paths(prefixdir, get_option('bindir'))
111 libdir = join_paths(prefixdir, get_option('libdir'))
112 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
113 includedir = join_paths(prefixdir, get_option('includedir'))
114 datadir = join_paths(prefixdir, get_option('datadir'))
115 localstatedir = join_paths('/', get_option('localstatedir'))
117 rootbindir = join_paths(rootprefixdir, 'bin')
118 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
119 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
121 rootlibdir = get_option('rootlibdir')
123 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
126 # Dirs of external packages
127 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
128 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
129 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
130 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
131 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
132 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
133 rpmmacrosdir = get_option('rpmmacrosdir')
134 if rpmmacrosdir != 'no'
135 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
137 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
140 pkgdatadir = join_paths(datadir, 'systemd')
141 environmentdir = join_paths(prefixdir, 'lib/environment.d')
142 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
143 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
144 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
145 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
146 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
147 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
148 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
149 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
150 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
151 pkgincludedir = join_paths(includedir, 'systemd')
152 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
153 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
154 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
155 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
156 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
157 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
158 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
159 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
160 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
161 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
162 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
163 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
164 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
165 factorydir = join_paths(datadir, 'factory')
166 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
167 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
168 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
169 catalogstatedir = join_paths(systemdstatedir, 'catalog')
170 randomseeddir = join_paths(localstatedir, 'lib/systemd')
171 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
172 ntpservicelistdir = join_paths(rootprefixdir, 'lib/systemd/ntp-units.d')
174 docdir = get_option('docdir')
176 docdir = join_paths(datadir, 'doc/systemd')
179 dbuspolicydir = get_option('dbuspolicydir')
180 if dbuspolicydir == ''
181 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
184 dbussessionservicedir = get_option('dbussessionservicedir')
185 if dbussessionservicedir == ''
186 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
189 dbussystemservicedir = get_option('dbussystemservicedir')
190 if dbussystemservicedir == ''
191 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
194 pamlibdir = get_option('pamlibdir')
196 pamlibdir = join_paths(rootlibdir, 'security')
199 pamconfdir = get_option('pamconfdir')
201 pamconfdir = join_paths(sysconfdir, 'pam.d')
204 memory_accounting_default = get_option('memory-accounting-default')
205 status_unit_format_default = get_option('status-unit-format-default')
207 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
208 conf.set_quoted('SYSTEM_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'system'))
209 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
210 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
211 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
212 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
214 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
216 conf.set_quoted('USER_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'user'))
217 conf.set_quoted('USER_DATA_UNIT_DIR', userunitdir)
218 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
219 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
220 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
221 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
222 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
223 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
224 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
225 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
226 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
227 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
228 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
229 conf.set_quoted('ROOTPREFIX', rootprefixdir)
230 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
231 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
232 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
233 conf.set_quoted('SYSTEM_GENERATOR_DIR', systemgeneratordir)
234 conf.set_quoted('USER_GENERATOR_DIR', usergeneratordir)
235 conf.set_quoted('SYSTEM_ENV_GENERATOR_DIR', systemenvgeneratordir)
236 conf.set_quoted('USER_ENV_GENERATOR_DIR', userenvgeneratordir)
237 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
238 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
239 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
240 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
241 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
242 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
243 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
244 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
245 conf.set_quoted('LIBDIR', libdir)
246 conf.set_quoted('ROOTLIBDIR', rootlibdir)
247 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
248 conf.set_quoted('BOOTLIBDIR', bootlibdir)
249 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
250 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
251 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
252 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
253 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
254 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
255 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
256 conf.set_quoted('SYSTEMD_HOMEWORK_PATH', join_paths(rootlibexecdir, 'systemd-homework'))
257 conf.set_quoted('SYSTEMD_USERWORK_PATH', join_paths(rootlibexecdir, 'systemd-userwork'))
258 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
259 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
260 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
262 substs.set('prefix', prefixdir)
263 substs.set('rootprefix', rootprefixdir)
264 substs.set('rootprefix_noslash', rootprefixdir_noslash)
265 substs.set('exec_prefix', prefixdir)
266 substs.set('libdir', libdir)
267 substs.set('rootlibdir', rootlibdir)
268 substs.set('includedir', includedir)
269 substs.set('sysconfdir', sysconfdir)
270 substs.set('bindir', bindir)
271 substs.set('rootbindir', rootbindir)
272 substs.set('rootlibexecdir', rootlibexecdir)
273 substs.set('systemunitdir', systemunitdir)
274 substs.set('userunitdir', userunitdir)
275 substs.set('systempresetdir', systempresetdir)
276 substs.set('userpresetdir', userpresetdir)
277 substs.set('udevhwdbdir', udevhwdbdir)
278 substs.set('udevrulesdir', udevrulesdir)
279 substs.set('udevlibexecdir', udevlibexecdir)
280 substs.set('environmentdir', environmentdir)
281 substs.set('catalogdir', catalogdir)
282 substs.set('tmpfilesdir', tmpfilesdir)
283 substs.set('sysusersdir', sysusersdir)
284 substs.set('sysctldir', sysctldir)
285 substs.set('binfmtdir', binfmtdir)
286 substs.set('modulesloaddir', modulesloaddir)
287 substs.set('modprobedir', modprobedir)
288 substs.set('systemgeneratordir', systemgeneratordir)
289 substs.set('usergeneratordir', usergeneratordir)
290 substs.set('systemenvgeneratordir', systemenvgeneratordir)
291 substs.set('userenvgeneratordir', userenvgeneratordir)
292 substs.set('systemshutdowndir', systemshutdowndir)
293 substs.set('systemsleepdir', systemsleepdir)
294 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
295 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
296 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
297 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
298 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
299 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
300 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
301 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
302 substs.set('BUILD_ROOT', project_build_root)
304 #####################################################################
306 cc = meson.get_compiler('c')
307 pkgconfig = import('pkgconfig')
308 check_compilation_sh = find_program('tools/check-compilation.sh')
309 meson_build_sh = find_program('tools/meson-build.sh')
311 want_tests = get_option('tests')
312 slow_tests = want_tests != 'false' and get_option('slow-tests')
313 fuzz_tests = want_tests != 'false' and get_option('fuzz-tests')
314 install_tests = get_option('install-tests')
316 if add_languages('cpp', required : fuzzer_build)
317 # Used only for tests
318 cxx = meson.get_compiler('cpp')
319 cxx_cmd = ' '.join(cxx.cmd_array())
325 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
326 if fuzzing_engine.found()
327 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
328 elif cc.has_argument('-fsanitize=fuzzer-no-link')
329 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
331 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
334 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
337 # Those generate many false positives, and we do not want to change the code to
339 basic_disabled_warnings = [
340 '-Wno-unused-parameter',
341 '-Wno-missing-field-initializers',
342 '-Wno-unused-result',
343 '-Wno-format-signedness',
346 possible_cc_flags = [
349 '-Wmissing-include-dirs',
350 '-Wold-style-definition',
354 '-Wsuggest-attribute=noreturn',
355 '-Werror=missing-prototypes',
356 '-Werror=implicit-function-declaration',
357 '-Werror=missing-declarations',
358 '-Werror=return-type',
359 '-Werror=incompatible-pointer-types',
361 '-Wstrict-prototypes',
363 '-Wmissing-noreturn',
364 '-Wimplicit-fallthrough=5',
367 '-Wstrict-aliasing=2',
370 '-Werror=shift-count-overflow',
371 '-Werror=shift-overflow=2',
375 # negative arguments are correctly detected starting with meson 0.46.
376 '-Wno-error=#warnings', # clang
377 '-Wno-string-plus-int', # clang
379 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
380 # optimizations enabled, producing essentially false positives.
381 '-Wno-maybe-uninitialized',
385 '-fdiagnostics-show-option',
386 '-fno-strict-aliasing',
387 '-fvisibility=hidden',
389 '-fstack-protector-strong',
390 '--param=ssp-buffer-size=4',
393 # --as-needed and --no-undefined are provided by meson by default,
394 # run mesonconf to see what is enabled
395 possible_link_flags = [
401 if cc.get_id() == 'clang'
402 possible_cc_flags += [
403 '-Wno-typedef-redefinition',
404 '-Wno-gnu-variable-sized-type-not-at-end',
408 if get_option('buildtype') != 'debug'
409 possible_cc_flags += [
410 '-ffunction-sections',
414 possible_link_flags += '-Wl,--gc-sections'
417 add_project_arguments(cc.get_supported_arguments(basic_disabled_warnings), language : 'c')
418 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
419 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
421 have = cc.has_argument('-Wzero-length-bounds')
422 conf.set10('HAVE_ZERO_LENGTH_BOUNDS', have)
426 #include <inttypes.h>
427 typedef uint64_t usec_t;
428 usec_t now(clockid_t clock);
433 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
434 add_project_arguments('-Werror=shadow', language : 'c')
438 add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp')
441 cpp = ' '.join(cc.cmd_array()) + ' -E'
443 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
445 #####################################################################
446 # compilation result tests
448 conf.set('_GNU_SOURCE', true)
449 conf.set('__SANE_USERSPACE_TYPES__', true)
450 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
452 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
453 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
454 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
455 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
459 #include <sys/stat.h>
462 foreach decl : ['char16_t',
467 # We get -1 if the size cannot be determined
468 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
470 if decl == 'struct statx'
472 want_linux_stat_h = false
474 have = cc.sizeof(decl,
475 prefix : decl_headers + '#include <linux/stat.h>',
476 args : '-D_GNU_SOURCE') > 0
477 want_linux_stat_h = have
481 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
484 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
486 foreach ident : ['secure_getenv', '__secure_getenv']
487 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
491 ['memfd_create', '''#include <sys/mman.h>'''],
492 ['gettid', '''#include <sys/types.h>
493 #include <unistd.h>'''],
494 ['pivot_root', '''#include <stdlib.h>
495 #include <unistd.h>'''], # no known header declares pivot_root
496 ['name_to_handle_at', '''#include <sys/types.h>
497 #include <sys/stat.h>
498 #include <fcntl.h>'''],
499 ['setns', '''#include <sched.h>'''],
500 ['renameat2', '''#include <stdio.h>
501 #include <fcntl.h>'''],
502 ['kcmp', '''#include <linux/kcmp.h>'''],
503 ['keyctl', '''#include <sys/types.h>
504 #include <keyutils.h>'''],
505 ['copy_file_range', '''#include <sys/syscall.h>
506 #include <unistd.h>'''],
507 ['bpf', '''#include <sys/syscall.h>
508 #include <unistd.h>'''],
509 ['statx', '''#include <sys/types.h>
510 #include <sys/stat.h>
511 #include <unistd.h>'''],
512 ['explicit_bzero' , '''#include <string.h>'''],
513 ['reallocarray', '''#include <malloc.h>'''],
514 ['set_mempolicy', '''#include <stdlib.h>
515 #include <unistd.h>'''],
516 ['get_mempolicy', '''#include <stdlib.h>
517 #include <unistd.h>'''],
518 ['pidfd_send_signal', '''#include <stdlib.h>
521 #include <sys/wait.h>'''],
522 ['pidfd_open', '''#include <stdlib.h>
525 #include <sys/wait.h>'''],
526 ['rt_sigqueueinfo', '''#include <stdlib.h>
529 #include <sys/wait.h>'''],
532 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
533 conf.set10('HAVE_' + ident[0].to_upper(), have)
536 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
537 conf.set10('USE_SYS_RANDOM_H', true)
538 conf.set10('HAVE_GETRANDOM', true)
540 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
541 conf.set10('USE_SYS_RANDOM_H', false)
542 conf.set10('HAVE_GETRANDOM', have)
545 #####################################################################
547 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
549 get_option('version-tag'),
550 meson.project_version()]
553 input : 'src/version/version.h.in',
554 output : 'version.h',
557 versiondep = declare_dependency(sources: version_h)
559 sed = find_program('sed')
560 awk = find_program('awk')
561 m4 = find_program('m4')
562 stat = find_program('stat')
563 git = find_program('git', required : false)
564 env = find_program('env')
565 perl = find_program('perl', required : false)
567 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
568 mkdir_p = 'mkdir -p $DESTDIR/@0@'
569 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
570 splash_bmp = files('test/splash.bmp')
572 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
573 # /usr/sbin, /sbin, and fall back to the default from middle column.
574 progs = [['quotaon', '/usr/sbin/quotaon' ],
575 ['quotacheck', '/usr/sbin/quotacheck' ],
576 ['kmod', '/usr/bin/kmod' ],
577 ['kexec', '/usr/sbin/kexec' ],
578 ['sulogin', '/usr/sbin/sulogin' ],
579 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
580 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
581 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
582 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
583 ['nologin', '/usr/sbin/nologin', ],
586 path = get_option(prog[0] + '-path')
588 message('Using @1@ for @0@'.format(prog[0], path))
590 exe = find_program(prog[0],
591 '/usr/sbin/' + prog[0],
594 path = exe.found() ? exe.path() : prog[1]
596 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
597 conf.set_quoted(name, path)
598 substs.set(name, path)
601 conf.set_quoted('TELINIT', get_option('telinit-path'))
603 if run_command('ln', '--relative', '--help').returncode() != 0
604 error('ln does not support --relative (added in coreutils 8.16)')
607 ############################################################
609 gperf = find_program('gperf')
611 gperf_test_format = '''
613 const char * in_word_set(const char *, @0@);
616 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
617 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
618 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
619 if cc.compiles(gperf_test)
620 gperf_len_type = 'size_t'
622 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
623 if cc.compiles(gperf_test)
624 gperf_len_type = 'unsigned'
626 error('unable to determine gperf len type')
629 message('gperf len type is @0@'.format(gperf_len_type))
630 conf.set('GPERF_LEN_TYPE', gperf_len_type,
631 description : 'The type of gperf "len" parameter')
633 ############################################################
635 if not cc.has_header('sys/capability.h')
636 error('POSIX caps headers not found')
638 foreach header : ['crypt.h',
640 'linux/vm_sockets.h',
642 'valgrind/memcheck.h',
643 'valgrind/valgrind.h',
646 conf.set10('HAVE_' + header.underscorify().to_upper(),
647 cc.has_header(header))
650 ############################################################
652 fallback_hostname = get_option('fallback-hostname')
653 if fallback_hostname == '' or fallback_hostname[0] == '.' or fallback_hostname[0] == '-'
654 error('Invalid fallback-hostname configuration')
655 # A more extensive test is done in test-hostname-util. Let's catch
656 # the most obvious errors here so we don't fail with an assert later.
658 conf.set_quoted('FALLBACK_HOSTNAME', fallback_hostname)
660 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
661 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
663 default_hierarchy = get_option('default-hierarchy')
664 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
665 description : 'default cgroup hierarchy as string')
666 if default_hierarchy == 'legacy'
667 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
668 elif default_hierarchy == 'hybrid'
669 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
671 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
674 default_net_naming_scheme = get_option('default-net-naming-scheme')
675 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
677 time_epoch = get_option('time-epoch')
679 time_epoch = run_command('sh', ['-c', 'echo "$SOURCE_DATE_EPOCH"']).stdout().strip()
680 if time_epoch == '' and git.found() and run_command('test', '-e', '.git').returncode() == 0
681 # If we're in a git repository, use the creation time of the latest git tag.
682 latest_tag = run_command('git', 'describe', '--abbrev=0', '--tags').stdout().strip()
683 time_epoch = run_command('git', 'log', '-1', '--format=%at', latest_tag).stdout()
687 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
689 time_epoch = time_epoch.to_int()
691 conf.set('TIME_EPOCH', time_epoch)
693 system_uid_max = get_option('system-uid-max')
694 if system_uid_max == -1
695 system_uid_max = run_command(
697 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
698 '/etc/login.defs').stdout().strip()
699 if system_uid_max == ''
702 system_uid_max = system_uid_max.to_int()
705 conf.set('SYSTEM_UID_MAX', system_uid_max)
706 substs.set('systemuidmax', system_uid_max)
708 system_gid_max = get_option('system-gid-max')
709 if system_gid_max == -1
710 system_gid_max = run_command(
712 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
713 '/etc/login.defs').stdout().strip()
714 if system_gid_max == ''
717 system_gid_max = system_gid_max.to_int()
720 conf.set('SYSTEM_GID_MAX', system_gid_max)
721 substs.set('systemgidmax', system_gid_max)
723 dynamic_uid_min = get_option('dynamic-uid-min')
724 dynamic_uid_max = get_option('dynamic-uid-max')
725 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
726 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
727 substs.set('dynamicuidmin', dynamic_uid_min)
728 substs.set('dynamicuidmax', dynamic_uid_max)
730 container_uid_base_min = get_option('container-uid-base-min')
731 container_uid_base_max = get_option('container-uid-base-max')
732 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
733 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
734 substs.set('containeruidbasemin', container_uid_base_min)
735 substs.set('containeruidbasemax', container_uid_base_max)
737 nobody_user = get_option('nobody-user')
738 nobody_group = get_option('nobody-group')
740 if not meson.is_cross_build()
741 getent_result = run_command('getent', 'passwd', '65534')
742 if getent_result.returncode() == 0
743 name = getent_result.stdout().split(':')[0]
744 if name != nobody_user
746 '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) +
747 'Your build will result in an user table setup that is incompatible with the local system.')
750 id_result = run_command('id', '-u', nobody_user)
751 if id_result.returncode() == 0
752 id = id_result.stdout().to_int()
755 '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) +
756 'Your build will result in an user table setup that is incompatible with the local system.')
760 getent_result = run_command('getent', 'group', '65534')
761 if getent_result.returncode() == 0
762 name = getent_result.stdout().split(':')[0]
763 if name != nobody_group
765 '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) +
766 'Your build will result in an group table setup that is incompatible with the local system.')
769 id_result = run_command('id', '-g', nobody_group)
770 if id_result.returncode() == 0
771 id = id_result.stdout().to_int()
774 '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) +
775 'Your build will result in an group table setup that is incompatible with the local system.')
779 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
781 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
782 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
785 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
786 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
787 substs.set('NOBODY_USER_NAME', nobody_user)
788 substs.set('NOBODY_GROUP_NAME', nobody_group)
790 tty_gid = get_option('tty-gid')
791 conf.set('TTY_GID', tty_gid)
792 substs.set('TTY_GID', tty_gid)
794 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
795 users_gid = get_option('users-gid')
796 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
798 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
799 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
801 dev_kvm_mode = get_option('dev-kvm-mode')
802 substs.set('DEV_KVM_MODE', dev_kvm_mode)
803 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
804 group_render_mode = get_option('group-render-mode')
805 substs.set('GROUP_RENDER_MODE', group_render_mode)
806 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
808 kill_user_processes = get_option('default-kill-user-processes')
809 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
810 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
811 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
813 dns_servers = get_option('dns-servers')
814 conf.set_quoted('DNS_SERVERS', dns_servers)
815 substs.set('DNS_SERVERS', dns_servers)
817 ntp_servers = get_option('ntp-servers')
818 conf.set_quoted('NTP_SERVERS', ntp_servers)
819 substs.set('NTP_SERVERS', ntp_servers)
821 default_locale = get_option('default-locale')
822 if default_locale == ''
823 if not meson.is_cross_build()
824 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
825 default_locale = run_command(choose_default_locale_sh).stdout().strip()
827 default_locale = 'C.UTF-8'
830 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
832 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
834 service_watchdog = get_option('service-watchdog')
835 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
836 substs.set('SERVICE_WATCHDOG', watchdog_value)
838 substs.set('SUSHELL', get_option('debug-shell'))
839 substs.set('DEBUGTTY', get_option('debug-tty'))
840 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
842 enable_debug_hashmap = false
843 enable_debug_mmap_cache = false
844 enable_debug_siphash = false
845 foreach name : get_option('debug-extra')
847 enable_debug_hashmap = true
848 elif name == 'mmap-cache'
849 enable_debug_mmap_cache = true
850 elif name == 'siphash'
851 enable_debug_siphash = true
853 message('unknown debug option "@0@", ignoring'.format(name))
856 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
857 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
858 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
860 conf.set10('VALGRIND', get_option('valgrind'))
861 conf.set10('LOG_TRACE', get_option('log-trace'))
863 default_user_path = get_option('user-path')
864 if default_user_path != ''
865 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
866 default_user_path_display = default_user_path
868 # meson 0.49 fails when ?: is used in .format()
869 default_user_path_display = '(same as system services)'
873 #####################################################################
875 threads = dependency('threads')
876 librt = cc.find_library('rt')
877 libm = cc.find_library('m')
878 libdl = cc.find_library('dl')
879 libcrypt = cc.find_library('crypt')
881 libcap = dependency('libcap', required : false)
882 if not libcap.found()
883 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
884 libcap = cc.find_library('cap')
887 libmount = dependency('mount',
888 version : fuzzer_build ? '>= 0' : '>= 2.30')
890 want_libfdisk = get_option('fdisk')
891 if want_libfdisk != 'false' and not skip_deps
892 libfdisk = dependency('fdisk',
893 required : want_libfdisk == 'true')
894 have = libfdisk.found()
899 conf.set10('HAVE_LIBFDISK', have)
901 want_pwquality = get_option('pwquality')
902 if want_pwquality != 'false' and not skip_deps
903 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
904 have = libpwquality.found()
909 conf.set10('HAVE_PWQUALITY', have)
911 want_seccomp = get_option('seccomp')
912 if want_seccomp != 'false' and not skip_deps
913 libseccomp = dependency('libseccomp',
914 version : '>= 2.3.1',
915 required : want_seccomp == 'true')
916 have = libseccomp.found()
921 conf.set10('HAVE_SECCOMP', have)
923 want_selinux = get_option('selinux')
924 if want_selinux != 'false' and not skip_deps
925 libselinux = dependency('libselinux',
926 version : '>= 2.1.9',
927 required : want_selinux == 'true')
928 have = libselinux.found()
933 conf.set10('HAVE_SELINUX', have)
935 want_apparmor = get_option('apparmor')
936 if want_apparmor != 'false' and not skip_deps
937 libapparmor = dependency('libapparmor',
939 required : want_apparmor == 'true')
940 have = libapparmor.found()
945 conf.set10('HAVE_APPARMOR', have)
947 smack_run_label = get_option('smack-run-label')
948 if smack_run_label != ''
949 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
952 want_polkit = get_option('polkit')
953 install_polkit = false
954 install_polkit_pkla = false
955 if want_polkit != 'false' and not skip_deps
956 install_polkit = true
958 libpolkit = dependency('polkit-gobject-1',
960 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
961 message('Old polkit detected, will install pkla files')
962 install_polkit_pkla = true
965 conf.set10('ENABLE_POLKIT', install_polkit)
967 want_acl = get_option('acl')
968 if want_acl != 'false' and not skip_deps
969 libacl = cc.find_library('acl', required : want_acl == 'true')
970 have = libacl.found()
975 conf.set10('HAVE_ACL', have)
977 want_audit = get_option('audit')
978 if want_audit != 'false' and not skip_deps
979 libaudit = dependency('audit', required : want_audit == 'true')
980 have = libaudit.found()
985 conf.set10('HAVE_AUDIT', have)
987 want_blkid = get_option('blkid')
988 if want_blkid != 'false' and not skip_deps
989 libblkid = dependency('blkid', required : want_blkid == 'true')
990 have = libblkid.found()
995 conf.set10('HAVE_BLKID', have)
997 want_kmod = get_option('kmod')
998 if want_kmod != 'false' and not skip_deps
999 libkmod = dependency('libkmod',
1001 required : want_kmod == 'true')
1002 have = libkmod.found()
1007 conf.set10('HAVE_KMOD', have)
1009 want_pam = get_option('pam')
1010 if want_pam != 'false' and not skip_deps
1011 libpam = cc.find_library('pam', required : want_pam == 'true')
1012 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
1013 have = libpam.found() and libpam_misc.found()
1019 conf.set10('HAVE_PAM', have)
1021 want_microhttpd = get_option('microhttpd')
1022 if want_microhttpd != 'false' and not skip_deps
1023 libmicrohttpd = dependency('libmicrohttpd',
1024 version : '>= 0.9.33',
1025 required : want_microhttpd == 'true')
1026 have = libmicrohttpd.found()
1031 conf.set10('HAVE_MICROHTTPD', have)
1033 want_libcryptsetup = get_option('libcryptsetup')
1034 if want_libcryptsetup != 'false' and not skip_deps
1035 libcryptsetup = dependency('libcryptsetup',
1036 version : '>= 2.0.1',
1037 required : want_libcryptsetup == 'true')
1038 have = libcryptsetup.found()
1040 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1041 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
1042 conf.set10('HAVE_CRYPT_ACTIVATE_BY_SIGNED_KEY',
1043 have and cc.has_function('crypt_activate_by_signed_key', dependencies : libcryptsetup))
1048 conf.set10('HAVE_LIBCRYPTSETUP', have)
1050 want_libcurl = get_option('libcurl')
1051 if want_libcurl != 'false' and not skip_deps
1052 libcurl = dependency('libcurl',
1053 version : '>= 7.32.0',
1054 required : want_libcurl == 'true')
1055 have = libcurl.found()
1060 conf.set10('HAVE_LIBCURL', have)
1062 want_libidn = get_option('libidn')
1063 want_libidn2 = get_option('libidn2')
1064 if want_libidn == 'true' and want_libidn2 == 'true'
1065 error('libidn and libidn2 cannot be requested simultaneously')
1068 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1069 libidn = dependency('libidn2',
1070 required : want_libidn2 == 'true')
1071 have = libidn.found()
1076 conf.set10('HAVE_LIBIDN2', have)
1077 if not have and want_libidn != 'false' and not skip_deps
1078 # libidn is used for both libidn and libidn2 objects
1079 libidn = dependency('libidn',
1080 required : want_libidn == 'true')
1081 have = libidn.found()
1085 conf.set10('HAVE_LIBIDN', have)
1087 want_libiptc = get_option('libiptc')
1088 if want_libiptc != 'false' and not skip_deps
1089 libiptc = dependency('libiptc',
1090 required : want_libiptc == 'true')
1091 have = libiptc.found()
1096 conf.set10('HAVE_LIBIPTC', have)
1098 want_qrencode = get_option('qrencode')
1099 if want_qrencode != 'false' and not skip_deps
1100 libqrencode = dependency('libqrencode',
1101 required : want_qrencode == 'true')
1102 have = libqrencode.found()
1107 conf.set10('HAVE_QRENCODE', have)
1109 want_gcrypt = get_option('gcrypt')
1110 if want_gcrypt != 'false' and not skip_deps
1111 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1112 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1113 have = libgcrypt.found() and libgpg_error.found()
1118 # link to neither of the libs if one is not found
1122 conf.set10('HAVE_GCRYPT', have)
1124 want_gnutls = get_option('gnutls')
1125 if want_gnutls != 'false' and not skip_deps
1126 libgnutls = dependency('gnutls',
1127 version : '>= 3.1.4',
1128 required : want_gnutls == 'true')
1129 have = libgnutls.found()
1134 conf.set10('HAVE_GNUTLS', have)
1136 want_openssl = get_option('openssl')
1137 if want_openssl != 'false' and not skip_deps
1138 libopenssl = dependency('openssl',
1139 version : '>= 1.1.0',
1140 required : want_openssl == 'true')
1141 have = libopenssl.found()
1146 conf.set10('HAVE_OPENSSL', have)
1148 want_p11kit = get_option('p11kit')
1149 if want_p11kit != 'false' and not skip_deps
1150 libp11kit = dependency('p11-kit-1',
1151 version : '>= 0.23.3',
1152 required : want_p11kit == 'true')
1153 have = libp11kit.found()
1158 conf.set10('HAVE_P11KIT', have)
1160 want_libfido2 = get_option('libfido2')
1161 if want_libfido2 != 'false' and not skip_deps
1162 libfido2 = dependency('libfido2',
1163 required : want_libfido2 == 'true')
1164 have = libfido2.found()
1169 conf.set10('HAVE_LIBFIDO2', have)
1171 want_elfutils = get_option('elfutils')
1172 if want_elfutils != 'false' and not skip_deps
1173 libdw = dependency('libdw',
1174 required : want_elfutils == 'true')
1175 have = libdw.found()
1180 conf.set10('HAVE_ELFUTILS', have)
1182 want_zlib = get_option('zlib')
1183 if want_zlib != 'false' and not skip_deps
1184 libz = dependency('zlib',
1185 required : want_zlib == 'true')
1191 conf.set10('HAVE_ZLIB', have)
1193 want_bzip2 = get_option('bzip2')
1194 if want_bzip2 != 'false' and not skip_deps
1195 libbzip2 = cc.find_library('bz2',
1196 required : want_bzip2 == 'true')
1197 have = libbzip2.found()
1202 conf.set10('HAVE_BZIP2', have)
1204 want_xz = get_option('xz')
1205 if want_xz != 'false' and not skip_deps
1206 libxz = dependency('liblzma',
1207 required : want_xz == 'true')
1208 have_xz = libxz.found()
1213 conf.set10('HAVE_XZ', have_xz)
1215 want_lz4 = get_option('lz4')
1216 if want_lz4 != 'false' and not skip_deps
1217 liblz4 = dependency('liblz4',
1218 version : '>= 1.3.0',
1219 required : want_lz4 == 'true')
1220 have_lz4 = liblz4.found()
1225 conf.set10('HAVE_LZ4', have_lz4)
1227 want_zstd = get_option('zstd')
1228 if want_zstd != 'false' and not skip_deps
1229 libzstd = dependency('libzstd',
1230 required : want_zstd == 'true',
1231 version : '>= 1.4.0')
1232 have_zstd = libzstd.found()
1237 conf.set10('HAVE_ZSTD', have_zstd)
1239 conf.set10('HAVE_COMPRESSION', have_xz or have_lz4 or have_zstd)
1241 want_xkbcommon = get_option('xkbcommon')
1242 if want_xkbcommon != 'false' and not skip_deps
1243 libxkbcommon = dependency('xkbcommon',
1244 version : '>= 0.3.0',
1245 required : want_xkbcommon == 'true')
1246 have = libxkbcommon.found()
1251 conf.set10('HAVE_XKBCOMMON', have)
1253 want_pcre2 = get_option('pcre2')
1254 if want_pcre2 != 'false'
1255 libpcre2 = dependency('libpcre2-8',
1256 required : want_pcre2 == 'true')
1257 have = libpcre2.found()
1262 conf.set10('HAVE_PCRE2', have)
1264 want_glib = get_option('glib')
1265 if want_glib != 'false' and not skip_deps
1266 libglib = dependency('glib-2.0',
1267 version : '>= 2.22.0',
1268 required : want_glib == 'true')
1269 libgobject = dependency('gobject-2.0',
1270 version : '>= 2.22.0',
1271 required : want_glib == 'true')
1272 libgio = dependency('gio-2.0',
1273 required : want_glib == 'true')
1274 have = libglib.found() and libgobject.found() and libgio.found()
1281 conf.set10('HAVE_GLIB', have)
1283 want_dbus = get_option('dbus')
1284 if want_dbus != 'false' and not skip_deps
1285 libdbus = dependency('dbus-1',
1286 version : '>= 1.3.2',
1287 required : want_dbus == 'true')
1288 have = libdbus.found()
1293 conf.set10('HAVE_DBUS', have)
1295 default_dnssec = get_option('default-dnssec')
1297 default_dnssec = 'no'
1299 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1300 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1301 default_dnssec = 'no'
1303 conf.set('DEFAULT_DNSSEC_MODE',
1304 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1305 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1307 dns_over_tls = get_option('dns-over-tls')
1308 if dns_over_tls != 'false'
1309 if dns_over_tls == 'openssl'
1312 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1313 if dns_over_tls == 'gnutls' and not have_gnutls
1314 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1317 if dns_over_tls == 'gnutls' or have_gnutls
1318 have_openssl = false
1320 have_openssl = conf.get('HAVE_OPENSSL') == 1
1321 if dns_over_tls != 'auto' and not have_openssl
1322 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1323 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1326 have = have_gnutls or have_openssl
1330 have_openssl = false
1332 conf.set10('ENABLE_DNS_OVER_TLS', have)
1333 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1334 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1336 default_dns_over_tls = get_option('default-dns-over-tls')
1338 default_dns_over_tls = 'no'
1340 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1341 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.')
1342 default_dns_over_tls = 'no'
1344 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1345 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1346 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1348 default_mdns = get_option('default-mdns')
1349 conf.set('DEFAULT_MDNS_MODE',
1350 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
1351 substs.set('DEFAULT_MDNS_MODE', default_mdns)
1353 default_llmnr = get_option('default-llmnr')
1354 conf.set('DEFAULT_LLMNR_MODE',
1355 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
1356 substs.set('DEFAULT_LLMNR_MODE', default_llmnr)
1358 want_repart = get_option('repart')
1359 if want_repart != 'false'
1360 have = (conf.get('HAVE_OPENSSL') == 1 and
1361 conf.get('HAVE_LIBFDISK') == 1)
1362 if want_repart == 'true' and not have
1363 error('repart support was requested, but dependencies are not available')
1368 conf.set10('ENABLE_REPART', have)
1370 want_importd = get_option('importd')
1371 if want_importd != 'false'
1372 have = (conf.get('HAVE_LIBCURL') == 1 and
1373 conf.get('HAVE_ZLIB') == 1 and
1374 conf.get('HAVE_XZ') == 1 and
1375 conf.get('HAVE_GCRYPT') == 1)
1376 if want_importd == 'true' and not have
1377 error('importd support was requested, but dependencies are not available')
1382 conf.set10('ENABLE_IMPORTD', have)
1384 want_homed = get_option('homed')
1385 if want_homed != 'false'
1386 have = (conf.get('HAVE_OPENSSL') == 1 and
1387 conf.get('HAVE_LIBFDISK') == 1 and
1388 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1389 if want_homed == 'true' and not have
1390 error('homed support was requested, but dependencies are not available')
1395 conf.set10('ENABLE_HOMED', have)
1397 have = have and conf.get('HAVE_PAM') == 1
1398 conf.set10('ENABLE_PAM_HOME', have)
1400 want_remote = get_option('remote')
1401 if want_remote != 'false'
1402 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1403 conf.get('HAVE_LIBCURL') == 1]
1404 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1405 # it's possible to build one without the other. Complain only if
1406 # support was explicitly requested. The auxiliary files like sysusers
1407 # config should be installed when any of the programs are built.
1408 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1409 error('remote support was requested, but dependencies are not available')
1411 have = have_deps[0] or have_deps[1]
1415 conf.set10('ENABLE_REMOTE', have)
1417 foreach term : ['utmp',
1453 have = get_option(term)
1454 name = 'ENABLE_' + term.underscorify().to_upper()
1455 conf.set10(name, have)
1458 foreach tuple : [['nss-mymachines', 'machined'],
1459 ['nss-resolve', 'resolve']]
1460 want = get_option(tuple[0])
1462 have = get_option(tuple[1])
1463 if want == 'true' and not have
1464 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1469 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1470 conf.set10(name, have)
1474 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1475 'ENABLE_NSS_MYMACHINES',
1476 'ENABLE_NSS_RESOLVE',
1477 'ENABLE_NSS_SYSTEMD']
1478 if conf.get(term) == 1
1482 conf.set10('ENABLE_NSS', enable_nss)
1484 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1489 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1491 #####################################################################
1493 if get_option('efi')
1494 efi_arch = host_machine.cpu_family()
1496 if efi_arch == 'x86'
1497 EFI_MACHINE_TYPE_NAME = 'ia32'
1498 gnu_efi_arch = 'ia32'
1499 elif efi_arch == 'x86_64'
1500 EFI_MACHINE_TYPE_NAME = 'x64'
1501 gnu_efi_arch = 'x86_64'
1502 elif efi_arch == 'arm'
1503 EFI_MACHINE_TYPE_NAME = 'arm'
1504 gnu_efi_arch = 'arm'
1505 elif efi_arch == 'aarch64'
1506 EFI_MACHINE_TYPE_NAME = 'aa64'
1507 gnu_efi_arch = 'aarch64'
1509 EFI_MACHINE_TYPE_NAME = ''
1514 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1516 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1520 conf.set10('ENABLE_EFI', have)
1522 #####################################################################
1524 config_h = configure_file(
1525 output : 'config.h',
1526 configuration : conf)
1528 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1530 includes = include_directories('src/basic',
1536 'src/journal-remote',
1540 'src/time-wait-sync',
1546 'src/xdg-autostart-generator',
1547 'src/libsystemd/sd-bus',
1548 'src/libsystemd/sd-device',
1549 'src/libsystemd/sd-event',
1550 'src/libsystemd/sd-hwdb',
1551 'src/libsystemd/sd-id128',
1552 'src/libsystemd/sd-netlink',
1553 'src/libsystemd/sd-network',
1554 'src/libsystemd/sd-resolve',
1555 'src/libsystemd-network',
1558 add_project_arguments('-include', 'config.h', language : 'c')
1560 generate_gperfs = find_program('tools/generate-gperfs.py')
1564 subdir('src/systemd')
1566 subdir('src/libsystemd')
1567 subdir('src/libsystemd-network')
1568 subdir('src/journal')
1571 libjournal_core = static_library(
1573 libjournal_core_sources,
1575 include_directories : includes,
1578 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1579 libsystemd = shared_library(
1582 version : libsystemd_version,
1583 include_directories : includes,
1584 link_args : ['-shared',
1585 '-Wl,--version-script=' + libsystemd_sym_path],
1586 link_with : [libbasic,
1588 link_whole : [libsystemd_static,
1590 dependencies : [threads,
1595 link_depends : libsystemd_sym,
1597 install_dir : rootlibdir)
1599 static_libsystemd = get_option('static-libsystemd')
1600 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1602 install_libsystemd_static = static_library(
1605 journal_client_sources,
1607 basic_gcrypt_sources,
1609 include_directories : includes,
1610 build_by_default : static_libsystemd != 'false',
1611 install : static_libsystemd != 'false',
1612 install_dir : rootlibdir,
1613 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1614 dependencies : [threads,
1624 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1626 # Generate autosuspend rules
1627 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1629 ############################################################
1631 # binaries that have --help and are intended for use by humans,
1632 # usually, but not always, installed in /bin.
1633 public_programs = []
1635 subdir('src/libudev')
1636 subdir('src/shared')
1638 subdir('src/shutdown')
1640 subdir('src/network')
1642 subdir('src/analyze')
1643 subdir('src/journal-remote')
1644 subdir('src/coredump')
1645 subdir('src/pstore')
1646 subdir('src/hostname')
1647 subdir('src/import')
1648 subdir('src/partition')
1649 subdir('src/kernel-install')
1650 subdir('src/locale')
1651 subdir('src/machine')
1652 subdir('src/portable')
1653 subdir('src/userdb')
1655 subdir('src/nspawn')
1656 subdir('src/resolve')
1657 subdir('src/timedate')
1658 subdir('src/timesync')
1659 subdir('src/tmpfiles')
1660 subdir('src/vconsole')
1661 subdir('src/boot/efi')
1668 ############################################################
1670 # only static linking apart from libdl, to make sure that the
1671 # module is linked to all libraries that it uses.
1672 test_dlopen = executable(
1676 include_directories : includes,
1677 link_with : [libbasic],
1678 dependencies : [libdl],
1679 build_by_default : want_tests != 'false')
1681 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1682 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h src/nss-systemd/nss-systemd.h'],
1683 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1684 ['resolve', 'ENABLE_NSS_RESOLVE']]
1686 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1690 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1691 version_script_arg = join_paths(project_source_root, sym)
1693 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1694 if tuple.length() > 2
1695 sources += tuple[2].split()
1698 nss = shared_library(
1703 include_directories : includes,
1704 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1705 link_args : ['-Wl,-z,nodelete',
1707 '-Wl,--version-script=' + version_script_arg],
1708 link_with : [libsystemd_static,
1711 dependencies : [threads,
1715 install_dir : rootlibdir)
1717 # We cannot use shared_module because it does not support version suffix.
1718 # Unfortunately shared_library insists on creating the symlink…
1719 meson.add_install_script('sh', '-c',
1720 'rm $DESTDIR@0@/libnss_@1@.so'
1721 .format(rootlibdir, module))
1723 if want_tests != 'false'
1724 test('dlopen-nss_' + module,
1726 # path to dlopen must include a slash
1727 args : nss.full_path())
1732 ############################################################
1737 include_directories : includes,
1738 link_with : [libcore,
1740 dependencies : [versiondep,
1747 install_rpath : rootlibexecdir,
1749 install_dir : rootlibexecdir)
1751 meson.add_install_script(meson_make_symlink,
1752 join_paths(rootlibexecdir, 'systemd'),
1753 join_paths(rootsbindir, 'init'))
1755 public_programs += executable(
1757 systemd_analyze_sources,
1758 include_directories : includes,
1759 link_with : [libcore,
1761 dependencies : [versiondep,
1768 install_rpath : rootlibexecdir,
1769 install : get_option('analyze'))
1773 systemd_journald_sources,
1774 include_directories : includes,
1775 link_with : [libjournal_core,
1777 dependencies : [threads,
1782 install_rpath : rootlibexecdir,
1784 install_dir : rootlibexecdir)
1786 public_programs += executable(
1788 systemd_cat_sources,
1789 include_directories : includes,
1790 link_with : [libjournal_core,
1792 dependencies : [threads],
1793 install_rpath : rootlibexecdir,
1796 public_programs += executable(
1799 include_directories : includes,
1800 link_with : [libshared],
1801 dependencies : [threads,
1807 install_rpath : rootlibexecdir,
1809 install_dir : rootbindir)
1812 'systemd-getty-generator',
1813 'src/getty-generator/getty-generator.c',
1814 include_directories : includes,
1815 link_with : [libshared],
1816 install_rpath : rootlibexecdir,
1818 install_dir : systemgeneratordir)
1821 'systemd-debug-generator',
1822 'src/debug-generator/debug-generator.c',
1823 include_directories : includes,
1824 link_with : [libshared],
1825 install_rpath : rootlibexecdir,
1827 install_dir : systemgeneratordir)
1830 'systemd-run-generator',
1831 'src/run-generator/run-generator.c',
1832 include_directories : includes,
1833 link_with : [libshared],
1834 install_rpath : rootlibexecdir,
1836 install_dir : systemgeneratordir)
1839 'systemd-fstab-generator',
1840 'src/fstab-generator/fstab-generator.c',
1841 include_directories : includes,
1842 link_with : [libcore_shared,
1844 install_rpath : rootlibexecdir,
1846 install_dir : systemgeneratordir)
1848 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1850 '30-systemd-environment-d-generator',
1851 'src/environment-d-generator/environment-d-generator.c',
1852 include_directories : includes,
1853 link_with : [libshared],
1854 install_rpath : rootlibexecdir,
1856 install_dir : userenvgeneratordir)
1858 meson.add_install_script(meson_make_symlink,
1859 join_paths(sysconfdir, 'environment'),
1860 join_paths(environmentdir, '99-environment.conf'))
1863 if conf.get('ENABLE_HIBERNATE') == 1
1865 'systemd-hibernate-resume-generator',
1866 'src/hibernate-resume/hibernate-resume-generator.c',
1867 include_directories : includes,
1868 link_with : [libshared],
1869 install_rpath : rootlibexecdir,
1871 install_dir : systemgeneratordir)
1874 'systemd-hibernate-resume',
1875 'src/hibernate-resume/hibernate-resume.c',
1876 include_directories : includes,
1877 link_with : [libshared],
1878 install_rpath : rootlibexecdir,
1880 install_dir : rootlibexecdir)
1883 if conf.get('HAVE_BLKID') == 1
1885 'systemd-gpt-auto-generator',
1886 'src/gpt-auto-generator/gpt-auto-generator.c',
1887 'src/shared/blkid-util.h',
1888 include_directories : includes,
1889 link_with : [libshared],
1890 dependencies : libblkid,
1891 install_rpath : rootlibexecdir,
1893 install_dir : systemgeneratordir)
1895 public_programs += executable(
1897 'src/dissect/dissect.c',
1898 include_directories : includes,
1899 link_with : [libshared],
1900 install_rpath : rootlibexecdir,
1902 install_dir : rootlibexecdir)
1905 if conf.get('ENABLE_RESOLVE') == 1
1908 systemd_resolved_sources,
1909 include_directories : includes,
1910 link_with : [libshared,
1912 libsystemd_resolve_core],
1913 dependencies : systemd_resolved_dependencies,
1914 install_rpath : rootlibexecdir,
1916 install_dir : rootlibexecdir)
1918 public_programs += executable(
1921 include_directories : includes,
1922 link_with : [libshared,
1924 libsystemd_resolve_core],
1925 dependencies : [threads,
1929 install_rpath : rootlibexecdir,
1932 meson.add_install_script(meson_make_symlink,
1933 join_paths(bindir, 'resolvectl'),
1934 join_paths(rootsbindir, 'resolvconf'))
1936 meson.add_install_script(meson_make_symlink,
1937 join_paths(bindir, 'resolvectl'),
1938 join_paths(bindir, 'systemd-resolve'))
1941 if conf.get('ENABLE_LOGIND') == 1
1944 systemd_logind_sources,
1945 include_directories : includes,
1946 link_with : [liblogind_core,
1948 dependencies : [threads,
1950 install_rpath : rootlibexecdir,
1952 install_dir : rootlibexecdir)
1954 public_programs += executable(
1957 include_directories : includes,
1958 link_with : [libshared],
1959 dependencies : [threads,
1963 install_rpath : rootlibexecdir,
1965 install_dir : rootbindir)
1967 public_programs += executable(
1969 'src/login/inhibit.c',
1970 include_directories : includes,
1971 link_with : [libshared],
1972 install_rpath : rootlibexecdir,
1974 install_dir : rootbindir)
1976 if conf.get('HAVE_PAM') == 1
1977 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1978 pam_systemd = shared_library(
1982 include_directories : includes,
1983 link_args : ['-shared',
1984 '-Wl,--version-script=' + version_script_arg],
1985 link_with : [libsystemd_static,
1987 dependencies : [threads,
1990 link_depends : pam_systemd_sym,
1992 install_dir : pamlibdir)
1994 if want_tests != 'false'
1995 test('dlopen-pam_systemd',
1997 # path to dlopen must include a slash
1998 args : pam_systemd.full_path())
2003 'systemd-user-runtime-dir',
2004 user_runtime_dir_sources,
2005 include_directories : includes,
2006 link_with : [libshared],
2007 install_rpath : rootlibexecdir,
2009 install_dir : rootlibexecdir)
2012 if conf.get('HAVE_PAM') == 1
2014 'systemd-user-sessions',
2015 'src/user-sessions/user-sessions.c',
2016 include_directories : includes,
2017 link_with : [libshared],
2018 install_rpath : rootlibexecdir,
2020 install_dir : rootlibexecdir)
2023 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
2024 public_programs += executable(
2026 'src/boot/bootctl.c',
2027 include_directories : includes,
2028 link_with : [libshared],
2029 dependencies : [libblkid],
2030 install_rpath : rootlibexecdir,
2033 public_programs += executable(
2034 'systemd-bless-boot',
2035 'src/boot/bless-boot.c',
2036 include_directories : includes,
2037 link_with : [libshared],
2038 dependencies : [libblkid],
2039 install_rpath : rootlibexecdir,
2041 install_dir : rootlibexecdir)
2044 'systemd-bless-boot-generator',
2045 'src/boot/bless-boot-generator.c',
2046 include_directories : includes,
2047 link_with : [libshared],
2048 install_rpath : rootlibexecdir,
2050 install_dir : systemgeneratordir)
2054 'systemd-boot-check-no-failures',
2055 'src/boot/boot-check-no-failures.c',
2056 include_directories : includes,
2057 link_with : [libshared],
2058 dependencies : [libblkid],
2059 install_rpath : rootlibexecdir,
2061 install_dir : rootlibexecdir)
2063 public_programs += executable(
2064 'systemd-socket-activate',
2065 'src/activate/activate.c',
2066 include_directories : includes,
2067 link_with : [libshared],
2068 dependencies : [threads],
2069 install_rpath : rootlibexecdir,
2072 if get_option('link-systemctl-shared')
2073 systemctl_link_with = [libshared]
2075 systemctl_link_with = [libsystemd_static,
2081 public_programs += executable(
2083 'src/systemctl/systemctl.c',
2084 'src/systemctl/sysv-compat.h',
2085 'src/systemctl/sysv-compat.c',
2086 include_directories : includes,
2087 link_with : systemctl_link_with,
2088 dependencies : [threads,
2094 install_rpath : rootlibexecdir,
2096 install_dir : rootbindir)
2098 if conf.get('ENABLE_PORTABLED') == 1
2100 'systemd-portabled',
2101 systemd_portabled_sources,
2102 include_directories : includes,
2103 link_with : [libshared],
2104 dependencies : [threads],
2105 install_rpath : rootlibexecdir,
2107 install_dir : rootlibexecdir)
2109 public_programs += executable(
2111 'src/portable/portablectl.c',
2112 include_directories : includes,
2113 link_with : [libshared],
2114 dependencies : [threads],
2115 install_rpath : rootlibexecdir,
2117 install_dir : rootbindir)
2120 if conf.get('ENABLE_USERDB') == 1
2123 systemd_userwork_sources,
2124 include_directories : includes,
2125 link_with : [libshared],
2126 dependencies : [threads],
2127 install_rpath : rootlibexecdir,
2129 install_dir : rootlibexecdir)
2133 systemd_userdbd_sources,
2134 include_directories : includes,
2135 link_with : [libshared],
2136 dependencies : [threads],
2137 install_rpath : rootlibexecdir,
2139 install_dir : rootlibexecdir)
2141 public_programs += executable(
2144 include_directories : includes,
2145 link_with : [libshared],
2146 dependencies : [threads],
2147 install_rpath : rootlibexecdir,
2149 install_dir : rootbindir)
2152 if conf.get('ENABLE_HOMED') == 1
2155 systemd_homework_sources,
2156 include_directories : includes,
2157 link_with : [libshared],
2158 dependencies : [threads,
2166 install_rpath : rootlibexecdir,
2168 install_dir : rootlibexecdir)
2172 systemd_homed_sources,
2173 include_directories : includes,
2174 link_with : [libshared],
2175 dependencies : [threads,
2179 install_rpath : rootlibexecdir,
2181 install_dir : rootlibexecdir)
2183 public_programs += executable(
2186 include_directories : includes,
2187 link_with : [libshared],
2188 dependencies : [threads,
2194 install_rpath : rootlibexecdir,
2196 install_dir : rootbindir)
2198 if conf.get('HAVE_PAM') == 1
2199 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2200 pam_systemd = shared_library(
2204 include_directories : includes,
2205 link_args : ['-shared',
2206 '-Wl,--version-script=' + version_script_arg],
2207 link_with : [libsystemd_static,
2209 dependencies : [threads,
2213 link_depends : pam_systemd_home_sym,
2215 install_dir : pamlibdir)
2219 foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
2220 (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
2221 meson.add_install_script(meson_make_symlink,
2222 join_paths(rootbindir, 'systemctl'),
2223 join_paths(rootsbindir, alias))
2226 meson.add_install_script(meson_make_symlink,
2227 join_paths(rootbindir, 'udevadm'),
2228 join_paths(rootlibexecdir, 'systemd-udevd'))
2230 if conf.get('ENABLE_BACKLIGHT') == 1
2232 'systemd-backlight',
2233 'src/backlight/backlight.c',
2234 include_directories : includes,
2235 link_with : [libshared],
2236 install_rpath : rootlibexecdir,
2238 install_dir : rootlibexecdir)
2241 if conf.get('ENABLE_RFKILL') == 1
2244 'src/rfkill/rfkill.c',
2245 include_directories : includes,
2246 link_with : [libshared],
2247 install_rpath : rootlibexecdir,
2249 install_dir : rootlibexecdir)
2253 'systemd-system-update-generator',
2254 'src/system-update-generator/system-update-generator.c',
2255 include_directories : includes,
2256 link_with : [libshared],
2257 install_rpath : rootlibexecdir,
2259 install_dir : systemgeneratordir)
2261 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2262 systemd_cryptsetup_sources = files('''
2263 src/cryptsetup/cryptsetup-pkcs11.h
2264 src/cryptsetup/cryptsetup-util.c
2265 src/cryptsetup/cryptsetup-util.h
2266 src/cryptsetup/cryptsetup.c
2269 if conf.get('HAVE_P11KIT') == 1
2270 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2274 'systemd-cryptsetup',
2275 systemd_cryptsetup_sources,
2276 include_directories : includes,
2277 link_with : [libshared],
2278 dependencies : [libcryptsetup,
2280 install_rpath : rootlibexecdir,
2282 install_dir : rootlibexecdir)
2285 'systemd-cryptsetup-generator',
2286 'src/cryptsetup/cryptsetup-generator.c',
2287 include_directories : includes,
2288 link_with : [libshared],
2289 dependencies : [libcryptsetup],
2290 install_rpath : rootlibexecdir,
2292 install_dir : systemgeneratordir)
2295 'systemd-veritysetup',
2296 'src/veritysetup/veritysetup.c',
2297 include_directories : includes,
2298 link_with : [libshared],
2299 dependencies : [libcryptsetup],
2300 install_rpath : rootlibexecdir,
2302 install_dir : rootlibexecdir)
2305 'systemd-veritysetup-generator',
2306 'src/veritysetup/veritysetup-generator.c',
2307 include_directories : includes,
2308 link_with : [libshared],
2309 dependencies : [libcryptsetup],
2310 install_rpath : rootlibexecdir,
2312 install_dir : systemgeneratordir)
2315 if conf.get('HAVE_SYSV_COMPAT') == 1
2317 'systemd-sysv-generator',
2318 'src/sysv-generator/sysv-generator.c',
2319 include_directories : includes,
2320 link_with : [libshared],
2321 install_rpath : rootlibexecdir,
2323 install_dir : systemgeneratordir)
2326 'systemd-rc-local-generator',
2327 'src/rc-local-generator/rc-local-generator.c',
2328 include_directories : includes,
2329 link_with : [libshared],
2330 install_rpath : rootlibexecdir,
2332 install_dir : systemgeneratordir)
2335 if conf.get('ENABLE_XDG_AUTOSTART') == 1
2337 'systemd-xdg-autostart-generator',
2338 'src/xdg-autostart-generator/xdg-autostart-generator.c',
2339 'src/xdg-autostart-generator/xdg-autostart-service.c',
2340 include_directories : includes,
2341 link_with : [libshared],
2342 install_rpath : rootlibexecdir,
2344 install_dir : usergeneratordir)
2347 'systemd-xdg-autostart-condition',
2348 'src/xdg-autostart-generator/xdg-autostart-condition.c',
2349 include_directories : includes,
2350 link_with : [libshared],
2351 install_rpath : rootlibexecdir,
2353 install_dir : rootlibexecdir)
2356 if conf.get('ENABLE_HOSTNAMED') == 1
2358 'systemd-hostnamed',
2359 'src/hostname/hostnamed.c',
2360 include_directories : includes,
2361 link_with : [libshared],
2362 install_rpath : rootlibexecdir,
2364 install_dir : rootlibexecdir)
2366 public_programs += executable(
2368 'src/hostname/hostnamectl.c',
2369 include_directories : includes,
2370 link_with : [libshared],
2371 install_rpath : rootlibexecdir,
2375 if conf.get('ENABLE_LOCALED') == 1
2376 if conf.get('HAVE_XKBCOMMON') == 1
2377 # logind will load libxkbcommon.so dynamically on its own
2385 systemd_localed_sources,
2386 include_directories : includes,
2387 link_with : [libshared],
2388 dependencies : deps,
2389 install_rpath : rootlibexecdir,
2391 install_dir : rootlibexecdir)
2393 public_programs += executable(
2396 include_directories : includes,
2397 link_with : [libshared],
2398 install_rpath : rootlibexecdir,
2402 if conf.get('ENABLE_TIMEDATED') == 1
2404 'systemd-timedated',
2405 'src/timedate/timedated.c',
2406 include_directories : includes,
2407 link_with : [libshared],
2408 install_rpath : rootlibexecdir,
2410 install_dir : rootlibexecdir)
2413 if conf.get('ENABLE_TIMEDATECTL') == 1
2414 public_programs += executable(
2416 'src/timedate/timedatectl.c',
2417 include_directories : includes,
2418 install_rpath : rootlibexecdir,
2419 link_with : [libshared],
2420 dependencies : [libm],
2424 if conf.get('ENABLE_TIMESYNCD') == 1
2425 if get_option('link-timesyncd-shared')
2426 timesyncd_link_with = [libshared]
2428 timesyncd_link_with = [libsystemd_static,
2435 'systemd-timesyncd',
2436 systemd_timesyncd_sources,
2437 include_directories : includes,
2438 link_with : [timesyncd_link_with],
2439 dependencies : [threads,
2441 install_rpath : rootlibexecdir,
2443 install_dir : rootlibexecdir)
2446 'systemd-time-wait-sync',
2447 'src/time-wait-sync/time-wait-sync.c',
2448 include_directories : includes,
2449 link_with : [timesyncd_link_with],
2450 install_rpath : rootlibexecdir,
2452 install_dir : rootlibexecdir)
2455 if conf.get('ENABLE_MACHINED') == 1
2458 systemd_machined_sources,
2459 include_directories : includes,
2460 link_with : [libmachine_core,
2462 install_rpath : rootlibexecdir,
2464 install_dir : rootlibexecdir)
2466 public_programs += executable(
2468 'src/machine/machinectl.c',
2469 include_directories : includes,
2470 link_with : [libshared],
2471 dependencies : [threads,
2475 install_rpath : rootlibexecdir,
2477 install_dir : rootbindir)
2480 if conf.get('ENABLE_IMPORTD') == 1
2483 systemd_importd_sources,
2484 include_directories : includes,
2485 link_with : [libshared],
2486 dependencies : [threads],
2487 install_rpath : rootlibexecdir,
2489 install_dir : rootlibexecdir)
2491 systemd_pull = executable(
2493 systemd_pull_sources,
2494 include_directories : includes,
2495 link_with : [libshared],
2496 dependencies : [versiondep,
2502 install_rpath : rootlibexecdir,
2504 install_dir : rootlibexecdir)
2506 systemd_import = executable(
2508 systemd_import_sources,
2509 include_directories : includes,
2510 link_with : [libshared],
2511 dependencies : [libcurl,
2515 install_rpath : rootlibexecdir,
2517 install_dir : rootlibexecdir)
2519 systemd_import_fs = executable(
2520 'systemd-import-fs',
2521 systemd_import_fs_sources,
2522 include_directories : includes,
2523 link_with : [libshared],
2524 install_rpath : rootlibexecdir,
2526 install_dir : rootlibexecdir)
2528 systemd_export = executable(
2530 systemd_export_sources,
2531 include_directories : includes,
2532 link_with : [libshared],
2533 dependencies : [libcurl,
2537 install_rpath : rootlibexecdir,
2539 install_dir : rootlibexecdir)
2541 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2544 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2545 public_programs += executable(
2546 'systemd-journal-upload',
2547 systemd_journal_upload_sources,
2548 include_directories : includes,
2549 link_with : [libshared],
2550 dependencies : [versiondep,
2557 install_rpath : rootlibexecdir,
2559 install_dir : rootlibexecdir)
2562 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2563 public_programs += executable(
2564 'systemd-journal-remote',
2565 systemd_journal_remote_sources,
2566 include_directories : includes,
2567 link_with : [libshared,
2568 libsystemd_journal_remote],
2569 dependencies : [threads,
2575 install_rpath : rootlibexecdir,
2577 install_dir : rootlibexecdir)
2579 public_programs += executable(
2580 'systemd-journal-gatewayd',
2581 systemd_journal_gatewayd_sources,
2582 include_directories : includes,
2583 link_with : [libshared],
2584 dependencies : [threads,
2590 install_rpath : rootlibexecdir,
2592 install_dir : rootlibexecdir)
2595 if conf.get('ENABLE_COREDUMP') == 1
2598 systemd_coredump_sources,
2599 include_directories : includes,
2600 link_with : [libshared],
2601 dependencies : [threads,
2607 install_rpath : rootlibexecdir,
2609 install_dir : rootlibexecdir)
2611 public_programs += executable(
2613 coredumpctl_sources,
2614 include_directories : includes,
2615 link_with : [libshared],
2616 dependencies : [threads,
2620 install_rpath : rootlibexecdir,
2624 if conf.get('ENABLE_PSTORE') == 1
2627 systemd_pstore_sources,
2628 include_directories : includes,
2629 link_with : [libshared],
2630 dependencies : [threads,
2636 install_rpath : rootlibexecdir,
2638 install_dir : rootlibexecdir)
2641 if conf.get('ENABLE_BINFMT') == 1
2642 public_programs += executable(
2644 'src/binfmt/binfmt.c',
2645 include_directories : includes,
2646 link_with : [libshared],
2647 install_rpath : rootlibexecdir,
2649 install_dir : rootlibexecdir)
2651 meson.add_install_script('sh', '-c',
2652 mkdir_p.format(binfmtdir))
2653 meson.add_install_script('sh', '-c',
2654 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2657 if conf.get('ENABLE_REPART') == 1
2660 systemd_repart_sources,
2661 include_directories : includes,
2662 link_with : [libshared],
2663 dependencies : [threads,
2668 install_rpath : rootlibexecdir,
2670 install_dir : rootbindir)
2671 public_programs += exe
2673 if want_tests != 'false'
2676 args : exe.full_path())
2680 if conf.get('ENABLE_VCONSOLE') == 1
2682 'systemd-vconsole-setup',
2683 'src/vconsole/vconsole-setup.c',
2684 include_directories : includes,
2685 link_with : [libshared],
2686 install_rpath : rootlibexecdir,
2688 install_dir : rootlibexecdir)
2691 if conf.get('ENABLE_RANDOMSEED') == 1
2693 'systemd-random-seed',
2694 'src/random-seed/random-seed.c',
2695 include_directories : includes,
2696 link_with : [libshared],
2697 install_rpath : rootlibexecdir,
2699 install_dir : rootlibexecdir)
2702 if conf.get('ENABLE_FIRSTBOOT') == 1
2704 'systemd-firstboot',
2705 'src/firstboot/firstboot.c',
2706 include_directories : includes,
2707 link_with : [libshared],
2708 dependencies : [libcrypt],
2709 install_rpath : rootlibexecdir,
2711 install_dir : rootbindir)
2715 'systemd-remount-fs',
2716 'src/remount-fs/remount-fs.c',
2717 include_directories : includes,
2718 link_with : [libcore_shared,
2720 install_rpath : rootlibexecdir,
2722 install_dir : rootlibexecdir)
2725 'systemd-machine-id-setup',
2726 'src/machine-id-setup/machine-id-setup-main.c',
2727 include_directories : includes,
2728 link_with : [libcore_shared,
2730 install_rpath : rootlibexecdir,
2732 install_dir : rootbindir)
2737 include_directories : includes,
2738 link_with : [libshared],
2739 install_rpath : rootlibexecdir,
2741 install_dir : rootlibexecdir)
2743 executable('systemd-growfs',
2744 'src/partition/growfs.c',
2745 include_directories : includes,
2746 link_with : [libshared],
2747 dependencies : [libcryptsetup],
2748 install_rpath : rootlibexecdir,
2750 install_dir : rootlibexecdir)
2754 'src/partition/makefs.c',
2755 include_directories : includes,
2756 link_with : [libshared],
2757 install_rpath : rootlibexecdir,
2759 install_dir : rootlibexecdir)
2763 'src/sleep/sleep.c',
2764 include_directories : includes,
2765 link_with : [libshared],
2766 install_rpath : rootlibexecdir,
2768 install_dir : rootlibexecdir)
2770 install_data('src/sleep/sleep.conf',
2771 install_dir : pkgsysconfdir)
2773 public_programs += executable(
2775 'src/sysctl/sysctl.c',
2776 include_directories : includes,
2777 link_with : [libshared],
2778 install_rpath : rootlibexecdir,
2780 install_dir : rootlibexecdir)
2784 'src/ac-power/ac-power.c',
2785 include_directories : includes,
2786 link_with : [libshared],
2787 install_rpath : rootlibexecdir,
2789 install_dir : rootlibexecdir)
2791 public_programs += executable(
2792 'systemd-detect-virt',
2793 'src/detect-virt/detect-virt.c',
2794 include_directories : includes,
2795 link_with : [libshared],
2796 install_rpath : rootlibexecdir,
2799 public_programs += executable(
2801 'src/delta/delta.c',
2802 include_directories : includes,
2803 link_with : [libshared],
2804 install_rpath : rootlibexecdir,
2807 public_programs += executable(
2809 'src/escape/escape.c',
2810 include_directories : includes,
2811 link_with : [libshared],
2812 install_rpath : rootlibexecdir,
2814 install_dir : rootbindir)
2816 public_programs += executable(
2818 'src/notify/notify.c',
2819 include_directories : includes,
2820 link_with : [libshared],
2821 install_rpath : rootlibexecdir,
2823 install_dir : rootbindir)
2826 'systemd-volatile-root',
2827 'src/volatile-root/volatile-root.c',
2828 include_directories : includes,
2829 link_with : [libshared],
2830 install_rpath : rootlibexecdir,
2831 install : conf.get('ENABLE_INITRD') == 1,
2832 install_dir : rootlibexecdir)
2835 'systemd-cgroups-agent',
2836 'src/cgroups-agent/cgroups-agent.c',
2837 include_directories : includes,
2838 link_with : [libshared],
2839 install_rpath : rootlibexecdir,
2841 install_dir : rootlibexecdir)
2843 public_programs += executable(
2845 'src/id128/id128.c',
2846 include_directories : includes,
2847 link_with : [libshared],
2848 install_rpath : rootlibexecdir,
2851 public_programs += executable(
2854 include_directories : includes,
2855 link_with : [libshared],
2856 install_rpath : rootlibexecdir,
2859 public_programs += executable(
2860 'systemd-ask-password',
2861 'src/ask-password/ask-password.c',
2862 include_directories : includes,
2863 link_with : [libshared],
2864 install_rpath : rootlibexecdir,
2866 install_dir : rootbindir)
2869 'systemd-reply-password',
2870 'src/reply-password/reply-password.c',
2871 include_directories : includes,
2872 link_with : [libshared],
2873 install_rpath : rootlibexecdir,
2875 install_dir : rootlibexecdir)
2877 public_programs += executable(
2878 'systemd-tty-ask-password-agent',
2879 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2880 include_directories : includes,
2881 link_with : [libshared],
2882 install_rpath : rootlibexecdir,
2884 install_dir : rootbindir)
2886 public_programs += executable(
2889 include_directories : includes,
2890 link_with : [libshared],
2891 install_rpath : rootlibexecdir,
2894 public_programs += executable(
2896 'src/cgtop/cgtop.c',
2897 include_directories : includes,
2898 link_with : [libshared],
2899 install_rpath : rootlibexecdir,
2904 'src/initctl/initctl.c',
2905 include_directories : includes,
2906 link_with : [libshared],
2907 install_rpath : rootlibexecdir,
2908 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
2909 install_dir : rootlibexecdir)
2911 public_programs += executable(
2913 'src/mount/mount-tool.c',
2914 include_directories : includes,
2915 link_with : [libshared],
2916 dependencies: [libmount],
2917 install_rpath : rootlibexecdir,
2920 meson.add_install_script(meson_make_symlink,
2921 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2923 public_programs += executable(
2926 include_directories : includes,
2927 link_with : [libshared],
2928 install_rpath : rootlibexecdir,
2931 public_programs += executable(
2932 'systemd-stdio-bridge',
2933 'src/stdio-bridge/stdio-bridge.c',
2934 include_directories : includes,
2935 link_with : [libshared],
2936 dependencies : [versiondep],
2937 install_rpath : rootlibexecdir,
2940 public_programs += executable(
2942 'src/busctl/busctl.c',
2943 'src/busctl/busctl-introspect.c',
2944 'src/busctl/busctl-introspect.h',
2945 include_directories : includes,
2946 link_with : [libshared],
2947 install_rpath : rootlibexecdir,
2950 if conf.get('ENABLE_SYSUSERS') == 1
2951 public_programs += executable(
2953 'src/sysusers/sysusers.c',
2954 include_directories : includes,
2955 link_with : [libshared],
2956 install_rpath : rootlibexecdir,
2958 install_dir : rootbindir)
2960 if have_standalone_binaries
2961 public_programs += executable(
2962 'systemd-sysusers.standalone',
2963 'src/sysusers/sysusers.c',
2964 include_directories : includes,
2965 link_with : [libshared_static,
2971 install_dir : rootbindir)
2975 if conf.get('ENABLE_TMPFILES') == 1
2978 systemd_tmpfiles_sources,
2979 include_directories : includes,
2980 link_with : [libshared],
2981 dependencies : [libacl],
2982 install_rpath : rootlibexecdir,
2984 install_dir : rootbindir)
2985 public_programs += exe
2987 if want_tests != 'false'
2988 test('test-systemd-tmpfiles',
2989 test_systemd_tmpfiles_py,
2990 # https://github.com/mesonbuild/meson/issues/2681
2991 args : exe.full_path())
2994 if have_standalone_binaries
2995 public_programs += executable(
2996 'systemd-tmpfiles.standalone',
2997 systemd_tmpfiles_sources,
2998 include_directories : includes,
2999 link_with : [libshared_static,
3004 dependencies : [libacl],
3006 install_dir : rootbindir)
3010 if conf.get('ENABLE_HWDB') == 1
3011 public_programs += executable(
3014 'src/libsystemd/sd-hwdb/hwdb-internal.h',
3015 include_directories : includes,
3016 link_with : [libudev_static],
3017 install_rpath : udev_rpath,
3019 install_dir : rootbindir)
3022 if conf.get('ENABLE_QUOTACHECK') == 1
3024 'systemd-quotacheck',
3025 'src/quotacheck/quotacheck.c',
3026 include_directories : includes,
3027 link_with : [libshared],
3028 install_rpath : rootlibexecdir,
3030 install_dir : rootlibexecdir)
3033 public_programs += executable(
3034 'systemd-socket-proxyd',
3035 'src/socket-proxy/socket-proxyd.c',
3036 include_directories : includes,
3037 link_with : [libshared],
3038 dependencies : [threads],
3039 install_rpath : rootlibexecdir,
3041 install_dir : rootlibexecdir)
3043 public_programs += executable(
3046 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
3047 include_directories : includes,
3048 link_with : [libudev_core,
3051 dependencies : [versiondep,
3057 install_rpath : udev_rpath,
3059 install_dir : rootbindir)
3063 systemd_shutdown_sources,
3064 include_directories : includes,
3065 link_with : [libcore_shared,
3067 dependencies : [libmount],
3068 install_rpath : rootlibexecdir,
3070 install_dir : rootlibexecdir)
3073 'systemd-update-done',
3074 'src/update-done/update-done.c',
3075 include_directories : includes,
3076 link_with : [libshared],
3077 install_rpath : rootlibexecdir,
3079 install_dir : rootlibexecdir)
3082 'systemd-update-utmp',
3083 'src/update-utmp/update-utmp.c',
3084 include_directories : includes,
3085 link_with : [libshared],
3086 dependencies : [libaudit],
3087 install_rpath : rootlibexecdir,
3088 install : (conf.get('ENABLE_UTMP') == 1),
3089 install_dir : rootlibexecdir)
3091 if conf.get('HAVE_KMOD') == 1
3093 'systemd-modules-load',
3094 'src/modules-load/modules-load.c',
3095 include_directories : includes,
3096 link_with : [libshared],
3097 dependencies : [libkmod],
3098 install_rpath : rootlibexecdir,
3100 install_dir : rootlibexecdir)
3102 meson.add_install_script('sh', '-c',
3103 mkdir_p.format(modulesloaddir))
3104 meson.add_install_script('sh', '-c',
3105 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
3108 public_programs += executable(
3110 systemd_nspawn_sources,
3111 include_directories : includes,
3112 link_with : [libcore_shared,
3115 dependencies : [libblkid,
3117 install_rpath : rootlibexecdir,
3120 if conf.get('ENABLE_NETWORKD') == 1
3123 systemd_networkd_sources,
3124 include_directories : network_include_dir,
3125 link_with : [libnetworkd_core,
3128 networkd_link_with],
3129 dependencies : [threads],
3130 install_rpath : rootlibexecdir,
3132 install_dir : rootlibexecdir)
3135 'systemd-networkd-wait-online',
3136 systemd_networkd_wait_online_sources,
3137 include_directories : includes,
3138 link_with : [libnetworkd_core,
3139 networkd_link_with],
3140 install_rpath : rootlibexecdir,
3142 install_dir : rootlibexecdir)
3144 public_programs += executable(
3147 include_directories : includes,
3148 link_with : [libsystemd_network,
3149 networkd_link_with],
3150 install_rpath : rootlibexecdir,
3152 install_dir : rootbindir)
3155 'systemd-network-generator',
3156 network_generator_sources,
3157 include_directories : includes,
3158 link_with : [networkd_link_with],
3159 install_rpath : rootlibexecdir,
3161 install_dir : rootlibexecdir)
3163 if want_tests != 'false'
3164 test('test-network-generator-conversion',
3165 test_network_generator_conversion_sh,
3166 # https://github.com/mesonbuild/meson/issues/2681
3167 args : exe.full_path())
3172 'systemd-sulogin-shell',
3173 ['src/sulogin-shell/sulogin-shell.c'],
3174 include_directories : includes,
3175 link_with : [libshared],
3176 install_rpath : rootlibexecdir,
3178 install_dir : rootlibexecdir)
3180 ############################################################
3183 'systemd-runtest.env',
3184 output : 'systemd-runtest.env',
3185 command : ['sh', '-c', '{ ' +
3186 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
3187 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
3189 build_by_default : true)
3191 foreach tuple : tests
3193 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3194 dependencies = tuple[2]
3195 condition = tuple.length() >= 4 ? tuple[3] : ''
3196 type = tuple.length() >= 5 ? tuple[4] : ''
3197 defs = tuple.length() >= 6 ? tuple[5] : []
3198 incs = tuple.length() >= 7 ? tuple[6] : includes
3201 name = sources[0].split('/')[-1].split('.')[0]
3202 if type.startswith('timeout=')
3203 timeout = type.split('=')[1].to_int()
3207 if condition == '' or conf.get(condition) == 1
3211 include_directories : incs,
3212 link_with : link_with,
3213 dependencies : [versiondep,
3216 build_by_default : want_tests != 'false',
3217 install_rpath : rootlibexecdir,
3218 install : install_tests,
3219 install_dir : join_paths(testsdir, type))
3222 message('@0@ is a manual test'.format(name))
3223 elif type == 'unsafe' and want_tests != 'unsafe'
3224 message('@0@ is an unsafe test'.format(name))
3225 elif want_tests != 'false'
3231 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3236 'test-libsystemd-sym',
3237 test_libsystemd_sym_c,
3238 include_directories : includes,
3239 link_with : [libsystemd],
3240 build_by_default : want_tests != 'false',
3241 install : install_tests,
3242 install_dir : testsdir)
3243 if want_tests != 'false'
3244 test('test-libsystemd-sym', exe)
3248 'test-libsystemd-static-sym',
3249 test_libsystemd_sym_c,
3250 include_directories : includes,
3251 link_with : [install_libsystemd_static],
3252 dependencies : [threads], # threads is already included in dependencies on the library,
3253 # but does not seem to get propagated. Add here as a work-around.
3254 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3255 install : install_tests and static_libsystemd_pic,
3256 install_dir : testsdir)
3257 if want_tests != 'false' and static_libsystemd_pic
3258 test('test-libsystemd-static-sym', exe)
3264 include_directories : includes,
3265 c_args : '-Wno-deprecated-declarations',
3266 link_with : [libudev],
3267 build_by_default : want_tests != 'false',
3268 install : install_tests,
3269 install_dir : testsdir)
3270 if want_tests != 'false'
3271 test('test-libudev-sym', exe)
3275 'test-libudev-static-sym',
3277 include_directories : includes,
3278 c_args : '-Wno-deprecated-declarations',
3279 link_with : [install_libudev_static],
3280 build_by_default : want_tests != 'false' and static_libudev_pic,
3281 install : install_tests and static_libudev_pic,
3282 install_dir : testsdir)
3283 if want_tests != 'false' and static_libudev_pic
3284 test('test-libudev-static-sym', exe)
3287 ############################################################
3291 if get_option('tests') != 'false'
3292 foreach tuple : fuzzers
3294 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3295 dependencies = tuple[2]
3296 defs = tuple.length() >= 4 ? tuple[3] : []
3297 incs = tuple.length() >= 5 ? tuple[4] : includes
3301 dependencies += fuzzing_engine
3303 if fuzzing_engine.found()
3304 dependencies += fuzzing_engine
3306 link_args += ['-fsanitize=fuzzer']
3309 sources += 'src/fuzz/fuzz-main.c'
3312 name = sources[0].split('/')[-1].split('.')[0]
3314 fuzzer_exes += executable(
3317 include_directories : [incs, include_directories('src/fuzz')],
3318 link_with : link_with,
3319 dependencies : dependencies,
3321 link_args: link_args,
3328 depends : fuzzer_exes,
3331 ############################################################
3333 make_directive_index_py = find_program('tools/make-directive-index.py')
3334 make_man_index_py = find_program('tools/make-man-index.py')
3335 xml_helper_py = find_program('tools/xml_helper.py')
3336 hwdb_update_sh = find_program('tools/hwdb-update.sh')
3337 autosuspend_update_sh = find_program('tools/autosuspend-update.sh')
3340 subdir('sysusers.d')
3341 subdir('tmpfiles.d')
3347 subdir('shell-completion/bash')
3348 subdir('shell-completion/zsh')
3349 subdir('docs/sysvinit')
3350 subdir('docs/var-log')
3352 install_subdir('factory/etc',
3353 install_dir : factorydir)
3355 install_data('xorg/50-systemd-user.sh',
3356 install_dir : xinitrcdir)
3357 install_data('modprobe.d/systemd.conf',
3358 install_dir : modprobedir)
3359 install_data('LICENSE.GPL2',
3363 'docs/CODING_STYLE.md',
3364 'docs/DISTRO_PORTING.md',
3365 'docs/ENVIRONMENT.md',
3367 'docs/TRANSIENT-SETTINGS.md',
3368 'docs/TRANSLATORS.md',
3369 'docs/UIDS-GIDS.md',
3370 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3371 install_dir : docdir)
3373 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3374 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3376 ############################################################
3378 check_help = find_program('tools/check-help.sh')
3380 foreach exec : public_programs
3381 name = exec.full_path().split('/')[-1]
3382 if want_tests != 'false'
3383 test('check-help-' + name,
3385 args : exec.full_path())
3389 ############################################################
3391 check_directives_sh = find_program('tools/check-directives.sh')
3393 if want_tests != 'false'
3394 test('check-directives',
3395 check_directives_sh,
3396 args : project_source_root)
3399 ############################################################
3401 # Enable tests for all supported sanitizers
3402 foreach tuple : sanitizers
3403 sanitizer = tuple[0]
3406 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3408 foreach p : fuzz_regression_tests
3409 b = p.split('/')[-2]
3410 c = p.split('/')[-1]
3412 name = '@0@:@1@'.format(b, sanitizer)
3415 if want_tests == 'false'
3416 message('Not compiling @0@ because tests is set to false'.format(name))
3417 elif slow_tests or fuzz_tests
3418 exe = custom_target(
3422 command : [env, 'ln', '-fs',
3423 join_paths(build.full_path(), b),
3425 build_by_default : true)
3427 message('Not compiling @0@ because slow-tests/fuzz-tests is set to false'.format(name))
3432 if want_tests != 'false' and (slow_tests or fuzz_tests)
3433 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3435 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
3437 args : [exe.full_path(),
3438 join_paths(project_source_root, p)])
3445 ############################################################
3448 all_files = run_command(
3450 ['--git-dir=@0@/.git'.format(project_source_root),
3453 all_files = files(all_files.stdout().split())
3458 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3461 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3465 git_contrib_sh = find_program('tools/git-contrib.sh')
3468 command : [git_contrib_sh])
3472 git_head = run_command(
3474 ['--git-dir=@0@/.git'.format(project_source_root),
3475 'rev-parse', 'HEAD']).stdout().strip()
3476 git_head_short = run_command(
3478 ['--git-dir=@0@/.git'.format(project_source_root),
3479 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3483 command : ['git', 'archive',
3484 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3486 '--prefix', 'systemd-@0@/'.format(git_head),
3490 ############################################################
3492 check_api_docs_sh = find_program('tools/check-api-docs.sh')
3495 depends : [man, libsystemd, libudev],
3496 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3498 ############################################################
3499 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3502 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3504 'split /usr: @0@'.format(split_usr),
3505 'split bin-sbin: @0@'.format(split_bin),
3506 'prefix directory: @0@'.format(prefixdir),
3507 'rootprefix directory: @0@'.format(rootprefixdir),
3508 'sysconf directory: @0@'.format(sysconfdir),
3509 'include directory: @0@'.format(includedir),
3510 'lib directory: @0@'.format(libdir),
3511 'rootlib directory: @0@'.format(rootlibdir),
3512 'SysV init scripts: @0@'.format(sysvinit_path),
3513 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3514 'PAM modules directory: @0@'.format(pamlibdir),
3515 'PAM configuration directory: @0@'.format(pamconfdir),
3516 'RPM macros directory: @0@'.format(rpmmacrosdir),
3517 'modprobe.d directory: @0@'.format(modprobedir),
3518 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3519 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3520 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3521 'bash completions directory: @0@'.format(bashcompletiondir),
3522 'zsh completions directory: @0@'.format(zshcompletiondir),
3523 'extra start script: @0@'.format(get_option('rc-local')),
3524 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3525 get_option('debug-tty')),
3526 'TTY GID: @0@'.format(tty_gid),
3527 'users GID: @0@'.format(substs.get('USERS_GID')),
3528 'maximum system UID: @0@'.format(system_uid_max),
3529 'maximum system GID: @0@'.format(system_gid_max),
3530 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3531 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3532 'minimum container UID base: @0@'.format(container_uid_base_min),
3533 'maximum container UID base: @0@'.format(container_uid_base_max),
3534 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3535 'render group access mode: @0@'.format(get_option('group-render-mode')),
3536 'certificate root directory: @0@'.format(get_option('certificate-root')),
3537 'support URL: @0@'.format(support_url),
3538 'nobody user name: @0@'.format(nobody_user),
3539 'nobody group name: @0@'.format(nobody_group),
3540 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3541 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3543 'default DNSSEC mode: @0@'.format(default_dnssec),
3544 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3545 'default mDNS mode: @0@'.format(default_mdns),
3546 'default LLMNR mode: @0@'.format(default_llmnr),
3547 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3548 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3549 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3550 'default locale: @0@'.format(default_locale),
3551 'default user $PATH: @0@'.format(default_user_path_display),
3552 'systemd service watchdog: @0@'.format(watchdog_opt)]
3554 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3555 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3557 'default DNS servers: @0@'.format(alt_dns_servers),
3558 'default NTP servers: @0@'.format(alt_ntp_servers)]
3560 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3561 '@@0@'.format(time_epoch)).stdout().strip()
3563 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3566 'static libsystemd: @0@'.format(static_libsystemd),
3567 'static libudev: @0@'.format(static_libudev)]
3570 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3571 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3572 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3574 if conf.get('ENABLE_EFI') == 1
3575 status += 'efi arch: @0@'.format(efi_arch)
3579 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3580 'EFI CC @0@'.format(' '.join(efi_cc)),
3581 'EFI lds: @0@'.format(efi_lds),
3582 'EFI crt0: @0@'.format(efi_crt0),
3583 'EFI include directory: @0@'.format(efi_incdir)]
3645 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3646 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3650 ['legacy pkla', install_polkit_pkla],
3652 ['gnu-efi', have_gnu_efi],
3665 ['man pages', want_man],
3666 ['html pages', want_html],
3667 ['man page indices', want_man and have_lxml],
3672 ['adm group', get_option('adm-group')],
3673 ['wheel group', get_option('wheel-group')],
3676 ['debug mmap cache'],
3678 ['valgrind', conf.get('VALGRIND') == 1],
3679 ['trace logging', conf.get('LOG_TRACE') == 1],
3680 ['install tests', install_tests],
3681 ['link-udev-shared', get_option('link-udev-shared')],
3682 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3683 ['link-networkd-shared', get_option('link-networkd-shared')],
3684 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3685 ['kernel-install', get_option('kernel-install')],
3686 ['systemd-analyze', get_option('analyze')],
3689 if tuple.length() >= 2
3692 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3693 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3694 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3705 'enabled features: @0@'.format(', '.join(found)),
3707 'disabled features: @0@'.format(', '.join(missing)),
3709 message('\n '.join(status))
3711 if rootprefixdir != rootprefix_default
3713 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3714 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3715 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))