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>'''],
535 ['mallinfo', '''#include <malloc.h>'''],
536 ['close_range', '''#include <unistd.h>'''],
539 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
540 conf.set10('HAVE_' + ident[0].to_upper(), have)
543 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
544 conf.set10('USE_SYS_RANDOM_H', true)
545 conf.set10('HAVE_GETRANDOM', true)
547 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
548 conf.set10('USE_SYS_RANDOM_H', false)
549 conf.set10('HAVE_GETRANDOM', have)
552 #####################################################################
554 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
556 get_option('version-tag'),
557 meson.project_version()]
560 input : 'src/version/version.h.in',
561 output : 'version.h',
564 versiondep = declare_dependency(sources: version_h)
566 sed = find_program('sed')
567 awk = find_program('awk')
568 m4 = find_program('m4')
569 stat = find_program('stat')
570 git = find_program('git', required : false)
571 env = find_program('env')
572 perl = find_program('perl', required : false)
574 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
575 mkdir_p = 'mkdir -p $DESTDIR/@0@'
576 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
577 splash_bmp = files('test/splash.bmp')
579 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
580 # /usr/sbin, /sbin, and fall back to the default from middle column.
581 progs = [['quotaon', '/usr/sbin/quotaon' ],
582 ['quotacheck', '/usr/sbin/quotacheck' ],
583 ['kmod', '/usr/bin/kmod' ],
584 ['kexec', '/usr/sbin/kexec' ],
585 ['sulogin', '/usr/sbin/sulogin' ],
586 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
587 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
588 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
589 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
590 ['nologin', '/usr/sbin/nologin', ],
593 path = get_option(prog[0] + '-path')
595 message('Using @1@ for @0@'.format(prog[0], path))
597 exe = find_program(prog[0],
598 '/usr/sbin/' + prog[0],
601 path = exe.found() ? exe.path() : prog[1]
603 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
604 conf.set_quoted(name, path)
605 substs.set(name, path)
608 conf.set_quoted('TELINIT', get_option('telinit-path'))
610 if run_command('ln', '--relative', '--help').returncode() != 0
611 error('ln does not support --relative (added in coreutils 8.16)')
614 ############################################################
616 gperf = find_program('gperf')
618 gperf_test_format = '''
620 const char * in_word_set(const char *, @0@);
623 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
624 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
625 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
626 if cc.compiles(gperf_test)
627 gperf_len_type = 'size_t'
629 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
630 if cc.compiles(gperf_test)
631 gperf_len_type = 'unsigned'
633 error('unable to determine gperf len type')
636 message('gperf len type is @0@'.format(gperf_len_type))
637 conf.set('GPERF_LEN_TYPE', gperf_len_type,
638 description : 'The type of gperf "len" parameter')
640 ############################################################
642 if not cc.has_header('sys/capability.h')
643 error('POSIX caps headers not found')
645 foreach header : ['crypt.h',
647 'linux/vm_sockets.h',
649 'valgrind/memcheck.h',
650 'valgrind/valgrind.h',
653 conf.set10('HAVE_' + header.underscorify().to_upper(),
654 cc.has_header(header))
657 ############################################################
659 fallback_hostname = get_option('fallback-hostname')
660 if fallback_hostname == '' or fallback_hostname[0] == '.' or fallback_hostname[0] == '-'
661 error('Invalid fallback-hostname configuration')
662 # A more extensive test is done in test-hostname-util. Let's catch
663 # the most obvious errors here so we don't fail with an assert later.
665 conf.set_quoted('FALLBACK_HOSTNAME', fallback_hostname)
667 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
668 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
670 default_hierarchy = get_option('default-hierarchy')
671 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
672 description : 'default cgroup hierarchy as string')
673 if default_hierarchy == 'legacy'
674 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
675 elif default_hierarchy == 'hybrid'
676 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
678 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
681 default_net_naming_scheme = get_option('default-net-naming-scheme')
682 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
684 time_epoch = get_option('time-epoch')
686 time_epoch = run_command('sh', ['-c', 'echo "$SOURCE_DATE_EPOCH"']).stdout().strip()
687 if time_epoch == '' and git.found() and run_command('test', '-e', '.git').returncode() == 0
688 # If we're in a git repository, use the creation time of the latest git tag.
689 latest_tag = run_command('git', 'describe', '--abbrev=0', '--tags').stdout().strip()
690 time_epoch = run_command('git', 'log', '-1', '--format=%at', latest_tag).stdout()
694 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
696 time_epoch = time_epoch.to_int()
698 conf.set('TIME_EPOCH', time_epoch)
700 foreach tuple : [['system-alloc-uid-min', 'SYS_UID_MIN', 1], # Also see login.defs(5).
701 ['system-uid-max', 'SYS_UID_MAX', 999],
702 ['system-alloc-gid-min', 'SYS_GID_MIN', 1],
703 ['system-gid-max', 'SYS_GID_MAX', 999]]
704 v = get_option(tuple[0])
708 '/^\s*@0@\s+/ { uid=$2 } END { print uid }'.format(tuple[1]),
709 '/etc/login.defs').stdout().strip()
716 conf.set(tuple[0].underscorify().to_upper(), v)
717 substs.set(tuple[0].underscorify().to_upper(), v)
719 if conf.get('SYSTEM_ALLOC_UID_MIN') >= conf.get('SYSTEM_UID_MAX')
720 error('Invalid uid allocation range')
722 if conf.get('SYSTEM_ALLOC_GID_MIN') >= conf.get('SYSTEM_GID_MAX')
723 error('Invalid gid allocation range')
726 dynamic_uid_min = get_option('dynamic-uid-min')
727 dynamic_uid_max = get_option('dynamic-uid-max')
728 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
729 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
730 substs.set('dynamicuidmin', dynamic_uid_min)
731 substs.set('dynamicuidmax', dynamic_uid_max)
733 container_uid_base_min = get_option('container-uid-base-min')
734 container_uid_base_max = get_option('container-uid-base-max')
735 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
736 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
737 substs.set('containeruidbasemin', container_uid_base_min)
738 substs.set('containeruidbasemax', container_uid_base_max)
740 nobody_user = get_option('nobody-user')
741 nobody_group = get_option('nobody-group')
743 if not meson.is_cross_build()
744 getent_result = run_command('getent', 'passwd', '65534')
745 if getent_result.returncode() == 0
746 name = getent_result.stdout().split(':')[0]
747 if name != nobody_user
749 '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) +
750 'Your build will result in an user table setup that is incompatible with the local system.')
753 id_result = run_command('id', '-u', nobody_user)
754 if id_result.returncode() == 0
755 id = id_result.stdout().to_int()
758 '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) +
759 'Your build will result in an user table setup that is incompatible with the local system.')
763 getent_result = run_command('getent', 'group', '65534')
764 if getent_result.returncode() == 0
765 name = getent_result.stdout().split(':')[0]
766 if name != nobody_group
768 '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) +
769 'Your build will result in an group table setup that is incompatible with the local system.')
772 id_result = run_command('id', '-g', nobody_group)
773 if id_result.returncode() == 0
774 id = id_result.stdout().to_int()
777 '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) +
778 'Your build will result in an group table setup that is incompatible with the local system.')
782 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
784 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
785 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
788 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
789 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
790 substs.set('NOBODY_USER_NAME', nobody_user)
791 substs.set('NOBODY_GROUP_NAME', nobody_group)
793 tty_gid = get_option('tty-gid')
794 conf.set('TTY_GID', tty_gid)
795 substs.set('TTY_GID', tty_gid)
797 # Ensure provided GID argument is numeric, otherwise fall back to default assignment
798 users_gid = get_option('users-gid')
799 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
801 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
802 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
804 dev_kvm_mode = get_option('dev-kvm-mode')
805 substs.set('DEV_KVM_MODE', dev_kvm_mode)
806 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
807 group_render_mode = get_option('group-render-mode')
808 substs.set('GROUP_RENDER_MODE', group_render_mode)
809 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
811 kill_user_processes = get_option('default-kill-user-processes')
812 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
813 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
814 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
816 dns_servers = get_option('dns-servers')
817 conf.set_quoted('DNS_SERVERS', dns_servers)
818 substs.set('DNS_SERVERS', dns_servers)
820 ntp_servers = get_option('ntp-servers')
821 conf.set_quoted('NTP_SERVERS', ntp_servers)
822 substs.set('NTP_SERVERS', ntp_servers)
824 default_locale = get_option('default-locale')
825 if default_locale == ''
826 if not meson.is_cross_build()
827 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
828 default_locale = run_command(choose_default_locale_sh).stdout().strip()
830 default_locale = 'C.UTF-8'
833 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
835 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
837 service_watchdog = get_option('service-watchdog')
838 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
839 substs.set('SERVICE_WATCHDOG', watchdog_value)
841 substs.set('SUSHELL', get_option('debug-shell'))
842 substs.set('DEBUGTTY', get_option('debug-tty'))
843 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
845 enable_debug_hashmap = false
846 enable_debug_mmap_cache = false
847 enable_debug_siphash = false
848 foreach name : get_option('debug-extra')
850 enable_debug_hashmap = true
851 elif name == 'mmap-cache'
852 enable_debug_mmap_cache = true
853 elif name == 'siphash'
854 enable_debug_siphash = true
856 message('unknown debug option "@0@", ignoring'.format(name))
859 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
860 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
861 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
863 conf.set10('VALGRIND', get_option('valgrind'))
864 conf.set10('LOG_TRACE', get_option('log-trace'))
866 default_user_path = get_option('user-path')
867 if default_user_path != ''
868 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
869 default_user_path_display = default_user_path
871 # meson 0.49 fails when ?: is used in .format()
872 default_user_path_display = '(same as system services)'
876 #####################################################################
878 threads = dependency('threads')
879 librt = cc.find_library('rt')
880 libm = cc.find_library('m')
881 libdl = cc.find_library('dl')
882 libcrypt = cc.find_library('crypt')
884 crypt_header = conf.get('HAVE_CRYPT_H') == 1 ? '''#include <crypt.h>''' : '''#include <unistd.h>'''
886 ['crypt_ra', crypt_header],
887 ['crypt_preferred_method', crypt_header],
888 ['crypt_gensalt_ra', crypt_header]]
890 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE',
891 dependencies : libcrypt)
892 conf.set10('HAVE_' + ident[0].to_upper(), have)
895 libcap = dependency('libcap', required : false)
896 if not libcap.found()
897 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
898 libcap = cc.find_library('cap')
901 libmount = dependency('mount',
902 version : fuzzer_build ? '>= 0' : '>= 2.30')
904 want_libfdisk = get_option('fdisk')
905 if want_libfdisk != 'false' and not skip_deps
906 libfdisk = dependency('fdisk',
908 required : want_libfdisk == 'true')
909 have = libfdisk.found()
914 conf.set10('HAVE_LIBFDISK', have)
916 want_pwquality = get_option('pwquality')
917 if want_pwquality != 'false' and not skip_deps
918 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
919 have = libpwquality.found()
924 conf.set10('HAVE_PWQUALITY', have)
926 want_seccomp = get_option('seccomp')
927 if want_seccomp != 'false' and not skip_deps
928 libseccomp = dependency('libseccomp',
929 version : '>= 2.3.1',
930 required : want_seccomp == 'true')
931 have = libseccomp.found()
936 conf.set10('HAVE_SECCOMP', have)
938 want_selinux = get_option('selinux')
939 if want_selinux != 'false' and not skip_deps
940 libselinux = dependency('libselinux',
941 version : '>= 2.1.9',
942 required : want_selinux == 'true')
943 have = libselinux.found()
948 conf.set10('HAVE_SELINUX', have)
950 want_apparmor = get_option('apparmor')
951 if want_apparmor != 'false' and not skip_deps
952 libapparmor = dependency('libapparmor',
954 required : want_apparmor == 'true')
955 have = libapparmor.found()
960 conf.set10('HAVE_APPARMOR', have)
962 smack_run_label = get_option('smack-run-label')
963 if smack_run_label != ''
964 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
967 want_polkit = get_option('polkit')
968 install_polkit = false
969 install_polkit_pkla = false
970 if want_polkit != 'false' and not skip_deps
971 install_polkit = true
973 libpolkit = dependency('polkit-gobject-1',
975 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
976 message('Old polkit detected, will install pkla files')
977 install_polkit_pkla = true
980 conf.set10('ENABLE_POLKIT', install_polkit)
982 want_acl = get_option('acl')
983 if want_acl != 'false' and not skip_deps
984 libacl = cc.find_library('acl', required : want_acl == 'true')
985 have = libacl.found()
990 conf.set10('HAVE_ACL', have)
992 want_audit = get_option('audit')
993 if want_audit != 'false' and not skip_deps
994 libaudit = dependency('audit', required : want_audit == 'true')
995 have = libaudit.found()
1000 conf.set10('HAVE_AUDIT', have)
1002 want_blkid = get_option('blkid')
1003 if want_blkid != 'false' and not skip_deps
1004 libblkid = dependency('blkid', required : want_blkid == 'true')
1005 have = libblkid.found()
1010 conf.set10('HAVE_BLKID', have)
1012 want_kmod = get_option('kmod')
1013 if want_kmod != 'false' and not skip_deps
1014 libkmod = dependency('libkmod',
1016 required : want_kmod == 'true')
1017 have = libkmod.found()
1022 conf.set10('HAVE_KMOD', have)
1024 want_pam = get_option('pam')
1025 if want_pam != 'false' and not skip_deps
1026 libpam = cc.find_library('pam', required : want_pam == 'true')
1027 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
1028 have = libpam.found() and libpam_misc.found()
1034 conf.set10('HAVE_PAM', have)
1036 want_microhttpd = get_option('microhttpd')
1037 if want_microhttpd != 'false' and not skip_deps
1038 libmicrohttpd = dependency('libmicrohttpd',
1039 version : '>= 0.9.33',
1040 required : want_microhttpd == 'true')
1041 have = libmicrohttpd.found()
1046 conf.set10('HAVE_MICROHTTPD', have)
1048 want_libcryptsetup = get_option('libcryptsetup')
1049 if want_libcryptsetup != 'false' and not skip_deps
1050 libcryptsetup = dependency('libcryptsetup',
1051 version : '>= 2.0.1',
1052 required : want_libcryptsetup == 'true')
1053 have = libcryptsetup.found()
1055 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1056 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
1057 conf.set10('HAVE_CRYPT_ACTIVATE_BY_SIGNED_KEY',
1058 have and cc.has_function('crypt_activate_by_signed_key', dependencies : libcryptsetup))
1063 conf.set10('HAVE_LIBCRYPTSETUP', have)
1065 want_libcurl = get_option('libcurl')
1066 if want_libcurl != 'false' and not skip_deps
1067 libcurl = dependency('libcurl',
1068 version : '>= 7.32.0',
1069 required : want_libcurl == 'true')
1070 have = libcurl.found()
1075 conf.set10('HAVE_LIBCURL', have)
1077 want_libidn = get_option('libidn')
1078 want_libidn2 = get_option('libidn2')
1079 if want_libidn == 'true' and want_libidn2 == 'true'
1080 error('libidn and libidn2 cannot be requested simultaneously')
1083 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1084 libidn = dependency('libidn2',
1085 required : want_libidn2 == 'true')
1086 have = libidn.found()
1091 conf.set10('HAVE_LIBIDN2', have)
1092 if not have and want_libidn != 'false' and not skip_deps
1093 # libidn is used for both libidn and libidn2 objects
1094 libidn = dependency('libidn',
1095 required : want_libidn == 'true')
1096 have = libidn.found()
1100 conf.set10('HAVE_LIBIDN', have)
1102 want_libiptc = get_option('libiptc')
1103 if want_libiptc != 'false' and not skip_deps
1104 libiptc = dependency('libiptc',
1105 required : want_libiptc == 'true')
1106 have = libiptc.found()
1111 conf.set10('HAVE_LIBIPTC', have)
1113 want_qrencode = get_option('qrencode')
1114 if want_qrencode != 'false' and not skip_deps
1115 libqrencode = dependency('libqrencode',
1116 required : want_qrencode == 'true')
1117 have = libqrencode.found()
1122 conf.set10('HAVE_QRENCODE', have)
1124 want_gcrypt = get_option('gcrypt')
1125 if want_gcrypt != 'false' and not skip_deps
1126 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1127 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1128 have = libgcrypt.found() and libgpg_error.found()
1133 # link to neither of the libs if one is not found
1137 conf.set10('HAVE_GCRYPT', have)
1139 want_gnutls = get_option('gnutls')
1140 if want_gnutls != 'false' and not skip_deps
1141 libgnutls = dependency('gnutls',
1142 version : '>= 3.1.4',
1143 required : want_gnutls == 'true')
1144 have = libgnutls.found()
1149 conf.set10('HAVE_GNUTLS', have)
1151 want_openssl = get_option('openssl')
1152 if want_openssl != 'false' and not skip_deps
1153 libopenssl = dependency('openssl',
1154 version : '>= 1.1.0',
1155 required : want_openssl == 'true')
1156 have = libopenssl.found()
1161 conf.set10('HAVE_OPENSSL', have)
1163 want_p11kit = get_option('p11kit')
1164 if want_p11kit != 'false' and not skip_deps
1165 libp11kit = dependency('p11-kit-1',
1166 version : '>= 0.23.3',
1167 required : want_p11kit == 'true')
1168 have = libp11kit.found()
1173 conf.set10('HAVE_P11KIT', have)
1175 want_libfido2 = get_option('libfido2')
1176 if want_libfido2 != 'false' and not skip_deps
1177 libfido2 = dependency('libfido2',
1178 required : want_libfido2 == 'true')
1179 have = libfido2.found()
1184 conf.set10('HAVE_LIBFIDO2', have)
1186 want_elfutils = get_option('elfutils')
1187 if want_elfutils != 'false' and not skip_deps
1188 libdw = dependency('libdw',
1189 required : want_elfutils == 'true')
1190 have = libdw.found()
1195 conf.set10('HAVE_ELFUTILS', have)
1197 want_zlib = get_option('zlib')
1198 if want_zlib != 'false' and not skip_deps
1199 libz = dependency('zlib',
1200 required : want_zlib == 'true')
1206 conf.set10('HAVE_ZLIB', have)
1208 want_bzip2 = get_option('bzip2')
1209 if want_bzip2 != 'false' and not skip_deps
1210 libbzip2 = cc.find_library('bz2',
1211 required : want_bzip2 == 'true')
1212 have = libbzip2.found()
1217 conf.set10('HAVE_BZIP2', have)
1219 want_xz = get_option('xz')
1220 if want_xz != 'false' and not skip_deps
1221 libxz = dependency('liblzma',
1222 required : want_xz == 'true')
1223 have_xz = libxz.found()
1228 conf.set10('HAVE_XZ', have_xz)
1230 want_lz4 = get_option('lz4')
1231 if want_lz4 != 'false' and not skip_deps
1232 liblz4 = dependency('liblz4',
1233 version : '>= 1.3.0',
1234 required : want_lz4 == 'true')
1235 have_lz4 = liblz4.found()
1240 conf.set10('HAVE_LZ4', have_lz4)
1242 want_zstd = get_option('zstd')
1243 if want_zstd != 'false' and not skip_deps
1244 libzstd = dependency('libzstd',
1245 required : want_zstd == 'true',
1246 version : '>= 1.4.0')
1247 have_zstd = libzstd.found()
1252 conf.set10('HAVE_ZSTD', have_zstd)
1254 conf.set10('HAVE_COMPRESSION', have_xz or have_lz4 or have_zstd)
1256 want_xkbcommon = get_option('xkbcommon')
1257 if want_xkbcommon != 'false' and not skip_deps
1258 libxkbcommon = dependency('xkbcommon',
1259 version : '>= 0.3.0',
1260 required : want_xkbcommon == 'true')
1261 have = libxkbcommon.found()
1266 conf.set10('HAVE_XKBCOMMON', have)
1268 want_pcre2 = get_option('pcre2')
1269 if want_pcre2 != 'false'
1270 libpcre2 = dependency('libpcre2-8',
1271 required : want_pcre2 == 'true')
1272 have = libpcre2.found()
1277 conf.set10('HAVE_PCRE2', have)
1279 want_glib = get_option('glib')
1280 if want_glib != 'false' and not skip_deps
1281 libglib = dependency('glib-2.0',
1282 version : '>= 2.22.0',
1283 required : want_glib == 'true')
1284 libgobject = dependency('gobject-2.0',
1285 version : '>= 2.22.0',
1286 required : want_glib == 'true')
1287 libgio = dependency('gio-2.0',
1288 required : want_glib == 'true')
1289 have = libglib.found() and libgobject.found() and libgio.found()
1296 conf.set10('HAVE_GLIB', have)
1298 want_dbus = get_option('dbus')
1299 if want_dbus != 'false' and not skip_deps
1300 libdbus = dependency('dbus-1',
1301 version : '>= 1.3.2',
1302 required : want_dbus == 'true')
1303 have = libdbus.found()
1308 conf.set10('HAVE_DBUS', have)
1310 default_dnssec = get_option('default-dnssec')
1312 default_dnssec = 'no'
1314 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1315 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1316 default_dnssec = 'no'
1318 conf.set('DEFAULT_DNSSEC_MODE',
1319 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1320 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1322 dns_over_tls = get_option('dns-over-tls')
1323 if dns_over_tls != 'false'
1324 if dns_over_tls == 'openssl'
1327 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1328 if dns_over_tls == 'gnutls' and not have_gnutls
1329 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1332 if dns_over_tls == 'gnutls' or have_gnutls
1333 have_openssl = false
1335 have_openssl = conf.get('HAVE_OPENSSL') == 1
1336 if dns_over_tls != 'auto' and not have_openssl
1337 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1338 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1341 have = have_gnutls or have_openssl
1345 have_openssl = false
1347 conf.set10('ENABLE_DNS_OVER_TLS', have)
1348 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1349 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1351 default_dns_over_tls = get_option('default-dns-over-tls')
1353 default_dns_over_tls = 'no'
1355 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1356 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.')
1357 default_dns_over_tls = 'no'
1359 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1360 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1361 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1363 default_mdns = get_option('default-mdns')
1364 conf.set('DEFAULT_MDNS_MODE',
1365 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
1366 substs.set('DEFAULT_MDNS_MODE', default_mdns)
1368 default_llmnr = get_option('default-llmnr')
1369 conf.set('DEFAULT_LLMNR_MODE',
1370 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
1371 substs.set('DEFAULT_LLMNR_MODE', default_llmnr)
1373 want_repart = get_option('repart')
1374 if want_repart != 'false'
1375 have = (conf.get('HAVE_OPENSSL') == 1 and
1376 conf.get('HAVE_LIBFDISK') == 1)
1377 if want_repart == 'true' and not have
1378 error('repart support was requested, but dependencies are not available')
1383 conf.set10('ENABLE_REPART', have)
1385 want_importd = get_option('importd')
1386 if want_importd != 'false'
1387 have = (conf.get('HAVE_LIBCURL') == 1 and
1388 conf.get('HAVE_ZLIB') == 1 and
1389 conf.get('HAVE_XZ') == 1 and
1390 conf.get('HAVE_GCRYPT') == 1)
1391 if want_importd == 'true' and not have
1392 error('importd support was requested, but dependencies are not available')
1397 conf.set10('ENABLE_IMPORTD', have)
1399 want_homed = get_option('homed')
1400 if want_homed != 'false'
1401 have = (conf.get('HAVE_OPENSSL') == 1 and
1402 conf.get('HAVE_LIBFDISK') == 1 and
1403 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1404 if want_homed == 'true' and not have
1405 error('homed support was requested, but dependencies are not available')
1410 conf.set10('ENABLE_HOMED', have)
1412 have = have and conf.get('HAVE_PAM') == 1
1413 conf.set10('ENABLE_PAM_HOME', have)
1415 have = get_option('oomd')
1417 have = get_option('mode') == 'developer'
1419 have = have == 'true'
1420 if have and get_option('mode') != 'developer'
1421 error('oomd is not available in release mode (yet)')
1424 conf.set10('ENABLE_OOMD', have)
1426 want_remote = get_option('remote')
1427 if want_remote != 'false'
1428 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1429 conf.get('HAVE_LIBCURL') == 1]
1430 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1431 # it's possible to build one without the other. Complain only if
1432 # support was explicitly requested. The auxiliary files like sysusers
1433 # config should be installed when any of the programs are built.
1434 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1435 error('remote support was requested, but dependencies are not available')
1437 have = have_deps[0] or have_deps[1]
1441 conf.set10('ENABLE_REMOTE', have)
1443 foreach term : ['analyze',
1457 'compat-mutable-uid-boundaries',
1482 have = get_option(term)
1483 name = 'ENABLE_' + term.underscorify().to_upper()
1484 conf.set10(name, have)
1485 substs.set10(name, have)
1488 enable_sysusers = conf.get('ENABLE_SYSUSERS') == 1
1490 foreach tuple : [['nss-mymachines', 'machined'],
1491 ['nss-resolve', 'resolve']]
1492 want = get_option(tuple[0])
1494 have = get_option(tuple[1])
1495 if want == 'true' and not have
1496 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1501 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1502 conf.set10(name, have)
1506 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1507 'ENABLE_NSS_MYMACHINES',
1508 'ENABLE_NSS_RESOLVE',
1509 'ENABLE_NSS_SYSTEMD']
1510 if conf.get(term) == 1
1514 conf.set10('ENABLE_NSS', enable_nss)
1516 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1521 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1523 #####################################################################
1525 if get_option('efi')
1526 efi_arch = host_machine.cpu_family()
1528 if efi_arch == 'x86'
1529 EFI_MACHINE_TYPE_NAME = 'ia32'
1530 gnu_efi_arch = 'ia32'
1531 elif efi_arch == 'x86_64'
1532 EFI_MACHINE_TYPE_NAME = 'x64'
1533 gnu_efi_arch = 'x86_64'
1534 elif efi_arch == 'arm'
1535 EFI_MACHINE_TYPE_NAME = 'arm'
1536 gnu_efi_arch = 'arm'
1537 elif efi_arch == 'aarch64'
1538 EFI_MACHINE_TYPE_NAME = 'aa64'
1539 gnu_efi_arch = 'aarch64'
1541 EFI_MACHINE_TYPE_NAME = ''
1546 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1548 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1552 conf.set10('ENABLE_EFI', have)
1554 #####################################################################
1556 config_h = configure_file(
1557 output : 'config.h',
1558 configuration : conf)
1560 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1562 includes = include_directories('src/basic',
1568 'src/journal-remote',
1572 'src/time-wait-sync',
1578 'src/xdg-autostart-generator',
1579 'src/libsystemd/sd-bus',
1580 'src/libsystemd/sd-device',
1581 'src/libsystemd/sd-event',
1582 'src/libsystemd/sd-hwdb',
1583 'src/libsystemd/sd-id128',
1584 'src/libsystemd/sd-netlink',
1585 'src/libsystemd/sd-network',
1586 'src/libsystemd/sd-resolve',
1587 'src/libsystemd-network',
1590 add_project_arguments('-include', 'config.h', language : 'c')
1592 generate_gperfs = find_program('tools/generate-gperfs.py')
1596 subdir('src/systemd')
1598 subdir('src/libsystemd')
1599 subdir('src/libsystemd-network')
1600 subdir('src/journal')
1603 libjournal_core = static_library(
1605 libjournal_core_sources,
1607 include_directories : includes,
1610 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1611 libsystemd = shared_library(
1614 version : libsystemd_version,
1615 include_directories : includes,
1616 link_args : ['-shared',
1617 '-Wl,--version-script=' + libsystemd_sym_path],
1618 link_with : [libbasic,
1620 link_whole : [libsystemd_static,
1622 dependencies : [threads,
1627 link_depends : libsystemd_sym,
1629 install_dir : rootlibdir)
1631 static_libsystemd = get_option('static-libsystemd')
1632 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1634 install_libsystemd_static = static_library(
1637 journal_client_sources,
1639 basic_gcrypt_sources,
1641 include_directories : includes,
1642 build_by_default : static_libsystemd != 'false',
1643 install : static_libsystemd != 'false',
1644 install_dir : rootlibdir,
1645 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1646 dependencies : [threads,
1656 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1658 ############################################################
1660 autosuspend_update_sh = find_program('tools/autosuspend-update.sh')
1661 hwdb_update_sh = find_program('tools/hwdb-update.sh')
1662 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1663 make_directive_index_py = find_program('tools/make-directive-index.py')
1664 make_man_index_py = find_program('tools/make-man-index.py')
1665 syscall_names_update_sh = find_program('tools/syscall-names-update.sh')
1666 xml_helper_py = find_program('tools/xml_helper.py')
1667 update_dbus_docs_py = find_program('tools/update-dbus-docs.py')
1669 ############################################################
1671 # binaries that have --help and are intended for use by humans,
1672 # usually, but not always, installed in /bin.
1673 public_programs = []
1675 subdir('src/libudev')
1676 subdir('src/shared')
1678 subdir('src/shutdown')
1680 subdir('src/network')
1682 subdir('src/analyze')
1683 subdir('src/journal-remote')
1684 subdir('src/coredump')
1685 subdir('src/pstore')
1687 subdir('src/hostname')
1688 subdir('src/import')
1689 subdir('src/partition')
1690 subdir('src/kernel-install')
1691 subdir('src/locale')
1692 subdir('src/machine')
1693 subdir('src/portable')
1694 subdir('src/userdb')
1696 subdir('src/nspawn')
1697 subdir('src/resolve')
1698 subdir('src/timedate')
1699 subdir('src/timesync')
1700 subdir('src/tmpfiles')
1701 subdir('src/vconsole')
1702 subdir('src/boot/efi')
1709 ############################################################
1711 # only static linking apart from libdl, to make sure that the
1712 # module is linked to all libraries that it uses.
1713 test_dlopen = executable(
1717 include_directories : includes,
1718 link_with : [libbasic],
1719 dependencies : [libdl],
1720 build_by_default : want_tests != 'false')
1722 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1723 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h src/nss-systemd/nss-systemd.h'],
1724 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1725 ['resolve', 'ENABLE_NSS_RESOLVE']]
1727 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1731 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1732 version_script_arg = join_paths(project_source_root, sym)
1734 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1735 if tuple.length() > 2
1736 sources += tuple[2].split()
1739 nss = shared_library(
1744 include_directories : includes,
1745 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1746 link_args : ['-Wl,-z,nodelete',
1748 '-Wl,--version-script=' + version_script_arg],
1749 link_with : [libsystemd_static,
1752 dependencies : [threads,
1756 install_dir : rootlibdir)
1758 # We cannot use shared_module because it does not support version suffix.
1759 # Unfortunately shared_library insists on creating the symlink…
1760 meson.add_install_script('sh', '-c',
1761 'rm $DESTDIR@0@/libnss_@1@.so'
1762 .format(rootlibdir, module))
1764 if want_tests != 'false'
1765 test('dlopen-nss_' + module,
1767 # path to dlopen must include a slash
1768 args : nss.full_path())
1773 ############################################################
1778 include_directories : includes,
1779 link_with : [libcore,
1781 dependencies : [versiondep,
1788 install_rpath : rootlibexecdir,
1790 install_dir : rootlibexecdir)
1792 meson.add_install_script(meson_make_symlink,
1793 join_paths(rootlibexecdir, 'systemd'),
1794 join_paths(rootsbindir, 'init'))
1796 public_programs += executable(
1798 systemd_analyze_sources,
1799 include_directories : includes,
1800 link_with : [libcore,
1802 dependencies : [versiondep,
1809 install_rpath : rootlibexecdir,
1810 install : conf.get('ENABLE_ANALYZE'))
1814 systemd_journald_sources,
1815 include_directories : includes,
1816 link_with : [libjournal_core,
1818 dependencies : [threads,
1823 install_rpath : rootlibexecdir,
1825 install_dir : rootlibexecdir)
1827 public_programs += executable(
1829 systemd_cat_sources,
1830 include_directories : includes,
1831 link_with : [libjournal_core,
1833 dependencies : [threads],
1834 install_rpath : rootlibexecdir,
1837 public_programs += executable(
1840 include_directories : includes,
1841 link_with : [libshared],
1842 dependencies : [threads,
1848 install_rpath : rootlibexecdir,
1850 install_dir : rootbindir)
1853 'systemd-getty-generator',
1854 'src/getty-generator/getty-generator.c',
1855 include_directories : includes,
1856 link_with : [libshared],
1857 install_rpath : rootlibexecdir,
1859 install_dir : systemgeneratordir)
1862 'systemd-debug-generator',
1863 'src/debug-generator/debug-generator.c',
1864 include_directories : includes,
1865 link_with : [libshared],
1866 install_rpath : rootlibexecdir,
1868 install_dir : systemgeneratordir)
1871 'systemd-run-generator',
1872 'src/run-generator/run-generator.c',
1873 include_directories : includes,
1874 link_with : [libshared],
1875 install_rpath : rootlibexecdir,
1877 install_dir : systemgeneratordir)
1880 'systemd-fstab-generator',
1881 'src/fstab-generator/fstab-generator.c',
1882 include_directories : includes,
1883 link_with : [libcore_shared,
1885 install_rpath : rootlibexecdir,
1887 install_dir : systemgeneratordir)
1889 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1891 '30-systemd-environment-d-generator',
1892 'src/environment-d-generator/environment-d-generator.c',
1893 include_directories : includes,
1894 link_with : [libshared],
1895 install_rpath : rootlibexecdir,
1897 install_dir : userenvgeneratordir)
1899 meson.add_install_script(meson_make_symlink,
1900 join_paths(sysconfdir, 'environment'),
1901 join_paths(environmentdir, '99-environment.conf'))
1904 if conf.get('ENABLE_HIBERNATE') == 1
1906 'systemd-hibernate-resume-generator',
1907 'src/hibernate-resume/hibernate-resume-generator.c',
1908 include_directories : includes,
1909 link_with : [libshared],
1910 install_rpath : rootlibexecdir,
1912 install_dir : systemgeneratordir)
1915 'systemd-hibernate-resume',
1916 'src/hibernate-resume/hibernate-resume.c',
1917 include_directories : includes,
1918 link_with : [libshared],
1919 install_rpath : rootlibexecdir,
1921 install_dir : rootlibexecdir)
1924 if conf.get('HAVE_BLKID') == 1
1926 'systemd-gpt-auto-generator',
1927 'src/gpt-auto-generator/gpt-auto-generator.c',
1928 'src/shared/blkid-util.h',
1929 include_directories : includes,
1930 link_with : [libshared],
1931 dependencies : libblkid,
1932 install_rpath : rootlibexecdir,
1934 install_dir : systemgeneratordir)
1936 public_programs += executable(
1938 'src/dissect/dissect.c',
1939 include_directories : includes,
1940 link_with : [libshared],
1941 install_rpath : rootlibexecdir,
1945 if conf.get('ENABLE_RESOLVE') == 1
1948 systemd_resolved_sources,
1949 include_directories : includes,
1950 link_with : [libshared,
1952 libsystemd_resolve_core],
1953 dependencies : systemd_resolved_dependencies,
1954 install_rpath : rootlibexecdir,
1956 install_dir : rootlibexecdir)
1958 public_programs += executable(
1961 include_directories : includes,
1962 link_with : [libshared,
1964 libsystemd_resolve_core],
1965 dependencies : [threads,
1969 install_rpath : rootlibexecdir,
1972 meson.add_install_script(meson_make_symlink,
1973 join_paths(bindir, 'resolvectl'),
1974 join_paths(rootsbindir, 'resolvconf'))
1976 meson.add_install_script(meson_make_symlink,
1977 join_paths(bindir, 'resolvectl'),
1978 join_paths(bindir, 'systemd-resolve'))
1981 if conf.get('ENABLE_LOGIND') == 1
1984 systemd_logind_sources,
1985 include_directories : includes,
1986 link_with : [liblogind_core,
1988 dependencies : [threads,
1990 install_rpath : rootlibexecdir,
1992 install_dir : rootlibexecdir)
1994 public_programs += executable(
1997 include_directories : includes,
1998 link_with : [libshared],
1999 dependencies : [threads,
2003 install_rpath : rootlibexecdir,
2005 install_dir : rootbindir)
2007 public_programs += executable(
2009 'src/login/inhibit.c',
2010 include_directories : includes,
2011 link_with : [libshared],
2012 install_rpath : rootlibexecdir,
2014 install_dir : rootbindir)
2016 if conf.get('HAVE_PAM') == 1
2017 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
2018 pam_systemd = shared_library(
2022 include_directories : includes,
2023 link_args : ['-shared',
2024 '-Wl,--version-script=' + version_script_arg],
2025 link_with : [libsystemd_static,
2027 dependencies : [threads,
2030 link_depends : pam_systemd_sym,
2032 install_dir : pamlibdir)
2034 if want_tests != 'false'
2035 test('dlopen-pam_systemd',
2037 # path to dlopen must include a slash
2038 args : pam_systemd.full_path())
2043 'systemd-user-runtime-dir',
2044 user_runtime_dir_sources,
2045 include_directories : includes,
2046 link_with : [libshared],
2047 install_rpath : rootlibexecdir,
2049 install_dir : rootlibexecdir)
2052 if conf.get('HAVE_PAM') == 1
2054 'systemd-user-sessions',
2055 'src/user-sessions/user-sessions.c',
2056 include_directories : includes,
2057 link_with : [libshared],
2058 install_rpath : rootlibexecdir,
2060 install_dir : rootlibexecdir)
2063 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
2064 public_programs += executable(
2066 'src/boot/bootctl.c',
2067 include_directories : includes,
2068 link_with : [libshared],
2069 dependencies : [libblkid],
2070 install_rpath : rootlibexecdir,
2073 public_programs += executable(
2074 'systemd-bless-boot',
2075 'src/boot/bless-boot.c',
2076 include_directories : includes,
2077 link_with : [libshared],
2078 dependencies : [libblkid],
2079 install_rpath : rootlibexecdir,
2081 install_dir : rootlibexecdir)
2084 'systemd-bless-boot-generator',
2085 'src/boot/bless-boot-generator.c',
2086 include_directories : includes,
2087 link_with : [libshared],
2088 install_rpath : rootlibexecdir,
2090 install_dir : systemgeneratordir)
2094 'systemd-boot-check-no-failures',
2095 'src/boot/boot-check-no-failures.c',
2096 include_directories : includes,
2097 link_with : [libshared],
2098 dependencies : [libblkid],
2099 install_rpath : rootlibexecdir,
2101 install_dir : rootlibexecdir)
2103 public_programs += executable(
2104 'systemd-socket-activate',
2105 'src/activate/activate.c',
2106 include_directories : includes,
2107 link_with : [libshared],
2108 dependencies : [threads],
2109 install_rpath : rootlibexecdir,
2112 if get_option('link-systemctl-shared')
2113 systemctl_link_with = [libshared]
2115 systemctl_link_with = [libsystemd_static,
2121 public_programs += executable(
2123 'src/systemctl/systemctl-add-dependency.c',
2124 'src/systemctl/systemctl-add-dependency.h',
2125 'src/systemctl/systemctl-cancel-job.c',
2126 'src/systemctl/systemctl-cancel-job.h',
2127 'src/systemctl/systemctl-clean-or-freeze.c',
2128 'src/systemctl/systemctl-clean-or-freeze.h',
2129 'src/systemctl/systemctl-compat-halt.c',
2130 'src/systemctl/systemctl-compat-halt.h',
2131 'src/systemctl/systemctl-compat-runlevel.c',
2132 'src/systemctl/systemctl-compat-runlevel.h',
2133 'src/systemctl/systemctl-compat-shutdown.c',
2134 'src/systemctl/systemctl-compat-shutdown.h',
2135 'src/systemctl/systemctl-compat-telinit.c',
2136 'src/systemctl/systemctl-compat-telinit.h',
2137 'src/systemctl/systemctl-daemon-reload.c',
2138 'src/systemctl/systemctl-daemon-reload.h',
2139 'src/systemctl/systemctl-edit.c',
2140 'src/systemctl/systemctl-edit.h',
2141 'src/systemctl/systemctl-enable.c',
2142 'src/systemctl/systemctl-enable.h',
2143 'src/systemctl/systemctl-is-active.c',
2144 'src/systemctl/systemctl-is-active.h',
2145 'src/systemctl/systemctl-is-enabled.c',
2146 'src/systemctl/systemctl-is-enabled.h',
2147 'src/systemctl/systemctl-is-system-running.c',
2148 'src/systemctl/systemctl-is-system-running.h',
2149 'src/systemctl/systemctl-kill.c',
2150 'src/systemctl/systemctl-kill.h',
2151 'src/systemctl/systemctl-list-dependencies.c',
2152 'src/systemctl/systemctl-list-dependencies.h',
2153 'src/systemctl/systemctl-list-jobs.c',
2154 'src/systemctl/systemctl-list-jobs.h',
2155 'src/systemctl/systemctl-list-machines.c',
2156 'src/systemctl/systemctl-list-machines.h',
2157 'src/systemctl/systemctl-list-unit-files.c',
2158 'src/systemctl/systemctl-list-unit-files.h',
2159 'src/systemctl/systemctl-list-units.c',
2160 'src/systemctl/systemctl-list-units.h',
2161 'src/systemctl/systemctl-log-setting.c',
2162 'src/systemctl/systemctl-log-setting.h',
2163 'src/systemctl/systemctl-logind.c',
2164 'src/systemctl/systemctl-logind.h',
2165 'src/systemctl/systemctl-preset-all.c',
2166 'src/systemctl/systemctl-preset-all.h',
2167 'src/systemctl/systemctl-reset-failed.c',
2168 'src/systemctl/systemctl-reset-failed.h',
2169 'src/systemctl/systemctl-service-watchdogs.c',
2170 'src/systemctl/systemctl-service-watchdogs.h',
2171 'src/systemctl/systemctl-set-default.c',
2172 'src/systemctl/systemctl-set-default.h',
2173 'src/systemctl/systemctl-set-environment.c',
2174 'src/systemctl/systemctl-set-environment.h',
2175 'src/systemctl/systemctl-set-property.c',
2176 'src/systemctl/systemctl-set-property.h',
2177 'src/systemctl/systemctl-show.c',
2178 'src/systemctl/systemctl-show.h',
2179 'src/systemctl/systemctl-start-special.c',
2180 'src/systemctl/systemctl-start-special.h',
2181 'src/systemctl/systemctl-start-unit.c',
2182 'src/systemctl/systemctl-start-unit.h',
2183 'src/systemctl/systemctl-switch-root.c',
2184 'src/systemctl/systemctl-switch-root.h',
2185 'src/systemctl/systemctl-sysv-compat.c',
2186 'src/systemctl/systemctl-sysv-compat.h',
2187 'src/systemctl/systemctl-trivial-method.c',
2188 'src/systemctl/systemctl-trivial-method.h',
2189 'src/systemctl/systemctl-util.c',
2190 'src/systemctl/systemctl-util.c',
2191 'src/systemctl/systemctl-util.h',
2192 'src/systemctl/systemctl.c',
2193 'src/systemctl/systemctl.h',
2194 include_directories : includes,
2195 link_with : systemctl_link_with,
2196 dependencies : [threads,
2202 install_rpath : rootlibexecdir,
2204 install_dir : rootbindir)
2206 if conf.get('ENABLE_PORTABLED') == 1
2208 'systemd-portabled',
2209 systemd_portabled_sources,
2210 include_directories : includes,
2211 link_with : [libshared],
2212 dependencies : [threads],
2213 install_rpath : rootlibexecdir,
2215 install_dir : rootlibexecdir)
2217 public_programs += executable(
2219 'src/portable/portablectl.c',
2220 include_directories : includes,
2221 link_with : [libshared],
2222 dependencies : [threads],
2223 install_rpath : rootlibexecdir,
2225 install_dir : rootbindir)
2228 if conf.get('ENABLE_USERDB') == 1
2231 systemd_userwork_sources,
2232 include_directories : includes,
2233 link_with : [libshared],
2234 dependencies : [threads],
2235 install_rpath : rootlibexecdir,
2237 install_dir : rootlibexecdir)
2241 systemd_userdbd_sources,
2242 include_directories : includes,
2243 link_with : [libshared],
2244 dependencies : [threads],
2245 install_rpath : rootlibexecdir,
2247 install_dir : rootlibexecdir)
2249 public_programs += executable(
2252 include_directories : includes,
2253 link_with : [libshared],
2254 dependencies : [threads],
2255 install_rpath : rootlibexecdir,
2257 install_dir : rootbindir)
2260 if conf.get('ENABLE_HOMED') == 1
2263 systemd_homework_sources,
2264 include_directories : includes,
2265 link_with : [libshared],
2266 dependencies : [threads,
2274 install_rpath : rootlibexecdir,
2276 install_dir : rootlibexecdir)
2280 systemd_homed_sources,
2281 include_directories : includes,
2282 link_with : [libshared],
2283 dependencies : [threads,
2286 install_rpath : rootlibexecdir,
2288 install_dir : rootlibexecdir)
2290 public_programs += executable(
2293 include_directories : includes,
2294 link_with : [libshared],
2295 dependencies : [threads,
2301 install_rpath : rootlibexecdir,
2303 install_dir : rootbindir)
2305 if conf.get('HAVE_PAM') == 1
2306 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2307 pam_systemd = shared_library(
2311 include_directories : includes,
2312 link_args : ['-shared',
2313 '-Wl,--version-script=' + version_script_arg],
2314 link_with : [libsystemd_static,
2316 dependencies : [threads,
2320 link_depends : pam_systemd_home_sym,
2322 install_dir : pamlibdir)
2326 foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
2327 (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
2328 meson.add_install_script(meson_make_symlink,
2329 join_paths(rootbindir, 'systemctl'),
2330 join_paths(rootsbindir, alias))
2333 meson.add_install_script(meson_make_symlink,
2334 join_paths(rootbindir, 'udevadm'),
2335 join_paths(rootlibexecdir, 'systemd-udevd'))
2337 if conf.get('ENABLE_BACKLIGHT') == 1
2339 'systemd-backlight',
2340 'src/backlight/backlight.c',
2341 include_directories : includes,
2342 link_with : [libshared],
2343 install_rpath : rootlibexecdir,
2345 install_dir : rootlibexecdir)
2348 if conf.get('ENABLE_RFKILL') == 1
2351 'src/rfkill/rfkill.c',
2352 include_directories : includes,
2353 link_with : [libshared],
2354 install_rpath : rootlibexecdir,
2356 install_dir : rootlibexecdir)
2360 'systemd-system-update-generator',
2361 'src/system-update-generator/system-update-generator.c',
2362 include_directories : includes,
2363 link_with : [libshared],
2364 install_rpath : rootlibexecdir,
2366 install_dir : systemgeneratordir)
2368 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2369 systemd_cryptsetup_sources = files('''
2370 src/cryptsetup/cryptsetup-pkcs11.h
2371 src/cryptsetup/cryptsetup-keyfile.c
2372 src/cryptsetup/cryptsetup-keyfile.h
2373 src/cryptsetup/cryptsetup.c
2376 if conf.get('HAVE_P11KIT') == 1
2377 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2381 'systemd-cryptsetup',
2382 systemd_cryptsetup_sources,
2383 include_directories : includes,
2384 link_with : [libshared],
2385 dependencies : [libcryptsetup,
2387 install_rpath : rootlibexecdir,
2389 install_dir : rootlibexecdir)
2392 'systemd-cryptsetup-generator',
2393 'src/cryptsetup/cryptsetup-generator.c',
2394 include_directories : includes,
2395 link_with : [libshared],
2396 install_rpath : rootlibexecdir,
2398 install_dir : systemgeneratordir)
2401 'systemd-veritysetup',
2402 'src/veritysetup/veritysetup.c',
2403 include_directories : includes,
2404 link_with : [libshared],
2405 dependencies : [libcryptsetup],
2406 install_rpath : rootlibexecdir,
2408 install_dir : rootlibexecdir)
2411 'systemd-veritysetup-generator',
2412 'src/veritysetup/veritysetup-generator.c',
2413 include_directories : includes,
2414 link_with : [libshared],
2415 install_rpath : rootlibexecdir,
2417 install_dir : systemgeneratordir)
2420 if conf.get('HAVE_SYSV_COMPAT') == 1
2422 'systemd-sysv-generator',
2423 'src/sysv-generator/sysv-generator.c',
2424 include_directories : includes,
2425 link_with : [libshared],
2426 install_rpath : rootlibexecdir,
2428 install_dir : systemgeneratordir)
2431 'systemd-rc-local-generator',
2432 'src/rc-local-generator/rc-local-generator.c',
2433 include_directories : includes,
2434 link_with : [libshared],
2435 install_rpath : rootlibexecdir,
2437 install_dir : systemgeneratordir)
2440 if conf.get('ENABLE_XDG_AUTOSTART') == 1
2442 'systemd-xdg-autostart-generator',
2443 'src/xdg-autostart-generator/xdg-autostart-generator.c',
2444 'src/xdg-autostart-generator/xdg-autostart-service.c',
2445 include_directories : includes,
2446 link_with : [libshared],
2447 install_rpath : rootlibexecdir,
2449 install_dir : usergeneratordir)
2452 'systemd-xdg-autostart-condition',
2453 'src/xdg-autostart-generator/xdg-autostart-condition.c',
2454 include_directories : includes,
2455 link_with : [libshared],
2456 install_rpath : rootlibexecdir,
2458 install_dir : rootlibexecdir)
2461 if conf.get('ENABLE_HOSTNAMED') == 1
2463 'systemd-hostnamed',
2464 'src/hostname/hostnamed.c',
2465 include_directories : includes,
2466 link_with : [libshared],
2467 install_rpath : rootlibexecdir,
2469 install_dir : rootlibexecdir)
2471 public_programs += executable(
2473 'src/hostname/hostnamectl.c',
2474 include_directories : includes,
2475 link_with : [libshared],
2476 install_rpath : rootlibexecdir,
2480 if conf.get('ENABLE_LOCALED') == 1
2481 if conf.get('HAVE_XKBCOMMON') == 1
2482 # logind will load libxkbcommon.so dynamically on its own
2490 systemd_localed_sources,
2491 include_directories : includes,
2492 link_with : [libshared],
2493 dependencies : deps,
2494 install_rpath : rootlibexecdir,
2496 install_dir : rootlibexecdir)
2498 public_programs += executable(
2501 include_directories : includes,
2502 link_with : [libshared],
2503 install_rpath : rootlibexecdir,
2507 if conf.get('ENABLE_TIMEDATED') == 1
2509 'systemd-timedated',
2510 'src/timedate/timedated.c',
2511 include_directories : includes,
2512 link_with : [libshared],
2513 install_rpath : rootlibexecdir,
2515 install_dir : rootlibexecdir)
2518 if conf.get('ENABLE_TIMEDATECTL') == 1
2519 public_programs += executable(
2521 'src/timedate/timedatectl.c',
2522 include_directories : includes,
2523 install_rpath : rootlibexecdir,
2524 link_with : [libshared],
2525 dependencies : [libm],
2529 if conf.get('ENABLE_TIMESYNCD') == 1
2530 if get_option('link-timesyncd-shared')
2531 timesyncd_link_with = [libshared]
2533 timesyncd_link_with = [libsystemd_static,
2540 'systemd-timesyncd',
2541 systemd_timesyncd_sources,
2542 include_directories : includes,
2543 link_with : [timesyncd_link_with],
2544 dependencies : [threads,
2546 install_rpath : rootlibexecdir,
2548 install_dir : rootlibexecdir)
2551 'systemd-time-wait-sync',
2552 'src/time-wait-sync/time-wait-sync.c',
2553 include_directories : includes,
2554 link_with : [timesyncd_link_with],
2555 install_rpath : rootlibexecdir,
2557 install_dir : rootlibexecdir)
2560 if conf.get('ENABLE_MACHINED') == 1
2563 systemd_machined_sources,
2564 include_directories : includes,
2565 link_with : [libmachine_core,
2567 install_rpath : rootlibexecdir,
2569 install_dir : rootlibexecdir)
2571 public_programs += executable(
2573 'src/machine/machinectl.c',
2574 include_directories : includes,
2575 link_with : [libshared],
2576 dependencies : [threads,
2580 install_rpath : rootlibexecdir,
2582 install_dir : rootbindir)
2585 if conf.get('ENABLE_IMPORTD') == 1
2588 systemd_importd_sources,
2589 include_directories : includes,
2590 link_with : [libshared],
2591 dependencies : [threads],
2592 install_rpath : rootlibexecdir,
2594 install_dir : rootlibexecdir)
2596 systemd_pull = executable(
2598 systemd_pull_sources,
2599 include_directories : includes,
2600 link_with : [libshared],
2601 dependencies : [versiondep,
2607 install_rpath : rootlibexecdir,
2609 install_dir : rootlibexecdir)
2611 systemd_import = executable(
2613 systemd_import_sources,
2614 include_directories : includes,
2615 link_with : [libshared],
2616 dependencies : [libcurl,
2620 install_rpath : rootlibexecdir,
2622 install_dir : rootlibexecdir)
2624 systemd_import_fs = executable(
2625 'systemd-import-fs',
2626 systemd_import_fs_sources,
2627 include_directories : includes,
2628 link_with : [libshared],
2629 install_rpath : rootlibexecdir,
2631 install_dir : rootlibexecdir)
2633 systemd_export = executable(
2635 systemd_export_sources,
2636 include_directories : includes,
2637 link_with : [libshared],
2638 dependencies : [libcurl,
2642 install_rpath : rootlibexecdir,
2644 install_dir : rootlibexecdir)
2646 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2649 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2650 public_programs += executable(
2651 'systemd-journal-upload',
2652 systemd_journal_upload_sources,
2653 include_directories : includes,
2654 link_with : [libshared],
2655 dependencies : [versiondep,
2662 install_rpath : rootlibexecdir,
2664 install_dir : rootlibexecdir)
2667 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2668 public_programs += executable(
2669 'systemd-journal-remote',
2670 systemd_journal_remote_sources,
2671 include_directories : includes,
2672 link_with : [libshared,
2673 libsystemd_journal_remote],
2674 dependencies : [threads,
2680 install_rpath : rootlibexecdir,
2682 install_dir : rootlibexecdir)
2684 public_programs += executable(
2685 'systemd-journal-gatewayd',
2686 systemd_journal_gatewayd_sources,
2687 include_directories : includes,
2688 link_with : [libshared],
2689 dependencies : [threads,
2695 install_rpath : rootlibexecdir,
2697 install_dir : rootlibexecdir)
2700 if conf.get('ENABLE_COREDUMP') == 1
2703 systemd_coredump_sources,
2704 include_directories : includes,
2705 link_with : [libshared],
2706 dependencies : [threads,
2712 install_rpath : rootlibexecdir,
2714 install_dir : rootlibexecdir)
2716 public_programs += executable(
2718 coredumpctl_sources,
2719 include_directories : includes,
2720 link_with : [libshared],
2721 dependencies : [threads,
2725 install_rpath : rootlibexecdir,
2729 if conf.get('ENABLE_PSTORE') == 1
2732 systemd_pstore_sources,
2733 include_directories : includes,
2734 link_with : [libshared],
2735 dependencies : [threads,
2741 install_rpath : rootlibexecdir,
2743 install_dir : rootlibexecdir)
2746 if conf.get('ENABLE_OOMD') == 1
2747 executable('systemd-oomd',
2748 systemd_oomd_sources,
2749 include_directories : includes,
2750 link_with : [libshared],
2752 install_rpath : rootlibexecdir,
2754 install_dir : rootlibexecdir)
2756 public_programs += executable(
2759 include_directories : includes,
2760 link_with : [libshared],
2762 install_rpath : rootlibexecdir,
2764 install_dir : rootbindir)
2767 if conf.get('ENABLE_BINFMT') == 1
2768 public_programs += executable(
2770 'src/binfmt/binfmt.c',
2771 include_directories : includes,
2772 link_with : [libshared],
2773 install_rpath : rootlibexecdir,
2775 install_dir : rootlibexecdir)
2777 meson.add_install_script('sh', '-c',
2778 mkdir_p.format(binfmtdir))
2779 meson.add_install_script('sh', '-c',
2780 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2783 if conf.get('ENABLE_REPART') == 1
2786 systemd_repart_sources,
2787 include_directories : includes,
2788 link_with : [libshared],
2789 dependencies : [threads,
2793 install_rpath : rootlibexecdir,
2795 install_dir : rootbindir)
2796 public_programs += exe
2798 if want_tests != 'false'
2801 args : exe.full_path())
2805 if conf.get('ENABLE_VCONSOLE') == 1
2807 'systemd-vconsole-setup',
2808 'src/vconsole/vconsole-setup.c',
2809 include_directories : includes,
2810 link_with : [libshared],
2811 install_rpath : rootlibexecdir,
2813 install_dir : rootlibexecdir)
2816 if conf.get('ENABLE_RANDOMSEED') == 1
2818 'systemd-random-seed',
2819 'src/random-seed/random-seed.c',
2820 include_directories : includes,
2821 link_with : [libshared],
2822 install_rpath : rootlibexecdir,
2824 install_dir : rootlibexecdir)
2827 if conf.get('ENABLE_FIRSTBOOT') == 1
2829 'systemd-firstboot',
2830 'src/firstboot/firstboot.c',
2831 include_directories : includes,
2832 link_with : [libshared],
2833 dependencies : [libcrypt],
2834 install_rpath : rootlibexecdir,
2836 install_dir : rootbindir)
2840 'systemd-remount-fs',
2841 'src/remount-fs/remount-fs.c',
2842 include_directories : includes,
2843 link_with : [libcore_shared,
2845 install_rpath : rootlibexecdir,
2847 install_dir : rootlibexecdir)
2850 'systemd-machine-id-setup',
2851 'src/machine-id-setup/machine-id-setup-main.c',
2852 include_directories : includes,
2853 link_with : [libcore_shared,
2855 install_rpath : rootlibexecdir,
2857 install_dir : rootbindir)
2862 include_directories : includes,
2863 link_with : [libshared],
2864 install_rpath : rootlibexecdir,
2866 install_dir : rootlibexecdir)
2868 executable('systemd-growfs',
2869 'src/partition/growfs.c',
2870 include_directories : includes,
2871 link_with : [libshared],
2872 install_rpath : rootlibexecdir,
2874 install_dir : rootlibexecdir)
2878 'src/partition/makefs.c',
2879 include_directories : includes,
2880 link_with : [libshared],
2881 install_rpath : rootlibexecdir,
2883 install_dir : rootlibexecdir)
2887 'src/sleep/sleep.c',
2888 include_directories : includes,
2889 link_with : [libshared],
2890 install_rpath : rootlibexecdir,
2892 install_dir : rootlibexecdir)
2894 install_data('src/sleep/sleep.conf',
2895 install_dir : pkgsysconfdir)
2897 public_programs += executable(
2899 'src/sysctl/sysctl.c',
2900 include_directories : includes,
2901 link_with : [libshared],
2902 install_rpath : rootlibexecdir,
2904 install_dir : rootlibexecdir)
2908 'src/ac-power/ac-power.c',
2909 include_directories : includes,
2910 link_with : [libshared],
2911 install_rpath : rootlibexecdir,
2913 install_dir : rootlibexecdir)
2915 public_programs += executable(
2916 'systemd-detect-virt',
2917 'src/detect-virt/detect-virt.c',
2918 include_directories : includes,
2919 link_with : [libshared],
2920 install_rpath : rootlibexecdir,
2923 public_programs += executable(
2925 'src/delta/delta.c',
2926 include_directories : includes,
2927 link_with : [libshared],
2928 install_rpath : rootlibexecdir,
2931 public_programs += executable(
2933 'src/escape/escape.c',
2934 include_directories : includes,
2935 link_with : [libshared],
2936 install_rpath : rootlibexecdir,
2938 install_dir : rootbindir)
2940 public_programs += executable(
2942 'src/notify/notify.c',
2943 include_directories : includes,
2944 link_with : [libshared],
2945 install_rpath : rootlibexecdir,
2947 install_dir : rootbindir)
2950 'systemd-volatile-root',
2951 'src/volatile-root/volatile-root.c',
2952 include_directories : includes,
2953 link_with : [libshared],
2954 install_rpath : rootlibexecdir,
2955 install : conf.get('ENABLE_INITRD') == 1,
2956 install_dir : rootlibexecdir)
2959 'systemd-cgroups-agent',
2960 'src/cgroups-agent/cgroups-agent.c',
2961 include_directories : includes,
2962 link_with : [libshared],
2963 install_rpath : rootlibexecdir,
2965 install_dir : rootlibexecdir)
2967 public_programs += executable(
2969 'src/id128/id128.c',
2970 include_directories : includes,
2971 link_with : [libshared],
2972 install_rpath : rootlibexecdir,
2975 public_programs += executable(
2978 include_directories : includes,
2979 link_with : [libshared],
2980 install_rpath : rootlibexecdir,
2983 public_programs += executable(
2984 'systemd-ask-password',
2985 'src/ask-password/ask-password.c',
2986 include_directories : includes,
2987 link_with : [libshared],
2988 install_rpath : rootlibexecdir,
2990 install_dir : rootbindir)
2993 'systemd-reply-password',
2994 'src/reply-password/reply-password.c',
2995 include_directories : includes,
2996 link_with : [libshared],
2997 install_rpath : rootlibexecdir,
2999 install_dir : rootlibexecdir)
3001 public_programs += executable(
3002 'systemd-tty-ask-password-agent',
3003 'src/tty-ask-password-agent/tty-ask-password-agent.c',
3004 include_directories : includes,
3005 link_with : [libshared],
3006 install_rpath : rootlibexecdir,
3008 install_dir : rootbindir)
3010 public_programs += executable(
3013 include_directories : includes,
3014 link_with : [libshared],
3015 install_rpath : rootlibexecdir,
3018 public_programs += executable(
3020 'src/cgtop/cgtop.c',
3021 include_directories : includes,
3022 link_with : [libshared],
3023 install_rpath : rootlibexecdir,
3028 'src/initctl/initctl.c',
3029 include_directories : includes,
3030 link_with : [libshared],
3031 install_rpath : rootlibexecdir,
3032 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
3033 install_dir : rootlibexecdir)
3035 public_programs += executable(
3037 'src/mount/mount-tool.c',
3038 include_directories : includes,
3039 link_with : [libshared],
3040 dependencies: [libmount],
3041 install_rpath : rootlibexecdir,
3044 meson.add_install_script(meson_make_symlink,
3045 'systemd-mount', join_paths(bindir, 'systemd-umount'))
3047 public_programs += executable(
3050 include_directories : includes,
3051 link_with : [libshared],
3052 install_rpath : rootlibexecdir,
3055 public_programs += executable(
3056 'systemd-stdio-bridge',
3057 'src/stdio-bridge/stdio-bridge.c',
3058 include_directories : includes,
3059 link_with : [libshared],
3060 dependencies : [versiondep],
3061 install_rpath : rootlibexecdir,
3064 public_programs += executable(
3066 'src/busctl/busctl.c',
3067 'src/busctl/busctl-introspect.c',
3068 'src/busctl/busctl-introspect.h',
3069 include_directories : includes,
3070 link_with : [libshared],
3071 install_rpath : rootlibexecdir,
3077 'src/sysusers/sysusers.c',
3078 include_directories : includes,
3079 link_with : [libshared],
3080 install_rpath : rootlibexecdir,
3082 install_dir : rootbindir)
3083 public_programs += exe
3085 if want_tests != 'false'
3086 test('test-sysusers',
3088 # https://github.com/mesonbuild/meson/issues/2681
3089 args : exe.full_path())
3092 if have_standalone_binaries
3094 'systemd-sysusers.standalone',
3095 'src/sysusers/sysusers.c',
3096 include_directories : includes,
3097 link_with : [libshared_static,
3103 install_dir : rootbindir)
3104 public_programs += exe
3106 if want_tests != 'false'
3107 test('test-sysusers.standalone',
3109 # https://github.com/mesonbuild/meson/issues/2681
3110 args : exe.full_path())
3115 if conf.get('ENABLE_TMPFILES') == 1
3118 systemd_tmpfiles_sources,
3119 include_directories : includes,
3120 link_with : [libshared],
3121 dependencies : [libacl],
3122 install_rpath : rootlibexecdir,
3124 install_dir : rootbindir)
3125 public_programs += exe
3127 if want_tests != 'false'
3128 test('test-systemd-tmpfiles',
3129 test_systemd_tmpfiles_py,
3130 # https://github.com/mesonbuild/meson/issues/2681
3131 args : exe.full_path())
3134 if have_standalone_binaries
3135 public_programs += executable(
3136 'systemd-tmpfiles.standalone',
3137 systemd_tmpfiles_sources,
3138 include_directories : includes,
3139 link_with : [libshared_static,
3144 dependencies : [libacl],
3146 install_dir : rootbindir)
3150 if conf.get('ENABLE_HWDB') == 1
3151 public_programs += executable(
3154 'src/libsystemd/sd-hwdb/hwdb-internal.h',
3155 include_directories : includes,
3156 link_with : [libudev_static],
3157 install_rpath : udev_rpath,
3159 install_dir : rootbindir)
3162 if conf.get('ENABLE_QUOTACHECK') == 1
3164 'systemd-quotacheck',
3165 'src/quotacheck/quotacheck.c',
3166 include_directories : includes,
3167 link_with : [libshared],
3168 install_rpath : rootlibexecdir,
3170 install_dir : rootlibexecdir)
3173 public_programs += executable(
3174 'systemd-socket-proxyd',
3175 'src/socket-proxy/socket-proxyd.c',
3176 include_directories : includes,
3177 link_with : [libshared],
3178 dependencies : [threads],
3179 install_rpath : rootlibexecdir,
3181 install_dir : rootlibexecdir)
3183 public_programs += executable(
3186 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
3187 include_directories : includes,
3188 link_with : [libudev_core,
3191 dependencies : [versiondep,
3197 install_rpath : udev_rpath,
3199 install_dir : rootbindir)
3203 systemd_shutdown_sources,
3204 include_directories : includes,
3205 link_with : [libcore_shared,
3207 dependencies : [libmount],
3208 install_rpath : rootlibexecdir,
3210 install_dir : rootlibexecdir)
3213 'systemd-update-done',
3214 'src/update-done/update-done.c',
3215 include_directories : includes,
3216 link_with : [libshared],
3217 install_rpath : rootlibexecdir,
3219 install_dir : rootlibexecdir)
3222 'systemd-update-utmp',
3223 'src/update-utmp/update-utmp.c',
3224 include_directories : includes,
3225 link_with : [libshared],
3226 dependencies : [libaudit],
3227 install_rpath : rootlibexecdir,
3228 install : (conf.get('ENABLE_UTMP') == 1),
3229 install_dir : rootlibexecdir)
3231 if conf.get('HAVE_KMOD') == 1
3233 'systemd-modules-load',
3234 'src/modules-load/modules-load.c',
3235 include_directories : includes,
3236 link_with : [libshared],
3237 dependencies : [libkmod],
3238 install_rpath : rootlibexecdir,
3240 install_dir : rootlibexecdir)
3242 meson.add_install_script('sh', '-c',
3243 mkdir_p.format(modulesloaddir))
3244 meson.add_install_script('sh', '-c',
3245 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
3248 public_programs += executable(
3250 systemd_nspawn_sources,
3251 include_directories : includes,
3252 link_with : [libcore_shared,
3255 dependencies : [libblkid,
3257 install_rpath : rootlibexecdir,
3260 if conf.get('ENABLE_NETWORKD') == 1
3263 systemd_networkd_sources,
3264 include_directories : network_include_dir,
3265 link_with : [libnetworkd_core,
3268 networkd_link_with],
3269 dependencies : [threads],
3270 install_rpath : rootlibexecdir,
3272 install_dir : rootlibexecdir)
3275 'systemd-networkd-wait-online',
3276 systemd_networkd_wait_online_sources,
3277 include_directories : includes,
3278 link_with : [libnetworkd_core,
3279 networkd_link_with],
3280 install_rpath : rootlibexecdir,
3282 install_dir : rootlibexecdir)
3284 public_programs += executable(
3287 include_directories : includes,
3288 link_with : [libsystemd_network,
3289 networkd_link_with],
3290 install_rpath : rootlibexecdir,
3292 install_dir : rootbindir)
3295 'systemd-network-generator',
3296 network_generator_sources,
3297 include_directories : includes,
3298 link_with : [networkd_link_with],
3299 install_rpath : rootlibexecdir,
3301 install_dir : rootlibexecdir)
3303 if want_tests != 'false'
3304 test('test-network-generator-conversion',
3305 test_network_generator_conversion_sh,
3306 # https://github.com/mesonbuild/meson/issues/2681
3307 args : exe.full_path())
3312 'systemd-sulogin-shell',
3313 ['src/sulogin-shell/sulogin-shell.c'],
3314 include_directories : includes,
3315 link_with : [libshared],
3316 install_rpath : rootlibexecdir,
3318 install_dir : rootlibexecdir)
3320 ############################################################
3323 'systemd-runtest.env',
3324 output : 'systemd-runtest.env',
3325 command : ['sh', '-c', '{ ' +
3326 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
3327 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
3329 build_by_default : true)
3331 foreach tuple : tests
3333 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3334 dependencies = tuple[2]
3335 condition = tuple.length() >= 4 ? tuple[3] : ''
3336 type = tuple.length() >= 5 ? tuple[4] : ''
3337 defs = tuple.length() >= 6 ? tuple[5] : []
3338 incs = tuple.length() >= 7 ? tuple[6] : includes
3341 name = sources[0].split('/')[-1].split('.')[0]
3342 if type.startswith('timeout=')
3343 timeout = type.split('=')[1].to_int()
3347 if condition == '' or conf.get(condition) == 1
3351 include_directories : incs,
3352 link_with : link_with,
3353 dependencies : [versiondep,
3356 build_by_default : want_tests != 'false',
3357 install_rpath : rootlibexecdir,
3358 install : install_tests,
3359 install_dir : join_paths(testsdir, type))
3362 message('@0@ is a manual test'.format(name))
3363 elif type == 'unsafe' and want_tests != 'unsafe'
3364 message('@0@ is an unsafe test'.format(name))
3365 elif want_tests != 'false'
3371 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3376 'test-libsystemd-sym',
3377 test_libsystemd_sym_c,
3378 include_directories : includes,
3379 link_with : [libsystemd],
3380 build_by_default : want_tests != 'false',
3381 install : install_tests,
3382 install_dir : testsdir)
3383 if want_tests != 'false'
3384 test('test-libsystemd-sym', exe)
3388 'test-libsystemd-static-sym',
3389 test_libsystemd_sym_c,
3390 include_directories : includes,
3391 link_with : [install_libsystemd_static],
3392 dependencies : [threads], # threads is already included in dependencies on the library,
3393 # but does not seem to get propagated. Add here as a work-around.
3394 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3395 install : install_tests and static_libsystemd_pic,
3396 install_dir : testsdir)
3397 if want_tests != 'false' and static_libsystemd_pic
3398 test('test-libsystemd-static-sym', exe)
3404 include_directories : includes,
3405 c_args : '-Wno-deprecated-declarations',
3406 link_with : [libudev],
3407 build_by_default : want_tests != 'false',
3408 install : install_tests,
3409 install_dir : testsdir)
3410 if want_tests != 'false'
3411 test('test-libudev-sym', exe)
3415 'test-libudev-static-sym',
3417 include_directories : includes,
3418 c_args : '-Wno-deprecated-declarations',
3419 link_with : [install_libudev_static],
3420 build_by_default : want_tests != 'false' and static_libudev_pic,
3421 install : install_tests and static_libudev_pic,
3422 install_dir : testsdir)
3423 if want_tests != 'false' and static_libudev_pic
3424 test('test-libudev-static-sym', exe)
3427 ############################################################
3431 if get_option('tests') != 'false'
3432 foreach tuple : fuzzers
3434 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3435 dependencies = tuple[2]
3436 defs = tuple.length() >= 4 ? tuple[3] : []
3437 incs = tuple.length() >= 5 ? tuple[4] : includes
3441 dependencies += fuzzing_engine
3443 if fuzzing_engine.found()
3444 dependencies += fuzzing_engine
3446 link_args += ['-fsanitize=fuzzer']
3449 sources += 'src/fuzz/fuzz-main.c'
3452 name = sources[0].split('/')[-1].split('.')[0]
3454 fuzzer_exes += executable(
3457 include_directories : [incs, include_directories('src/fuzz')],
3458 link_with : link_with,
3459 dependencies : dependencies,
3461 link_args: link_args,
3468 depends : fuzzer_exes,
3471 ############################################################
3474 subdir('sysusers.d')
3475 subdir('tmpfiles.d')
3481 subdir('shell-completion/bash')
3482 subdir('shell-completion/zsh')
3483 subdir('docs/sysvinit')
3484 subdir('docs/var-log')
3486 install_subdir('factory/etc',
3487 install_dir : factorydir)
3489 install_data('xorg/50-systemd-user.sh',
3490 install_dir : xinitrcdir)
3491 install_data('modprobe.d/systemd.conf',
3492 install_dir : modprobedir)
3493 install_data('LICENSE.GPL2',
3497 'docs/CODING_STYLE.md',
3498 'docs/DISTRO_PORTING.md',
3499 'docs/ENVIRONMENT.md',
3501 'docs/TRANSIENT-SETTINGS.md',
3502 'docs/TRANSLATORS.md',
3503 'docs/UIDS-GIDS.md',
3504 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3505 install_dir : docdir)
3507 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3508 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3510 ############################################################
3512 check_help = find_program('tools/check-help.sh')
3514 foreach exec : public_programs
3515 name = exec.full_path().split('/')[-1]
3516 if want_tests != 'false'
3517 test('check-help-' + name,
3519 args : exec.full_path())
3523 ############################################################
3525 check_directives_sh = find_program('tools/check-directives.sh')
3527 if want_tests != 'false'
3528 test('check-directives',
3529 check_directives_sh,
3530 args : project_source_root)
3533 ############################################################
3535 # Enable tests for all supported sanitizers
3536 foreach tuple : sanitizers
3537 sanitizer = tuple[0]
3540 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3542 foreach p : fuzz_regression_tests
3543 b = p.split('/')[-2]
3544 c = p.split('/')[-1]
3546 name = '@0@:@1@'.format(b, sanitizer)
3549 if want_tests == 'false'
3550 message('Not compiling @0@ because tests is set to false'.format(name))
3551 elif slow_tests or fuzz_tests
3552 exe = custom_target(
3556 command : [env, 'ln', '-fs',
3557 join_paths(build.full_path(), b),
3559 build_by_default : true)
3561 message('Not compiling @0@ because slow-tests/fuzz-tests is set to false'.format(name))
3566 if want_tests != 'false' and (slow_tests or fuzz_tests)
3567 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3569 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
3571 args : [exe.full_path(),
3572 join_paths(project_source_root, p)])
3579 ############################################################
3582 all_files = run_command(
3584 ['--git-dir=@0@/.git'.format(project_source_root),
3587 all_files = files(all_files.stdout().split())
3592 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3595 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3599 git_contrib_sh = find_program('tools/git-contrib.sh')
3602 command : [git_contrib_sh])
3606 git_head = run_command(
3608 ['--git-dir=@0@/.git'.format(project_source_root),
3609 'rev-parse', 'HEAD']).stdout().strip()
3610 git_head_short = run_command(
3612 ['--git-dir=@0@/.git'.format(project_source_root),
3613 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3617 command : ['git', 'archive',
3618 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3620 '--prefix', 'systemd-@0@/'.format(git_head),
3624 ############################################################
3626 check_api_docs_sh = find_program('tools/check-api-docs.sh')
3629 depends : [man, libsystemd, libudev],
3630 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3632 ############################################################
3633 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3636 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3638 'build mode: @0@'.format(get_option('mode')),
3639 'split /usr: @0@'.format(split_usr),
3640 'split bin-sbin: @0@'.format(split_bin),
3641 'prefix directory: @0@'.format(prefixdir),
3642 'rootprefix directory: @0@'.format(rootprefixdir),
3643 'sysconf directory: @0@'.format(sysconfdir),
3644 'include directory: @0@'.format(includedir),
3645 'lib directory: @0@'.format(libdir),
3646 'rootlib directory: @0@'.format(rootlibdir),
3647 'SysV init scripts: @0@'.format(sysvinit_path),
3648 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3649 'PAM modules directory: @0@'.format(pamlibdir),
3650 'PAM configuration directory: @0@'.format(pamconfdir),
3651 'RPM macros directory: @0@'.format(rpmmacrosdir),
3652 'modprobe.d directory: @0@'.format(modprobedir),
3653 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3654 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3655 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3656 'bash completions directory: @0@'.format(bashcompletiondir),
3657 'zsh completions directory: @0@'.format(zshcompletiondir),
3658 'extra start script: @0@'.format(get_option('rc-local')),
3659 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3660 get_option('debug-tty')),
3661 'TTY GID: @0@'.format(tty_gid),
3662 'users GID: @0@'.format(substs.get('USERS_GID')),
3663 'system UIDs: <=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_UID_MAX'),
3664 conf.get('SYSTEM_ALLOC_UID_MIN')),
3665 'system GIDs: <=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_GID_MAX'),
3666 conf.get('SYSTEM_ALLOC_GID_MIN')),
3667 'dynamic UIDs: @0@–@1@'.format(dynamic_uid_min, dynamic_uid_max),
3668 'container UID bases: @0@–@1@'.format(container_uid_base_min, container_uid_base_max),
3669 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3670 'render group access mode: @0@'.format(get_option('group-render-mode')),
3671 'certificate root directory: @0@'.format(get_option('certificate-root')),
3672 'support URL: @0@'.format(support_url),
3673 'nobody user name: @0@'.format(nobody_user),
3674 'nobody group name: @0@'.format(nobody_group),
3675 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3676 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3678 'default DNSSEC mode: @0@'.format(default_dnssec),
3679 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3680 'default mDNS mode: @0@'.format(default_mdns),
3681 'default LLMNR mode: @0@'.format(default_llmnr),
3682 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3683 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3684 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3685 'default locale: @0@'.format(default_locale),
3686 'default user $PATH: @0@'.format(default_user_path_display),
3687 'systemd service watchdog: @0@'.format(watchdog_opt)]
3689 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3690 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3692 'default DNS servers: @0@'.format(alt_dns_servers),
3693 'default NTP servers: @0@'.format(alt_ntp_servers)]
3695 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3696 '@@0@'.format(time_epoch)).stdout().strip()
3698 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3701 'static libsystemd: @0@'.format(static_libsystemd),
3702 'static libudev: @0@'.format(static_libudev)]
3705 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3706 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3707 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3709 if conf.get('ENABLE_EFI') == 1
3710 status += 'efi arch: @0@'.format(efi_arch)
3714 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3715 'EFI CC @0@'.format(' '.join(efi_cc)),
3716 'EFI lds: @0@'.format(efi_lds),
3717 'EFI crt0: @0@'.format(efi_crt0),
3718 'EFI include directory: @0@'.format(efi_incdir)]
3752 ['compat-mutable-uid-boundaries'],
3781 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3782 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3787 ['legacy pkla', install_polkit_pkla],
3789 ['gnu-efi', have_gnu_efi],
3802 ['man pages', want_man],
3803 ['html pages', want_html],
3804 ['man page indices', want_man and have_lxml],
3809 ['adm group', get_option('adm-group')],
3810 ['wheel group', get_option('wheel-group')],
3813 ['debug mmap cache'],
3815 ['valgrind', conf.get('VALGRIND') == 1],
3816 ['trace logging', conf.get('LOG_TRACE') == 1],
3817 ['install tests', install_tests],
3818 ['link-udev-shared', get_option('link-udev-shared')],
3819 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3820 ['link-networkd-shared', get_option('link-networkd-shared')],
3821 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3822 ['kernel-install', get_option('kernel-install')],
3823 ['systemd-analyze', conf.get('ENABLE_ANALYZE') == 1],
3826 if tuple.length() >= 2
3829 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3830 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3831 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3842 'enabled features: @0@'.format(', '.join(found)),
3844 'disabled features: @0@'.format(', '.join(missing)),
3846 message('\n '.join(status))
3848 if rootprefixdir != rootprefix_default
3850 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3851 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3852 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))