1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
13 meson_version : '>= 0.46',
16 libsystemd_version = '0.29.0'
17 libudev_version = '1.7.0'
19 # We need the same data in two different formats, ugh!
20 # Also, for hysterical reasons, we use different variable
21 # names, sometimes. Not all variables are included in every
23 conf = configuration_data()
24 conf.set('PROJECT_VERSION', meson.project_version(),
25 description : 'Numerical project version (used where a simple number is expected)')
27 substs = configuration_data()
28 substs.set('PROJECT_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
29 substs.set('PROJECT_VERSION', meson.project_version(),
30 description : 'Numerical project version (used where a simple number is expected)')
32 # This is to be used instead of meson.source_root(), as the latter will return
33 # the wrong result when systemd is being built as a meson subproject
34 project_source_root = meson.current_source_dir()
35 project_build_root = meson.current_build_dir()
36 relative_source_path = run_command('realpath',
37 '--relative-to=@0@'.format(project_build_root),
38 project_source_root).stdout().strip()
39 conf.set_quoted('RELATIVE_SOURCE_PATH', relative_source_path)
41 conf.set10('DEVELOPER_MODE', get_option('mode') == 'developer',
42 description : 'enable additional checks only suitable in development')
44 want_ossfuzz = get_option('oss-fuzz')
45 want_libfuzzer = get_option('llvm-fuzz')
46 if want_ossfuzz + want_libfuzzer > 1
47 error('only one of oss-fuzz or llvm-fuzz can be specified')
50 skip_deps = want_ossfuzz or want_libfuzzer
51 fuzzer_build = want_ossfuzz or want_libfuzzer
53 #####################################################################
55 # Try to install the git pre-commit hook
56 add_git_hook_sh = find_program('tools/add-git-hook.sh', required : false)
57 if add_git_hook_sh.found()
58 git_hook = run_command(add_git_hook_sh)
59 if git_hook.returncode() == 0
60 message(git_hook.stdout().strip())
64 #####################################################################
66 if get_option('split-usr') == 'auto'
67 split_usr = run_command('test', '-L', '/bin').returncode() != 0
69 split_usr = get_option('split-usr') == 'true'
71 conf.set10('HAVE_SPLIT_USR', split_usr,
72 description : '/usr/bin and /bin directories are separate')
74 if get_option('split-bin') == 'auto'
75 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
77 split_bin = get_option('split-bin') == 'true'
79 conf.set10('HAVE_SPLIT_BIN', split_bin,
80 description : 'bin and sbin directories are separate')
82 rootprefixdir = get_option('rootprefix')
83 # Unusual rootprefixdir values are used by some distros
84 # (see https://github.com/systemd/systemd/pull/7461).
85 rootprefix_default = split_usr ? '/' : '/usr'
86 if rootprefixdir == ''
87 rootprefixdir = rootprefix_default
89 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
91 have_standalone_binaries = get_option('standalone-binaries')
93 sysvinit_path = get_option('sysvinit-path')
94 sysvrcnd_path = get_option('sysvrcnd-path')
95 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
96 description : 'SysV init scripts and rcN.d links are supported')
98 if get_option('hibernate') and not get_option('initrd')
99 error('hibernate depends on initrd')
102 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
103 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
104 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
106 # join_paths ignores the preceding arguments if an absolute component is
107 # encountered, so this should canonicalize various paths when they are
108 # absolute or relative.
109 prefixdir = get_option('prefix')
110 if not prefixdir.startswith('/')
111 error('Prefix is not absolute: "@0@"'.format(prefixdir))
113 bindir = join_paths(prefixdir, get_option('bindir'))
114 libdir = join_paths(prefixdir, get_option('libdir'))
115 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
116 includedir = join_paths(prefixdir, get_option('includedir'))
117 datadir = join_paths(prefixdir, get_option('datadir'))
118 localstatedir = join_paths('/', get_option('localstatedir'))
120 rootbindir = join_paths(rootprefixdir, 'bin')
121 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
122 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
124 rootlibdir = get_option('rootlibdir')
126 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
129 # Dirs of external packages
130 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
131 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
132 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
133 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
134 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
135 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
136 rpmmacrosdir = get_option('rpmmacrosdir')
137 if rpmmacrosdir != 'no'
138 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
140 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
143 pkgdatadir = join_paths(datadir, 'systemd')
144 environmentdir = join_paths(prefixdir, 'lib/environment.d')
145 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
146 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
147 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
148 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
149 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
150 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
151 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
152 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
153 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
154 pkgincludedir = join_paths(includedir, 'systemd')
155 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
156 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
157 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
158 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
159 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
160 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
161 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
162 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
163 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
164 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
165 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
166 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
167 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
168 factorydir = join_paths(datadir, 'factory')
169 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
170 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
171 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
172 catalogstatedir = join_paths(systemdstatedir, 'catalog')
173 randomseeddir = join_paths(localstatedir, 'lib/systemd')
174 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
175 ntpservicelistdir = join_paths(rootprefixdir, 'lib/systemd/ntp-units.d')
177 docdir = get_option('docdir')
179 docdir = join_paths(datadir, 'doc/systemd')
182 dbuspolicydir = get_option('dbuspolicydir')
183 if dbuspolicydir == ''
184 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
187 dbussessionservicedir = get_option('dbussessionservicedir')
188 if dbussessionservicedir == ''
189 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
192 dbussystemservicedir = get_option('dbussystemservicedir')
193 if dbussystemservicedir == ''
194 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
197 pamlibdir = get_option('pamlibdir')
199 pamlibdir = join_paths(rootlibdir, 'security')
202 pamconfdir = get_option('pamconfdir')
204 pamconfdir = join_paths(prefixdir, 'lib/pam.d')
207 memory_accounting_default = get_option('memory-accounting-default')
208 status_unit_format_default = get_option('status-unit-format-default')
210 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
211 conf.set_quoted('SYSTEM_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'system'))
212 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
213 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
214 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
215 conf.set_quoted('RC_LOCAL_PATH', get_option('rc-local'))
217 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
219 conf.set_quoted('USER_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'user'))
220 conf.set_quoted('USER_DATA_UNIT_DIR', userunitdir)
221 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
222 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
223 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
224 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
225 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
226 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
227 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
228 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
229 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
230 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
231 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
232 conf.set_quoted('ROOTPREFIX', rootprefixdir)
233 conf.set_quoted('ROOTPREFIX_NOSLASH', rootprefixdir_noslash)
234 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
235 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
236 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
237 conf.set_quoted('SYSTEM_GENERATOR_DIR', systemgeneratordir)
238 conf.set_quoted('USER_GENERATOR_DIR', usergeneratordir)
239 conf.set_quoted('SYSTEM_ENV_GENERATOR_DIR', systemenvgeneratordir)
240 conf.set_quoted('USER_ENV_GENERATOR_DIR', userenvgeneratordir)
241 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
242 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
243 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
244 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
245 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
246 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
247 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
248 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
249 conf.set_quoted('LIBDIR', libdir)
250 conf.set_quoted('ROOTLIBDIR', rootlibdir)
251 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
252 conf.set_quoted('BOOTLIBDIR', bootlibdir)
253 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
254 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
255 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
256 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
257 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
258 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
259 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
260 conf.set_quoted('SYSTEMD_HOMEWORK_PATH', join_paths(rootlibexecdir, 'systemd-homework'))
261 conf.set_quoted('SYSTEMD_USERWORK_PATH', join_paths(rootlibexecdir, 'systemd-userwork'))
262 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
263 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
264 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
266 substs.set('prefix', prefixdir)
267 substs.set('rootprefix', rootprefixdir)
268 substs.set('rootprefix_noslash', rootprefixdir_noslash)
269 substs.set('exec_prefix', prefixdir)
270 substs.set('libdir', libdir)
271 substs.set('rootlibdir', rootlibdir)
272 substs.set('includedir', includedir)
273 substs.set('sysconfdir', sysconfdir)
274 substs.set('bindir', bindir)
275 substs.set('rootbindir', rootbindir)
276 substs.set('rootlibexecdir', rootlibexecdir)
277 substs.set('systemunitdir', systemunitdir)
278 substs.set('userunitdir', userunitdir)
279 substs.set('systempresetdir', systempresetdir)
280 substs.set('userpresetdir', userpresetdir)
281 substs.set('udevhwdbdir', udevhwdbdir)
282 substs.set('udevrulesdir', udevrulesdir)
283 substs.set('udevlibexecdir', udevlibexecdir)
284 substs.set('environmentdir', environmentdir)
285 substs.set('catalogdir', catalogdir)
286 substs.set('tmpfilesdir', tmpfilesdir)
287 substs.set('sysusersdir', sysusersdir)
288 substs.set('sysctldir', sysctldir)
289 substs.set('binfmtdir', binfmtdir)
290 substs.set('modulesloaddir', modulesloaddir)
291 substs.set('modprobedir', modprobedir)
292 substs.set('systemgeneratordir', systemgeneratordir)
293 substs.set('usergeneratordir', usergeneratordir)
294 substs.set('systemenvgeneratordir', systemenvgeneratordir)
295 substs.set('userenvgeneratordir', userenvgeneratordir)
296 substs.set('systemshutdowndir', systemshutdowndir)
297 substs.set('systemsleepdir', systemsleepdir)
298 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
299 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
300 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
301 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
302 substs.set('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
303 substs.set('RC_LOCAL_PATH', get_option('rc-local'))
304 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
305 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
306 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
307 substs.set('BUILD_ROOT', project_build_root)
309 #####################################################################
311 cc = meson.get_compiler('c')
312 pkgconfig = import('pkgconfig')
313 check_compilation_sh = find_program('tools/check-compilation.sh')
314 meson_build_sh = find_program('tools/meson-build.sh')
316 want_tests = get_option('tests')
317 slow_tests = want_tests != 'false' and get_option('slow-tests')
318 fuzz_tests = want_tests != 'false' and get_option('fuzz-tests')
319 install_tests = get_option('install-tests')
321 if add_languages('cpp', required : fuzzer_build)
322 # Used only for tests
323 cxx = meson.get_compiler('cpp')
324 cxx_cmd = ' '.join(cxx.cmd_array())
330 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
331 if fuzzing_engine.found()
332 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
333 elif cc.has_argument('-fsanitize=fuzzer-no-link')
334 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
336 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
339 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
342 # Those generate many false positives, and we do not want to change the code to
344 basic_disabled_warnings = [
345 '-Wno-unused-parameter',
346 '-Wno-missing-field-initializers',
347 '-Wno-unused-result',
348 '-Wno-format-signedness',
351 possible_cc_flags = [
354 '-Wmissing-include-dirs',
355 '-Wold-style-definition',
359 '-Wsuggest-attribute=noreturn',
360 '-Werror=missing-prototypes',
361 '-Werror=implicit-function-declaration',
362 '-Werror=missing-declarations',
363 '-Werror=return-type',
364 '-Werror=incompatible-pointer-types',
366 '-Wstrict-prototypes',
368 '-Wmissing-noreturn',
369 '-Wimplicit-fallthrough=5',
372 '-Wstrict-aliasing=2',
375 '-Werror=shift-count-overflow',
376 '-Werror=shift-overflow=2',
380 # negative arguments are correctly detected starting with meson 0.46.
381 '-Wno-error=#warnings', # clang
382 '-Wno-string-plus-int', # clang
384 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
385 # optimizations enabled, producing essentially false positives.
386 '-Wno-maybe-uninitialized',
390 '-fdiagnostics-show-option',
391 '-fno-strict-aliasing',
392 '-fvisibility=hidden',
394 '-fstack-protector-strong',
395 '--param=ssp-buffer-size=4',
398 # --as-needed and --no-undefined are provided by meson by default,
399 # run mesonconf to see what is enabled
400 possible_link_flags = [
406 if cc.get_id() == 'clang'
407 possible_cc_flags += [
408 '-Wno-typedef-redefinition',
409 '-Wno-gnu-variable-sized-type-not-at-end',
413 if get_option('buildtype') != 'debug'
414 possible_cc_flags += [
415 '-ffunction-sections',
419 possible_link_flags += '-Wl,--gc-sections'
422 add_project_arguments(cc.get_supported_arguments(basic_disabled_warnings), language : 'c')
423 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
424 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
426 have = cc.has_argument('-Wzero-length-bounds')
427 conf.set10('HAVE_ZERO_LENGTH_BOUNDS', have)
431 #include <inttypes.h>
432 typedef uint64_t usec_t;
433 usec_t now(clockid_t clock);
438 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
439 add_project_arguments('-Werror=shadow', language : 'c')
443 add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp')
446 cpp = ' '.join(cc.cmd_array()) + ' -E'
448 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
450 #####################################################################
451 # compilation result tests
453 conf.set('_GNU_SOURCE', true)
454 conf.set('__SANE_USERSPACE_TYPES__', true)
455 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
457 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
458 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
459 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
460 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
464 #include <sys/stat.h>
467 foreach decl : ['char16_t',
472 # We get -1 if the size cannot be determined
473 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
475 if decl == 'struct statx'
477 want_linux_stat_h = false
479 have = cc.sizeof(decl,
480 prefix : decl_headers + '#include <linux/stat.h>',
481 args : '-D_GNU_SOURCE') > 0
482 want_linux_stat_h = have
486 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
489 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
491 foreach ident : ['secure_getenv', '__secure_getenv']
492 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
496 ['memfd_create', '''#include <sys/mman.h>'''],
497 ['gettid', '''#include <sys/types.h>
498 #include <unistd.h>'''],
499 ['pivot_root', '''#include <stdlib.h>
500 #include <unistd.h>'''], # no known header declares pivot_root
501 ['name_to_handle_at', '''#include <sys/types.h>
502 #include <sys/stat.h>
503 #include <fcntl.h>'''],
504 ['setns', '''#include <sched.h>'''],
505 ['renameat2', '''#include <stdio.h>
506 #include <fcntl.h>'''],
507 ['kcmp', '''#include <linux/kcmp.h>'''],
508 ['keyctl', '''#include <sys/types.h>
509 #include <keyutils.h>'''],
510 ['copy_file_range', '''#include <sys/syscall.h>
511 #include <unistd.h>'''],
512 ['bpf', '''#include <sys/syscall.h>
513 #include <unistd.h>'''],
514 ['statx', '''#include <sys/types.h>
515 #include <sys/stat.h>
516 #include <unistd.h>'''],
517 ['explicit_bzero' , '''#include <string.h>'''],
518 ['reallocarray', '''#include <malloc.h>'''],
519 ['set_mempolicy', '''#include <stdlib.h>
520 #include <unistd.h>'''],
521 ['get_mempolicy', '''#include <stdlib.h>
522 #include <unistd.h>'''],
523 ['pidfd_send_signal', '''#include <stdlib.h>
526 #include <sys/wait.h>'''],
527 ['pidfd_open', '''#include <stdlib.h>
530 #include <sys/wait.h>'''],
531 ['rt_sigqueueinfo', '''#include <stdlib.h>
534 #include <sys/wait.h>'''],
537 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
538 conf.set10('HAVE_' + ident[0].to_upper(), have)
541 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
542 conf.set10('USE_SYS_RANDOM_H', true)
543 conf.set10('HAVE_GETRANDOM', true)
545 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
546 conf.set10('USE_SYS_RANDOM_H', false)
547 conf.set10('HAVE_GETRANDOM', have)
550 #####################################################################
552 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
554 get_option('version-tag'),
555 meson.project_version()]
558 input : 'src/version/version.h.in',
559 output : 'version.h',
562 versiondep = declare_dependency(sources: version_h)
564 sed = find_program('sed')
565 awk = find_program('awk')
566 m4 = find_program('m4')
567 stat = find_program('stat')
568 git = find_program('git', required : false)
569 env = find_program('env')
570 perl = find_program('perl', required : false)
572 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
573 mkdir_p = 'mkdir -p $DESTDIR/@0@'
574 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
575 splash_bmp = files('test/splash.bmp')
577 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
578 # /usr/sbin, /sbin, and fall back to the default from middle column.
579 progs = [['quotaon', '/usr/sbin/quotaon' ],
580 ['quotacheck', '/usr/sbin/quotacheck' ],
581 ['kmod', '/usr/bin/kmod' ],
582 ['kexec', '/usr/sbin/kexec' ],
583 ['sulogin', '/usr/sbin/sulogin' ],
584 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
585 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
586 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
587 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
588 ['nologin', '/usr/sbin/nologin', ],
591 path = get_option(prog[0] + '-path')
593 message('Using @1@ for @0@'.format(prog[0], path))
595 exe = find_program(prog[0],
596 '/usr/sbin/' + prog[0],
599 path = exe.found() ? exe.path() : prog[1]
601 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
602 conf.set_quoted(name, path)
603 substs.set(name, path)
606 conf.set_quoted('TELINIT', get_option('telinit-path'))
608 if run_command('ln', '--relative', '--help').returncode() != 0
609 error('ln does not support --relative (added in coreutils 8.16)')
612 ############################################################
614 gperf = find_program('gperf')
616 gperf_test_format = '''
618 const char * in_word_set(const char *, @0@);
621 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
622 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
623 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
624 if cc.compiles(gperf_test)
625 gperf_len_type = 'size_t'
627 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
628 if cc.compiles(gperf_test)
629 gperf_len_type = 'unsigned'
631 error('unable to determine gperf len type')
634 message('gperf len type is @0@'.format(gperf_len_type))
635 conf.set('GPERF_LEN_TYPE', gperf_len_type,
636 description : 'The type of gperf "len" parameter')
638 ############################################################
640 if not cc.has_header('sys/capability.h')
641 error('POSIX caps headers not found')
643 foreach header : ['crypt.h',
645 'linux/vm_sockets.h',
647 'valgrind/memcheck.h',
648 'valgrind/valgrind.h',
651 conf.set10('HAVE_' + header.underscorify().to_upper(),
652 cc.has_header(header))
655 ############################################################
657 fallback_hostname = get_option('fallback-hostname')
658 if fallback_hostname == '' or fallback_hostname[0] == '.' or fallback_hostname[0] == '-'
659 error('Invalid fallback-hostname configuration')
660 # A more extensive test is done in test-hostname-util. Let's catch
661 # the most obvious errors here so we don't fail with an assert later.
663 conf.set_quoted('FALLBACK_HOSTNAME', fallback_hostname)
665 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
666 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
668 default_hierarchy = get_option('default-hierarchy')
669 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
670 description : 'default cgroup hierarchy as string')
671 if default_hierarchy == 'legacy'
672 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
673 elif default_hierarchy == 'hybrid'
674 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
676 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
679 default_net_naming_scheme = get_option('default-net-naming-scheme')
680 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
682 time_epoch = get_option('time-epoch')
684 time_epoch = run_command('sh', ['-c', 'echo "$SOURCE_DATE_EPOCH"']).stdout().strip()
685 if time_epoch == '' and git.found() and run_command('test', '-e', '.git').returncode() == 0
686 # If we're in a git repository, use the creation time of the latest git tag.
687 latest_tag = run_command('git', 'describe', '--abbrev=0', '--tags').stdout().strip()
688 time_epoch = run_command('git', 'log', '-1', '--format=%at', latest_tag).stdout()
692 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
694 time_epoch = time_epoch.to_int()
696 conf.set('TIME_EPOCH', time_epoch)
698 foreach tuple : [['system-alloc-uid-min', 'SYS_UID_MIN', 1], # Also see login.defs(5).
699 ['system-uid-max', 'SYS_UID_MAX', 999],
700 ['system-alloc-gid-min', 'SYS_GID_MIN', 1],
701 ['system-gid-max', 'SYS_GID_MAX', 999]]
702 v = get_option(tuple[0])
706 '/^\s*@0@\s+/ { uid=$2 } END { print uid }'.format(tuple[1]),
707 '/etc/login.defs').stdout().strip()
714 conf.set(tuple[0].underscorify().to_upper(), v)
715 substs.set(tuple[0].underscorify().to_upper(), v)
717 if conf.get('SYSTEM_ALLOC_UID_MIN') >= conf.get('SYSTEM_UID_MAX')
718 error('Invalid uid allocation range')
720 if conf.get('SYSTEM_ALLOC_GID_MIN') >= conf.get('SYSTEM_GID_MAX')
721 error('Invalid gid allocation range')
724 dynamic_uid_min = get_option('dynamic-uid-min')
725 dynamic_uid_max = get_option('dynamic-uid-max')
726 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
727 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
728 substs.set('dynamicuidmin', dynamic_uid_min)
729 substs.set('dynamicuidmax', dynamic_uid_max)
731 container_uid_base_min = get_option('container-uid-base-min')
732 container_uid_base_max = get_option('container-uid-base-max')
733 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
734 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
735 substs.set('containeruidbasemin', container_uid_base_min)
736 substs.set('containeruidbasemax', container_uid_base_max)
738 nobody_user = get_option('nobody-user')
739 nobody_group = get_option('nobody-group')
741 if not meson.is_cross_build()
742 getent_result = run_command('getent', 'passwd', '65534')
743 if getent_result.returncode() == 0
744 name = getent_result.stdout().split(':')[0]
745 if name != nobody_user
747 '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) +
748 'Your build will result in an user table setup that is incompatible with the local system.')
751 id_result = run_command('id', '-u', nobody_user)
752 if id_result.returncode() == 0
753 id = id_result.stdout().to_int()
756 '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) +
757 'Your build will result in an user table setup that is incompatible with the local system.')
761 getent_result = run_command('getent', 'group', '65534')
762 if getent_result.returncode() == 0
763 name = getent_result.stdout().split(':')[0]
764 if name != nobody_group
766 '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) +
767 'Your build will result in an group table setup that is incompatible with the local system.')
770 id_result = run_command('id', '-g', nobody_group)
771 if id_result.returncode() == 0
772 id = id_result.stdout().to_int()
775 '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) +
776 'Your build will result in an group table setup that is incompatible with the local system.')
780 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
782 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
783 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
786 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
787 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
788 substs.set('NOBODY_USER_NAME', nobody_user)
789 substs.set('NOBODY_GROUP_NAME', nobody_group)
791 tty_gid = get_option('tty-gid')
792 conf.set('TTY_GID', tty_gid)
793 substs.set('TTY_GID', tty_gid)
795 # Ensure provided GID argument is numeric, otherwise fall back to default assignment
796 users_gid = get_option('users-gid')
797 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
799 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
800 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
802 dev_kvm_mode = get_option('dev-kvm-mode')
803 substs.set('DEV_KVM_MODE', dev_kvm_mode)
804 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
805 group_render_mode = get_option('group-render-mode')
806 substs.set('GROUP_RENDER_MODE', group_render_mode)
807 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
809 kill_user_processes = get_option('default-kill-user-processes')
810 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
811 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
812 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
814 dns_servers = get_option('dns-servers')
815 conf.set_quoted('DNS_SERVERS', dns_servers)
816 substs.set('DNS_SERVERS', dns_servers)
818 ntp_servers = get_option('ntp-servers')
819 conf.set_quoted('NTP_SERVERS', ntp_servers)
820 substs.set('NTP_SERVERS', ntp_servers)
822 default_locale = get_option('default-locale')
823 if default_locale == ''
824 if not meson.is_cross_build()
825 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
826 default_locale = run_command(choose_default_locale_sh).stdout().strip()
828 default_locale = 'C.UTF-8'
831 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
833 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
835 service_watchdog = get_option('service-watchdog')
836 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
837 substs.set('SERVICE_WATCHDOG', watchdog_value)
839 substs.set('SUSHELL', get_option('debug-shell'))
840 substs.set('DEBUGTTY', get_option('debug-tty'))
841 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
843 enable_debug_hashmap = false
844 enable_debug_mmap_cache = false
845 enable_debug_siphash = false
846 foreach name : get_option('debug-extra')
848 enable_debug_hashmap = true
849 elif name == 'mmap-cache'
850 enable_debug_mmap_cache = true
851 elif name == 'siphash'
852 enable_debug_siphash = true
854 message('unknown debug option "@0@", ignoring'.format(name))
857 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
858 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
859 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
861 conf.set10('VALGRIND', get_option('valgrind'))
862 conf.set10('LOG_TRACE', get_option('log-trace'))
864 default_user_path = get_option('user-path')
865 if default_user_path != ''
866 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
867 default_user_path_display = default_user_path
869 # meson 0.49 fails when ?: is used in .format()
870 default_user_path_display = '(same as system services)'
874 #####################################################################
876 threads = dependency('threads')
877 librt = cc.find_library('rt')
878 libm = cc.find_library('m')
879 libdl = cc.find_library('dl')
880 libcrypt = cc.find_library('crypt')
882 crypt_header = conf.get('HAVE_CRYPT_H') == 1 ? '''#include <crypt.h>''' : '''#include <unistd.h>'''
884 ['crypt_ra', crypt_header],
885 ['crypt_preferred_method', crypt_header],
886 ['crypt_gensalt_ra', crypt_header]]
888 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE',
889 dependencies : libcrypt)
890 conf.set10('HAVE_' + ident[0].to_upper(), have)
893 libcap = dependency('libcap', required : false)
894 if not libcap.found()
895 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
896 libcap = cc.find_library('cap')
899 libmount = dependency('mount',
900 version : fuzzer_build ? '>= 0' : '>= 2.30')
902 want_libfdisk = get_option('fdisk')
903 if want_libfdisk != 'false' and not skip_deps
904 libfdisk = dependency('fdisk',
906 required : want_libfdisk == 'true')
907 have = libfdisk.found()
912 conf.set10('HAVE_LIBFDISK', have)
914 want_pwquality = get_option('pwquality')
915 if want_pwquality != 'false' and not skip_deps
916 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
917 have = libpwquality.found()
922 conf.set10('HAVE_PWQUALITY', have)
924 want_seccomp = get_option('seccomp')
925 if want_seccomp != 'false' and not skip_deps
926 libseccomp = dependency('libseccomp',
927 version : '>= 2.3.1',
928 required : want_seccomp == 'true')
929 have = libseccomp.found()
934 conf.set10('HAVE_SECCOMP', have)
936 want_selinux = get_option('selinux')
937 if want_selinux != 'false' and not skip_deps
938 libselinux = dependency('libselinux',
939 version : '>= 2.1.9',
940 required : want_selinux == 'true')
941 have = libselinux.found()
946 conf.set10('HAVE_SELINUX', have)
948 want_apparmor = get_option('apparmor')
949 if want_apparmor != 'false' and not skip_deps
950 libapparmor = dependency('libapparmor',
952 required : want_apparmor == 'true')
953 have = libapparmor.found()
958 conf.set10('HAVE_APPARMOR', have)
960 smack_run_label = get_option('smack-run-label')
961 if smack_run_label != ''
962 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
965 want_polkit = get_option('polkit')
966 install_polkit = false
967 install_polkit_pkla = false
968 if want_polkit != 'false' and not skip_deps
969 install_polkit = true
971 libpolkit = dependency('polkit-gobject-1',
973 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
974 message('Old polkit detected, will install pkla files')
975 install_polkit_pkla = true
978 conf.set10('ENABLE_POLKIT', install_polkit)
980 want_acl = get_option('acl')
981 if want_acl != 'false' and not skip_deps
982 libacl = cc.find_library('acl', required : want_acl == 'true')
983 have = libacl.found()
988 conf.set10('HAVE_ACL', have)
990 want_audit = get_option('audit')
991 if want_audit != 'false' and not skip_deps
992 libaudit = dependency('audit', required : want_audit == 'true')
993 have = libaudit.found()
998 conf.set10('HAVE_AUDIT', have)
1000 want_blkid = get_option('blkid')
1001 if want_blkid != 'false' and not skip_deps
1002 libblkid = dependency('blkid', required : want_blkid == 'true')
1003 have = libblkid.found()
1008 conf.set10('HAVE_BLKID', have)
1010 want_kmod = get_option('kmod')
1011 if want_kmod != 'false' and not skip_deps
1012 libkmod = dependency('libkmod',
1014 required : want_kmod == 'true')
1015 have = libkmod.found()
1020 conf.set10('HAVE_KMOD', have)
1022 want_pam = get_option('pam')
1023 if want_pam != 'false' and not skip_deps
1024 libpam = cc.find_library('pam', required : want_pam == 'true')
1025 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
1026 have = libpam.found() and libpam_misc.found()
1032 conf.set10('HAVE_PAM', have)
1034 want_microhttpd = get_option('microhttpd')
1035 if want_microhttpd != 'false' and not skip_deps
1036 libmicrohttpd = dependency('libmicrohttpd',
1037 version : '>= 0.9.33',
1038 required : want_microhttpd == 'true')
1039 have = libmicrohttpd.found()
1044 conf.set10('HAVE_MICROHTTPD', have)
1046 want_libcryptsetup = get_option('libcryptsetup')
1047 if want_libcryptsetup != 'false' and not skip_deps
1048 libcryptsetup = dependency('libcryptsetup',
1049 version : '>= 2.0.1',
1050 required : want_libcryptsetup == 'true')
1051 have = libcryptsetup.found()
1053 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1054 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
1055 conf.set10('HAVE_CRYPT_ACTIVATE_BY_SIGNED_KEY',
1056 have and cc.has_function('crypt_activate_by_signed_key', dependencies : libcryptsetup))
1061 conf.set10('HAVE_LIBCRYPTSETUP', have)
1063 want_libcurl = get_option('libcurl')
1064 if want_libcurl != 'false' and not skip_deps
1065 libcurl = dependency('libcurl',
1066 version : '>= 7.32.0',
1067 required : want_libcurl == 'true')
1068 have = libcurl.found()
1073 conf.set10('HAVE_LIBCURL', have)
1075 want_libidn = get_option('libidn')
1076 want_libidn2 = get_option('libidn2')
1077 if want_libidn == 'true' and want_libidn2 == 'true'
1078 error('libidn and libidn2 cannot be requested simultaneously')
1081 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1082 libidn = dependency('libidn2',
1083 required : want_libidn2 == 'true')
1084 have = libidn.found()
1089 conf.set10('HAVE_LIBIDN2', have)
1090 if not have and want_libidn != 'false' and not skip_deps
1091 # libidn is used for both libidn and libidn2 objects
1092 libidn = dependency('libidn',
1093 required : want_libidn == 'true')
1094 have = libidn.found()
1098 conf.set10('HAVE_LIBIDN', have)
1100 want_libiptc = get_option('libiptc')
1101 if want_libiptc != 'false' and not skip_deps
1102 libiptc = dependency('libiptc',
1103 required : want_libiptc == 'true')
1104 have = libiptc.found()
1109 conf.set10('HAVE_LIBIPTC', have)
1111 want_qrencode = get_option('qrencode')
1112 if want_qrencode != 'false' and not skip_deps
1113 libqrencode = dependency('libqrencode',
1114 required : want_qrencode == 'true')
1115 have = libqrencode.found()
1120 conf.set10('HAVE_QRENCODE', have)
1122 want_gcrypt = get_option('gcrypt')
1123 if want_gcrypt != 'false' and not skip_deps
1124 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1125 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1126 have = libgcrypt.found() and libgpg_error.found()
1131 # link to neither of the libs if one is not found
1135 conf.set10('HAVE_GCRYPT', have)
1137 want_gnutls = get_option('gnutls')
1138 if want_gnutls != 'false' and not skip_deps
1139 libgnutls = dependency('gnutls',
1140 version : '>= 3.1.4',
1141 required : want_gnutls == 'true')
1142 have = libgnutls.found()
1147 conf.set10('HAVE_GNUTLS', have)
1149 want_openssl = get_option('openssl')
1150 if want_openssl != 'false' and not skip_deps
1151 libopenssl = dependency('openssl',
1152 version : '>= 1.1.0',
1153 required : want_openssl == 'true')
1154 have = libopenssl.found()
1159 conf.set10('HAVE_OPENSSL', have)
1161 want_p11kit = get_option('p11kit')
1162 if want_p11kit != 'false' and not skip_deps
1163 libp11kit = dependency('p11-kit-1',
1164 version : '>= 0.23.3',
1165 required : want_p11kit == 'true')
1166 have = libp11kit.found()
1171 conf.set10('HAVE_P11KIT', have)
1173 want_libfido2 = get_option('libfido2')
1174 if want_libfido2 != 'false' and not skip_deps
1175 libfido2 = dependency('libfido2',
1176 required : want_libfido2 == 'true')
1177 have = libfido2.found()
1182 conf.set10('HAVE_LIBFIDO2', have)
1184 want_elfutils = get_option('elfutils')
1185 if want_elfutils != 'false' and not skip_deps
1186 libdw = dependency('libdw',
1187 required : want_elfutils == 'true')
1188 have = libdw.found()
1193 conf.set10('HAVE_ELFUTILS', have)
1195 want_zlib = get_option('zlib')
1196 if want_zlib != 'false' and not skip_deps
1197 libz = dependency('zlib',
1198 required : want_zlib == 'true')
1204 conf.set10('HAVE_ZLIB', have)
1206 want_bzip2 = get_option('bzip2')
1207 if want_bzip2 != 'false' and not skip_deps
1208 libbzip2 = cc.find_library('bz2',
1209 required : want_bzip2 == 'true')
1210 have = libbzip2.found()
1215 conf.set10('HAVE_BZIP2', have)
1217 want_xz = get_option('xz')
1218 if want_xz != 'false' and not skip_deps
1219 libxz = dependency('liblzma',
1220 required : want_xz == 'true')
1221 have_xz = libxz.found()
1226 conf.set10('HAVE_XZ', have_xz)
1228 want_lz4 = get_option('lz4')
1229 if want_lz4 != 'false' and not skip_deps
1230 liblz4 = dependency('liblz4',
1231 version : '>= 1.3.0',
1232 required : want_lz4 == 'true')
1233 have_lz4 = liblz4.found()
1238 conf.set10('HAVE_LZ4', have_lz4)
1240 want_zstd = get_option('zstd')
1241 if want_zstd != 'false' and not skip_deps
1242 libzstd = dependency('libzstd',
1243 required : want_zstd == 'true',
1244 version : '>= 1.4.0')
1245 have_zstd = libzstd.found()
1250 conf.set10('HAVE_ZSTD', have_zstd)
1252 conf.set10('HAVE_COMPRESSION', have_xz or have_lz4 or have_zstd)
1254 want_xkbcommon = get_option('xkbcommon')
1255 if want_xkbcommon != 'false' and not skip_deps
1256 libxkbcommon = dependency('xkbcommon',
1257 version : '>= 0.3.0',
1258 required : want_xkbcommon == 'true')
1259 have = libxkbcommon.found()
1264 conf.set10('HAVE_XKBCOMMON', have)
1266 want_pcre2 = get_option('pcre2')
1267 if want_pcre2 != 'false'
1268 libpcre2 = dependency('libpcre2-8',
1269 required : want_pcre2 == 'true')
1270 have = libpcre2.found()
1275 conf.set10('HAVE_PCRE2', have)
1277 want_glib = get_option('glib')
1278 if want_glib != 'false' and not skip_deps
1279 libglib = dependency('glib-2.0',
1280 version : '>= 2.22.0',
1281 required : want_glib == 'true')
1282 libgobject = dependency('gobject-2.0',
1283 version : '>= 2.22.0',
1284 required : want_glib == 'true')
1285 libgio = dependency('gio-2.0',
1286 required : want_glib == 'true')
1287 have = libglib.found() and libgobject.found() and libgio.found()
1294 conf.set10('HAVE_GLIB', have)
1296 want_dbus = get_option('dbus')
1297 if want_dbus != 'false' and not skip_deps
1298 libdbus = dependency('dbus-1',
1299 version : '>= 1.3.2',
1300 required : want_dbus == 'true')
1301 have = libdbus.found()
1306 conf.set10('HAVE_DBUS', have)
1308 default_dnssec = get_option('default-dnssec')
1310 default_dnssec = 'no'
1312 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1313 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1314 default_dnssec = 'no'
1316 conf.set('DEFAULT_DNSSEC_MODE',
1317 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1318 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1320 dns_over_tls = get_option('dns-over-tls')
1321 if dns_over_tls != 'false'
1322 if dns_over_tls == 'openssl'
1325 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1326 if dns_over_tls == 'gnutls' and not have_gnutls
1327 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1330 if dns_over_tls == 'gnutls' or have_gnutls
1331 have_openssl = false
1333 have_openssl = conf.get('HAVE_OPENSSL') == 1
1334 if dns_over_tls != 'auto' and not have_openssl
1335 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1336 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1339 have = have_gnutls or have_openssl
1343 have_openssl = false
1345 conf.set10('ENABLE_DNS_OVER_TLS', have)
1346 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1347 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1349 default_dns_over_tls = get_option('default-dns-over-tls')
1351 default_dns_over_tls = 'no'
1353 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1354 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.')
1355 default_dns_over_tls = 'no'
1357 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1358 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1359 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1361 default_mdns = get_option('default-mdns')
1362 conf.set('DEFAULT_MDNS_MODE',
1363 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
1364 substs.set('DEFAULT_MDNS_MODE', default_mdns)
1366 default_llmnr = get_option('default-llmnr')
1367 conf.set('DEFAULT_LLMNR_MODE',
1368 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
1369 substs.set('DEFAULT_LLMNR_MODE', default_llmnr)
1371 want_repart = get_option('repart')
1372 if want_repart != 'false'
1373 have = (conf.get('HAVE_OPENSSL') == 1 and
1374 conf.get('HAVE_LIBFDISK') == 1)
1375 if want_repart == 'true' and not have
1376 error('repart support was requested, but dependencies are not available')
1381 conf.set10('ENABLE_REPART', have)
1383 want_importd = get_option('importd')
1384 if want_importd != 'false'
1385 have = (conf.get('HAVE_LIBCURL') == 1 and
1386 conf.get('HAVE_ZLIB') == 1 and
1387 conf.get('HAVE_XZ') == 1 and
1388 conf.get('HAVE_GCRYPT') == 1)
1389 if want_importd == 'true' and not have
1390 error('importd support was requested, but dependencies are not available')
1395 conf.set10('ENABLE_IMPORTD', have)
1397 want_homed = get_option('homed')
1398 if want_homed != 'false'
1399 have = (conf.get('HAVE_OPENSSL') == 1 and
1400 conf.get('HAVE_LIBFDISK') == 1 and
1401 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1402 if want_homed == 'true' and not have
1403 error('homed support was requested, but dependencies are not available')
1408 conf.set10('ENABLE_HOMED', have)
1410 have = have and conf.get('HAVE_PAM') == 1
1411 conf.set10('ENABLE_PAM_HOME', have)
1413 want_remote = get_option('remote')
1414 if want_remote != 'false'
1415 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1416 conf.get('HAVE_LIBCURL') == 1]
1417 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1418 # it's possible to build one without the other. Complain only if
1419 # support was explicitly requested. The auxiliary files like sysusers
1420 # config should be installed when any of the programs are built.
1421 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1422 error('remote support was requested, but dependencies are not available')
1424 have = have_deps[0] or have_deps[1]
1428 conf.set10('ENABLE_REMOTE', have)
1430 foreach term : ['analyze',
1444 'compat-mutable-uid-boundaries',
1468 have = get_option(term)
1469 name = 'ENABLE_' + term.underscorify().to_upper()
1470 conf.set10(name, have)
1471 substs.set10(name, have)
1474 enable_sysusers = conf.get('ENABLE_SYSUSERS') == 1
1476 foreach tuple : [['nss-mymachines', 'machined'],
1477 ['nss-resolve', 'resolve']]
1478 want = get_option(tuple[0])
1480 have = get_option(tuple[1])
1481 if want == 'true' and not have
1482 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1487 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1488 conf.set10(name, have)
1492 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1493 'ENABLE_NSS_MYMACHINES',
1494 'ENABLE_NSS_RESOLVE',
1495 'ENABLE_NSS_SYSTEMD']
1496 if conf.get(term) == 1
1500 conf.set10('ENABLE_NSS', enable_nss)
1502 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1507 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1509 #####################################################################
1511 if get_option('efi')
1512 efi_arch = host_machine.cpu_family()
1514 if efi_arch == 'x86'
1515 EFI_MACHINE_TYPE_NAME = 'ia32'
1516 gnu_efi_arch = 'ia32'
1517 elif efi_arch == 'x86_64'
1518 EFI_MACHINE_TYPE_NAME = 'x64'
1519 gnu_efi_arch = 'x86_64'
1520 elif efi_arch == 'arm'
1521 EFI_MACHINE_TYPE_NAME = 'arm'
1522 gnu_efi_arch = 'arm'
1523 elif efi_arch == 'aarch64'
1524 EFI_MACHINE_TYPE_NAME = 'aa64'
1525 gnu_efi_arch = 'aarch64'
1527 EFI_MACHINE_TYPE_NAME = ''
1532 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1534 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1538 conf.set10('ENABLE_EFI', have)
1540 #####################################################################
1542 config_h = configure_file(
1543 output : 'config.h',
1544 configuration : conf)
1546 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1548 includes = include_directories('src/basic',
1554 'src/journal-remote',
1558 'src/time-wait-sync',
1564 'src/xdg-autostart-generator',
1565 'src/libsystemd/sd-bus',
1566 'src/libsystemd/sd-device',
1567 'src/libsystemd/sd-event',
1568 'src/libsystemd/sd-hwdb',
1569 'src/libsystemd/sd-id128',
1570 'src/libsystemd/sd-netlink',
1571 'src/libsystemd/sd-network',
1572 'src/libsystemd/sd-resolve',
1573 'src/libsystemd-network',
1576 add_project_arguments('-include', 'config.h', language : 'c')
1578 generate_gperfs = find_program('tools/generate-gperfs.py')
1582 subdir('src/systemd')
1584 subdir('src/libsystemd')
1585 subdir('src/libsystemd-network')
1586 subdir('src/journal')
1589 libjournal_core = static_library(
1591 libjournal_core_sources,
1593 include_directories : includes,
1596 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1597 libsystemd = shared_library(
1600 version : libsystemd_version,
1601 include_directories : includes,
1602 link_args : ['-shared',
1603 '-Wl,--version-script=' + libsystemd_sym_path],
1604 link_with : [libbasic,
1606 link_whole : [libsystemd_static,
1608 dependencies : [threads,
1613 link_depends : libsystemd_sym,
1615 install_dir : rootlibdir)
1617 static_libsystemd = get_option('static-libsystemd')
1618 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1620 install_libsystemd_static = static_library(
1623 journal_client_sources,
1625 basic_gcrypt_sources,
1627 include_directories : includes,
1628 build_by_default : static_libsystemd != 'false',
1629 install : static_libsystemd != 'false',
1630 install_dir : rootlibdir,
1631 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1632 dependencies : [threads,
1642 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1644 ############################################################
1646 autosuspend_update_sh = find_program('tools/autosuspend-update.sh')
1647 hwdb_update_sh = find_program('tools/hwdb-update.sh')
1648 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1649 make_directive_index_py = find_program('tools/make-directive-index.py')
1650 make_man_index_py = find_program('tools/make-man-index.py')
1651 syscall_names_update_sh = find_program('tools/syscall-names-update.sh')
1652 xml_helper_py = find_program('tools/xml_helper.py')
1653 update_dbus_docs_py = find_program('tools/update-dbus-docs.py')
1655 ############################################################
1657 # binaries that have --help and are intended for use by humans,
1658 # usually, but not always, installed in /bin.
1659 public_programs = []
1661 subdir('src/libudev')
1662 subdir('src/shared')
1664 subdir('src/shutdown')
1666 subdir('src/network')
1668 subdir('src/analyze')
1669 subdir('src/journal-remote')
1670 subdir('src/coredump')
1671 subdir('src/pstore')
1672 subdir('src/hostname')
1673 subdir('src/import')
1674 subdir('src/partition')
1675 subdir('src/kernel-install')
1676 subdir('src/locale')
1677 subdir('src/machine')
1678 subdir('src/portable')
1679 subdir('src/userdb')
1681 subdir('src/nspawn')
1682 subdir('src/resolve')
1683 subdir('src/timedate')
1684 subdir('src/timesync')
1685 subdir('src/tmpfiles')
1686 subdir('src/vconsole')
1687 subdir('src/boot/efi')
1694 ############################################################
1696 # only static linking apart from libdl, to make sure that the
1697 # module is linked to all libraries that it uses.
1698 test_dlopen = executable(
1702 include_directories : includes,
1703 link_with : [libbasic],
1704 dependencies : [libdl],
1705 build_by_default : want_tests != 'false')
1707 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1708 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h src/nss-systemd/nss-systemd.h'],
1709 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1710 ['resolve', 'ENABLE_NSS_RESOLVE']]
1712 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1716 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1717 version_script_arg = join_paths(project_source_root, sym)
1719 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1720 if tuple.length() > 2
1721 sources += tuple[2].split()
1724 nss = shared_library(
1729 include_directories : includes,
1730 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1731 link_args : ['-Wl,-z,nodelete',
1733 '-Wl,--version-script=' + version_script_arg],
1734 link_with : [libsystemd_static,
1737 dependencies : [threads,
1741 install_dir : rootlibdir)
1743 # We cannot use shared_module because it does not support version suffix.
1744 # Unfortunately shared_library insists on creating the symlink…
1745 meson.add_install_script('sh', '-c',
1746 'rm $DESTDIR@0@/libnss_@1@.so'
1747 .format(rootlibdir, module))
1749 if want_tests != 'false'
1750 test('dlopen-nss_' + module,
1752 # path to dlopen must include a slash
1753 args : nss.full_path())
1758 ############################################################
1763 include_directories : includes,
1764 link_with : [libcore,
1766 dependencies : [versiondep,
1773 install_rpath : rootlibexecdir,
1775 install_dir : rootlibexecdir)
1777 meson.add_install_script(meson_make_symlink,
1778 join_paths(rootlibexecdir, 'systemd'),
1779 join_paths(rootsbindir, 'init'))
1781 public_programs += executable(
1783 systemd_analyze_sources,
1784 include_directories : includes,
1785 link_with : [libcore,
1787 dependencies : [versiondep,
1794 install_rpath : rootlibexecdir,
1795 install : conf.get('ENABLE_ANALYZE'))
1799 systemd_journald_sources,
1800 include_directories : includes,
1801 link_with : [libjournal_core,
1803 dependencies : [threads,
1808 install_rpath : rootlibexecdir,
1810 install_dir : rootlibexecdir)
1812 public_programs += executable(
1814 systemd_cat_sources,
1815 include_directories : includes,
1816 link_with : [libjournal_core,
1818 dependencies : [threads],
1819 install_rpath : rootlibexecdir,
1822 public_programs += executable(
1825 include_directories : includes,
1826 link_with : [libshared],
1827 dependencies : [threads,
1833 install_rpath : rootlibexecdir,
1835 install_dir : rootbindir)
1838 'systemd-getty-generator',
1839 'src/getty-generator/getty-generator.c',
1840 include_directories : includes,
1841 link_with : [libshared],
1842 install_rpath : rootlibexecdir,
1844 install_dir : systemgeneratordir)
1847 'systemd-debug-generator',
1848 'src/debug-generator/debug-generator.c',
1849 include_directories : includes,
1850 link_with : [libshared],
1851 install_rpath : rootlibexecdir,
1853 install_dir : systemgeneratordir)
1856 'systemd-run-generator',
1857 'src/run-generator/run-generator.c',
1858 include_directories : includes,
1859 link_with : [libshared],
1860 install_rpath : rootlibexecdir,
1862 install_dir : systemgeneratordir)
1865 'systemd-fstab-generator',
1866 'src/fstab-generator/fstab-generator.c',
1867 include_directories : includes,
1868 link_with : [libcore_shared,
1870 install_rpath : rootlibexecdir,
1872 install_dir : systemgeneratordir)
1874 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1876 '30-systemd-environment-d-generator',
1877 'src/environment-d-generator/environment-d-generator.c',
1878 include_directories : includes,
1879 link_with : [libshared],
1880 install_rpath : rootlibexecdir,
1882 install_dir : userenvgeneratordir)
1884 meson.add_install_script(meson_make_symlink,
1885 join_paths(sysconfdir, 'environment'),
1886 join_paths(environmentdir, '99-environment.conf'))
1889 if conf.get('ENABLE_HIBERNATE') == 1
1891 'systemd-hibernate-resume-generator',
1892 'src/hibernate-resume/hibernate-resume-generator.c',
1893 include_directories : includes,
1894 link_with : [libshared],
1895 install_rpath : rootlibexecdir,
1897 install_dir : systemgeneratordir)
1900 'systemd-hibernate-resume',
1901 'src/hibernate-resume/hibernate-resume.c',
1902 include_directories : includes,
1903 link_with : [libshared],
1904 install_rpath : rootlibexecdir,
1906 install_dir : rootlibexecdir)
1909 if conf.get('HAVE_BLKID') == 1
1911 'systemd-gpt-auto-generator',
1912 'src/gpt-auto-generator/gpt-auto-generator.c',
1913 'src/shared/blkid-util.h',
1914 include_directories : includes,
1915 link_with : [libshared],
1916 dependencies : libblkid,
1917 install_rpath : rootlibexecdir,
1919 install_dir : systemgeneratordir)
1921 public_programs += executable(
1923 'src/dissect/dissect.c',
1924 include_directories : includes,
1925 link_with : [libshared],
1926 install_rpath : rootlibexecdir,
1930 if conf.get('ENABLE_RESOLVE') == 1
1933 systemd_resolved_sources,
1934 include_directories : includes,
1935 link_with : [libshared,
1937 libsystemd_resolve_core],
1938 dependencies : systemd_resolved_dependencies,
1939 install_rpath : rootlibexecdir,
1941 install_dir : rootlibexecdir)
1943 public_programs += executable(
1946 include_directories : includes,
1947 link_with : [libshared,
1949 libsystemd_resolve_core],
1950 dependencies : [threads,
1954 install_rpath : rootlibexecdir,
1957 meson.add_install_script(meson_make_symlink,
1958 join_paths(bindir, 'resolvectl'),
1959 join_paths(rootsbindir, 'resolvconf'))
1961 meson.add_install_script(meson_make_symlink,
1962 join_paths(bindir, 'resolvectl'),
1963 join_paths(bindir, 'systemd-resolve'))
1966 if conf.get('ENABLE_LOGIND') == 1
1969 systemd_logind_sources,
1970 include_directories : includes,
1971 link_with : [liblogind_core,
1973 dependencies : [threads,
1975 install_rpath : rootlibexecdir,
1977 install_dir : rootlibexecdir)
1979 public_programs += executable(
1982 include_directories : includes,
1983 link_with : [libshared],
1984 dependencies : [threads,
1988 install_rpath : rootlibexecdir,
1990 install_dir : rootbindir)
1992 public_programs += executable(
1994 'src/login/inhibit.c',
1995 include_directories : includes,
1996 link_with : [libshared],
1997 install_rpath : rootlibexecdir,
1999 install_dir : rootbindir)
2001 if conf.get('HAVE_PAM') == 1
2002 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
2003 pam_systemd = shared_library(
2007 include_directories : includes,
2008 link_args : ['-shared',
2009 '-Wl,--version-script=' + version_script_arg],
2010 link_with : [libsystemd_static,
2012 dependencies : [threads,
2015 link_depends : pam_systemd_sym,
2017 install_dir : pamlibdir)
2019 if want_tests != 'false'
2020 test('dlopen-pam_systemd',
2022 # path to dlopen must include a slash
2023 args : pam_systemd.full_path())
2028 'systemd-user-runtime-dir',
2029 user_runtime_dir_sources,
2030 include_directories : includes,
2031 link_with : [libshared],
2032 install_rpath : rootlibexecdir,
2034 install_dir : rootlibexecdir)
2037 if conf.get('HAVE_PAM') == 1
2039 'systemd-user-sessions',
2040 'src/user-sessions/user-sessions.c',
2041 include_directories : includes,
2042 link_with : [libshared],
2043 install_rpath : rootlibexecdir,
2045 install_dir : rootlibexecdir)
2048 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
2049 public_programs += executable(
2051 'src/boot/bootctl.c',
2052 include_directories : includes,
2053 link_with : [libshared],
2054 dependencies : [libblkid],
2055 install_rpath : rootlibexecdir,
2058 public_programs += executable(
2059 'systemd-bless-boot',
2060 'src/boot/bless-boot.c',
2061 include_directories : includes,
2062 link_with : [libshared],
2063 dependencies : [libblkid],
2064 install_rpath : rootlibexecdir,
2066 install_dir : rootlibexecdir)
2069 'systemd-bless-boot-generator',
2070 'src/boot/bless-boot-generator.c',
2071 include_directories : includes,
2072 link_with : [libshared],
2073 install_rpath : rootlibexecdir,
2075 install_dir : systemgeneratordir)
2079 'systemd-boot-check-no-failures',
2080 'src/boot/boot-check-no-failures.c',
2081 include_directories : includes,
2082 link_with : [libshared],
2083 dependencies : [libblkid],
2084 install_rpath : rootlibexecdir,
2086 install_dir : rootlibexecdir)
2088 public_programs += executable(
2089 'systemd-socket-activate',
2090 'src/activate/activate.c',
2091 include_directories : includes,
2092 link_with : [libshared],
2093 dependencies : [threads],
2094 install_rpath : rootlibexecdir,
2097 if get_option('link-systemctl-shared')
2098 systemctl_link_with = [libshared]
2100 systemctl_link_with = [libsystemd_static,
2106 public_programs += executable(
2108 'src/systemctl/systemctl-add-dependency.c',
2109 'src/systemctl/systemctl-add-dependency.h',
2110 'src/systemctl/systemctl-cancel-job.c',
2111 'src/systemctl/systemctl-cancel-job.h',
2112 'src/systemctl/systemctl-clean-or-freeze.c',
2113 'src/systemctl/systemctl-clean-or-freeze.h',
2114 'src/systemctl/systemctl-compat-halt.c',
2115 'src/systemctl/systemctl-compat-halt.h',
2116 'src/systemctl/systemctl-compat-runlevel.c',
2117 'src/systemctl/systemctl-compat-runlevel.h',
2118 'src/systemctl/systemctl-compat-shutdown.c',
2119 'src/systemctl/systemctl-compat-shutdown.h',
2120 'src/systemctl/systemctl-compat-telinit.c',
2121 'src/systemctl/systemctl-compat-telinit.h',
2122 'src/systemctl/systemctl-daemon-reload.c',
2123 'src/systemctl/systemctl-daemon-reload.h',
2124 'src/systemctl/systemctl-edit.c',
2125 'src/systemctl/systemctl-edit.h',
2126 'src/systemctl/systemctl-enable.c',
2127 'src/systemctl/systemctl-enable.h',
2128 'src/systemctl/systemctl-is-active.c',
2129 'src/systemctl/systemctl-is-active.h',
2130 'src/systemctl/systemctl-is-enabled.c',
2131 'src/systemctl/systemctl-is-enabled.h',
2132 'src/systemctl/systemctl-is-system-running.c',
2133 'src/systemctl/systemctl-is-system-running.h',
2134 'src/systemctl/systemctl-kill.c',
2135 'src/systemctl/systemctl-kill.h',
2136 'src/systemctl/systemctl-list-dependencies.c',
2137 'src/systemctl/systemctl-list-dependencies.h',
2138 'src/systemctl/systemctl-list-jobs.c',
2139 'src/systemctl/systemctl-list-jobs.h',
2140 'src/systemctl/systemctl-list-machines.c',
2141 'src/systemctl/systemctl-list-machines.h',
2142 'src/systemctl/systemctl-list-unit-files.c',
2143 'src/systemctl/systemctl-list-unit-files.h',
2144 'src/systemctl/systemctl-list-units.c',
2145 'src/systemctl/systemctl-list-units.h',
2146 'src/systemctl/systemctl-log-setting.c',
2147 'src/systemctl/systemctl-log-setting.h',
2148 'src/systemctl/systemctl-logind.c',
2149 'src/systemctl/systemctl-logind.h',
2150 'src/systemctl/systemctl-preset-all.c',
2151 'src/systemctl/systemctl-preset-all.h',
2152 'src/systemctl/systemctl-reset-failed.c',
2153 'src/systemctl/systemctl-reset-failed.h',
2154 'src/systemctl/systemctl-service-watchdogs.c',
2155 'src/systemctl/systemctl-service-watchdogs.h',
2156 'src/systemctl/systemctl-set-default.c',
2157 'src/systemctl/systemctl-set-default.h',
2158 'src/systemctl/systemctl-set-environment.c',
2159 'src/systemctl/systemctl-set-environment.h',
2160 'src/systemctl/systemctl-set-property.c',
2161 'src/systemctl/systemctl-set-property.h',
2162 'src/systemctl/systemctl-show.c',
2163 'src/systemctl/systemctl-show.h',
2164 'src/systemctl/systemctl-start-special.c',
2165 'src/systemctl/systemctl-start-special.h',
2166 'src/systemctl/systemctl-start-unit.c',
2167 'src/systemctl/systemctl-start-unit.h',
2168 'src/systemctl/systemctl-switch-root.c',
2169 'src/systemctl/systemctl-switch-root.h',
2170 'src/systemctl/systemctl-sysv-compat.c',
2171 'src/systemctl/systemctl-sysv-compat.h',
2172 'src/systemctl/systemctl-trivial-method.c',
2173 'src/systemctl/systemctl-trivial-method.h',
2174 'src/systemctl/systemctl-util.c',
2175 'src/systemctl/systemctl-util.c',
2176 'src/systemctl/systemctl-util.h',
2177 'src/systemctl/systemctl.c',
2178 'src/systemctl/systemctl.h',
2179 include_directories : includes,
2180 link_with : systemctl_link_with,
2181 dependencies : [threads,
2187 install_rpath : rootlibexecdir,
2189 install_dir : rootbindir)
2191 if conf.get('ENABLE_PORTABLED') == 1
2193 'systemd-portabled',
2194 systemd_portabled_sources,
2195 include_directories : includes,
2196 link_with : [libshared],
2197 dependencies : [threads],
2198 install_rpath : rootlibexecdir,
2200 install_dir : rootlibexecdir)
2202 public_programs += executable(
2204 'src/portable/portablectl.c',
2205 include_directories : includes,
2206 link_with : [libshared],
2207 dependencies : [threads],
2208 install_rpath : rootlibexecdir,
2210 install_dir : rootbindir)
2213 if conf.get('ENABLE_USERDB') == 1
2216 systemd_userwork_sources,
2217 include_directories : includes,
2218 link_with : [libshared],
2219 dependencies : [threads],
2220 install_rpath : rootlibexecdir,
2222 install_dir : rootlibexecdir)
2226 systemd_userdbd_sources,
2227 include_directories : includes,
2228 link_with : [libshared],
2229 dependencies : [threads],
2230 install_rpath : rootlibexecdir,
2232 install_dir : rootlibexecdir)
2234 public_programs += executable(
2237 include_directories : includes,
2238 link_with : [libshared],
2239 dependencies : [threads],
2240 install_rpath : rootlibexecdir,
2242 install_dir : rootbindir)
2245 if conf.get('ENABLE_HOMED') == 1
2248 systemd_homework_sources,
2249 include_directories : includes,
2250 link_with : [libshared],
2251 dependencies : [threads,
2259 install_rpath : rootlibexecdir,
2261 install_dir : rootlibexecdir)
2265 systemd_homed_sources,
2266 include_directories : includes,
2267 link_with : [libshared],
2268 dependencies : [threads,
2271 install_rpath : rootlibexecdir,
2273 install_dir : rootlibexecdir)
2275 public_programs += executable(
2278 include_directories : includes,
2279 link_with : [libshared],
2280 dependencies : [threads,
2286 install_rpath : rootlibexecdir,
2288 install_dir : rootbindir)
2290 if conf.get('HAVE_PAM') == 1
2291 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2292 pam_systemd = shared_library(
2296 include_directories : includes,
2297 link_args : ['-shared',
2298 '-Wl,--version-script=' + version_script_arg],
2299 link_with : [libsystemd_static,
2301 dependencies : [threads,
2305 link_depends : pam_systemd_home_sym,
2307 install_dir : pamlibdir)
2311 foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
2312 (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
2313 meson.add_install_script(meson_make_symlink,
2314 join_paths(rootbindir, 'systemctl'),
2315 join_paths(rootsbindir, alias))
2318 meson.add_install_script(meson_make_symlink,
2319 join_paths(rootbindir, 'udevadm'),
2320 join_paths(rootlibexecdir, 'systemd-udevd'))
2322 if conf.get('ENABLE_BACKLIGHT') == 1
2324 'systemd-backlight',
2325 'src/backlight/backlight.c',
2326 include_directories : includes,
2327 link_with : [libshared],
2328 install_rpath : rootlibexecdir,
2330 install_dir : rootlibexecdir)
2333 if conf.get('ENABLE_RFKILL') == 1
2336 'src/rfkill/rfkill.c',
2337 include_directories : includes,
2338 link_with : [libshared],
2339 install_rpath : rootlibexecdir,
2341 install_dir : rootlibexecdir)
2345 'systemd-system-update-generator',
2346 'src/system-update-generator/system-update-generator.c',
2347 include_directories : includes,
2348 link_with : [libshared],
2349 install_rpath : rootlibexecdir,
2351 install_dir : systemgeneratordir)
2353 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2354 systemd_cryptsetup_sources = files('''
2355 src/cryptsetup/cryptsetup-pkcs11.h
2356 src/cryptsetup/cryptsetup-keyfile.c
2357 src/cryptsetup/cryptsetup-keyfile.h
2358 src/cryptsetup/cryptsetup.c
2361 if conf.get('HAVE_P11KIT') == 1
2362 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2366 'systemd-cryptsetup',
2367 systemd_cryptsetup_sources,
2368 include_directories : includes,
2369 link_with : [libshared],
2370 dependencies : [libcryptsetup,
2372 install_rpath : rootlibexecdir,
2374 install_dir : rootlibexecdir)
2377 'systemd-cryptsetup-generator',
2378 'src/cryptsetup/cryptsetup-generator.c',
2379 include_directories : includes,
2380 link_with : [libshared],
2381 install_rpath : rootlibexecdir,
2383 install_dir : systemgeneratordir)
2386 'systemd-veritysetup',
2387 'src/veritysetup/veritysetup.c',
2388 include_directories : includes,
2389 link_with : [libshared],
2390 dependencies : [libcryptsetup],
2391 install_rpath : rootlibexecdir,
2393 install_dir : rootlibexecdir)
2396 'systemd-veritysetup-generator',
2397 'src/veritysetup/veritysetup-generator.c',
2398 include_directories : includes,
2399 link_with : [libshared],
2400 install_rpath : rootlibexecdir,
2402 install_dir : systemgeneratordir)
2405 if conf.get('HAVE_SYSV_COMPAT') == 1
2407 'systemd-sysv-generator',
2408 'src/sysv-generator/sysv-generator.c',
2409 include_directories : includes,
2410 link_with : [libshared],
2411 install_rpath : rootlibexecdir,
2413 install_dir : systemgeneratordir)
2416 'systemd-rc-local-generator',
2417 'src/rc-local-generator/rc-local-generator.c',
2418 include_directories : includes,
2419 link_with : [libshared],
2420 install_rpath : rootlibexecdir,
2422 install_dir : systemgeneratordir)
2425 if conf.get('ENABLE_XDG_AUTOSTART') == 1
2427 'systemd-xdg-autostart-generator',
2428 'src/xdg-autostart-generator/xdg-autostart-generator.c',
2429 'src/xdg-autostart-generator/xdg-autostart-service.c',
2430 include_directories : includes,
2431 link_with : [libshared],
2432 install_rpath : rootlibexecdir,
2434 install_dir : usergeneratordir)
2437 'systemd-xdg-autostart-condition',
2438 'src/xdg-autostart-generator/xdg-autostart-condition.c',
2439 include_directories : includes,
2440 link_with : [libshared],
2441 install_rpath : rootlibexecdir,
2443 install_dir : rootlibexecdir)
2446 if conf.get('ENABLE_HOSTNAMED') == 1
2448 'systemd-hostnamed',
2449 'src/hostname/hostnamed.c',
2450 include_directories : includes,
2451 link_with : [libshared],
2452 install_rpath : rootlibexecdir,
2454 install_dir : rootlibexecdir)
2456 public_programs += executable(
2458 'src/hostname/hostnamectl.c',
2459 include_directories : includes,
2460 link_with : [libshared],
2461 install_rpath : rootlibexecdir,
2465 if conf.get('ENABLE_LOCALED') == 1
2466 if conf.get('HAVE_XKBCOMMON') == 1
2467 # logind will load libxkbcommon.so dynamically on its own
2475 systemd_localed_sources,
2476 include_directories : includes,
2477 link_with : [libshared],
2478 dependencies : deps,
2479 install_rpath : rootlibexecdir,
2481 install_dir : rootlibexecdir)
2483 public_programs += executable(
2486 include_directories : includes,
2487 link_with : [libshared],
2488 install_rpath : rootlibexecdir,
2492 if conf.get('ENABLE_TIMEDATED') == 1
2494 'systemd-timedated',
2495 'src/timedate/timedated.c',
2496 include_directories : includes,
2497 link_with : [libshared],
2498 install_rpath : rootlibexecdir,
2500 install_dir : rootlibexecdir)
2503 if conf.get('ENABLE_TIMEDATECTL') == 1
2504 public_programs += executable(
2506 'src/timedate/timedatectl.c',
2507 include_directories : includes,
2508 install_rpath : rootlibexecdir,
2509 link_with : [libshared],
2510 dependencies : [libm],
2514 if conf.get('ENABLE_TIMESYNCD') == 1
2515 if get_option('link-timesyncd-shared')
2516 timesyncd_link_with = [libshared]
2518 timesyncd_link_with = [libsystemd_static,
2525 'systemd-timesyncd',
2526 systemd_timesyncd_sources,
2527 include_directories : includes,
2528 link_with : [timesyncd_link_with],
2529 dependencies : [threads,
2531 install_rpath : rootlibexecdir,
2533 install_dir : rootlibexecdir)
2536 'systemd-time-wait-sync',
2537 'src/time-wait-sync/time-wait-sync.c',
2538 include_directories : includes,
2539 link_with : [timesyncd_link_with],
2540 install_rpath : rootlibexecdir,
2542 install_dir : rootlibexecdir)
2545 if conf.get('ENABLE_MACHINED') == 1
2548 systemd_machined_sources,
2549 include_directories : includes,
2550 link_with : [libmachine_core,
2552 install_rpath : rootlibexecdir,
2554 install_dir : rootlibexecdir)
2556 public_programs += executable(
2558 'src/machine/machinectl.c',
2559 include_directories : includes,
2560 link_with : [libshared],
2561 dependencies : [threads,
2565 install_rpath : rootlibexecdir,
2567 install_dir : rootbindir)
2570 if conf.get('ENABLE_IMPORTD') == 1
2573 systemd_importd_sources,
2574 include_directories : includes,
2575 link_with : [libshared],
2576 dependencies : [threads],
2577 install_rpath : rootlibexecdir,
2579 install_dir : rootlibexecdir)
2581 systemd_pull = executable(
2583 systemd_pull_sources,
2584 include_directories : includes,
2585 link_with : [libshared],
2586 dependencies : [versiondep,
2592 install_rpath : rootlibexecdir,
2594 install_dir : rootlibexecdir)
2596 systemd_import = executable(
2598 systemd_import_sources,
2599 include_directories : includes,
2600 link_with : [libshared],
2601 dependencies : [libcurl,
2605 install_rpath : rootlibexecdir,
2607 install_dir : rootlibexecdir)
2609 systemd_import_fs = executable(
2610 'systemd-import-fs',
2611 systemd_import_fs_sources,
2612 include_directories : includes,
2613 link_with : [libshared],
2614 install_rpath : rootlibexecdir,
2616 install_dir : rootlibexecdir)
2618 systemd_export = executable(
2620 systemd_export_sources,
2621 include_directories : includes,
2622 link_with : [libshared],
2623 dependencies : [libcurl,
2627 install_rpath : rootlibexecdir,
2629 install_dir : rootlibexecdir)
2631 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2634 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2635 public_programs += executable(
2636 'systemd-journal-upload',
2637 systemd_journal_upload_sources,
2638 include_directories : includes,
2639 link_with : [libshared],
2640 dependencies : [versiondep,
2647 install_rpath : rootlibexecdir,
2649 install_dir : rootlibexecdir)
2652 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2653 public_programs += executable(
2654 'systemd-journal-remote',
2655 systemd_journal_remote_sources,
2656 include_directories : includes,
2657 link_with : [libshared,
2658 libsystemd_journal_remote],
2659 dependencies : [threads,
2665 install_rpath : rootlibexecdir,
2667 install_dir : rootlibexecdir)
2669 public_programs += executable(
2670 'systemd-journal-gatewayd',
2671 systemd_journal_gatewayd_sources,
2672 include_directories : includes,
2673 link_with : [libshared],
2674 dependencies : [threads,
2680 install_rpath : rootlibexecdir,
2682 install_dir : rootlibexecdir)
2685 if conf.get('ENABLE_COREDUMP') == 1
2688 systemd_coredump_sources,
2689 include_directories : includes,
2690 link_with : [libshared],
2691 dependencies : [threads,
2697 install_rpath : rootlibexecdir,
2699 install_dir : rootlibexecdir)
2701 public_programs += executable(
2703 coredumpctl_sources,
2704 include_directories : includes,
2705 link_with : [libshared],
2706 dependencies : [threads,
2710 install_rpath : rootlibexecdir,
2714 if conf.get('ENABLE_PSTORE') == 1
2717 systemd_pstore_sources,
2718 include_directories : includes,
2719 link_with : [libshared],
2720 dependencies : [threads,
2726 install_rpath : rootlibexecdir,
2728 install_dir : rootlibexecdir)
2731 if conf.get('ENABLE_BINFMT') == 1
2732 public_programs += executable(
2734 'src/binfmt/binfmt.c',
2735 include_directories : includes,
2736 link_with : [libshared],
2737 install_rpath : rootlibexecdir,
2739 install_dir : rootlibexecdir)
2741 meson.add_install_script('sh', '-c',
2742 mkdir_p.format(binfmtdir))
2743 meson.add_install_script('sh', '-c',
2744 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2747 if conf.get('ENABLE_REPART') == 1
2750 systemd_repart_sources,
2751 include_directories : includes,
2752 link_with : [libshared],
2753 dependencies : [threads,
2757 install_rpath : rootlibexecdir,
2759 install_dir : rootbindir)
2760 public_programs += exe
2762 if want_tests != 'false'
2765 args : exe.full_path())
2769 if conf.get('ENABLE_VCONSOLE') == 1
2771 'systemd-vconsole-setup',
2772 'src/vconsole/vconsole-setup.c',
2773 include_directories : includes,
2774 link_with : [libshared],
2775 install_rpath : rootlibexecdir,
2777 install_dir : rootlibexecdir)
2780 if conf.get('ENABLE_RANDOMSEED') == 1
2782 'systemd-random-seed',
2783 'src/random-seed/random-seed.c',
2784 include_directories : includes,
2785 link_with : [libshared],
2786 install_rpath : rootlibexecdir,
2788 install_dir : rootlibexecdir)
2791 if conf.get('ENABLE_FIRSTBOOT') == 1
2793 'systemd-firstboot',
2794 'src/firstboot/firstboot.c',
2795 include_directories : includes,
2796 link_with : [libshared],
2797 dependencies : [libcrypt],
2798 install_rpath : rootlibexecdir,
2800 install_dir : rootbindir)
2804 'systemd-remount-fs',
2805 'src/remount-fs/remount-fs.c',
2806 include_directories : includes,
2807 link_with : [libcore_shared,
2809 install_rpath : rootlibexecdir,
2811 install_dir : rootlibexecdir)
2814 'systemd-machine-id-setup',
2815 'src/machine-id-setup/machine-id-setup-main.c',
2816 include_directories : includes,
2817 link_with : [libcore_shared,
2819 install_rpath : rootlibexecdir,
2821 install_dir : rootbindir)
2826 include_directories : includes,
2827 link_with : [libshared],
2828 install_rpath : rootlibexecdir,
2830 install_dir : rootlibexecdir)
2832 executable('systemd-growfs',
2833 'src/partition/growfs.c',
2834 include_directories : includes,
2835 link_with : [libshared],
2836 install_rpath : rootlibexecdir,
2838 install_dir : rootlibexecdir)
2842 'src/partition/makefs.c',
2843 include_directories : includes,
2844 link_with : [libshared],
2845 install_rpath : rootlibexecdir,
2847 install_dir : rootlibexecdir)
2851 'src/sleep/sleep.c',
2852 include_directories : includes,
2853 link_with : [libshared],
2854 install_rpath : rootlibexecdir,
2856 install_dir : rootlibexecdir)
2858 install_data('src/sleep/sleep.conf',
2859 install_dir : pkgsysconfdir)
2861 public_programs += executable(
2863 'src/sysctl/sysctl.c',
2864 include_directories : includes,
2865 link_with : [libshared],
2866 install_rpath : rootlibexecdir,
2868 install_dir : rootlibexecdir)
2872 'src/ac-power/ac-power.c',
2873 include_directories : includes,
2874 link_with : [libshared],
2875 install_rpath : rootlibexecdir,
2877 install_dir : rootlibexecdir)
2879 public_programs += executable(
2880 'systemd-detect-virt',
2881 'src/detect-virt/detect-virt.c',
2882 include_directories : includes,
2883 link_with : [libshared],
2884 install_rpath : rootlibexecdir,
2887 public_programs += executable(
2889 'src/delta/delta.c',
2890 include_directories : includes,
2891 link_with : [libshared],
2892 install_rpath : rootlibexecdir,
2895 public_programs += executable(
2897 'src/escape/escape.c',
2898 include_directories : includes,
2899 link_with : [libshared],
2900 install_rpath : rootlibexecdir,
2902 install_dir : rootbindir)
2904 public_programs += executable(
2906 'src/notify/notify.c',
2907 include_directories : includes,
2908 link_with : [libshared],
2909 install_rpath : rootlibexecdir,
2911 install_dir : rootbindir)
2914 'systemd-volatile-root',
2915 'src/volatile-root/volatile-root.c',
2916 include_directories : includes,
2917 link_with : [libshared],
2918 install_rpath : rootlibexecdir,
2919 install : conf.get('ENABLE_INITRD') == 1,
2920 install_dir : rootlibexecdir)
2923 'systemd-cgroups-agent',
2924 'src/cgroups-agent/cgroups-agent.c',
2925 include_directories : includes,
2926 link_with : [libshared],
2927 install_rpath : rootlibexecdir,
2929 install_dir : rootlibexecdir)
2931 public_programs += executable(
2933 'src/id128/id128.c',
2934 include_directories : includes,
2935 link_with : [libshared],
2936 install_rpath : rootlibexecdir,
2939 public_programs += executable(
2942 include_directories : includes,
2943 link_with : [libshared],
2944 install_rpath : rootlibexecdir,
2947 public_programs += executable(
2948 'systemd-ask-password',
2949 'src/ask-password/ask-password.c',
2950 include_directories : includes,
2951 link_with : [libshared],
2952 install_rpath : rootlibexecdir,
2954 install_dir : rootbindir)
2957 'systemd-reply-password',
2958 'src/reply-password/reply-password.c',
2959 include_directories : includes,
2960 link_with : [libshared],
2961 install_rpath : rootlibexecdir,
2963 install_dir : rootlibexecdir)
2965 public_programs += executable(
2966 'systemd-tty-ask-password-agent',
2967 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2968 include_directories : includes,
2969 link_with : [libshared],
2970 install_rpath : rootlibexecdir,
2972 install_dir : rootbindir)
2974 public_programs += executable(
2977 include_directories : includes,
2978 link_with : [libshared],
2979 install_rpath : rootlibexecdir,
2982 public_programs += executable(
2984 'src/cgtop/cgtop.c',
2985 include_directories : includes,
2986 link_with : [libshared],
2987 install_rpath : rootlibexecdir,
2992 'src/initctl/initctl.c',
2993 include_directories : includes,
2994 link_with : [libshared],
2995 install_rpath : rootlibexecdir,
2996 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
2997 install_dir : rootlibexecdir)
2999 public_programs += executable(
3001 'src/mount/mount-tool.c',
3002 include_directories : includes,
3003 link_with : [libshared],
3004 dependencies: [libmount],
3005 install_rpath : rootlibexecdir,
3008 meson.add_install_script(meson_make_symlink,
3009 'systemd-mount', join_paths(bindir, 'systemd-umount'))
3011 public_programs += executable(
3014 include_directories : includes,
3015 link_with : [libshared],
3016 install_rpath : rootlibexecdir,
3019 public_programs += executable(
3020 'systemd-stdio-bridge',
3021 'src/stdio-bridge/stdio-bridge.c',
3022 include_directories : includes,
3023 link_with : [libshared],
3024 dependencies : [versiondep],
3025 install_rpath : rootlibexecdir,
3028 public_programs += executable(
3030 'src/busctl/busctl.c',
3031 'src/busctl/busctl-introspect.c',
3032 'src/busctl/busctl-introspect.h',
3033 include_directories : includes,
3034 link_with : [libshared],
3035 install_rpath : rootlibexecdir,
3041 'src/sysusers/sysusers.c',
3042 include_directories : includes,
3043 link_with : [libshared],
3044 install_rpath : rootlibexecdir,
3046 install_dir : rootbindir)
3047 public_programs += exe
3049 if want_tests != 'false'
3050 test('test-sysusers',
3052 # https://github.com/mesonbuild/meson/issues/2681
3053 args : exe.full_path())
3056 if have_standalone_binaries
3058 'systemd-sysusers.standalone',
3059 'src/sysusers/sysusers.c',
3060 include_directories : includes,
3061 link_with : [libshared_static,
3067 install_dir : rootbindir)
3068 public_programs += exe
3070 if want_tests != 'false'
3071 test('test-sysusers.standalone',
3073 # https://github.com/mesonbuild/meson/issues/2681
3074 args : exe.full_path())
3079 if conf.get('ENABLE_TMPFILES') == 1
3082 systemd_tmpfiles_sources,
3083 include_directories : includes,
3084 link_with : [libshared],
3085 dependencies : [libacl],
3086 install_rpath : rootlibexecdir,
3088 install_dir : rootbindir)
3089 public_programs += exe
3091 if want_tests != 'false'
3092 test('test-systemd-tmpfiles',
3093 test_systemd_tmpfiles_py,
3094 # https://github.com/mesonbuild/meson/issues/2681
3095 args : exe.full_path())
3098 if have_standalone_binaries
3099 public_programs += executable(
3100 'systemd-tmpfiles.standalone',
3101 systemd_tmpfiles_sources,
3102 include_directories : includes,
3103 link_with : [libshared_static,
3108 dependencies : [libacl],
3110 install_dir : rootbindir)
3114 if conf.get('ENABLE_HWDB') == 1
3115 public_programs += executable(
3118 'src/libsystemd/sd-hwdb/hwdb-internal.h',
3119 include_directories : includes,
3120 link_with : [libudev_static],
3121 install_rpath : udev_rpath,
3123 install_dir : rootbindir)
3126 if conf.get('ENABLE_QUOTACHECK') == 1
3128 'systemd-quotacheck',
3129 'src/quotacheck/quotacheck.c',
3130 include_directories : includes,
3131 link_with : [libshared],
3132 install_rpath : rootlibexecdir,
3134 install_dir : rootlibexecdir)
3137 public_programs += executable(
3138 'systemd-socket-proxyd',
3139 'src/socket-proxy/socket-proxyd.c',
3140 include_directories : includes,
3141 link_with : [libshared],
3142 dependencies : [threads],
3143 install_rpath : rootlibexecdir,
3145 install_dir : rootlibexecdir)
3147 public_programs += executable(
3150 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
3151 include_directories : includes,
3152 link_with : [libudev_core,
3155 dependencies : [versiondep,
3161 install_rpath : udev_rpath,
3163 install_dir : rootbindir)
3167 systemd_shutdown_sources,
3168 include_directories : includes,
3169 link_with : [libcore_shared,
3171 dependencies : [libmount],
3172 install_rpath : rootlibexecdir,
3174 install_dir : rootlibexecdir)
3177 'systemd-update-done',
3178 'src/update-done/update-done.c',
3179 include_directories : includes,
3180 link_with : [libshared],
3181 install_rpath : rootlibexecdir,
3183 install_dir : rootlibexecdir)
3186 'systemd-update-utmp',
3187 'src/update-utmp/update-utmp.c',
3188 include_directories : includes,
3189 link_with : [libshared],
3190 dependencies : [libaudit],
3191 install_rpath : rootlibexecdir,
3192 install : (conf.get('ENABLE_UTMP') == 1),
3193 install_dir : rootlibexecdir)
3195 if conf.get('HAVE_KMOD') == 1
3197 'systemd-modules-load',
3198 'src/modules-load/modules-load.c',
3199 include_directories : includes,
3200 link_with : [libshared],
3201 dependencies : [libkmod],
3202 install_rpath : rootlibexecdir,
3204 install_dir : rootlibexecdir)
3206 meson.add_install_script('sh', '-c',
3207 mkdir_p.format(modulesloaddir))
3208 meson.add_install_script('sh', '-c',
3209 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
3212 public_programs += executable(
3214 systemd_nspawn_sources,
3215 include_directories : includes,
3216 link_with : [libcore_shared,
3219 dependencies : [libblkid,
3221 install_rpath : rootlibexecdir,
3224 if conf.get('ENABLE_NETWORKD') == 1
3227 systemd_networkd_sources,
3228 include_directories : network_include_dir,
3229 link_with : [libnetworkd_core,
3232 networkd_link_with],
3233 dependencies : [threads],
3234 install_rpath : rootlibexecdir,
3236 install_dir : rootlibexecdir)
3239 'systemd-networkd-wait-online',
3240 systemd_networkd_wait_online_sources,
3241 include_directories : includes,
3242 link_with : [libnetworkd_core,
3243 networkd_link_with],
3244 install_rpath : rootlibexecdir,
3246 install_dir : rootlibexecdir)
3248 public_programs += executable(
3251 include_directories : includes,
3252 link_with : [libsystemd_network,
3253 networkd_link_with],
3254 install_rpath : rootlibexecdir,
3256 install_dir : rootbindir)
3259 'systemd-network-generator',
3260 network_generator_sources,
3261 include_directories : includes,
3262 link_with : [networkd_link_with],
3263 install_rpath : rootlibexecdir,
3265 install_dir : rootlibexecdir)
3267 if want_tests != 'false'
3268 test('test-network-generator-conversion',
3269 test_network_generator_conversion_sh,
3270 # https://github.com/mesonbuild/meson/issues/2681
3271 args : exe.full_path())
3276 'systemd-sulogin-shell',
3277 ['src/sulogin-shell/sulogin-shell.c'],
3278 include_directories : includes,
3279 link_with : [libshared],
3280 install_rpath : rootlibexecdir,
3282 install_dir : rootlibexecdir)
3284 ############################################################
3287 'systemd-runtest.env',
3288 output : 'systemd-runtest.env',
3289 command : ['sh', '-c', '{ ' +
3290 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
3291 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
3293 build_by_default : true)
3295 foreach tuple : tests
3297 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3298 dependencies = tuple[2]
3299 condition = tuple.length() >= 4 ? tuple[3] : ''
3300 type = tuple.length() >= 5 ? tuple[4] : ''
3301 defs = tuple.length() >= 6 ? tuple[5] : []
3302 incs = tuple.length() >= 7 ? tuple[6] : includes
3305 name = sources[0].split('/')[-1].split('.')[0]
3306 if type.startswith('timeout=')
3307 timeout = type.split('=')[1].to_int()
3311 if condition == '' or conf.get(condition) == 1
3315 include_directories : incs,
3316 link_with : link_with,
3317 dependencies : [versiondep,
3320 build_by_default : want_tests != 'false',
3321 install_rpath : rootlibexecdir,
3322 install : install_tests,
3323 install_dir : join_paths(testsdir, type))
3326 message('@0@ is a manual test'.format(name))
3327 elif type == 'unsafe' and want_tests != 'unsafe'
3328 message('@0@ is an unsafe test'.format(name))
3329 elif want_tests != 'false'
3335 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3340 'test-libsystemd-sym',
3341 test_libsystemd_sym_c,
3342 include_directories : includes,
3343 link_with : [libsystemd],
3344 build_by_default : want_tests != 'false',
3345 install : install_tests,
3346 install_dir : testsdir)
3347 if want_tests != 'false'
3348 test('test-libsystemd-sym', exe)
3352 'test-libsystemd-static-sym',
3353 test_libsystemd_sym_c,
3354 include_directories : includes,
3355 link_with : [install_libsystemd_static],
3356 dependencies : [threads], # threads is already included in dependencies on the library,
3357 # but does not seem to get propagated. Add here as a work-around.
3358 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3359 install : install_tests and static_libsystemd_pic,
3360 install_dir : testsdir)
3361 if want_tests != 'false' and static_libsystemd_pic
3362 test('test-libsystemd-static-sym', exe)
3368 include_directories : includes,
3369 c_args : '-Wno-deprecated-declarations',
3370 link_with : [libudev],
3371 build_by_default : want_tests != 'false',
3372 install : install_tests,
3373 install_dir : testsdir)
3374 if want_tests != 'false'
3375 test('test-libudev-sym', exe)
3379 'test-libudev-static-sym',
3381 include_directories : includes,
3382 c_args : '-Wno-deprecated-declarations',
3383 link_with : [install_libudev_static],
3384 build_by_default : want_tests != 'false' and static_libudev_pic,
3385 install : install_tests and static_libudev_pic,
3386 install_dir : testsdir)
3387 if want_tests != 'false' and static_libudev_pic
3388 test('test-libudev-static-sym', exe)
3391 ############################################################
3395 if get_option('tests') != 'false'
3396 foreach tuple : fuzzers
3398 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3399 dependencies = tuple[2]
3400 defs = tuple.length() >= 4 ? tuple[3] : []
3401 incs = tuple.length() >= 5 ? tuple[4] : includes
3405 dependencies += fuzzing_engine
3407 if fuzzing_engine.found()
3408 dependencies += fuzzing_engine
3410 link_args += ['-fsanitize=fuzzer']
3413 sources += 'src/fuzz/fuzz-main.c'
3416 name = sources[0].split('/')[-1].split('.')[0]
3418 fuzzer_exes += executable(
3421 include_directories : [incs, include_directories('src/fuzz')],
3422 link_with : link_with,
3423 dependencies : dependencies,
3425 link_args: link_args,
3432 depends : fuzzer_exes,
3435 ############################################################
3438 subdir('sysusers.d')
3439 subdir('tmpfiles.d')
3445 subdir('shell-completion/bash')
3446 subdir('shell-completion/zsh')
3447 subdir('docs/sysvinit')
3448 subdir('docs/var-log')
3450 install_subdir('factory/etc',
3451 install_dir : factorydir)
3453 install_data('xorg/50-systemd-user.sh',
3454 install_dir : xinitrcdir)
3455 install_data('modprobe.d/systemd.conf',
3456 install_dir : modprobedir)
3457 install_data('LICENSE.GPL2',
3461 'docs/CODING_STYLE.md',
3462 'docs/DISTRO_PORTING.md',
3463 'docs/ENVIRONMENT.md',
3465 'docs/TRANSIENT-SETTINGS.md',
3466 'docs/TRANSLATORS.md',
3467 'docs/UIDS-GIDS.md',
3468 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3469 install_dir : docdir)
3471 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3472 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3474 ############################################################
3476 check_help = find_program('tools/check-help.sh')
3478 foreach exec : public_programs
3479 name = exec.full_path().split('/')[-1]
3480 if want_tests != 'false'
3481 test('check-help-' + name,
3483 args : exec.full_path())
3487 ############################################################
3489 check_directives_sh = find_program('tools/check-directives.sh')
3491 if want_tests != 'false'
3492 test('check-directives',
3493 check_directives_sh,
3494 args : project_source_root)
3497 ############################################################
3499 # Enable tests for all supported sanitizers
3500 foreach tuple : sanitizers
3501 sanitizer = tuple[0]
3504 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3506 foreach p : fuzz_regression_tests
3507 b = p.split('/')[-2]
3508 c = p.split('/')[-1]
3510 name = '@0@:@1@'.format(b, sanitizer)
3513 if want_tests == 'false'
3514 message('Not compiling @0@ because tests is set to false'.format(name))
3515 elif slow_tests or fuzz_tests
3516 exe = custom_target(
3520 command : [env, 'ln', '-fs',
3521 join_paths(build.full_path(), b),
3523 build_by_default : true)
3525 message('Not compiling @0@ because slow-tests/fuzz-tests is set to false'.format(name))
3530 if want_tests != 'false' and (slow_tests or fuzz_tests)
3531 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3533 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
3535 args : [exe.full_path(),
3536 join_paths(project_source_root, p)])
3543 ############################################################
3546 all_files = run_command(
3548 ['--git-dir=@0@/.git'.format(project_source_root),
3551 all_files = files(all_files.stdout().split())
3556 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3559 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3563 git_contrib_sh = find_program('tools/git-contrib.sh')
3566 command : [git_contrib_sh])
3570 git_head = run_command(
3572 ['--git-dir=@0@/.git'.format(project_source_root),
3573 'rev-parse', 'HEAD']).stdout().strip()
3574 git_head_short = run_command(
3576 ['--git-dir=@0@/.git'.format(project_source_root),
3577 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3581 command : ['git', 'archive',
3582 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3584 '--prefix', 'systemd-@0@/'.format(git_head),
3588 ############################################################
3590 check_api_docs_sh = find_program('tools/check-api-docs.sh')
3593 depends : [man, libsystemd, libudev],
3594 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3596 ############################################################
3597 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3600 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3602 'build mode: @0@'.format(get_option('mode')),
3603 'split /usr: @0@'.format(split_usr),
3604 'split bin-sbin: @0@'.format(split_bin),
3605 'prefix directory: @0@'.format(prefixdir),
3606 'rootprefix directory: @0@'.format(rootprefixdir),
3607 'sysconf directory: @0@'.format(sysconfdir),
3608 'include directory: @0@'.format(includedir),
3609 'lib directory: @0@'.format(libdir),
3610 'rootlib directory: @0@'.format(rootlibdir),
3611 'SysV init scripts: @0@'.format(sysvinit_path),
3612 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3613 'PAM modules directory: @0@'.format(pamlibdir),
3614 'PAM configuration directory: @0@'.format(pamconfdir),
3615 'RPM macros directory: @0@'.format(rpmmacrosdir),
3616 'modprobe.d directory: @0@'.format(modprobedir),
3617 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3618 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3619 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3620 'bash completions directory: @0@'.format(bashcompletiondir),
3621 'zsh completions directory: @0@'.format(zshcompletiondir),
3622 'extra start script: @0@'.format(get_option('rc-local')),
3623 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3624 get_option('debug-tty')),
3625 'TTY GID: @0@'.format(tty_gid),
3626 'users GID: @0@'.format(substs.get('USERS_GID')),
3627 'system UIDs: <=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_UID_MAX'),
3628 conf.get('SYSTEM_ALLOC_UID_MIN')),
3629 'system GIDs: <=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_GID_MAX'),
3630 conf.get('SYSTEM_ALLOC_GID_MIN')),
3631 'dynamic UIDs: @0@–@1@'.format(dynamic_uid_min, dynamic_uid_max),
3632 'container UID bases: @0@–@1@'.format(container_uid_base_min, container_uid_base_max),
3633 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3634 'render group access mode: @0@'.format(get_option('group-render-mode')),
3635 'certificate root directory: @0@'.format(get_option('certificate-root')),
3636 'support URL: @0@'.format(support_url),
3637 'nobody user name: @0@'.format(nobody_user),
3638 'nobody group name: @0@'.format(nobody_group),
3639 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3640 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3642 'default DNSSEC mode: @0@'.format(default_dnssec),
3643 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3644 'default mDNS mode: @0@'.format(default_mdns),
3645 'default LLMNR mode: @0@'.format(default_llmnr),
3646 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3647 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3648 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3649 'default locale: @0@'.format(default_locale),
3650 'default user $PATH: @0@'.format(default_user_path_display),
3651 'systemd service watchdog: @0@'.format(watchdog_opt)]
3653 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3654 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3656 'default DNS servers: @0@'.format(alt_dns_servers),
3657 'default NTP servers: @0@'.format(alt_ntp_servers)]
3659 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3660 '@@0@'.format(time_epoch)).stdout().strip()
3662 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3665 'static libsystemd: @0@'.format(static_libsystemd),
3666 'static libudev: @0@'.format(static_libudev)]
3669 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3670 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3671 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3673 if conf.get('ENABLE_EFI') == 1
3674 status += 'efi arch: @0@'.format(efi_arch)
3678 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3679 'EFI CC @0@'.format(' '.join(efi_cc)),
3680 'EFI lds: @0@'.format(efi_lds),
3681 'EFI crt0: @0@'.format(efi_crt0),
3682 'EFI include directory: @0@'.format(efi_incdir)]
3716 ['compat-mutable-uid-boundaries'],
3745 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3746 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3750 ['legacy pkla', install_polkit_pkla],
3752 ['gnu-efi', have_gnu_efi],
3765 ['man pages', want_man],
3766 ['html pages', want_html],
3767 ['man page indices', want_man and have_lxml],
3772 ['adm group', get_option('adm-group')],
3773 ['wheel group', get_option('wheel-group')],
3776 ['debug mmap cache'],
3778 ['valgrind', conf.get('VALGRIND') == 1],
3779 ['trace logging', conf.get('LOG_TRACE') == 1],
3780 ['install tests', install_tests],
3781 ['link-udev-shared', get_option('link-udev-shared')],
3782 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3783 ['link-networkd-shared', get_option('link-networkd-shared')],
3784 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3785 ['kernel-install', get_option('kernel-install')],
3786 ['systemd-analyze', conf.get('ENABLE_ANALYZE') == 1],
3789 if tuple.length() >= 2
3792 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3793 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3794 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3805 'enabled features: @0@'.format(', '.join(found)),
3807 'disabled features: @0@'.format(', '.join(missing)),
3809 message('\n '.join(status))
3811 if rootprefixdir != rootprefix_default
3813 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3814 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3815 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))