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 fall back 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',
894 required : want_libfdisk == 'true')
895 have = libfdisk.found()
900 conf.set10('HAVE_LIBFDISK', have)
902 want_pwquality = get_option('pwquality')
903 if want_pwquality != 'false' and not skip_deps
904 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
905 have = libpwquality.found()
910 conf.set10('HAVE_PWQUALITY', have)
912 want_seccomp = get_option('seccomp')
913 if want_seccomp != 'false' and not skip_deps
914 libseccomp = dependency('libseccomp',
915 version : '>= 2.3.1',
916 required : want_seccomp == 'true')
917 have = libseccomp.found()
922 conf.set10('HAVE_SECCOMP', have)
924 want_selinux = get_option('selinux')
925 if want_selinux != 'false' and not skip_deps
926 libselinux = dependency('libselinux',
927 version : '>= 2.1.9',
928 required : want_selinux == 'true')
929 have = libselinux.found()
934 conf.set10('HAVE_SELINUX', have)
936 want_apparmor = get_option('apparmor')
937 if want_apparmor != 'false' and not skip_deps
938 libapparmor = dependency('libapparmor',
940 required : want_apparmor == 'true')
941 have = libapparmor.found()
946 conf.set10('HAVE_APPARMOR', have)
948 smack_run_label = get_option('smack-run-label')
949 if smack_run_label != ''
950 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
953 want_polkit = get_option('polkit')
954 install_polkit = false
955 install_polkit_pkla = false
956 if want_polkit != 'false' and not skip_deps
957 install_polkit = true
959 libpolkit = dependency('polkit-gobject-1',
961 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
962 message('Old polkit detected, will install pkla files')
963 install_polkit_pkla = true
966 conf.set10('ENABLE_POLKIT', install_polkit)
968 want_acl = get_option('acl')
969 if want_acl != 'false' and not skip_deps
970 libacl = cc.find_library('acl', required : want_acl == 'true')
971 have = libacl.found()
976 conf.set10('HAVE_ACL', have)
978 want_audit = get_option('audit')
979 if want_audit != 'false' and not skip_deps
980 libaudit = dependency('audit', required : want_audit == 'true')
981 have = libaudit.found()
986 conf.set10('HAVE_AUDIT', have)
988 want_blkid = get_option('blkid')
989 if want_blkid != 'false' and not skip_deps
990 libblkid = dependency('blkid', required : want_blkid == 'true')
991 have = libblkid.found()
996 conf.set10('HAVE_BLKID', have)
998 want_kmod = get_option('kmod')
999 if want_kmod != 'false' and not skip_deps
1000 libkmod = dependency('libkmod',
1002 required : want_kmod == 'true')
1003 have = libkmod.found()
1008 conf.set10('HAVE_KMOD', have)
1010 want_pam = get_option('pam')
1011 if want_pam != 'false' and not skip_deps
1012 libpam = cc.find_library('pam', required : want_pam == 'true')
1013 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
1014 have = libpam.found() and libpam_misc.found()
1020 conf.set10('HAVE_PAM', have)
1022 want_microhttpd = get_option('microhttpd')
1023 if want_microhttpd != 'false' and not skip_deps
1024 libmicrohttpd = dependency('libmicrohttpd',
1025 version : '>= 0.9.33',
1026 required : want_microhttpd == 'true')
1027 have = libmicrohttpd.found()
1032 conf.set10('HAVE_MICROHTTPD', have)
1034 want_libcryptsetup = get_option('libcryptsetup')
1035 if want_libcryptsetup != 'false' and not skip_deps
1036 libcryptsetup = dependency('libcryptsetup',
1037 version : '>= 2.0.1',
1038 required : want_libcryptsetup == 'true')
1039 have = libcryptsetup.found()
1041 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1042 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
1043 conf.set10('HAVE_CRYPT_ACTIVATE_BY_SIGNED_KEY',
1044 have and cc.has_function('crypt_activate_by_signed_key', dependencies : libcryptsetup))
1049 conf.set10('HAVE_LIBCRYPTSETUP', have)
1051 want_libcurl = get_option('libcurl')
1052 if want_libcurl != 'false' and not skip_deps
1053 libcurl = dependency('libcurl',
1054 version : '>= 7.32.0',
1055 required : want_libcurl == 'true')
1056 have = libcurl.found()
1061 conf.set10('HAVE_LIBCURL', have)
1063 want_libidn = get_option('libidn')
1064 want_libidn2 = get_option('libidn2')
1065 if want_libidn == 'true' and want_libidn2 == 'true'
1066 error('libidn and libidn2 cannot be requested simultaneously')
1069 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1070 libidn = dependency('libidn2',
1071 required : want_libidn2 == 'true')
1072 have = libidn.found()
1077 conf.set10('HAVE_LIBIDN2', have)
1078 if not have and want_libidn != 'false' and not skip_deps
1079 # libidn is used for both libidn and libidn2 objects
1080 libidn = dependency('libidn',
1081 required : want_libidn == 'true')
1082 have = libidn.found()
1086 conf.set10('HAVE_LIBIDN', have)
1088 want_libiptc = get_option('libiptc')
1089 if want_libiptc != 'false' and not skip_deps
1090 libiptc = dependency('libiptc',
1091 required : want_libiptc == 'true')
1092 have = libiptc.found()
1097 conf.set10('HAVE_LIBIPTC', have)
1099 want_qrencode = get_option('qrencode')
1100 if want_qrencode != 'false' and not skip_deps
1101 libqrencode = dependency('libqrencode',
1102 required : want_qrencode == 'true')
1103 have = libqrencode.found()
1108 conf.set10('HAVE_QRENCODE', have)
1110 want_gcrypt = get_option('gcrypt')
1111 if want_gcrypt != 'false' and not skip_deps
1112 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1113 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1114 have = libgcrypt.found() and libgpg_error.found()
1119 # link to neither of the libs if one is not found
1123 conf.set10('HAVE_GCRYPT', have)
1125 want_gnutls = get_option('gnutls')
1126 if want_gnutls != 'false' and not skip_deps
1127 libgnutls = dependency('gnutls',
1128 version : '>= 3.1.4',
1129 required : want_gnutls == 'true')
1130 have = libgnutls.found()
1135 conf.set10('HAVE_GNUTLS', have)
1137 want_openssl = get_option('openssl')
1138 if want_openssl != 'false' and not skip_deps
1139 libopenssl = dependency('openssl',
1140 version : '>= 1.1.0',
1141 required : want_openssl == 'true')
1142 have = libopenssl.found()
1147 conf.set10('HAVE_OPENSSL', have)
1149 want_p11kit = get_option('p11kit')
1150 if want_p11kit != 'false' and not skip_deps
1151 libp11kit = dependency('p11-kit-1',
1152 version : '>= 0.23.3',
1153 required : want_p11kit == 'true')
1154 have = libp11kit.found()
1159 conf.set10('HAVE_P11KIT', have)
1161 want_libfido2 = get_option('libfido2')
1162 if want_libfido2 != 'false' and not skip_deps
1163 libfido2 = dependency('libfido2',
1164 required : want_libfido2 == 'true')
1165 have = libfido2.found()
1170 conf.set10('HAVE_LIBFIDO2', have)
1172 want_elfutils = get_option('elfutils')
1173 if want_elfutils != 'false' and not skip_deps
1174 libdw = dependency('libdw',
1175 required : want_elfutils == 'true')
1176 have = libdw.found()
1181 conf.set10('HAVE_ELFUTILS', have)
1183 want_zlib = get_option('zlib')
1184 if want_zlib != 'false' and not skip_deps
1185 libz = dependency('zlib',
1186 required : want_zlib == 'true')
1192 conf.set10('HAVE_ZLIB', have)
1194 want_bzip2 = get_option('bzip2')
1195 if want_bzip2 != 'false' and not skip_deps
1196 libbzip2 = cc.find_library('bz2',
1197 required : want_bzip2 == 'true')
1198 have = libbzip2.found()
1203 conf.set10('HAVE_BZIP2', have)
1205 want_xz = get_option('xz')
1206 if want_xz != 'false' and not skip_deps
1207 libxz = dependency('liblzma',
1208 required : want_xz == 'true')
1209 have_xz = libxz.found()
1214 conf.set10('HAVE_XZ', have_xz)
1216 want_lz4 = get_option('lz4')
1217 if want_lz4 != 'false' and not skip_deps
1218 liblz4 = dependency('liblz4',
1219 version : '>= 1.3.0',
1220 required : want_lz4 == 'true')
1221 have_lz4 = liblz4.found()
1226 conf.set10('HAVE_LZ4', have_lz4)
1228 want_zstd = get_option('zstd')
1229 if want_zstd != 'false' and not skip_deps
1230 libzstd = dependency('libzstd',
1231 required : want_zstd == 'true',
1232 version : '>= 1.4.0')
1233 have_zstd = libzstd.found()
1238 conf.set10('HAVE_ZSTD', have_zstd)
1240 conf.set10('HAVE_COMPRESSION', have_xz or have_lz4 or have_zstd)
1242 want_xkbcommon = get_option('xkbcommon')
1243 if want_xkbcommon != 'false' and not skip_deps
1244 libxkbcommon = dependency('xkbcommon',
1245 version : '>= 0.3.0',
1246 required : want_xkbcommon == 'true')
1247 have = libxkbcommon.found()
1252 conf.set10('HAVE_XKBCOMMON', have)
1254 want_pcre2 = get_option('pcre2')
1255 if want_pcre2 != 'false'
1256 libpcre2 = dependency('libpcre2-8',
1257 required : want_pcre2 == 'true')
1258 have = libpcre2.found()
1263 conf.set10('HAVE_PCRE2', have)
1265 want_glib = get_option('glib')
1266 if want_glib != 'false' and not skip_deps
1267 libglib = dependency('glib-2.0',
1268 version : '>= 2.22.0',
1269 required : want_glib == 'true')
1270 libgobject = dependency('gobject-2.0',
1271 version : '>= 2.22.0',
1272 required : want_glib == 'true')
1273 libgio = dependency('gio-2.0',
1274 required : want_glib == 'true')
1275 have = libglib.found() and libgobject.found() and libgio.found()
1282 conf.set10('HAVE_GLIB', have)
1284 want_dbus = get_option('dbus')
1285 if want_dbus != 'false' and not skip_deps
1286 libdbus = dependency('dbus-1',
1287 version : '>= 1.3.2',
1288 required : want_dbus == 'true')
1289 have = libdbus.found()
1294 conf.set10('HAVE_DBUS', have)
1296 default_dnssec = get_option('default-dnssec')
1298 default_dnssec = 'no'
1300 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1301 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1302 default_dnssec = 'no'
1304 conf.set('DEFAULT_DNSSEC_MODE',
1305 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1306 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1308 dns_over_tls = get_option('dns-over-tls')
1309 if dns_over_tls != 'false'
1310 if dns_over_tls == 'openssl'
1313 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1314 if dns_over_tls == 'gnutls' and not have_gnutls
1315 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1318 if dns_over_tls == 'gnutls' or have_gnutls
1319 have_openssl = false
1321 have_openssl = conf.get('HAVE_OPENSSL') == 1
1322 if dns_over_tls != 'auto' and not have_openssl
1323 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1324 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1327 have = have_gnutls or have_openssl
1331 have_openssl = false
1333 conf.set10('ENABLE_DNS_OVER_TLS', have)
1334 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1335 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1337 default_dns_over_tls = get_option('default-dns-over-tls')
1339 default_dns_over_tls = 'no'
1341 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1342 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.')
1343 default_dns_over_tls = 'no'
1345 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1346 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1347 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1349 default_mdns = get_option('default-mdns')
1350 conf.set('DEFAULT_MDNS_MODE',
1351 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
1352 substs.set('DEFAULT_MDNS_MODE', default_mdns)
1354 default_llmnr = get_option('default-llmnr')
1355 conf.set('DEFAULT_LLMNR_MODE',
1356 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
1357 substs.set('DEFAULT_LLMNR_MODE', default_llmnr)
1359 want_repart = get_option('repart')
1360 if want_repart != 'false'
1361 have = (conf.get('HAVE_OPENSSL') == 1 and
1362 conf.get('HAVE_LIBFDISK') == 1)
1363 if want_repart == 'true' and not have
1364 error('repart support was requested, but dependencies are not available')
1369 conf.set10('ENABLE_REPART', have)
1371 want_importd = get_option('importd')
1372 if want_importd != 'false'
1373 have = (conf.get('HAVE_LIBCURL') == 1 and
1374 conf.get('HAVE_ZLIB') == 1 and
1375 conf.get('HAVE_XZ') == 1 and
1376 conf.get('HAVE_GCRYPT') == 1)
1377 if want_importd == 'true' and not have
1378 error('importd support was requested, but dependencies are not available')
1383 conf.set10('ENABLE_IMPORTD', have)
1385 want_homed = get_option('homed')
1386 if want_homed != 'false'
1387 have = (conf.get('HAVE_OPENSSL') == 1 and
1388 conf.get('HAVE_LIBFDISK') == 1 and
1389 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1390 if want_homed == 'true' and not have
1391 error('homed support was requested, but dependencies are not available')
1396 conf.set10('ENABLE_HOMED', have)
1398 have = have and conf.get('HAVE_PAM') == 1
1399 conf.set10('ENABLE_PAM_HOME', have)
1401 want_remote = get_option('remote')
1402 if want_remote != 'false'
1403 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1404 conf.get('HAVE_LIBCURL') == 1]
1405 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1406 # it's possible to build one without the other. Complain only if
1407 # support was explicitly requested. The auxiliary files like sysusers
1408 # config should be installed when any of the programs are built.
1409 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1410 error('remote support was requested, but dependencies are not available')
1412 have = have_deps[0] or have_deps[1]
1416 conf.set10('ENABLE_REMOTE', have)
1418 foreach term : ['analyze',
1455 have = get_option(term)
1456 name = 'ENABLE_' + term.underscorify().to_upper()
1457 conf.set10(name, have)
1460 foreach tuple : [['nss-mymachines', 'machined'],
1461 ['nss-resolve', 'resolve']]
1462 want = get_option(tuple[0])
1464 have = get_option(tuple[1])
1465 if want == 'true' and not have
1466 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1471 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1472 conf.set10(name, have)
1476 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1477 'ENABLE_NSS_MYMACHINES',
1478 'ENABLE_NSS_RESOLVE',
1479 'ENABLE_NSS_SYSTEMD']
1480 if conf.get(term) == 1
1484 conf.set10('ENABLE_NSS', enable_nss)
1486 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1491 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1493 #####################################################################
1495 if get_option('efi')
1496 efi_arch = host_machine.cpu_family()
1498 if efi_arch == 'x86'
1499 EFI_MACHINE_TYPE_NAME = 'ia32'
1500 gnu_efi_arch = 'ia32'
1501 elif efi_arch == 'x86_64'
1502 EFI_MACHINE_TYPE_NAME = 'x64'
1503 gnu_efi_arch = 'x86_64'
1504 elif efi_arch == 'arm'
1505 EFI_MACHINE_TYPE_NAME = 'arm'
1506 gnu_efi_arch = 'arm'
1507 elif efi_arch == 'aarch64'
1508 EFI_MACHINE_TYPE_NAME = 'aa64'
1509 gnu_efi_arch = 'aarch64'
1511 EFI_MACHINE_TYPE_NAME = ''
1516 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1518 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1522 conf.set10('ENABLE_EFI', have)
1524 #####################################################################
1526 config_h = configure_file(
1527 output : 'config.h',
1528 configuration : conf)
1530 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1532 includes = include_directories('src/basic',
1538 'src/journal-remote',
1542 'src/time-wait-sync',
1548 'src/xdg-autostart-generator',
1549 'src/libsystemd/sd-bus',
1550 'src/libsystemd/sd-device',
1551 'src/libsystemd/sd-event',
1552 'src/libsystemd/sd-hwdb',
1553 'src/libsystemd/sd-id128',
1554 'src/libsystemd/sd-netlink',
1555 'src/libsystemd/sd-network',
1556 'src/libsystemd/sd-resolve',
1557 'src/libsystemd-network',
1560 add_project_arguments('-include', 'config.h', language : 'c')
1562 generate_gperfs = find_program('tools/generate-gperfs.py')
1566 subdir('src/systemd')
1568 subdir('src/libsystemd')
1569 subdir('src/libsystemd-network')
1570 subdir('src/journal')
1573 libjournal_core = static_library(
1575 libjournal_core_sources,
1577 include_directories : includes,
1580 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1581 libsystemd = shared_library(
1584 version : libsystemd_version,
1585 include_directories : includes,
1586 link_args : ['-shared',
1587 '-Wl,--version-script=' + libsystemd_sym_path],
1588 link_with : [libbasic,
1590 link_whole : [libsystemd_static,
1592 dependencies : [threads,
1597 link_depends : libsystemd_sym,
1599 install_dir : rootlibdir)
1601 static_libsystemd = get_option('static-libsystemd')
1602 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1604 install_libsystemd_static = static_library(
1607 journal_client_sources,
1609 basic_gcrypt_sources,
1611 include_directories : includes,
1612 build_by_default : static_libsystemd != 'false',
1613 install : static_libsystemd != 'false',
1614 install_dir : rootlibdir,
1615 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1616 dependencies : [threads,
1626 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1628 # Generate autosuspend rules
1629 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1631 ############################################################
1633 # binaries that have --help and are intended for use by humans,
1634 # usually, but not always, installed in /bin.
1635 public_programs = []
1637 subdir('src/libudev')
1638 subdir('src/shared')
1640 subdir('src/shutdown')
1642 subdir('src/network')
1644 subdir('src/analyze')
1645 subdir('src/journal-remote')
1646 subdir('src/coredump')
1647 subdir('src/pstore')
1648 subdir('src/hostname')
1649 subdir('src/import')
1650 subdir('src/partition')
1651 subdir('src/kernel-install')
1652 subdir('src/locale')
1653 subdir('src/machine')
1654 subdir('src/portable')
1655 subdir('src/userdb')
1657 subdir('src/nspawn')
1658 subdir('src/resolve')
1659 subdir('src/timedate')
1660 subdir('src/timesync')
1661 subdir('src/tmpfiles')
1662 subdir('src/vconsole')
1663 subdir('src/boot/efi')
1670 ############################################################
1672 # only static linking apart from libdl, to make sure that the
1673 # module is linked to all libraries that it uses.
1674 test_dlopen = executable(
1678 include_directories : includes,
1679 link_with : [libbasic],
1680 dependencies : [libdl],
1681 build_by_default : want_tests != 'false')
1683 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1684 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h src/nss-systemd/nss-systemd.h'],
1685 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1686 ['resolve', 'ENABLE_NSS_RESOLVE']]
1688 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1692 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1693 version_script_arg = join_paths(project_source_root, sym)
1695 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1696 if tuple.length() > 2
1697 sources += tuple[2].split()
1700 nss = shared_library(
1705 include_directories : includes,
1706 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1707 link_args : ['-Wl,-z,nodelete',
1709 '-Wl,--version-script=' + version_script_arg],
1710 link_with : [libsystemd_static,
1713 dependencies : [threads,
1717 install_dir : rootlibdir)
1719 # We cannot use shared_module because it does not support version suffix.
1720 # Unfortunately shared_library insists on creating the symlink…
1721 meson.add_install_script('sh', '-c',
1722 'rm $DESTDIR@0@/libnss_@1@.so'
1723 .format(rootlibdir, module))
1725 if want_tests != 'false'
1726 test('dlopen-nss_' + module,
1728 # path to dlopen must include a slash
1729 args : nss.full_path())
1734 ############################################################
1739 include_directories : includes,
1740 link_with : [libcore,
1742 dependencies : [versiondep,
1749 install_rpath : rootlibexecdir,
1751 install_dir : rootlibexecdir)
1753 meson.add_install_script(meson_make_symlink,
1754 join_paths(rootlibexecdir, 'systemd'),
1755 join_paths(rootsbindir, 'init'))
1757 public_programs += executable(
1759 systemd_analyze_sources,
1760 include_directories : includes,
1761 link_with : [libcore,
1763 dependencies : [versiondep,
1770 install_rpath : rootlibexecdir,
1771 install : conf.get('ENABLE_ANALYZE'))
1775 systemd_journald_sources,
1776 include_directories : includes,
1777 link_with : [libjournal_core,
1779 dependencies : [threads,
1784 install_rpath : rootlibexecdir,
1786 install_dir : rootlibexecdir)
1788 public_programs += executable(
1790 systemd_cat_sources,
1791 include_directories : includes,
1792 link_with : [libjournal_core,
1794 dependencies : [threads],
1795 install_rpath : rootlibexecdir,
1798 public_programs += executable(
1801 include_directories : includes,
1802 link_with : [libshared],
1803 dependencies : [threads,
1809 install_rpath : rootlibexecdir,
1811 install_dir : rootbindir)
1814 'systemd-getty-generator',
1815 'src/getty-generator/getty-generator.c',
1816 include_directories : includes,
1817 link_with : [libshared],
1818 install_rpath : rootlibexecdir,
1820 install_dir : systemgeneratordir)
1823 'systemd-debug-generator',
1824 'src/debug-generator/debug-generator.c',
1825 include_directories : includes,
1826 link_with : [libshared],
1827 install_rpath : rootlibexecdir,
1829 install_dir : systemgeneratordir)
1832 'systemd-run-generator',
1833 'src/run-generator/run-generator.c',
1834 include_directories : includes,
1835 link_with : [libshared],
1836 install_rpath : rootlibexecdir,
1838 install_dir : systemgeneratordir)
1841 'systemd-fstab-generator',
1842 'src/fstab-generator/fstab-generator.c',
1843 include_directories : includes,
1844 link_with : [libcore_shared,
1846 install_rpath : rootlibexecdir,
1848 install_dir : systemgeneratordir)
1850 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1852 '30-systemd-environment-d-generator',
1853 'src/environment-d-generator/environment-d-generator.c',
1854 include_directories : includes,
1855 link_with : [libshared],
1856 install_rpath : rootlibexecdir,
1858 install_dir : userenvgeneratordir)
1860 meson.add_install_script(meson_make_symlink,
1861 join_paths(sysconfdir, 'environment'),
1862 join_paths(environmentdir, '99-environment.conf'))
1865 if conf.get('ENABLE_HIBERNATE') == 1
1867 'systemd-hibernate-resume-generator',
1868 'src/hibernate-resume/hibernate-resume-generator.c',
1869 include_directories : includes,
1870 link_with : [libshared],
1871 install_rpath : rootlibexecdir,
1873 install_dir : systemgeneratordir)
1876 'systemd-hibernate-resume',
1877 'src/hibernate-resume/hibernate-resume.c',
1878 include_directories : includes,
1879 link_with : [libshared],
1880 install_rpath : rootlibexecdir,
1882 install_dir : rootlibexecdir)
1885 if conf.get('HAVE_BLKID') == 1
1887 'systemd-gpt-auto-generator',
1888 'src/gpt-auto-generator/gpt-auto-generator.c',
1889 'src/shared/blkid-util.h',
1890 include_directories : includes,
1891 link_with : [libshared],
1892 dependencies : libblkid,
1893 install_rpath : rootlibexecdir,
1895 install_dir : systemgeneratordir)
1897 public_programs += executable(
1899 'src/dissect/dissect.c',
1900 include_directories : includes,
1901 link_with : [libshared],
1902 install_rpath : rootlibexecdir,
1906 if conf.get('ENABLE_RESOLVE') == 1
1909 systemd_resolved_sources,
1910 include_directories : includes,
1911 link_with : [libshared,
1913 libsystemd_resolve_core],
1914 dependencies : systemd_resolved_dependencies,
1915 install_rpath : rootlibexecdir,
1917 install_dir : rootlibexecdir)
1919 public_programs += executable(
1922 include_directories : includes,
1923 link_with : [libshared,
1925 libsystemd_resolve_core],
1926 dependencies : [threads,
1930 install_rpath : rootlibexecdir,
1933 meson.add_install_script(meson_make_symlink,
1934 join_paths(bindir, 'resolvectl'),
1935 join_paths(rootsbindir, 'resolvconf'))
1937 meson.add_install_script(meson_make_symlink,
1938 join_paths(bindir, 'resolvectl'),
1939 join_paths(bindir, 'systemd-resolve'))
1942 if conf.get('ENABLE_LOGIND') == 1
1945 systemd_logind_sources,
1946 include_directories : includes,
1947 link_with : [liblogind_core,
1949 dependencies : [threads,
1951 install_rpath : rootlibexecdir,
1953 install_dir : rootlibexecdir)
1955 public_programs += executable(
1958 include_directories : includes,
1959 link_with : [libshared],
1960 dependencies : [threads,
1964 install_rpath : rootlibexecdir,
1966 install_dir : rootbindir)
1968 public_programs += executable(
1970 'src/login/inhibit.c',
1971 include_directories : includes,
1972 link_with : [libshared],
1973 install_rpath : rootlibexecdir,
1975 install_dir : rootbindir)
1977 if conf.get('HAVE_PAM') == 1
1978 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1979 pam_systemd = shared_library(
1983 include_directories : includes,
1984 link_args : ['-shared',
1985 '-Wl,--version-script=' + version_script_arg],
1986 link_with : [libsystemd_static,
1988 dependencies : [threads,
1991 link_depends : pam_systemd_sym,
1993 install_dir : pamlibdir)
1995 if want_tests != 'false'
1996 test('dlopen-pam_systemd',
1998 # path to dlopen must include a slash
1999 args : pam_systemd.full_path())
2004 'systemd-user-runtime-dir',
2005 user_runtime_dir_sources,
2006 include_directories : includes,
2007 link_with : [libshared],
2008 install_rpath : rootlibexecdir,
2010 install_dir : rootlibexecdir)
2013 if conf.get('HAVE_PAM') == 1
2015 'systemd-user-sessions',
2016 'src/user-sessions/user-sessions.c',
2017 include_directories : includes,
2018 link_with : [libshared],
2019 install_rpath : rootlibexecdir,
2021 install_dir : rootlibexecdir)
2024 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
2025 public_programs += executable(
2027 'src/boot/bootctl.c',
2028 include_directories : includes,
2029 link_with : [libshared],
2030 dependencies : [libblkid],
2031 install_rpath : rootlibexecdir,
2034 public_programs += executable(
2035 'systemd-bless-boot',
2036 'src/boot/bless-boot.c',
2037 include_directories : includes,
2038 link_with : [libshared],
2039 dependencies : [libblkid],
2040 install_rpath : rootlibexecdir,
2042 install_dir : rootlibexecdir)
2045 'systemd-bless-boot-generator',
2046 'src/boot/bless-boot-generator.c',
2047 include_directories : includes,
2048 link_with : [libshared],
2049 install_rpath : rootlibexecdir,
2051 install_dir : systemgeneratordir)
2055 'systemd-boot-check-no-failures',
2056 'src/boot/boot-check-no-failures.c',
2057 include_directories : includes,
2058 link_with : [libshared],
2059 dependencies : [libblkid],
2060 install_rpath : rootlibexecdir,
2062 install_dir : rootlibexecdir)
2064 public_programs += executable(
2065 'systemd-socket-activate',
2066 'src/activate/activate.c',
2067 include_directories : includes,
2068 link_with : [libshared],
2069 dependencies : [threads],
2070 install_rpath : rootlibexecdir,
2073 if get_option('link-systemctl-shared')
2074 systemctl_link_with = [libshared]
2076 systemctl_link_with = [libsystemd_static,
2082 public_programs += executable(
2084 'src/systemctl/systemctl.c',
2085 'src/systemctl/sysv-compat.h',
2086 'src/systemctl/sysv-compat.c',
2087 include_directories : includes,
2088 link_with : systemctl_link_with,
2089 dependencies : [threads,
2095 install_rpath : rootlibexecdir,
2097 install_dir : rootbindir)
2099 if conf.get('ENABLE_PORTABLED') == 1
2101 'systemd-portabled',
2102 systemd_portabled_sources,
2103 include_directories : includes,
2104 link_with : [libshared],
2105 dependencies : [threads],
2106 install_rpath : rootlibexecdir,
2108 install_dir : rootlibexecdir)
2110 public_programs += executable(
2112 'src/portable/portablectl.c',
2113 include_directories : includes,
2114 link_with : [libshared],
2115 dependencies : [threads],
2116 install_rpath : rootlibexecdir,
2118 install_dir : rootbindir)
2121 if conf.get('ENABLE_USERDB') == 1
2124 systemd_userwork_sources,
2125 include_directories : includes,
2126 link_with : [libshared],
2127 dependencies : [threads],
2128 install_rpath : rootlibexecdir,
2130 install_dir : rootlibexecdir)
2134 systemd_userdbd_sources,
2135 include_directories : includes,
2136 link_with : [libshared],
2137 dependencies : [threads],
2138 install_rpath : rootlibexecdir,
2140 install_dir : rootlibexecdir)
2142 public_programs += executable(
2145 include_directories : includes,
2146 link_with : [libshared],
2147 dependencies : [threads],
2148 install_rpath : rootlibexecdir,
2150 install_dir : rootbindir)
2153 if conf.get('ENABLE_HOMED') == 1
2156 systemd_homework_sources,
2157 include_directories : includes,
2158 link_with : [libshared],
2159 dependencies : [threads,
2167 install_rpath : rootlibexecdir,
2169 install_dir : rootlibexecdir)
2173 systemd_homed_sources,
2174 include_directories : includes,
2175 link_with : [libshared],
2176 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,
2193 install_rpath : rootlibexecdir,
2195 install_dir : rootbindir)
2197 if conf.get('HAVE_PAM') == 1
2198 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2199 pam_systemd = shared_library(
2203 include_directories : includes,
2204 link_args : ['-shared',
2205 '-Wl,--version-script=' + version_script_arg],
2206 link_with : [libsystemd_static,
2208 dependencies : [threads,
2212 link_depends : pam_systemd_home_sym,
2214 install_dir : pamlibdir)
2218 foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
2219 (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
2220 meson.add_install_script(meson_make_symlink,
2221 join_paths(rootbindir, 'systemctl'),
2222 join_paths(rootsbindir, alias))
2225 meson.add_install_script(meson_make_symlink,
2226 join_paths(rootbindir, 'udevadm'),
2227 join_paths(rootlibexecdir, 'systemd-udevd'))
2229 if conf.get('ENABLE_BACKLIGHT') == 1
2231 'systemd-backlight',
2232 'src/backlight/backlight.c',
2233 include_directories : includes,
2234 link_with : [libshared],
2235 install_rpath : rootlibexecdir,
2237 install_dir : rootlibexecdir)
2240 if conf.get('ENABLE_RFKILL') == 1
2243 'src/rfkill/rfkill.c',
2244 include_directories : includes,
2245 link_with : [libshared],
2246 install_rpath : rootlibexecdir,
2248 install_dir : rootlibexecdir)
2252 'systemd-system-update-generator',
2253 'src/system-update-generator/system-update-generator.c',
2254 include_directories : includes,
2255 link_with : [libshared],
2256 install_rpath : rootlibexecdir,
2258 install_dir : systemgeneratordir)
2260 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2261 systemd_cryptsetup_sources = files('''
2262 src/cryptsetup/cryptsetup-pkcs11.h
2263 src/cryptsetup/cryptsetup-util.c
2264 src/cryptsetup/cryptsetup-util.h
2265 src/cryptsetup/cryptsetup.c
2268 if conf.get('HAVE_P11KIT') == 1
2269 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2273 'systemd-cryptsetup',
2274 systemd_cryptsetup_sources,
2275 include_directories : includes,
2276 link_with : [libshared],
2277 dependencies : [libcryptsetup,
2279 install_rpath : rootlibexecdir,
2281 install_dir : rootlibexecdir)
2284 'systemd-cryptsetup-generator',
2285 'src/cryptsetup/cryptsetup-generator.c',
2286 include_directories : includes,
2287 link_with : [libshared],
2288 dependencies : [libcryptsetup],
2289 install_rpath : rootlibexecdir,
2291 install_dir : systemgeneratordir)
2294 'systemd-veritysetup',
2295 'src/veritysetup/veritysetup.c',
2296 include_directories : includes,
2297 link_with : [libshared],
2298 dependencies : [libcryptsetup],
2299 install_rpath : rootlibexecdir,
2301 install_dir : rootlibexecdir)
2304 'systemd-veritysetup-generator',
2305 'src/veritysetup/veritysetup-generator.c',
2306 include_directories : includes,
2307 link_with : [libshared],
2308 dependencies : [libcryptsetup],
2309 install_rpath : rootlibexecdir,
2311 install_dir : systemgeneratordir)
2314 if conf.get('HAVE_SYSV_COMPAT') == 1
2316 'systemd-sysv-generator',
2317 'src/sysv-generator/sysv-generator.c',
2318 include_directories : includes,
2319 link_with : [libshared],
2320 install_rpath : rootlibexecdir,
2322 install_dir : systemgeneratordir)
2325 'systemd-rc-local-generator',
2326 'src/rc-local-generator/rc-local-generator.c',
2327 include_directories : includes,
2328 link_with : [libshared],
2329 install_rpath : rootlibexecdir,
2331 install_dir : systemgeneratordir)
2334 if conf.get('ENABLE_XDG_AUTOSTART') == 1
2336 'systemd-xdg-autostart-generator',
2337 'src/xdg-autostart-generator/xdg-autostart-generator.c',
2338 'src/xdg-autostart-generator/xdg-autostart-service.c',
2339 include_directories : includes,
2340 link_with : [libshared],
2341 install_rpath : rootlibexecdir,
2343 install_dir : usergeneratordir)
2346 'systemd-xdg-autostart-condition',
2347 'src/xdg-autostart-generator/xdg-autostart-condition.c',
2348 include_directories : includes,
2349 link_with : [libshared],
2350 install_rpath : rootlibexecdir,
2352 install_dir : rootlibexecdir)
2355 if conf.get('ENABLE_HOSTNAMED') == 1
2357 'systemd-hostnamed',
2358 'src/hostname/hostnamed.c',
2359 include_directories : includes,
2360 link_with : [libshared],
2361 install_rpath : rootlibexecdir,
2363 install_dir : rootlibexecdir)
2365 public_programs += executable(
2367 'src/hostname/hostnamectl.c',
2368 include_directories : includes,
2369 link_with : [libshared],
2370 install_rpath : rootlibexecdir,
2374 if conf.get('ENABLE_LOCALED') == 1
2375 if conf.get('HAVE_XKBCOMMON') == 1
2376 # logind will load libxkbcommon.so dynamically on its own
2384 systemd_localed_sources,
2385 include_directories : includes,
2386 link_with : [libshared],
2387 dependencies : deps,
2388 install_rpath : rootlibexecdir,
2390 install_dir : rootlibexecdir)
2392 public_programs += executable(
2395 include_directories : includes,
2396 link_with : [libshared],
2397 install_rpath : rootlibexecdir,
2401 if conf.get('ENABLE_TIMEDATED') == 1
2403 'systemd-timedated',
2404 'src/timedate/timedated.c',
2405 include_directories : includes,
2406 link_with : [libshared],
2407 install_rpath : rootlibexecdir,
2409 install_dir : rootlibexecdir)
2412 if conf.get('ENABLE_TIMEDATECTL') == 1
2413 public_programs += executable(
2415 'src/timedate/timedatectl.c',
2416 include_directories : includes,
2417 install_rpath : rootlibexecdir,
2418 link_with : [libshared],
2419 dependencies : [libm],
2423 if conf.get('ENABLE_TIMESYNCD') == 1
2424 if get_option('link-timesyncd-shared')
2425 timesyncd_link_with = [libshared]
2427 timesyncd_link_with = [libsystemd_static,
2434 'systemd-timesyncd',
2435 systemd_timesyncd_sources,
2436 include_directories : includes,
2437 link_with : [timesyncd_link_with],
2438 dependencies : [threads,
2440 install_rpath : rootlibexecdir,
2442 install_dir : rootlibexecdir)
2445 'systemd-time-wait-sync',
2446 'src/time-wait-sync/time-wait-sync.c',
2447 include_directories : includes,
2448 link_with : [timesyncd_link_with],
2449 install_rpath : rootlibexecdir,
2451 install_dir : rootlibexecdir)
2454 if conf.get('ENABLE_MACHINED') == 1
2457 systemd_machined_sources,
2458 include_directories : includes,
2459 link_with : [libmachine_core,
2461 install_rpath : rootlibexecdir,
2463 install_dir : rootlibexecdir)
2465 public_programs += executable(
2467 'src/machine/machinectl.c',
2468 include_directories : includes,
2469 link_with : [libshared],
2470 dependencies : [threads,
2474 install_rpath : rootlibexecdir,
2476 install_dir : rootbindir)
2479 if conf.get('ENABLE_IMPORTD') == 1
2482 systemd_importd_sources,
2483 include_directories : includes,
2484 link_with : [libshared],
2485 dependencies : [threads],
2486 install_rpath : rootlibexecdir,
2488 install_dir : rootlibexecdir)
2490 systemd_pull = executable(
2492 systemd_pull_sources,
2493 include_directories : includes,
2494 link_with : [libshared],
2495 dependencies : [versiondep,
2501 install_rpath : rootlibexecdir,
2503 install_dir : rootlibexecdir)
2505 systemd_import = executable(
2507 systemd_import_sources,
2508 include_directories : includes,
2509 link_with : [libshared],
2510 dependencies : [libcurl,
2514 install_rpath : rootlibexecdir,
2516 install_dir : rootlibexecdir)
2518 systemd_import_fs = executable(
2519 'systemd-import-fs',
2520 systemd_import_fs_sources,
2521 include_directories : includes,
2522 link_with : [libshared],
2523 install_rpath : rootlibexecdir,
2525 install_dir : rootlibexecdir)
2527 systemd_export = executable(
2529 systemd_export_sources,
2530 include_directories : includes,
2531 link_with : [libshared],
2532 dependencies : [libcurl,
2536 install_rpath : rootlibexecdir,
2538 install_dir : rootlibexecdir)
2540 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2543 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2544 public_programs += executable(
2545 'systemd-journal-upload',
2546 systemd_journal_upload_sources,
2547 include_directories : includes,
2548 link_with : [libshared],
2549 dependencies : [versiondep,
2556 install_rpath : rootlibexecdir,
2558 install_dir : rootlibexecdir)
2561 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2562 public_programs += executable(
2563 'systemd-journal-remote',
2564 systemd_journal_remote_sources,
2565 include_directories : includes,
2566 link_with : [libshared,
2567 libsystemd_journal_remote],
2568 dependencies : [threads,
2574 install_rpath : rootlibexecdir,
2576 install_dir : rootlibexecdir)
2578 public_programs += executable(
2579 'systemd-journal-gatewayd',
2580 systemd_journal_gatewayd_sources,
2581 include_directories : includes,
2582 link_with : [libshared],
2583 dependencies : [threads,
2589 install_rpath : rootlibexecdir,
2591 install_dir : rootlibexecdir)
2594 if conf.get('ENABLE_COREDUMP') == 1
2597 systemd_coredump_sources,
2598 include_directories : includes,
2599 link_with : [libshared],
2600 dependencies : [threads,
2606 install_rpath : rootlibexecdir,
2608 install_dir : rootlibexecdir)
2610 public_programs += executable(
2612 coredumpctl_sources,
2613 include_directories : includes,
2614 link_with : [libshared],
2615 dependencies : [threads,
2619 install_rpath : rootlibexecdir,
2623 if conf.get('ENABLE_PSTORE') == 1
2626 systemd_pstore_sources,
2627 include_directories : includes,
2628 link_with : [libshared],
2629 dependencies : [threads,
2635 install_rpath : rootlibexecdir,
2637 install_dir : rootlibexecdir)
2640 if conf.get('ENABLE_BINFMT') == 1
2641 public_programs += executable(
2643 'src/binfmt/binfmt.c',
2644 include_directories : includes,
2645 link_with : [libshared],
2646 install_rpath : rootlibexecdir,
2648 install_dir : rootlibexecdir)
2650 meson.add_install_script('sh', '-c',
2651 mkdir_p.format(binfmtdir))
2652 meson.add_install_script('sh', '-c',
2653 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2656 if conf.get('ENABLE_REPART') == 1
2659 systemd_repart_sources,
2660 include_directories : includes,
2661 link_with : [libshared],
2662 dependencies : [threads,
2667 install_rpath : rootlibexecdir,
2669 install_dir : rootbindir)
2670 public_programs += exe
2672 if want_tests != 'false'
2675 args : exe.full_path())
2679 if conf.get('ENABLE_VCONSOLE') == 1
2681 'systemd-vconsole-setup',
2682 'src/vconsole/vconsole-setup.c',
2683 include_directories : includes,
2684 link_with : [libshared],
2685 install_rpath : rootlibexecdir,
2687 install_dir : rootlibexecdir)
2690 if conf.get('ENABLE_RANDOMSEED') == 1
2692 'systemd-random-seed',
2693 'src/random-seed/random-seed.c',
2694 include_directories : includes,
2695 link_with : [libshared],
2696 install_rpath : rootlibexecdir,
2698 install_dir : rootlibexecdir)
2701 if conf.get('ENABLE_FIRSTBOOT') == 1
2703 'systemd-firstboot',
2704 'src/firstboot/firstboot.c',
2705 include_directories : includes,
2706 link_with : [libshared],
2707 dependencies : [libcrypt],
2708 install_rpath : rootlibexecdir,
2710 install_dir : rootbindir)
2714 'systemd-remount-fs',
2715 'src/remount-fs/remount-fs.c',
2716 include_directories : includes,
2717 link_with : [libcore_shared,
2719 install_rpath : rootlibexecdir,
2721 install_dir : rootlibexecdir)
2724 'systemd-machine-id-setup',
2725 'src/machine-id-setup/machine-id-setup-main.c',
2726 include_directories : includes,
2727 link_with : [libcore_shared,
2729 install_rpath : rootlibexecdir,
2731 install_dir : rootbindir)
2736 include_directories : includes,
2737 link_with : [libshared],
2738 install_rpath : rootlibexecdir,
2740 install_dir : rootlibexecdir)
2742 executable('systemd-growfs',
2743 'src/partition/growfs.c',
2744 include_directories : includes,
2745 link_with : [libshared],
2746 dependencies : [libcryptsetup],
2747 install_rpath : rootlibexecdir,
2749 install_dir : rootlibexecdir)
2753 'src/partition/makefs.c',
2754 include_directories : includes,
2755 link_with : [libshared],
2756 install_rpath : rootlibexecdir,
2758 install_dir : rootlibexecdir)
2762 'src/sleep/sleep.c',
2763 include_directories : includes,
2764 link_with : [libshared],
2765 install_rpath : rootlibexecdir,
2767 install_dir : rootlibexecdir)
2769 install_data('src/sleep/sleep.conf',
2770 install_dir : pkgsysconfdir)
2772 public_programs += executable(
2774 'src/sysctl/sysctl.c',
2775 include_directories : includes,
2776 link_with : [libshared],
2777 install_rpath : rootlibexecdir,
2779 install_dir : rootlibexecdir)
2783 'src/ac-power/ac-power.c',
2784 include_directories : includes,
2785 link_with : [libshared],
2786 install_rpath : rootlibexecdir,
2788 install_dir : rootlibexecdir)
2790 public_programs += executable(
2791 'systemd-detect-virt',
2792 'src/detect-virt/detect-virt.c',
2793 include_directories : includes,
2794 link_with : [libshared],
2795 install_rpath : rootlibexecdir,
2798 public_programs += executable(
2800 'src/delta/delta.c',
2801 include_directories : includes,
2802 link_with : [libshared],
2803 install_rpath : rootlibexecdir,
2806 public_programs += executable(
2808 'src/escape/escape.c',
2809 include_directories : includes,
2810 link_with : [libshared],
2811 install_rpath : rootlibexecdir,
2813 install_dir : rootbindir)
2815 public_programs += executable(
2817 'src/notify/notify.c',
2818 include_directories : includes,
2819 link_with : [libshared],
2820 install_rpath : rootlibexecdir,
2822 install_dir : rootbindir)
2825 'systemd-volatile-root',
2826 'src/volatile-root/volatile-root.c',
2827 include_directories : includes,
2828 link_with : [libshared],
2829 install_rpath : rootlibexecdir,
2830 install : conf.get('ENABLE_INITRD') == 1,
2831 install_dir : rootlibexecdir)
2834 'systemd-cgroups-agent',
2835 'src/cgroups-agent/cgroups-agent.c',
2836 include_directories : includes,
2837 link_with : [libshared],
2838 install_rpath : rootlibexecdir,
2840 install_dir : rootlibexecdir)
2842 public_programs += executable(
2844 'src/id128/id128.c',
2845 include_directories : includes,
2846 link_with : [libshared],
2847 install_rpath : rootlibexecdir,
2850 public_programs += executable(
2853 include_directories : includes,
2854 link_with : [libshared],
2855 install_rpath : rootlibexecdir,
2858 public_programs += executable(
2859 'systemd-ask-password',
2860 'src/ask-password/ask-password.c',
2861 include_directories : includes,
2862 link_with : [libshared],
2863 install_rpath : rootlibexecdir,
2865 install_dir : rootbindir)
2868 'systemd-reply-password',
2869 'src/reply-password/reply-password.c',
2870 include_directories : includes,
2871 link_with : [libshared],
2872 install_rpath : rootlibexecdir,
2874 install_dir : rootlibexecdir)
2876 public_programs += executable(
2877 'systemd-tty-ask-password-agent',
2878 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2879 include_directories : includes,
2880 link_with : [libshared],
2881 install_rpath : rootlibexecdir,
2883 install_dir : rootbindir)
2885 public_programs += executable(
2888 include_directories : includes,
2889 link_with : [libshared],
2890 install_rpath : rootlibexecdir,
2893 public_programs += executable(
2895 'src/cgtop/cgtop.c',
2896 include_directories : includes,
2897 link_with : [libshared],
2898 install_rpath : rootlibexecdir,
2903 'src/initctl/initctl.c',
2904 include_directories : includes,
2905 link_with : [libshared],
2906 install_rpath : rootlibexecdir,
2907 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
2908 install_dir : rootlibexecdir)
2910 public_programs += executable(
2912 'src/mount/mount-tool.c',
2913 include_directories : includes,
2914 link_with : [libshared],
2915 dependencies: [libmount],
2916 install_rpath : rootlibexecdir,
2919 meson.add_install_script(meson_make_symlink,
2920 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2922 public_programs += executable(
2925 include_directories : includes,
2926 link_with : [libshared],
2927 install_rpath : rootlibexecdir,
2930 public_programs += executable(
2931 'systemd-stdio-bridge',
2932 'src/stdio-bridge/stdio-bridge.c',
2933 include_directories : includes,
2934 link_with : [libshared],
2935 dependencies : [versiondep],
2936 install_rpath : rootlibexecdir,
2939 public_programs += executable(
2941 'src/busctl/busctl.c',
2942 'src/busctl/busctl-introspect.c',
2943 'src/busctl/busctl-introspect.h',
2944 include_directories : includes,
2945 link_with : [libshared],
2946 install_rpath : rootlibexecdir,
2949 if conf.get('ENABLE_SYSUSERS') == 1
2950 public_programs += executable(
2952 'src/sysusers/sysusers.c',
2953 include_directories : includes,
2954 link_with : [libshared],
2955 install_rpath : rootlibexecdir,
2957 install_dir : rootbindir)
2959 if have_standalone_binaries
2960 public_programs += executable(
2961 'systemd-sysusers.standalone',
2962 'src/sysusers/sysusers.c',
2963 include_directories : includes,
2964 link_with : [libshared_static,
2970 install_dir : rootbindir)
2974 if conf.get('ENABLE_TMPFILES') == 1
2977 systemd_tmpfiles_sources,
2978 include_directories : includes,
2979 link_with : [libshared],
2980 dependencies : [libacl],
2981 install_rpath : rootlibexecdir,
2983 install_dir : rootbindir)
2984 public_programs += exe
2986 if want_tests != 'false'
2987 test('test-systemd-tmpfiles',
2988 test_systemd_tmpfiles_py,
2989 # https://github.com/mesonbuild/meson/issues/2681
2990 args : exe.full_path())
2993 if have_standalone_binaries
2994 public_programs += executable(
2995 'systemd-tmpfiles.standalone',
2996 systemd_tmpfiles_sources,
2997 include_directories : includes,
2998 link_with : [libshared_static,
3003 dependencies : [libacl],
3005 install_dir : rootbindir)
3009 if conf.get('ENABLE_HWDB') == 1
3010 public_programs += executable(
3013 'src/libsystemd/sd-hwdb/hwdb-internal.h',
3014 include_directories : includes,
3015 link_with : [libudev_static],
3016 install_rpath : udev_rpath,
3018 install_dir : rootbindir)
3021 if conf.get('ENABLE_QUOTACHECK') == 1
3023 'systemd-quotacheck',
3024 'src/quotacheck/quotacheck.c',
3025 include_directories : includes,
3026 link_with : [libshared],
3027 install_rpath : rootlibexecdir,
3029 install_dir : rootlibexecdir)
3032 public_programs += executable(
3033 'systemd-socket-proxyd',
3034 'src/socket-proxy/socket-proxyd.c',
3035 include_directories : includes,
3036 link_with : [libshared],
3037 dependencies : [threads],
3038 install_rpath : rootlibexecdir,
3040 install_dir : rootlibexecdir)
3042 public_programs += executable(
3045 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
3046 include_directories : includes,
3047 link_with : [libudev_core,
3050 dependencies : [versiondep,
3056 install_rpath : udev_rpath,
3058 install_dir : rootbindir)
3062 systemd_shutdown_sources,
3063 include_directories : includes,
3064 link_with : [libcore_shared,
3066 dependencies : [libmount],
3067 install_rpath : rootlibexecdir,
3069 install_dir : rootlibexecdir)
3072 'systemd-update-done',
3073 'src/update-done/update-done.c',
3074 include_directories : includes,
3075 link_with : [libshared],
3076 install_rpath : rootlibexecdir,
3078 install_dir : rootlibexecdir)
3081 'systemd-update-utmp',
3082 'src/update-utmp/update-utmp.c',
3083 include_directories : includes,
3084 link_with : [libshared],
3085 dependencies : [libaudit],
3086 install_rpath : rootlibexecdir,
3087 install : (conf.get('ENABLE_UTMP') == 1),
3088 install_dir : rootlibexecdir)
3090 if conf.get('HAVE_KMOD') == 1
3092 'systemd-modules-load',
3093 'src/modules-load/modules-load.c',
3094 include_directories : includes,
3095 link_with : [libshared],
3096 dependencies : [libkmod],
3097 install_rpath : rootlibexecdir,
3099 install_dir : rootlibexecdir)
3101 meson.add_install_script('sh', '-c',
3102 mkdir_p.format(modulesloaddir))
3103 meson.add_install_script('sh', '-c',
3104 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
3107 public_programs += executable(
3109 systemd_nspawn_sources,
3110 include_directories : includes,
3111 link_with : [libcore_shared,
3114 dependencies : [libblkid,
3116 install_rpath : rootlibexecdir,
3119 if conf.get('ENABLE_NETWORKD') == 1
3122 systemd_networkd_sources,
3123 include_directories : network_include_dir,
3124 link_with : [libnetworkd_core,
3127 networkd_link_with],
3128 dependencies : [threads],
3129 install_rpath : rootlibexecdir,
3131 install_dir : rootlibexecdir)
3134 'systemd-networkd-wait-online',
3135 systemd_networkd_wait_online_sources,
3136 include_directories : includes,
3137 link_with : [libnetworkd_core,
3138 networkd_link_with],
3139 install_rpath : rootlibexecdir,
3141 install_dir : rootlibexecdir)
3143 public_programs += executable(
3146 include_directories : includes,
3147 link_with : [libsystemd_network,
3148 networkd_link_with],
3149 install_rpath : rootlibexecdir,
3151 install_dir : rootbindir)
3154 'systemd-network-generator',
3155 network_generator_sources,
3156 include_directories : includes,
3157 link_with : [networkd_link_with],
3158 install_rpath : rootlibexecdir,
3160 install_dir : rootlibexecdir)
3162 if want_tests != 'false'
3163 test('test-network-generator-conversion',
3164 test_network_generator_conversion_sh,
3165 # https://github.com/mesonbuild/meson/issues/2681
3166 args : exe.full_path())
3171 'systemd-sulogin-shell',
3172 ['src/sulogin-shell/sulogin-shell.c'],
3173 include_directories : includes,
3174 link_with : [libshared],
3175 install_rpath : rootlibexecdir,
3177 install_dir : rootlibexecdir)
3179 ############################################################
3182 'systemd-runtest.env',
3183 output : 'systemd-runtest.env',
3184 command : ['sh', '-c', '{ ' +
3185 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
3186 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
3188 build_by_default : true)
3190 foreach tuple : tests
3192 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3193 dependencies = tuple[2]
3194 condition = tuple.length() >= 4 ? tuple[3] : ''
3195 type = tuple.length() >= 5 ? tuple[4] : ''
3196 defs = tuple.length() >= 6 ? tuple[5] : []
3197 incs = tuple.length() >= 7 ? tuple[6] : includes
3200 name = sources[0].split('/')[-1].split('.')[0]
3201 if type.startswith('timeout=')
3202 timeout = type.split('=')[1].to_int()
3206 if condition == '' or conf.get(condition) == 1
3210 include_directories : incs,
3211 link_with : link_with,
3212 dependencies : [versiondep,
3215 build_by_default : want_tests != 'false',
3216 install_rpath : rootlibexecdir,
3217 install : install_tests,
3218 install_dir : join_paths(testsdir, type))
3221 message('@0@ is a manual test'.format(name))
3222 elif type == 'unsafe' and want_tests != 'unsafe'
3223 message('@0@ is an unsafe test'.format(name))
3224 elif want_tests != 'false'
3230 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3235 'test-libsystemd-sym',
3236 test_libsystemd_sym_c,
3237 include_directories : includes,
3238 link_with : [libsystemd],
3239 build_by_default : want_tests != 'false',
3240 install : install_tests,
3241 install_dir : testsdir)
3242 if want_tests != 'false'
3243 test('test-libsystemd-sym', exe)
3247 'test-libsystemd-static-sym',
3248 test_libsystemd_sym_c,
3249 include_directories : includes,
3250 link_with : [install_libsystemd_static],
3251 dependencies : [threads], # threads is already included in dependencies on the library,
3252 # but does not seem to get propagated. Add here as a work-around.
3253 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3254 install : install_tests and static_libsystemd_pic,
3255 install_dir : testsdir)
3256 if want_tests != 'false' and static_libsystemd_pic
3257 test('test-libsystemd-static-sym', exe)
3263 include_directories : includes,
3264 c_args : '-Wno-deprecated-declarations',
3265 link_with : [libudev],
3266 build_by_default : want_tests != 'false',
3267 install : install_tests,
3268 install_dir : testsdir)
3269 if want_tests != 'false'
3270 test('test-libudev-sym', exe)
3274 'test-libudev-static-sym',
3276 include_directories : includes,
3277 c_args : '-Wno-deprecated-declarations',
3278 link_with : [install_libudev_static],
3279 build_by_default : want_tests != 'false' and static_libudev_pic,
3280 install : install_tests and static_libudev_pic,
3281 install_dir : testsdir)
3282 if want_tests != 'false' and static_libudev_pic
3283 test('test-libudev-static-sym', exe)
3286 ############################################################
3290 if get_option('tests') != 'false'
3291 foreach tuple : fuzzers
3293 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3294 dependencies = tuple[2]
3295 defs = tuple.length() >= 4 ? tuple[3] : []
3296 incs = tuple.length() >= 5 ? tuple[4] : includes
3300 dependencies += fuzzing_engine
3302 if fuzzing_engine.found()
3303 dependencies += fuzzing_engine
3305 link_args += ['-fsanitize=fuzzer']
3308 sources += 'src/fuzz/fuzz-main.c'
3311 name = sources[0].split('/')[-1].split('.')[0]
3313 fuzzer_exes += executable(
3316 include_directories : [incs, include_directories('src/fuzz')],
3317 link_with : link_with,
3318 dependencies : dependencies,
3320 link_args: link_args,
3327 depends : fuzzer_exes,
3330 ############################################################
3332 make_directive_index_py = find_program('tools/make-directive-index.py')
3333 make_man_index_py = find_program('tools/make-man-index.py')
3334 xml_helper_py = find_program('tools/xml_helper.py')
3335 hwdb_update_sh = find_program('tools/hwdb-update.sh')
3336 autosuspend_update_sh = find_program('tools/autosuspend-update.sh')
3339 subdir('sysusers.d')
3340 subdir('tmpfiles.d')
3346 subdir('shell-completion/bash')
3347 subdir('shell-completion/zsh')
3348 subdir('docs/sysvinit')
3349 subdir('docs/var-log')
3351 install_subdir('factory/etc',
3352 install_dir : factorydir)
3354 install_data('xorg/50-systemd-user.sh',
3355 install_dir : xinitrcdir)
3356 install_data('modprobe.d/systemd.conf',
3357 install_dir : modprobedir)
3358 install_data('LICENSE.GPL2',
3362 'docs/CODING_STYLE.md',
3363 'docs/DISTRO_PORTING.md',
3364 'docs/ENVIRONMENT.md',
3366 'docs/TRANSIENT-SETTINGS.md',
3367 'docs/TRANSLATORS.md',
3368 'docs/UIDS-GIDS.md',
3369 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3370 install_dir : docdir)
3372 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3373 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3375 ############################################################
3377 check_help = find_program('tools/check-help.sh')
3379 foreach exec : public_programs
3380 name = exec.full_path().split('/')[-1]
3381 if want_tests != 'false'
3382 test('check-help-' + name,
3384 args : exec.full_path())
3388 ############################################################
3390 check_directives_sh = find_program('tools/check-directives.sh')
3392 if want_tests != 'false'
3393 test('check-directives',
3394 check_directives_sh,
3395 args : project_source_root)
3398 ############################################################
3400 # Enable tests for all supported sanitizers
3401 foreach tuple : sanitizers
3402 sanitizer = tuple[0]
3405 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3407 foreach p : fuzz_regression_tests
3408 b = p.split('/')[-2]
3409 c = p.split('/')[-1]
3411 name = '@0@:@1@'.format(b, sanitizer)
3414 if want_tests == 'false'
3415 message('Not compiling @0@ because tests is set to false'.format(name))
3416 elif slow_tests or fuzz_tests
3417 exe = custom_target(
3421 command : [env, 'ln', '-fs',
3422 join_paths(build.full_path(), b),
3424 build_by_default : true)
3426 message('Not compiling @0@ because slow-tests/fuzz-tests is set to false'.format(name))
3431 if want_tests != 'false' and (slow_tests or fuzz_tests)
3432 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3434 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
3436 args : [exe.full_path(),
3437 join_paths(project_source_root, p)])
3444 ############################################################
3447 all_files = run_command(
3449 ['--git-dir=@0@/.git'.format(project_source_root),
3452 all_files = files(all_files.stdout().split())
3457 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3460 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3464 git_contrib_sh = find_program('tools/git-contrib.sh')
3467 command : [git_contrib_sh])
3471 git_head = run_command(
3473 ['--git-dir=@0@/.git'.format(project_source_root),
3474 'rev-parse', 'HEAD']).stdout().strip()
3475 git_head_short = run_command(
3477 ['--git-dir=@0@/.git'.format(project_source_root),
3478 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3482 command : ['git', 'archive',
3483 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3485 '--prefix', 'systemd-@0@/'.format(git_head),
3489 ############################################################
3491 check_api_docs_sh = find_program('tools/check-api-docs.sh')
3494 depends : [man, libsystemd, libudev],
3495 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3497 ############################################################
3498 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3501 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3503 'split /usr: @0@'.format(split_usr),
3504 'split bin-sbin: @0@'.format(split_bin),
3505 'prefix directory: @0@'.format(prefixdir),
3506 'rootprefix directory: @0@'.format(rootprefixdir),
3507 'sysconf directory: @0@'.format(sysconfdir),
3508 'include directory: @0@'.format(includedir),
3509 'lib directory: @0@'.format(libdir),
3510 'rootlib directory: @0@'.format(rootlibdir),
3511 'SysV init scripts: @0@'.format(sysvinit_path),
3512 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3513 'PAM modules directory: @0@'.format(pamlibdir),
3514 'PAM configuration directory: @0@'.format(pamconfdir),
3515 'RPM macros directory: @0@'.format(rpmmacrosdir),
3516 'modprobe.d directory: @0@'.format(modprobedir),
3517 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3518 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3519 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3520 'bash completions directory: @0@'.format(bashcompletiondir),
3521 'zsh completions directory: @0@'.format(zshcompletiondir),
3522 'extra start script: @0@'.format(get_option('rc-local')),
3523 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3524 get_option('debug-tty')),
3525 'TTY GID: @0@'.format(tty_gid),
3526 'users GID: @0@'.format(substs.get('USERS_GID')),
3527 'maximum system UID: @0@'.format(system_uid_max),
3528 'maximum system GID: @0@'.format(system_gid_max),
3529 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3530 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3531 'minimum container UID base: @0@'.format(container_uid_base_min),
3532 'maximum container UID base: @0@'.format(container_uid_base_max),
3533 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3534 'render group access mode: @0@'.format(get_option('group-render-mode')),
3535 'certificate root directory: @0@'.format(get_option('certificate-root')),
3536 'support URL: @0@'.format(support_url),
3537 'nobody user name: @0@'.format(nobody_user),
3538 'nobody group name: @0@'.format(nobody_group),
3539 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3540 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3542 'default DNSSEC mode: @0@'.format(default_dnssec),
3543 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3544 'default mDNS mode: @0@'.format(default_mdns),
3545 'default LLMNR mode: @0@'.format(default_llmnr),
3546 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3547 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3548 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3549 'default locale: @0@'.format(default_locale),
3550 'default user $PATH: @0@'.format(default_user_path_display),
3551 'systemd service watchdog: @0@'.format(watchdog_opt)]
3553 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3554 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3556 'default DNS servers: @0@'.format(alt_dns_servers),
3557 'default NTP servers: @0@'.format(alt_ntp_servers)]
3559 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3560 '@@0@'.format(time_epoch)).stdout().strip()
3562 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3565 'static libsystemd: @0@'.format(static_libsystemd),
3566 'static libudev: @0@'.format(static_libudev)]
3569 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3570 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3571 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3573 if conf.get('ENABLE_EFI') == 1
3574 status += 'efi arch: @0@'.format(efi_arch)
3578 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3579 'EFI CC @0@'.format(' '.join(efi_cc)),
3580 'EFI lds: @0@'.format(efi_lds),
3581 'EFI crt0: @0@'.format(efi_crt0),
3582 'EFI include directory: @0@'.format(efi_incdir)]
3644 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3645 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3649 ['legacy pkla', install_polkit_pkla],
3651 ['gnu-efi', have_gnu_efi],
3664 ['man pages', want_man],
3665 ['html pages', want_html],
3666 ['man page indices', want_man and have_lxml],
3671 ['adm group', get_option('adm-group')],
3672 ['wheel group', get_option('wheel-group')],
3675 ['debug mmap cache'],
3677 ['valgrind', conf.get('VALGRIND') == 1],
3678 ['trace logging', conf.get('LOG_TRACE') == 1],
3679 ['install tests', install_tests],
3680 ['link-udev-shared', get_option('link-udev-shared')],
3681 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3682 ['link-networkd-shared', get_option('link-networkd-shared')],
3683 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3684 ['kernel-install', get_option('kernel-install')],
3685 ['systemd-analyze', conf.get('ENABLE_ANALYZE') == 1],
3688 if tuple.length() >= 2
3691 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3692 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3693 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3704 'enabled features: @0@'.format(', '.join(found)),
3706 'disabled features: @0@'.format(', '.join(missing)),
3708 message('\n '.join(status))
3710 if rootprefixdir != rootprefix_default
3712 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3713 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3714 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))