1 # SPDX-License-Identifier: LGPL-2.1-or-later
3 project('systemd', 'c',
13 meson_version : '>= 0.46',
16 libsystemd_version = '0.30.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.set('BUILD_MODE', 'BUILD_MODE_' + get_option('mode').to_upper(),
42 description : 'tailor build to development or release builds')
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'
72 warning('\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n\n'
73 + ' split-usr mode is going to be removed\n' +
74 '\n\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
76 conf.set10('HAVE_SPLIT_USR', split_usr,
77 description : '/usr/bin and /bin directories are separate')
79 if get_option('split-bin') == 'auto'
80 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
82 split_bin = get_option('split-bin') == 'true'
84 conf.set10('HAVE_SPLIT_BIN', split_bin,
85 description : 'bin and sbin directories are separate')
87 rootprefixdir = get_option('rootprefix')
88 # Unusual rootprefixdir values are used by some distros
89 # (see https://github.com/systemd/systemd/pull/7461).
90 rootprefix_default = split_usr ? '/' : '/usr'
91 if rootprefixdir == ''
92 rootprefixdir = rootprefix_default
94 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
96 have_standalone_binaries = get_option('standalone-binaries')
98 sysvinit_path = get_option('sysvinit-path')
99 sysvrcnd_path = get_option('sysvrcnd-path')
100 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
101 description : 'SysV init scripts and rcN.d links are supported')
103 if get_option('hibernate') and not get_option('initrd')
104 error('hibernate depends on initrd')
107 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
108 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
109 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
111 # join_paths ignores the preceding arguments if an absolute component is
112 # encountered, so this should canonicalize various paths when they are
113 # absolute or relative.
114 prefixdir = get_option('prefix')
115 if not prefixdir.startswith('/')
116 error('Prefix is not absolute: "@0@"'.format(prefixdir))
118 bindir = join_paths(prefixdir, get_option('bindir'))
119 libdir = join_paths(prefixdir, get_option('libdir'))
120 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
121 includedir = join_paths(prefixdir, get_option('includedir'))
122 datadir = join_paths(prefixdir, get_option('datadir'))
123 localstatedir = join_paths('/', get_option('localstatedir'))
125 rootbindir = join_paths(rootprefixdir, 'bin')
126 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
127 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
129 rootlibdir = get_option('rootlibdir')
131 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
134 install_sysconfdir = get_option('install-sysconfdir') != 'false'
135 install_sysconfdir_samples = get_option('install-sysconfdir') == 'true'
136 # Dirs of external packages
137 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
138 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
139 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
140 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
141 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
142 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
143 rpmmacrosdir = get_option('rpmmacrosdir')
144 if rpmmacrosdir != 'no'
145 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
147 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
150 pkgdatadir = join_paths(datadir, 'systemd')
151 environmentdir = join_paths(prefixdir, 'lib/environment.d')
152 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
153 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
154 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
155 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
156 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
157 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
158 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
159 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
160 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
161 pkgincludedir = join_paths(includedir, 'systemd')
162 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
163 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
164 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
165 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
166 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
167 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
168 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
169 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
170 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
171 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
172 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
173 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
174 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
175 factorydir = join_paths(datadir, 'factory')
176 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
177 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
178 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
179 catalogstatedir = join_paths(systemdstatedir, 'catalog')
180 randomseeddir = join_paths(localstatedir, 'lib/systemd')
181 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
182 ntpservicelistdir = join_paths(rootprefixdir, 'lib/systemd/ntp-units.d')
184 docdir = get_option('docdir')
186 docdir = join_paths(datadir, 'doc/systemd')
189 dbuspolicydir = get_option('dbuspolicydir')
190 if dbuspolicydir == ''
191 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
194 dbussessionservicedir = get_option('dbussessionservicedir')
195 if dbussessionservicedir == ''
196 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
199 dbussystemservicedir = get_option('dbussystemservicedir')
200 if dbussystemservicedir == ''
201 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
204 pamlibdir = get_option('pamlibdir')
206 pamlibdir = join_paths(rootlibdir, 'security')
209 pamconfdir = get_option('pamconfdir')
211 pamconfdir = join_paths(prefixdir, 'lib/pam.d')
214 memory_accounting_default = get_option('memory-accounting-default')
215 status_unit_format_default = get_option('status-unit-format-default')
217 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
218 conf.set_quoted('SYSTEM_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'system'))
219 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
220 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
221 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
222 conf.set_quoted('RC_LOCAL_PATH', get_option('rc-local'))
224 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
225 conf.set10('ENABLE_FEXECVE', get_option('fexecve'))
227 conf.set_quoted('USER_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'user'))
228 conf.set_quoted('USER_DATA_UNIT_DIR', userunitdir)
229 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
230 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
231 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
232 conf.set_quoted('SYSTEMD_CGROUPS_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
233 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
234 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
235 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
236 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
237 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
238 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
239 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
240 conf.set_quoted('ROOTPREFIX', rootprefixdir)
241 conf.set_quoted('ROOTPREFIX_NOSLASH', rootprefixdir_noslash)
242 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
243 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
244 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
245 conf.set_quoted('SYSTEMD_VERITYSETUP_PATH', join_paths(rootlibexecdir, 'systemd-veritysetup'))
246 conf.set_quoted('SYSTEM_GENERATOR_DIR', systemgeneratordir)
247 conf.set_quoted('USER_GENERATOR_DIR', usergeneratordir)
248 conf.set_quoted('SYSTEM_ENV_GENERATOR_DIR', systemenvgeneratordir)
249 conf.set_quoted('USER_ENV_GENERATOR_DIR', userenvgeneratordir)
250 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
251 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
252 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
253 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
254 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
255 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
256 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
257 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
258 conf.set_quoted('LIBDIR', libdir)
259 conf.set_quoted('ROOTLIBDIR', rootlibdir)
260 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
261 conf.set_quoted('BOOTLIBDIR', bootlibdir)
262 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
263 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
264 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
265 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
266 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
267 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
268 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
269 conf.set_quoted('SYSTEMD_HOMEWORK_PATH', join_paths(rootlibexecdir, 'systemd-homework'))
270 conf.set_quoted('SYSTEMD_USERWORK_PATH', join_paths(rootlibexecdir, 'systemd-userwork'))
271 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
272 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
273 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
275 substs.set('prefix', prefixdir)
276 substs.set('rootprefix', rootprefixdir)
277 substs.set('rootprefix_noslash', rootprefixdir_noslash)
278 substs.set('exec_prefix', prefixdir)
279 substs.set('libdir', libdir)
280 substs.set('rootlibdir', rootlibdir)
281 substs.set('includedir', includedir)
282 substs.set('sysconfdir', sysconfdir)
283 substs.set('bindir', bindir)
284 substs.set('rootbindir', rootbindir)
285 substs.set('rootlibexecdir', rootlibexecdir)
286 substs.set('systemunitdir', systemunitdir)
287 substs.set('userunitdir', userunitdir)
288 substs.set('systempresetdir', systempresetdir)
289 substs.set('userpresetdir', userpresetdir)
290 substs.set('udevhwdbdir', udevhwdbdir)
291 substs.set('udevrulesdir', udevrulesdir)
292 substs.set('udevlibexecdir', udevlibexecdir)
293 substs.set('environmentdir', environmentdir)
294 substs.set('catalogdir', catalogdir)
295 substs.set('tmpfilesdir', tmpfilesdir)
296 substs.set('sysusersdir', sysusersdir)
297 substs.set('sysctldir', sysctldir)
298 substs.set('binfmtdir', binfmtdir)
299 substs.set('modulesloaddir', modulesloaddir)
300 substs.set('modprobedir', modprobedir)
301 substs.set('systemgeneratordir', systemgeneratordir)
302 substs.set('usergeneratordir', usergeneratordir)
303 substs.set('systemenvgeneratordir', systemenvgeneratordir)
304 substs.set('userenvgeneratordir', userenvgeneratordir)
305 substs.set('systemshutdowndir', systemshutdowndir)
306 substs.set('systemsleepdir', systemsleepdir)
307 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
308 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
309 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
310 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
311 substs.set('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
312 substs.set('RC_LOCAL_PATH', get_option('rc-local'))
313 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
314 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
315 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
316 substs.set('BUILD_ROOT', project_build_root)
318 #####################################################################
320 cc = meson.get_compiler('c')
321 pkgconfig = import('pkgconfig')
322 check_compilation_sh = find_program('tools/check-compilation.sh')
323 meson_build_sh = find_program('tools/meson-build.sh')
325 want_tests = get_option('tests')
326 slow_tests = want_tests != 'false' and get_option('slow-tests')
327 fuzz_tests = want_tests != 'false' and get_option('fuzz-tests')
328 install_tests = get_option('install-tests')
330 if add_languages('cpp', required : fuzzer_build)
331 # Used only for tests
332 cxx = meson.get_compiler('cpp')
333 cxx_cmd = ' '.join(cxx.cmd_array())
339 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
340 if fuzzing_engine.found()
341 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
342 elif cc.has_argument('-fsanitize=fuzzer-no-link')
343 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
345 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
348 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
351 # Those generate many false positives, and we do not want to change the code to
353 basic_disabled_warnings = [
354 '-Wno-unused-parameter',
355 '-Wno-missing-field-initializers',
356 '-Wno-unused-result',
357 '-Wno-format-signedness',
360 possible_cc_flags = [
363 '-Wmissing-include-dirs',
364 '-Wold-style-definition',
368 '-Wsuggest-attribute=noreturn',
369 '-Werror=missing-prototypes',
370 '-Werror=implicit-function-declaration',
371 '-Werror=missing-declarations',
372 '-Werror=return-type',
373 '-Werror=incompatible-pointer-types',
375 '-Wstrict-prototypes',
377 '-Wmissing-noreturn',
378 '-Wimplicit-fallthrough=5',
381 '-Wstrict-aliasing=2',
384 '-Werror=shift-count-overflow',
385 '-Werror=shift-overflow=2',
389 # negative arguments are correctly detected starting with meson 0.46.
390 '-Wno-error=#warnings', # clang
391 '-Wno-string-plus-int', # clang
393 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
394 # optimizations enabled, producing essentially false positives.
395 '-Wno-maybe-uninitialized',
399 '-fdiagnostics-show-option',
400 '-fno-strict-aliasing',
401 '-fvisibility=hidden',
403 '-fstack-protector-strong',
404 '--param=ssp-buffer-size=4',
407 # --as-needed and --no-undefined are provided by meson by default,
408 # run mesonconf to see what is enabled
409 possible_link_flags = [
415 if cc.get_id() == 'clang'
416 possible_cc_flags += [
417 '-Wno-typedef-redefinition',
418 '-Wno-gnu-variable-sized-type-not-at-end',
422 if get_option('buildtype') != 'debug'
423 possible_cc_flags += [
424 '-ffunction-sections',
428 possible_link_flags += '-Wl,--gc-sections'
431 add_project_arguments(cc.get_supported_arguments(basic_disabled_warnings), language : 'c')
432 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
433 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
435 have = cc.has_argument('-Wzero-length-bounds')
436 conf.set10('HAVE_ZERO_LENGTH_BOUNDS', have)
440 #include <inttypes.h>
441 typedef uint64_t usec_t;
442 usec_t now(clockid_t clock);
447 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
448 add_project_arguments('-Werror=shadow', language : 'c')
452 add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp')
455 cpp = ' '.join(cc.cmd_array()) + ' -E'
457 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
459 #####################################################################
460 # compilation result tests
462 conf.set('_GNU_SOURCE', true)
463 conf.set('__SANE_USERSPACE_TYPES__', true)
464 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
466 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
467 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
468 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
469 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
473 #include <sys/stat.h>
476 foreach decl : ['char16_t',
481 # We get -1 if the size cannot be determined
482 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
484 if decl == 'struct statx'
486 want_linux_stat_h = false
488 have = cc.sizeof(decl,
489 prefix : decl_headers + '#include <linux/stat.h>',
490 args : '-D_GNU_SOURCE') > 0
491 want_linux_stat_h = have
495 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
498 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
500 foreach ident : ['secure_getenv', '__secure_getenv']
501 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
505 ['memfd_create', '''#include <sys/mman.h>'''],
506 ['gettid', '''#include <sys/types.h>
507 #include <unistd.h>'''],
508 ['pivot_root', '''#include <stdlib.h>
509 #include <unistd.h>'''], # no known header declares pivot_root
510 ['name_to_handle_at', '''#include <sys/types.h>
511 #include <sys/stat.h>
512 #include <fcntl.h>'''],
513 ['setns', '''#include <sched.h>'''],
514 ['renameat2', '''#include <stdio.h>
515 #include <fcntl.h>'''],
516 ['kcmp', '''#include <linux/kcmp.h>'''],
517 ['keyctl', '''#include <sys/types.h>
518 #include <keyutils.h>'''],
519 ['copy_file_range', '''#include <sys/syscall.h>
520 #include <unistd.h>'''],
521 ['bpf', '''#include <sys/syscall.h>
522 #include <unistd.h>'''],
523 ['statx', '''#include <sys/types.h>
524 #include <sys/stat.h>
525 #include <unistd.h>'''],
526 ['explicit_bzero' , '''#include <string.h>'''],
527 ['reallocarray', '''#include <stdlib.h>'''],
528 ['set_mempolicy', '''#include <stdlib.h>
529 #include <unistd.h>'''],
530 ['get_mempolicy', '''#include <stdlib.h>
531 #include <unistd.h>'''],
532 ['pidfd_send_signal', '''#include <stdlib.h>
535 #include <sys/wait.h>'''],
536 ['pidfd_open', '''#include <stdlib.h>
539 #include <sys/wait.h>'''],
540 ['rt_sigqueueinfo', '''#include <stdlib.h>
543 #include <sys/wait.h>'''],
544 ['mallinfo', '''#include <malloc.h>'''],
545 ['execveat', '''#include <unistd.h>'''],
546 ['close_range', '''#include <unistd.h>'''],
549 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
550 conf.set10('HAVE_' + ident[0].to_upper(), have)
553 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
554 conf.set10('USE_SYS_RANDOM_H', true)
555 conf.set10('HAVE_GETRANDOM', true)
557 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
558 conf.set10('USE_SYS_RANDOM_H', false)
559 conf.set10('HAVE_GETRANDOM', have)
562 #####################################################################
564 version_tag = get_option('version-tag')
566 vcs_data = configuration_data()
567 vcs_data.set('VCS_TAG', version_tag)
568 version_h = configure_file(configuration : vcs_data,
569 input : 'src/version/version.h.in',
570 output : 'version.h')
573 project_source_root + '/tools/meson-vcs-tag.sh',
575 meson.project_version()]
578 input : 'src/version/version.h.in',
579 output : 'version.h',
583 versiondep = declare_dependency(sources: version_h)
585 sed = find_program('sed')
586 awk = find_program('awk')
587 m4 = find_program('m4')
588 stat = find_program('stat')
589 git = find_program('git', required : false)
590 env = find_program('env')
591 perl = find_program('perl', required : false)
593 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
594 mkdir_p = 'mkdir -p $DESTDIR/@0@'
595 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
596 splash_bmp = files('test/splash.bmp')
598 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
599 # /usr/sbin, /sbin, and fall back to the default from middle column.
600 progs = [['quotaon', '/usr/sbin/quotaon' ],
601 ['quotacheck', '/usr/sbin/quotacheck' ],
602 ['kmod', '/usr/bin/kmod' ],
603 ['kexec', '/usr/sbin/kexec' ],
604 ['sulogin', '/usr/sbin/sulogin' ],
605 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
606 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
607 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
608 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
609 ['nologin', '/usr/sbin/nologin', ],
612 path = get_option(prog[0] + '-path')
614 message('Using @1@ for @0@'.format(prog[0], path))
616 exe = find_program(prog[0],
617 '/usr/sbin/' + prog[0],
620 path = exe.found() ? exe.path() : prog[1]
622 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
623 conf.set_quoted(name, path)
624 substs.set(name, path)
627 conf.set_quoted('TELINIT', get_option('telinit-path'))
629 if run_command('ln', '--relative', '--help').returncode() != 0
630 error('ln does not support --relative (added in coreutils 8.16)')
633 ############################################################
635 gperf = find_program('gperf')
637 gperf_test_format = '''
639 const char * in_word_set(const char *, @0@);
642 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
643 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
644 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
645 if cc.compiles(gperf_test)
646 gperf_len_type = 'size_t'
648 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
649 if cc.compiles(gperf_test)
650 gperf_len_type = 'unsigned'
652 error('unable to determine gperf len type')
655 message('gperf len type is @0@'.format(gperf_len_type))
656 conf.set('GPERF_LEN_TYPE', gperf_len_type,
657 description : 'The type of gperf "len" parameter')
659 ############################################################
661 if not cc.has_header('sys/capability.h')
662 error('POSIX caps headers not found')
664 foreach header : ['crypt.h',
666 'linux/vm_sockets.h',
668 'valgrind/memcheck.h',
669 'valgrind/valgrind.h',
672 conf.set10('HAVE_' + header.underscorify().to_upper(),
673 cc.has_header(header))
676 ############################################################
678 fallback_hostname = get_option('fallback-hostname')
679 if fallback_hostname == '' or fallback_hostname[0] == '.' or fallback_hostname[0] == '-'
680 error('Invalid fallback-hostname configuration')
681 # A more extensive test is done in test-hostname-util. Let's catch
682 # the most obvious errors here so we don't fail with an assert later.
684 conf.set_quoted('FALLBACK_HOSTNAME', fallback_hostname)
686 default_hierarchy = get_option('default-hierarchy')
687 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
688 description : 'default cgroup hierarchy as string')
689 if default_hierarchy == 'legacy'
690 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
691 elif default_hierarchy == 'hybrid'
692 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
694 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
697 default_net_naming_scheme = get_option('default-net-naming-scheme')
698 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
700 time_epoch = get_option('time-epoch')
702 time_epoch = run_command('sh', ['-c', 'echo "$SOURCE_DATE_EPOCH"']).stdout().strip()
703 if time_epoch == '' and git.found() and run_command('test', '-e', '.git').returncode() == 0
704 # If we're in a git repository, use the creation time of the latest git tag.
705 latest_tag = run_command('git', 'describe', '--abbrev=0', '--tags').stdout().strip()
706 time_epoch = run_command('git', 'log', '-1', '--format=%at', latest_tag).stdout()
710 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
712 time_epoch = time_epoch.to_int()
714 conf.set('TIME_EPOCH', time_epoch)
716 foreach tuple : [['system-alloc-uid-min', 'SYS_UID_MIN', 1], # Also see login.defs(5).
717 ['system-uid-max', 'SYS_UID_MAX', 999],
718 ['system-alloc-gid-min', 'SYS_GID_MIN', 1],
719 ['system-gid-max', 'SYS_GID_MAX', 999]]
720 v = get_option(tuple[0])
724 '/^\s*@0@\s+/ { uid=$2 } END { print uid }'.format(tuple[1]),
725 '/etc/login.defs').stdout().strip()
732 conf.set(tuple[0].underscorify().to_upper(), v)
733 substs.set(tuple[0].underscorify().to_upper(), v)
735 if conf.get('SYSTEM_ALLOC_UID_MIN') >= conf.get('SYSTEM_UID_MAX')
736 error('Invalid uid allocation range')
738 if conf.get('SYSTEM_ALLOC_GID_MIN') >= conf.get('SYSTEM_GID_MAX')
739 error('Invalid gid allocation range')
742 dynamic_uid_min = get_option('dynamic-uid-min')
743 dynamic_uid_max = get_option('dynamic-uid-max')
744 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
745 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
746 substs.set('dynamicuidmin', dynamic_uid_min)
747 substs.set('dynamicuidmax', dynamic_uid_max)
749 container_uid_base_min = get_option('container-uid-base-min')
750 container_uid_base_max = get_option('container-uid-base-max')
751 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
752 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
753 substs.set('containeruidbasemin', container_uid_base_min)
754 substs.set('containeruidbasemax', container_uid_base_max)
756 nobody_user = get_option('nobody-user')
757 nobody_group = get_option('nobody-group')
759 if not meson.is_cross_build()
760 getent_result = run_command('getent', 'passwd', '65534')
761 if getent_result.returncode() == 0
762 name = getent_result.stdout().split(':')[0]
763 if name != nobody_user
765 '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) +
766 'Your build will result in an user table setup that is incompatible with the local system.')
769 id_result = run_command('id', '-u', nobody_user)
770 if id_result.returncode() == 0
771 id = id_result.stdout().to_int()
774 '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) +
775 'Your build will result in an user table setup that is incompatible with the local system.')
779 getent_result = run_command('getent', 'group', '65534')
780 if getent_result.returncode() == 0
781 name = getent_result.stdout().split(':')[0]
782 if name != nobody_group
784 '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) +
785 'Your build will result in an group table setup that is incompatible with the local system.')
788 id_result = run_command('id', '-g', nobody_group)
789 if id_result.returncode() == 0
790 id = id_result.stdout().to_int()
793 '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) +
794 'Your build will result in an group table setup that is incompatible with the local system.')
798 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
800 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
801 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
804 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
805 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
806 substs.set('NOBODY_USER_NAME', nobody_user)
807 substs.set('NOBODY_GROUP_NAME', nobody_group)
809 tty_gid = get_option('tty-gid')
810 conf.set('TTY_GID', tty_gid)
811 substs.set('TTY_GID', tty_gid)
813 # Ensure provided GID argument is numeric, otherwise fall back to default assignment
814 users_gid = get_option('users-gid')
815 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
817 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
818 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
820 dev_kvm_mode = get_option('dev-kvm-mode')
821 substs.set('DEV_KVM_MODE', dev_kvm_mode)
822 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
823 group_render_mode = get_option('group-render-mode')
824 substs.set('GROUP_RENDER_MODE', group_render_mode)
825 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
827 kill_user_processes = get_option('default-kill-user-processes')
828 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
829 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
830 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
832 dns_servers = get_option('dns-servers')
833 conf.set_quoted('DNS_SERVERS', dns_servers)
834 substs.set('DNS_SERVERS', dns_servers)
836 ntp_servers = get_option('ntp-servers')
837 conf.set_quoted('NTP_SERVERS', ntp_servers)
838 substs.set('NTP_SERVERS', ntp_servers)
840 default_locale = get_option('default-locale')
841 if default_locale == ''
842 if not meson.is_cross_build()
843 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
844 default_locale = run_command(choose_default_locale_sh).stdout().strip()
846 default_locale = 'C.UTF-8'
849 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
851 localegen_path = get_option('localegen-path')
853 if localegen_path != ''
854 conf.set_quoted('LOCALEGEN_PATH', localegen_path)
857 conf.set10('HAVE_LOCALEGEN', have)
859 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
861 service_watchdog = get_option('service-watchdog')
862 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
863 substs.set('SERVICE_WATCHDOG', watchdog_value)
865 substs.set('SUSHELL', get_option('debug-shell'))
866 substs.set('DEBUGTTY', get_option('debug-tty'))
867 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
869 enable_debug_hashmap = false
870 enable_debug_mmap_cache = false
871 enable_debug_siphash = false
872 foreach name : get_option('debug-extra')
874 enable_debug_hashmap = true
875 elif name == 'mmap-cache'
876 enable_debug_mmap_cache = true
877 elif name == 'siphash'
878 enable_debug_siphash = true
880 message('unknown debug option "@0@", ignoring'.format(name))
883 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
884 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
885 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
887 conf.set10('VALGRIND', get_option('valgrind'))
888 conf.set10('LOG_TRACE', get_option('log-trace'))
890 default_user_path = get_option('user-path')
891 if default_user_path != ''
892 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
893 default_user_path_display = default_user_path
895 # meson 0.49 fails when ?: is used in .format()
896 default_user_path_display = '(same as system services)'
900 #####################################################################
902 threads = dependency('threads')
903 librt = cc.find_library('rt')
904 libm = cc.find_library('m')
905 libdl = cc.find_library('dl')
906 libcrypt = cc.find_library('crypt')
908 crypt_header = conf.get('HAVE_CRYPT_H') == 1 ? '''#include <crypt.h>''' : '''#include <unistd.h>'''
910 ['crypt_ra', crypt_header],
911 ['crypt_preferred_method', crypt_header],
912 ['crypt_gensalt_ra', crypt_header]]
914 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE',
915 dependencies : libcrypt)
916 conf.set10('HAVE_' + ident[0].to_upper(), have)
919 libcap = dependency('libcap', required : false)
920 if not libcap.found()
921 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
922 libcap = cc.find_library('cap')
925 libmount = dependency('mount',
926 version : fuzzer_build ? '>= 0' : '>= 2.30')
928 want_libfdisk = get_option('fdisk')
929 if want_libfdisk != 'false' and not skip_deps
930 libfdisk = dependency('fdisk',
932 required : want_libfdisk == 'true')
933 have = libfdisk.found()
938 conf.set10('HAVE_LIBFDISK', have)
940 want_pwquality = get_option('pwquality')
941 if want_pwquality != 'false' and not skip_deps
942 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
943 have = libpwquality.found()
948 conf.set10('HAVE_PWQUALITY', have)
950 want_seccomp = get_option('seccomp')
951 if want_seccomp != 'false' and not skip_deps
952 libseccomp = dependency('libseccomp',
953 version : '>= 2.3.1',
954 required : want_seccomp == 'true')
955 have = libseccomp.found()
960 conf.set10('HAVE_SECCOMP', have)
962 want_selinux = get_option('selinux')
963 if want_selinux != 'false' and not skip_deps
964 libselinux = dependency('libselinux',
965 version : '>= 2.1.9',
966 required : want_selinux == 'true')
967 have = libselinux.found()
972 conf.set10('HAVE_SELINUX', have)
974 want_apparmor = get_option('apparmor')
975 if want_apparmor != 'false' and not skip_deps
976 libapparmor = dependency('libapparmor',
978 required : want_apparmor == 'true')
979 have = libapparmor.found()
984 conf.set10('HAVE_APPARMOR', have)
986 smack_run_label = get_option('smack-run-label')
987 if smack_run_label != ''
988 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
991 want_polkit = get_option('polkit')
992 install_polkit = false
993 install_polkit_pkla = false
994 if want_polkit != 'false' and not skip_deps
995 install_polkit = true
997 libpolkit = dependency('polkit-gobject-1',
999 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
1000 message('Old polkit detected, will install pkla files')
1001 install_polkit_pkla = true
1004 conf.set10('ENABLE_POLKIT', install_polkit)
1006 want_acl = get_option('acl')
1007 if want_acl != 'false' and not skip_deps
1008 libacl = cc.find_library('acl', required : want_acl == 'true')
1009 have = libacl.found()
1014 conf.set10('HAVE_ACL', have)
1016 want_audit = get_option('audit')
1017 if want_audit != 'false' and not skip_deps
1018 libaudit = dependency('audit', required : want_audit == 'true')
1019 have = libaudit.found()
1024 conf.set10('HAVE_AUDIT', have)
1026 want_blkid = get_option('blkid')
1027 if want_blkid != 'false' and not skip_deps
1028 libblkid = dependency('blkid', required : want_blkid == 'true')
1029 have = libblkid.found()
1031 conf.set10('HAVE_BLKID_PROBE_SET_HINT',
1032 have and cc.has_function('blkid_probe_set_hint', dependencies : libblkid))
1037 conf.set10('HAVE_BLKID', have)
1039 want_kmod = get_option('kmod')
1040 if want_kmod != 'false' and not skip_deps
1041 libkmod = dependency('libkmod',
1043 required : want_kmod == 'true')
1044 have = libkmod.found()
1049 conf.set10('HAVE_KMOD', have)
1051 want_pam = get_option('pam')
1052 if want_pam != 'false' and not skip_deps
1053 libpam = cc.find_library('pam', required : want_pam == 'true')
1054 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
1055 have = libpam.found() and libpam_misc.found()
1061 conf.set10('HAVE_PAM', have)
1063 want_microhttpd = get_option('microhttpd')
1064 if want_microhttpd != 'false' and not skip_deps
1065 libmicrohttpd = dependency('libmicrohttpd',
1066 version : '>= 0.9.33',
1067 required : want_microhttpd == 'true')
1068 have = libmicrohttpd.found()
1073 conf.set10('HAVE_MICROHTTPD', have)
1075 want_libcryptsetup = get_option('libcryptsetup')
1076 if want_libcryptsetup != 'false' and not skip_deps
1077 libcryptsetup = dependency('libcryptsetup',
1078 version : '>= 2.0.1',
1079 required : want_libcryptsetup == 'true')
1080 have = libcryptsetup.found()
1082 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1083 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
1084 conf.set10('HAVE_CRYPT_ACTIVATE_BY_SIGNED_KEY',
1085 have and cc.has_function('crypt_activate_by_signed_key', dependencies : libcryptsetup))
1086 conf.set10('HAVE_CRYPT_TOKEN_MAX',
1087 have and cc.has_function('crypt_token_max', dependencies : libcryptsetup))
1092 conf.set10('HAVE_LIBCRYPTSETUP', have)
1094 want_libcurl = get_option('libcurl')
1095 if want_libcurl != 'false' and not skip_deps
1096 libcurl = dependency('libcurl',
1097 version : '>= 7.32.0',
1098 required : want_libcurl == 'true')
1099 have = libcurl.found()
1104 conf.set10('HAVE_LIBCURL', have)
1105 conf.set10('CURL_NO_OLDIES', get_option('mode') == 'developer')
1107 want_libidn = get_option('libidn')
1108 want_libidn2 = get_option('libidn2')
1109 if want_libidn == 'true' and want_libidn2 == 'true'
1110 error('libidn and libidn2 cannot be requested simultaneously')
1113 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1114 libidn = dependency('libidn2',
1115 required : want_libidn2 == 'true')
1116 have = libidn.found()
1121 conf.set10('HAVE_LIBIDN2', have)
1122 if not have and want_libidn != 'false' and not skip_deps
1123 # libidn is used for both libidn and libidn2 objects
1124 libidn = dependency('libidn',
1125 required : want_libidn == 'true')
1126 have = libidn.found()
1130 conf.set10('HAVE_LIBIDN', have)
1132 want_libiptc = get_option('libiptc')
1133 if want_libiptc != 'false' and not skip_deps
1134 libiptc = dependency('libiptc',
1135 required : want_libiptc == 'true')
1136 have = libiptc.found()
1141 conf.set10('HAVE_LIBIPTC', have)
1143 want_qrencode = get_option('qrencode')
1144 if want_qrencode != 'false' and not skip_deps
1145 libqrencode = dependency('libqrencode',
1147 required : want_qrencode == 'true')
1148 have = libqrencode.found()
1153 conf.set10('HAVE_QRENCODE', have)
1155 want_gcrypt = get_option('gcrypt')
1156 if want_gcrypt != 'false' and not skip_deps
1157 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1158 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1159 have = libgcrypt.found() and libgpg_error.found()
1164 # link to neither of the libs if one is not found
1168 conf.set10('HAVE_GCRYPT', have)
1170 want_gnutls = get_option('gnutls')
1171 if want_gnutls != 'false' and not skip_deps
1172 libgnutls = dependency('gnutls',
1173 version : '>= 3.1.4',
1174 required : want_gnutls == 'true')
1175 have = libgnutls.found()
1180 conf.set10('HAVE_GNUTLS', have)
1182 want_openssl = get_option('openssl')
1183 if want_openssl != 'false' and not skip_deps
1184 libopenssl = dependency('openssl',
1185 version : '>= 1.1.0',
1186 required : want_openssl == 'true')
1187 have = libopenssl.found()
1192 conf.set10('HAVE_OPENSSL', have)
1194 want_p11kit = get_option('p11kit')
1195 if want_p11kit != 'false' and not skip_deps
1196 libp11kit = dependency('p11-kit-1',
1197 version : '>= 0.23.3',
1198 required : want_p11kit == 'true')
1199 have = libp11kit.found()
1204 conf.set10('HAVE_P11KIT', have)
1206 want_libfido2 = get_option('libfido2')
1207 if want_libfido2 != 'false' and not skip_deps
1208 libfido2 = dependency('libfido2',
1209 required : want_libfido2 == 'true')
1210 have = libfido2.found()
1215 conf.set10('HAVE_LIBFIDO2', have)
1217 want_tpm2 = get_option('tpm2')
1218 if want_tpm2 != 'false' and not skip_deps
1219 tpm2 = dependency('tss2-esys tss2-rc tss2-mu',
1220 required : want_tpm2 == 'true')
1226 conf.set10('HAVE_TPM2', have)
1228 want_elfutils = get_option('elfutils')
1229 if want_elfutils != 'false' and not skip_deps
1230 libdw = dependency('libdw',
1231 required : want_elfutils == 'true')
1232 have = libdw.found()
1237 conf.set10('HAVE_ELFUTILS', have)
1239 want_zlib = get_option('zlib')
1240 if want_zlib != 'false' and not skip_deps
1241 libz = dependency('zlib',
1242 required : want_zlib == 'true')
1248 conf.set10('HAVE_ZLIB', have)
1250 want_bzip2 = get_option('bzip2')
1251 if want_bzip2 != 'false' and not skip_deps
1252 libbzip2 = cc.find_library('bz2',
1253 required : want_bzip2 == 'true')
1254 have = libbzip2.found()
1259 conf.set10('HAVE_BZIP2', have)
1261 want_xz = get_option('xz')
1262 if want_xz != 'false' and not skip_deps
1263 libxz = dependency('liblzma',
1264 required : want_xz == 'true')
1265 have_xz = libxz.found()
1270 conf.set10('HAVE_XZ', have_xz)
1272 want_lz4 = get_option('lz4')
1273 if want_lz4 != 'false' and not skip_deps
1274 liblz4 = dependency('liblz4',
1275 version : '>= 1.3.0',
1276 required : want_lz4 == 'true')
1277 have_lz4 = liblz4.found()
1282 conf.set10('HAVE_LZ4', have_lz4)
1284 want_zstd = get_option('zstd')
1285 if want_zstd != 'false' and not skip_deps
1286 libzstd = dependency('libzstd',
1287 required : want_zstd == 'true',
1288 version : '>= 1.4.0')
1289 have_zstd = libzstd.found()
1294 conf.set10('HAVE_ZSTD', have_zstd)
1296 conf.set10('HAVE_COMPRESSION', have_xz or have_lz4 or have_zstd)
1298 want_xkbcommon = get_option('xkbcommon')
1299 if want_xkbcommon != 'false' and not skip_deps
1300 libxkbcommon = dependency('xkbcommon',
1301 version : '>= 0.3.0',
1302 required : want_xkbcommon == 'true')
1303 have = libxkbcommon.found()
1308 conf.set10('HAVE_XKBCOMMON', have)
1310 want_pcre2 = get_option('pcre2')
1311 if want_pcre2 != 'false'
1312 libpcre2 = dependency('libpcre2-8',
1313 required : want_pcre2 == 'true')
1314 have = libpcre2.found()
1319 conf.set10('HAVE_PCRE2', have)
1321 want_glib = get_option('glib')
1322 if want_glib != 'false' and not skip_deps
1323 libglib = dependency('glib-2.0',
1324 version : '>= 2.22.0',
1325 required : want_glib == 'true')
1326 libgobject = dependency('gobject-2.0',
1327 version : '>= 2.22.0',
1328 required : want_glib == 'true')
1329 libgio = dependency('gio-2.0',
1330 required : want_glib == 'true')
1331 have = libglib.found() and libgobject.found() and libgio.found()
1338 conf.set10('HAVE_GLIB', have)
1340 want_dbus = get_option('dbus')
1341 if want_dbus != 'false' and not skip_deps
1342 libdbus = dependency('dbus-1',
1343 version : '>= 1.3.2',
1344 required : want_dbus == 'true')
1345 have = libdbus.found()
1350 conf.set10('HAVE_DBUS', have)
1352 default_dnssec = get_option('default-dnssec')
1354 default_dnssec = 'no'
1356 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1357 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1358 default_dnssec = 'no'
1360 conf.set('DEFAULT_DNSSEC_MODE',
1361 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1362 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1364 dns_over_tls = get_option('dns-over-tls')
1365 if dns_over_tls != 'false'
1366 if dns_over_tls == 'openssl'
1369 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1370 if dns_over_tls == 'gnutls' and not have_gnutls
1371 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1374 if dns_over_tls == 'gnutls' or have_gnutls
1375 have_openssl = false
1377 have_openssl = conf.get('HAVE_OPENSSL') == 1
1378 if dns_over_tls != 'auto' and not have_openssl
1379 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1380 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1383 have = have_gnutls or have_openssl
1387 have_openssl = false
1389 conf.set10('ENABLE_DNS_OVER_TLS', have)
1390 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1391 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1393 default_dns_over_tls = get_option('default-dns-over-tls')
1395 default_dns_over_tls = 'no'
1397 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1398 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.')
1399 default_dns_over_tls = 'no'
1401 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1402 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1403 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1405 default_mdns = get_option('default-mdns')
1406 conf.set('DEFAULT_MDNS_MODE',
1407 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
1408 substs.set('DEFAULT_MDNS_MODE', default_mdns)
1410 default_llmnr = get_option('default-llmnr')
1411 conf.set('DEFAULT_LLMNR_MODE',
1412 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
1413 substs.set('DEFAULT_LLMNR_MODE', default_llmnr)
1415 want_repart = get_option('repart')
1416 if want_repart != 'false'
1417 have = (conf.get('HAVE_OPENSSL') == 1 and
1418 conf.get('HAVE_LIBFDISK') == 1)
1419 if want_repart == 'true' and not have
1420 error('repart support was requested, but dependencies are not available')
1425 conf.set10('ENABLE_REPART', have)
1427 want_importd = get_option('importd')
1428 if want_importd != 'false'
1429 have = (conf.get('HAVE_LIBCURL') == 1 and
1430 conf.get('HAVE_ZLIB') == 1 and
1431 conf.get('HAVE_XZ') == 1 and
1432 conf.get('HAVE_GCRYPT') == 1)
1433 if want_importd == 'true' and not have
1434 error('importd support was requested, but dependencies are not available')
1439 conf.set10('ENABLE_IMPORTD', have)
1441 want_homed = get_option('homed')
1442 if want_homed != 'false'
1443 have = (conf.get('HAVE_OPENSSL') == 1 and
1444 conf.get('HAVE_LIBFDISK') == 1 and
1445 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1446 if want_homed == 'true' and not have
1447 error('homed support was requested, but dependencies are not available')
1452 conf.set10('ENABLE_HOMED', have)
1454 have = have and conf.get('HAVE_PAM') == 1
1455 conf.set10('ENABLE_PAM_HOME', have)
1457 have = get_option('oomd')
1458 conf.set10('ENABLE_OOMD', have)
1459 substs.set10('ENABLE_OOMD', have)
1461 want_remote = get_option('remote')
1462 if want_remote != 'false'
1463 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1464 conf.get('HAVE_LIBCURL') == 1]
1465 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1466 # it's possible to build one without the other. Complain only if
1467 # support was explicitly requested. The auxiliary files like sysusers
1468 # config should be installed when any of the programs are built.
1469 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1470 error('remote support was requested, but dependencies are not available')
1472 have = have_deps[0] or have_deps[1]
1476 conf.set10('ENABLE_REMOTE', have)
1478 foreach term : ['analyze',
1492 'compat-mutable-uid-boundaries',
1518 have = get_option(term)
1519 name = 'ENABLE_' + term.underscorify().to_upper()
1520 conf.set10(name, have)
1521 substs.set10(name, have)
1524 enable_sysusers = conf.get('ENABLE_SYSUSERS') == 1
1526 foreach tuple : [['nss-mymachines', 'machined'],
1527 ['nss-resolve', 'resolve']]
1528 want = get_option(tuple[0])
1530 have = get_option(tuple[1])
1531 if want == 'true' and not have
1532 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1537 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1538 conf.set10(name, have)
1542 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1543 'ENABLE_NSS_MYMACHINES',
1544 'ENABLE_NSS_RESOLVE',
1545 'ENABLE_NSS_SYSTEMD']
1546 if conf.get(term) == 1
1550 conf.set10('ENABLE_NSS', enable_nss)
1552 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1554 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1556 #####################################################################
1558 if get_option('efi')
1559 efi_arch = host_machine.cpu_family()
1561 if efi_arch == 'x86'
1562 EFI_MACHINE_TYPE_NAME = 'ia32'
1563 gnu_efi_arch = 'ia32'
1564 elif efi_arch == 'x86_64'
1565 EFI_MACHINE_TYPE_NAME = 'x64'
1566 gnu_efi_arch = 'x86_64'
1567 elif efi_arch == 'arm'
1568 EFI_MACHINE_TYPE_NAME = 'arm'
1569 gnu_efi_arch = 'arm'
1570 elif efi_arch == 'aarch64'
1571 EFI_MACHINE_TYPE_NAME = 'aa64'
1572 gnu_efi_arch = 'aarch64'
1574 EFI_MACHINE_TYPE_NAME = ''
1579 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1581 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1585 conf.set10('ENABLE_EFI', have)
1587 ############################################################
1589 generate_gperfs = find_program('tools/generate-gperfs.py')
1590 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1591 make_directive_index_py = find_program('tools/make-directive-index.py')
1592 make_man_index_py = find_program('tools/make-man-index.py')
1593 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1594 update_dbus_docs_py = find_program('tools/update-dbus-docs.py')
1595 update_hwdb_sh = find_program('tools/update-hwdb.sh')
1596 update_hwdb_autosuspend_sh = find_program('tools/update-hwdb-autosuspend.sh')
1597 update_syscall_tables_sh = find_program('tools/update-syscall-tables.sh')
1598 xml_helper_py = find_program('tools/xml_helper.py')
1600 #####################################################################
1602 config_h = configure_file(
1603 output : 'config.h',
1604 configuration : conf)
1606 add_project_arguments('-include', 'config.h', language : 'c')
1608 ############################################################
1610 # binaries that have --help and are intended for use by humans,
1611 # usually, but not always, installed in /bin.
1612 public_programs = []
1617 basic_includes = include_directories(
1623 libsystemd_includes = [basic_includes, include_directories(
1624 'src/libsystemd/sd-bus',
1625 'src/libsystemd/sd-device',
1626 'src/libsystemd/sd-event',
1627 'src/libsystemd/sd-hwdb',
1628 'src/libsystemd/sd-id128',
1629 'src/libsystemd/sd-journal',
1630 'src/libsystemd/sd-netlink',
1631 'src/libsystemd/sd-network',
1632 'src/libsystemd/sd-resolve')]
1634 includes = [libsystemd_includes, include_directories('src/shared')]
1638 subdir('src/fundamental')
1640 subdir('src/libsystemd')
1641 subdir('src/shared')
1643 subdir('src/libudev')
1645 libsystemd = shared_library(
1648 version : libsystemd_version,
1649 include_directories : libsystemd_includes,
1650 link_args : ['-shared',
1651 '-Wl,--version-script=' + libsystemd_sym_path],
1652 link_with : [libbasic,
1654 link_whole : [libsystemd_static],
1655 dependencies : [threads,
1660 link_depends : libsystemd_sym,
1662 install_dir : rootlibdir)
1664 install_libsystemd_static = static_library(
1668 basic_gcrypt_sources,
1669 fundamental_sources,
1671 include_directories : libsystemd_includes,
1672 build_by_default : static_libsystemd != 'false',
1673 install : static_libsystemd != 'false',
1674 install_dir : rootlibdir,
1675 pic : static_libsystemd_pic,
1676 dependencies : [threads,
1686 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1688 libudev = shared_library(
1691 version : libudev_version,
1692 include_directories : includes,
1693 link_args : ['-shared',
1694 '-Wl,--version-script=' + libudev_sym_path],
1695 link_with : [libsystemd_static, libshared_static],
1696 link_whole : libudev_basic,
1697 dependencies : [threads],
1698 link_depends : libudev_sym,
1700 install_dir : rootlibdir)
1702 install_libudev_static = static_library(
1705 fundamental_sources,
1710 include_directories : includes,
1711 build_by_default : static_libudev != 'false',
1712 install : static_libudev != 'false',
1713 install_dir : rootlibdir,
1714 link_depends : libudev_sym,
1715 dependencies : libshared_deps + [libmount],
1716 c_args : static_libudev_pic ? [] : ['-fno-PIC'],
1717 pic : static_libudev_pic)
1719 ############################################################
1721 # systemd-analyze requires 'libcore'
1723 # systemd-journal-remote requires 'libjournal_core'
1724 subdir('src/journal')
1725 # systemd-networkd requires 'libsystemd_network'
1726 subdir('src/libsystemd-network')
1728 subdir('src/analyze')
1729 subdir('src/boot/efi')
1730 subdir('src/busctl')
1731 subdir('src/coredump')
1732 subdir('src/cryptenroll')
1733 subdir('src/cryptsetup')
1735 subdir('src/hostname')
1736 subdir('src/import')
1737 subdir('src/journal-remote')
1738 subdir('src/kernel-install')
1739 subdir('src/locale')
1741 subdir('src/machine')
1742 subdir('src/network')
1743 subdir('src/nspawn')
1745 subdir('src/partition')
1746 subdir('src/portable')
1747 subdir('src/pstore')
1748 subdir('src/resolve')
1750 subdir('src/shutdown')
1751 subdir('src/sysext')
1752 subdir('src/systemctl')
1753 subdir('src/timedate')
1754 subdir('src/timesync')
1755 subdir('src/tmpfiles')
1756 subdir('src/userdb')
1757 subdir('src/vconsole')
1758 subdir('src/xdg-autostart-generator')
1760 subdir('src/systemd')
1767 ############################################################
1769 # only static linking apart from libdl, to make sure that the
1770 # module is linked to all libraries that it uses.
1771 test_dlopen = executable(
1775 include_directories : includes,
1776 link_with : [libbasic],
1777 dependencies : [libdl],
1778 build_by_default : want_tests != 'false')
1780 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1781 ['systemd', 'ENABLE_NSS_SYSTEMD', ['nss-systemd.h', 'userdb-glue.c', 'userdb-glue.h']],
1782 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1783 ['resolve', 'ENABLE_NSS_RESOLVE', [], resolve_includes]]
1785 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1789 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1790 version_script_arg = join_paths(project_source_root, sym)
1792 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1793 if tuple.length() > 2
1794 foreach s : tuple[2]
1795 sources += ['src/nss-@0@/@1@'.format(module, s)]
1799 incs = tuple.length() > 3 ? tuple[3] : includes
1801 nss = shared_library(
1806 include_directories : incs,
1807 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1808 link_args : ['-Wl,-z,nodelete',
1810 '-Wl,--version-script=' + version_script_arg],
1811 link_with : [libsystemd_static,
1814 dependencies : [threads,
1818 install_dir : rootlibdir)
1820 # We cannot use shared_module because it does not support version suffix.
1821 # Unfortunately shared_library insists on creating the symlink…
1822 meson.add_install_script('sh', '-c',
1823 'rm $DESTDIR@0@/libnss_@1@.so'
1824 .format(rootlibdir, module))
1826 if want_tests != 'false'
1827 test('dlopen-nss_' + module,
1829 # path to dlopen must include a slash
1830 args : nss.full_path())
1835 ############################################################
1840 include_directories : includes,
1841 link_with : [libcore,
1843 dependencies : [versiondep,
1850 install_rpath : rootlibexecdir,
1852 install_dir : rootlibexecdir)
1854 meson.add_install_script(meson_make_symlink,
1855 join_paths(rootlibexecdir, 'systemd'),
1856 join_paths(rootsbindir, 'init'))
1858 public_programs += executable(
1860 systemd_analyze_sources,
1861 include_directories : core_includes,
1862 link_with : [libcore,
1864 dependencies : [versiondep,
1871 install_rpath : rootlibexecdir,
1872 install : conf.get('ENABLE_ANALYZE'))
1876 systemd_journald_sources,
1877 include_directories : includes,
1878 link_with : [libjournal_core,
1880 dependencies : [threads,
1885 install_rpath : rootlibexecdir,
1887 install_dir : rootlibexecdir)
1889 public_programs += executable(
1891 systemd_cat_sources,
1892 include_directories : includes,
1893 link_with : [libjournal_core,
1895 dependencies : [threads],
1896 install_rpath : rootlibexecdir,
1899 public_programs += executable(
1902 include_directories : includes,
1903 link_with : [libshared],
1904 dependencies : [threads,
1910 install_rpath : rootlibexecdir,
1912 install_dir : rootbindir)
1915 'systemd-getty-generator',
1916 'src/getty-generator/getty-generator.c',
1917 include_directories : includes,
1918 link_with : [libshared],
1919 install_rpath : rootlibexecdir,
1921 install_dir : systemgeneratordir)
1924 'systemd-debug-generator',
1925 'src/debug-generator/debug-generator.c',
1926 include_directories : includes,
1927 link_with : [libshared],
1928 install_rpath : rootlibexecdir,
1930 install_dir : systemgeneratordir)
1933 'systemd-run-generator',
1934 'src/run-generator/run-generator.c',
1935 include_directories : includes,
1936 link_with : [libshared],
1937 install_rpath : rootlibexecdir,
1939 install_dir : systemgeneratordir)
1942 'systemd-fstab-generator',
1943 'src/fstab-generator/fstab-generator.c',
1944 include_directories : includes,
1945 link_with : [libshared],
1946 install_rpath : rootlibexecdir,
1948 install_dir : systemgeneratordir)
1950 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1952 '30-systemd-environment-d-generator',
1953 'src/environment-d-generator/environment-d-generator.c',
1954 include_directories : includes,
1955 link_with : [libshared],
1956 install_rpath : rootlibexecdir,
1958 install_dir : userenvgeneratordir)
1960 meson.add_install_script(meson_make_symlink,
1961 join_paths(sysconfdir, 'environment'),
1962 join_paths(environmentdir, '99-environment.conf'))
1965 if conf.get('ENABLE_HIBERNATE') == 1
1967 'systemd-hibernate-resume-generator',
1968 'src/hibernate-resume/hibernate-resume-generator.c',
1969 include_directories : includes,
1970 link_with : [libshared],
1971 install_rpath : rootlibexecdir,
1973 install_dir : systemgeneratordir)
1976 'systemd-hibernate-resume',
1977 'src/hibernate-resume/hibernate-resume.c',
1978 include_directories : includes,
1979 link_with : [libshared],
1980 install_rpath : rootlibexecdir,
1982 install_dir : rootlibexecdir)
1985 if conf.get('HAVE_BLKID') == 1
1987 'systemd-gpt-auto-generator',
1988 'src/gpt-auto-generator/gpt-auto-generator.c',
1989 include_directories : includes,
1990 link_with : [libshared],
1991 dependencies : libblkid,
1992 install_rpath : rootlibexecdir,
1994 install_dir : systemgeneratordir)
1996 public_programs += executable(
1998 'src/dissect/dissect.c',
1999 include_directories : includes,
2000 link_with : [libshared],
2001 install_rpath : rootlibexecdir,
2005 if conf.get('ENABLE_RESOLVE') == 1
2008 systemd_resolved_sources,
2009 include_directories : resolve_includes,
2010 link_with : [libshared,
2012 libsystemd_resolve_core],
2013 dependencies : systemd_resolved_dependencies,
2014 install_rpath : rootlibexecdir,
2016 install_dir : rootlibexecdir)
2018 public_programs += executable(
2021 include_directories : includes,
2022 link_with : [libshared,
2024 libsystemd_resolve_core],
2025 dependencies : [threads,
2029 install_rpath : rootlibexecdir,
2032 meson.add_install_script(meson_make_symlink,
2033 join_paths(bindir, 'resolvectl'),
2034 join_paths(rootsbindir, 'resolvconf'))
2036 meson.add_install_script(meson_make_symlink,
2037 join_paths(bindir, 'resolvectl'),
2038 join_paths(bindir, 'systemd-resolve'))
2041 if conf.get('ENABLE_LOGIND') == 1
2044 systemd_logind_sources,
2045 include_directories : includes,
2046 link_with : [liblogind_core,
2048 dependencies : [threads,
2050 install_rpath : rootlibexecdir,
2052 install_dir : rootlibexecdir)
2054 public_programs += executable(
2057 include_directories : includes,
2058 link_with : [libshared],
2059 dependencies : [threads,
2063 install_rpath : rootlibexecdir,
2065 install_dir : rootbindir)
2067 public_programs += executable(
2069 'src/login/inhibit.c',
2070 include_directories : includes,
2071 link_with : [libshared],
2072 install_rpath : rootlibexecdir,
2074 install_dir : rootbindir)
2076 if conf.get('HAVE_PAM') == 1
2077 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
2078 pam_systemd = shared_library(
2082 include_directories : includes,
2083 link_args : ['-shared',
2084 '-Wl,--version-script=' + version_script_arg],
2085 link_with : [libsystemd_static,
2087 dependencies : [threads,
2090 link_depends : pam_systemd_sym,
2092 install_dir : pamlibdir)
2094 if want_tests != 'false'
2095 test('dlopen-pam_systemd',
2097 # path to dlopen must include a slash
2098 args : pam_systemd.full_path())
2103 'systemd-user-runtime-dir',
2104 user_runtime_dir_sources,
2105 include_directories : includes,
2106 link_with : [libshared],
2107 install_rpath : rootlibexecdir,
2109 install_dir : rootlibexecdir)
2112 if conf.get('HAVE_PAM') == 1
2114 'systemd-user-sessions',
2115 'src/user-sessions/user-sessions.c',
2116 include_directories : includes,
2117 link_with : [libshared],
2118 install_rpath : rootlibexecdir,
2120 install_dir : rootlibexecdir)
2123 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
2124 public_programs += executable(
2126 'src/boot/bootctl.c',
2127 include_directories : includes,
2128 link_with : [libshared],
2129 dependencies : [libblkid],
2130 install_rpath : rootlibexecdir,
2133 public_programs += executable(
2134 'systemd-bless-boot',
2135 'src/boot/bless-boot.c',
2136 include_directories : includes,
2137 link_with : [libshared],
2138 dependencies : [libblkid],
2139 install_rpath : rootlibexecdir,
2141 install_dir : rootlibexecdir)
2144 'systemd-bless-boot-generator',
2145 'src/boot/bless-boot-generator.c',
2146 include_directories : includes,
2147 link_with : [libshared],
2148 install_rpath : rootlibexecdir,
2150 install_dir : systemgeneratordir)
2154 'systemd-boot-check-no-failures',
2155 'src/boot/boot-check-no-failures.c',
2156 include_directories : includes,
2157 link_with : [libshared],
2158 dependencies : [libblkid],
2159 install_rpath : rootlibexecdir,
2161 install_dir : rootlibexecdir)
2163 public_programs += executable(
2164 'systemd-socket-activate',
2165 'src/activate/activate.c',
2166 include_directories : includes,
2167 link_with : [libshared],
2168 dependencies : [threads],
2169 install_rpath : rootlibexecdir,
2172 public_programs += executable(
2175 include_directories : includes,
2176 link_with : systemctl_link_with,
2177 dependencies : [threads,
2183 install_rpath : rootlibexecdir,
2185 install_dir : rootbindir)
2187 if conf.get('ENABLE_PORTABLED') == 1
2189 'systemd-portabled',
2190 systemd_portabled_sources,
2191 include_directories : includes,
2192 link_with : [libshared],
2193 dependencies : [threads],
2194 install_rpath : rootlibexecdir,
2196 install_dir : rootlibexecdir)
2198 public_programs += executable(
2200 'src/portable/portablectl.c',
2201 include_directories : includes,
2202 link_with : [libshared],
2203 dependencies : [threads],
2204 install_rpath : rootlibexecdir,
2206 install_dir : rootbindir)
2209 if conf.get('ENABLE_SYSEXT') == 1
2210 public_programs += executable(
2212 systemd_sysext_sources,
2213 include_directories : includes,
2214 link_with : [libshared],
2215 install_rpath : rootlibexecdir,
2217 install_dir : rootbindir)
2220 if conf.get('ENABLE_USERDB') == 1
2223 systemd_userwork_sources,
2224 include_directories : includes,
2225 link_with : [libshared],
2226 dependencies : [threads],
2227 install_rpath : rootlibexecdir,
2229 install_dir : rootlibexecdir)
2233 systemd_userdbd_sources,
2234 include_directories : includes,
2235 link_with : [libshared],
2236 dependencies : [threads],
2237 install_rpath : rootlibexecdir,
2239 install_dir : rootlibexecdir)
2241 public_programs += executable(
2244 include_directories : includes,
2245 link_with : [libshared],
2246 dependencies : [threads],
2247 install_rpath : rootlibexecdir,
2249 install_dir : rootbindir)
2252 if conf.get('ENABLE_HOMED') == 1
2255 systemd_homework_sources,
2256 include_directories : includes,
2257 link_with : [libshared],
2258 dependencies : [threads,
2265 install_rpath : rootlibexecdir,
2267 install_dir : rootlibexecdir)
2271 systemd_homed_sources,
2272 include_directories : home_includes,
2273 link_with : [libshared],
2274 dependencies : [threads,
2277 install_rpath : rootlibexecdir,
2279 install_dir : rootlibexecdir)
2281 public_programs += executable(
2284 include_directories : includes,
2285 link_with : [libshared],
2286 dependencies : [threads,
2291 install_rpath : rootlibexecdir,
2293 install_dir : rootbindir)
2295 if conf.get('HAVE_PAM') == 1
2296 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2297 pam_systemd = shared_library(
2301 include_directories : includes,
2302 link_args : ['-shared',
2303 '-Wl,--version-script=' + version_script_arg],
2304 link_with : [libsystemd_static,
2306 dependencies : [threads,
2310 link_depends : pam_systemd_home_sym,
2312 install_dir : pamlibdir)
2316 foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
2317 (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
2318 meson.add_install_script(meson_make_symlink,
2319 join_paths(rootbindir, 'systemctl'),
2320 join_paths(rootsbindir, alias))
2323 meson.add_install_script(meson_make_symlink,
2324 join_paths(rootbindir, 'udevadm'),
2325 join_paths(rootlibexecdir, 'systemd-udevd'))
2327 if conf.get('ENABLE_BACKLIGHT') == 1
2329 'systemd-backlight',
2330 'src/backlight/backlight.c',
2331 include_directories : includes,
2332 link_with : [libshared],
2333 install_rpath : rootlibexecdir,
2335 install_dir : rootlibexecdir)
2338 if conf.get('ENABLE_RFKILL') == 1
2341 'src/rfkill/rfkill.c',
2342 include_directories : includes,
2343 link_with : [libshared],
2344 install_rpath : rootlibexecdir,
2346 install_dir : rootlibexecdir)
2350 'systemd-system-update-generator',
2351 'src/system-update-generator/system-update-generator.c',
2352 include_directories : includes,
2353 link_with : [libshared],
2354 install_rpath : rootlibexecdir,
2356 install_dir : systemgeneratordir)
2358 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2360 'systemd-cryptsetup',
2361 systemd_cryptsetup_sources,
2362 include_directories : includes,
2363 link_with : [libshared],
2364 dependencies : [libcryptsetup,
2366 install_rpath : rootlibexecdir,
2368 install_dir : rootlibexecdir)
2371 'systemd-cryptsetup-generator',
2372 'src/cryptsetup/cryptsetup-generator.c',
2373 include_directories : includes,
2374 link_with : [libshared],
2375 install_rpath : rootlibexecdir,
2377 install_dir : systemgeneratordir)
2380 'systemd-veritysetup',
2381 'src/veritysetup/veritysetup.c',
2382 include_directories : includes,
2383 link_with : [libshared],
2384 dependencies : [libcryptsetup],
2385 install_rpath : rootlibexecdir,
2387 install_dir : rootlibexecdir)
2390 'systemd-veritysetup-generator',
2391 'src/veritysetup/veritysetup-generator.c',
2392 include_directories : includes,
2393 link_with : [libshared],
2394 install_rpath : rootlibexecdir,
2396 install_dir : systemgeneratordir)
2399 'systemd-cryptenroll',
2400 systemd_cryptenroll_sources,
2401 include_directories : includes,
2402 link_with : [libshared],
2403 dependencies : [libcryptsetup,
2407 install_rpath : rootlibexecdir,
2411 if conf.get('HAVE_SYSV_COMPAT') == 1
2413 'systemd-sysv-generator',
2414 'src/sysv-generator/sysv-generator.c',
2415 include_directories : includes,
2416 link_with : [libshared],
2417 install_rpath : rootlibexecdir,
2419 install_dir : systemgeneratordir)
2422 'systemd-rc-local-generator',
2423 'src/rc-local-generator/rc-local-generator.c',
2424 include_directories : includes,
2425 link_with : [libshared],
2426 install_rpath : rootlibexecdir,
2428 install_dir : systemgeneratordir)
2431 if conf.get('ENABLE_XDG_AUTOSTART') == 1
2433 'systemd-xdg-autostart-generator',
2434 systemd_xdg_autostart_generator_sources,
2435 include_directories : includes,
2436 link_with : [libshared],
2437 install_rpath : rootlibexecdir,
2439 install_dir : usergeneratordir)
2442 'systemd-xdg-autostart-condition',
2443 'src/xdg-autostart-generator/xdg-autostart-condition.c',
2444 include_directories : includes,
2445 link_with : [libshared],
2446 install_rpath : rootlibexecdir,
2448 install_dir : rootlibexecdir)
2451 if conf.get('ENABLE_HOSTNAMED') == 1
2453 'systemd-hostnamed',
2454 'src/hostname/hostnamed.c',
2455 include_directories : includes,
2456 link_with : [libshared],
2457 install_rpath : rootlibexecdir,
2459 install_dir : rootlibexecdir)
2461 public_programs += executable(
2463 'src/hostname/hostnamectl.c',
2464 include_directories : includes,
2465 link_with : [libshared],
2466 install_rpath : rootlibexecdir,
2470 if conf.get('ENABLE_LOCALED') == 1
2471 if conf.get('HAVE_XKBCOMMON') == 1
2472 # logind will load libxkbcommon.so dynamically on its own
2480 systemd_localed_sources,
2481 include_directories : includes,
2482 link_with : [libshared],
2483 dependencies : deps,
2484 install_rpath : rootlibexecdir,
2486 install_dir : rootlibexecdir)
2488 public_programs += executable(
2491 include_directories : includes,
2492 link_with : [libshared],
2493 install_rpath : rootlibexecdir,
2497 if conf.get('ENABLE_TIMEDATED') == 1
2499 'systemd-timedated',
2500 'src/timedate/timedated.c',
2501 include_directories : includes,
2502 link_with : [libshared],
2503 install_rpath : rootlibexecdir,
2505 install_dir : rootlibexecdir)
2508 if conf.get('ENABLE_TIMEDATECTL') == 1
2509 public_programs += executable(
2511 'src/timedate/timedatectl.c',
2512 include_directories : includes,
2513 install_rpath : rootlibexecdir,
2514 link_with : [libshared],
2515 dependencies : [libm],
2519 if conf.get('ENABLE_TIMESYNCD') == 1
2521 'systemd-timesyncd',
2522 systemd_timesyncd_sources,
2523 include_directories : includes,
2524 link_with : [libtimesyncd_core],
2525 dependencies : [threads,
2527 install_rpath : rootlibexecdir,
2529 install_dir : rootlibexecdir)
2532 'systemd-time-wait-sync',
2533 'src/timesync/wait-sync.c',
2534 include_directories : includes,
2535 link_with : [libtimesyncd_core],
2536 install_rpath : rootlibexecdir,
2538 install_dir : rootlibexecdir)
2541 if conf.get('ENABLE_MACHINED') == 1
2544 systemd_machined_sources,
2545 include_directories : includes,
2546 link_with : [libmachine_core,
2548 install_rpath : rootlibexecdir,
2550 install_dir : rootlibexecdir)
2552 public_programs += executable(
2554 'src/machine/machinectl.c',
2555 include_directories : includes,
2556 link_with : [libshared],
2557 dependencies : [threads,
2561 install_rpath : rootlibexecdir,
2563 install_dir : rootbindir)
2566 if conf.get('ENABLE_IMPORTD') == 1
2569 systemd_importd_sources,
2570 include_directories : includes,
2571 link_with : [libshared],
2572 dependencies : [threads],
2573 install_rpath : rootlibexecdir,
2575 install_dir : rootlibexecdir)
2577 systemd_pull = executable(
2579 systemd_pull_sources,
2580 include_directories : includes,
2581 link_with : [libshared],
2582 dependencies : [versiondep,
2588 install_rpath : rootlibexecdir,
2590 install_dir : rootlibexecdir)
2592 systemd_import = executable(
2594 systemd_import_sources,
2595 include_directories : includes,
2596 link_with : [libshared],
2597 dependencies : [libcurl,
2601 install_rpath : rootlibexecdir,
2603 install_dir : rootlibexecdir)
2605 systemd_import_fs = executable(
2606 'systemd-import-fs',
2607 systemd_import_fs_sources,
2608 include_directories : includes,
2609 link_with : [libshared],
2610 install_rpath : rootlibexecdir,
2612 install_dir : rootlibexecdir)
2614 systemd_export = executable(
2616 systemd_export_sources,
2617 include_directories : includes,
2618 link_with : [libshared],
2619 dependencies : [libcurl,
2623 install_rpath : rootlibexecdir,
2625 install_dir : rootlibexecdir)
2627 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2630 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2631 public_programs += executable(
2632 'systemd-journal-upload',
2633 systemd_journal_upload_sources,
2634 include_directories : includes,
2635 link_with : [libshared],
2636 dependencies : [versiondep,
2643 install_rpath : rootlibexecdir,
2645 install_dir : rootlibexecdir)
2648 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2649 public_programs += executable(
2650 'systemd-journal-remote',
2651 systemd_journal_remote_sources,
2652 include_directories : includes,
2653 link_with : [libshared,
2654 libsystemd_journal_remote],
2655 dependencies : [threads,
2661 install_rpath : rootlibexecdir,
2663 install_dir : rootlibexecdir)
2665 public_programs += executable(
2666 'systemd-journal-gatewayd',
2667 systemd_journal_gatewayd_sources,
2668 include_directories : includes,
2669 link_with : [libshared],
2670 dependencies : [threads,
2676 install_rpath : rootlibexecdir,
2678 install_dir : rootlibexecdir)
2681 if conf.get('ENABLE_COREDUMP') == 1
2684 systemd_coredump_sources,
2685 include_directories : includes,
2686 link_with : [libshared],
2687 dependencies : [threads,
2693 install_rpath : rootlibexecdir,
2695 install_dir : rootlibexecdir)
2697 public_programs += executable(
2699 coredumpctl_sources,
2700 include_directories : includes,
2701 link_with : [libshared],
2702 dependencies : [threads,
2706 install_rpath : rootlibexecdir,
2710 if conf.get('ENABLE_PSTORE') == 1
2713 systemd_pstore_sources,
2714 include_directories : includes,
2715 link_with : [libshared],
2716 dependencies : [threads,
2722 install_rpath : rootlibexecdir,
2724 install_dir : rootlibexecdir)
2727 if conf.get('ENABLE_OOMD') == 1
2728 executable('systemd-oomd',
2729 systemd_oomd_sources,
2730 include_directories : includes,
2731 link_with : [libshared],
2733 install_rpath : rootlibexecdir,
2735 install_dir : rootlibexecdir)
2737 public_programs += executable(
2740 include_directories : includes,
2741 link_with : [libshared],
2743 install_rpath : rootlibexecdir,
2745 install_dir : rootbindir)
2748 if conf.get('ENABLE_BINFMT') == 1
2749 public_programs += executable(
2751 'src/binfmt/binfmt.c',
2752 include_directories : includes,
2753 link_with : [libshared],
2754 install_rpath : rootlibexecdir,
2756 install_dir : rootlibexecdir)
2758 meson.add_install_script('sh', '-c',
2759 mkdir_p.format(binfmtdir))
2760 if install_sysconfdir
2761 meson.add_install_script('sh', '-c',
2762 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2766 if conf.get('ENABLE_REPART') == 1
2769 systemd_repart_sources,
2770 include_directories : includes,
2771 link_with : [libshared],
2772 dependencies : [threads,
2776 install_rpath : rootlibexecdir,
2778 install_dir : rootbindir)
2779 public_programs += exe
2781 if want_tests != 'false'
2784 args : exe.full_path())
2788 if conf.get('ENABLE_VCONSOLE') == 1
2790 'systemd-vconsole-setup',
2791 'src/vconsole/vconsole-setup.c',
2792 include_directories : includes,
2793 link_with : [libshared],
2794 install_rpath : rootlibexecdir,
2796 install_dir : rootlibexecdir)
2799 if conf.get('ENABLE_RANDOMSEED') == 1
2801 'systemd-random-seed',
2802 'src/random-seed/random-seed.c',
2803 include_directories : includes,
2804 link_with : [libshared],
2805 install_rpath : rootlibexecdir,
2807 install_dir : rootlibexecdir)
2810 if conf.get('ENABLE_FIRSTBOOT') == 1
2812 'systemd-firstboot',
2813 'src/firstboot/firstboot.c',
2814 include_directories : includes,
2815 link_with : [libshared],
2816 dependencies : [libcrypt],
2817 install_rpath : rootlibexecdir,
2819 install_dir : rootbindir)
2823 'systemd-remount-fs',
2824 'src/remount-fs/remount-fs.c',
2825 include_directories : includes,
2826 link_with : [libshared],
2827 install_rpath : rootlibexecdir,
2829 install_dir : rootlibexecdir)
2832 'systemd-machine-id-setup',
2833 'src/machine-id-setup/machine-id-setup-main.c',
2834 include_directories : includes,
2835 link_with : [libshared],
2836 install_rpath : rootlibexecdir,
2838 install_dir : rootbindir)
2843 include_directories : includes,
2844 link_with : [libshared],
2845 install_rpath : rootlibexecdir,
2847 install_dir : rootlibexecdir)
2849 executable('systemd-growfs',
2850 'src/partition/growfs.c',
2851 include_directories : includes,
2852 link_with : [libshared],
2853 install_rpath : rootlibexecdir,
2855 install_dir : rootlibexecdir)
2859 'src/partition/makefs.c',
2860 include_directories : includes,
2861 link_with : [libshared],
2862 install_rpath : rootlibexecdir,
2864 install_dir : rootlibexecdir)
2868 'src/sleep/sleep.c',
2869 include_directories : includes,
2870 link_with : [libshared],
2871 install_rpath : rootlibexecdir,
2873 install_dir : rootlibexecdir)
2875 if install_sysconfdir_samples
2876 install_data('src/sleep/sleep.conf',
2877 install_dir : pkgsysconfdir)
2880 public_programs += executable(
2882 'src/sysctl/sysctl.c',
2883 include_directories : includes,
2884 link_with : [libshared],
2885 install_rpath : rootlibexecdir,
2887 install_dir : rootlibexecdir)
2891 'src/ac-power/ac-power.c',
2892 include_directories : includes,
2893 link_with : [libshared],
2894 install_rpath : rootlibexecdir,
2896 install_dir : rootlibexecdir)
2898 public_programs += executable(
2899 'systemd-detect-virt',
2900 'src/detect-virt/detect-virt.c',
2901 include_directories : includes,
2902 link_with : [libshared],
2903 install_rpath : rootlibexecdir,
2906 public_programs += executable(
2908 'src/delta/delta.c',
2909 include_directories : includes,
2910 link_with : [libshared],
2911 install_rpath : rootlibexecdir,
2914 public_programs += executable(
2916 'src/escape/escape.c',
2917 include_directories : includes,
2918 link_with : [libshared],
2919 install_rpath : rootlibexecdir,
2921 install_dir : rootbindir)
2923 public_programs += executable(
2925 'src/notify/notify.c',
2926 include_directories : includes,
2927 link_with : [libshared],
2928 install_rpath : rootlibexecdir,
2930 install_dir : rootbindir)
2933 'systemd-volatile-root',
2934 'src/volatile-root/volatile-root.c',
2935 include_directories : includes,
2936 link_with : [libshared],
2937 install_rpath : rootlibexecdir,
2938 install : conf.get('ENABLE_INITRD') == 1,
2939 install_dir : rootlibexecdir)
2942 'systemd-cgroups-agent',
2943 'src/cgroups-agent/cgroups-agent.c',
2944 include_directories : includes,
2945 link_with : [libshared],
2946 install_rpath : rootlibexecdir,
2948 install_dir : rootlibexecdir)
2950 public_programs += executable(
2952 'src/id128/id128.c',
2953 include_directories : includes,
2954 link_with : [libshared],
2955 install_rpath : rootlibexecdir,
2958 public_programs += executable(
2961 include_directories : includes,
2962 link_with : [libshared],
2963 install_rpath : rootlibexecdir,
2966 public_programs += executable(
2967 'systemd-ask-password',
2968 'src/ask-password/ask-password.c',
2969 include_directories : includes,
2970 link_with : [libshared],
2971 install_rpath : rootlibexecdir,
2973 install_dir : rootbindir)
2976 'systemd-reply-password',
2977 'src/reply-password/reply-password.c',
2978 include_directories : includes,
2979 link_with : [libshared],
2980 install_rpath : rootlibexecdir,
2982 install_dir : rootlibexecdir)
2984 public_programs += executable(
2985 'systemd-tty-ask-password-agent',
2986 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2987 include_directories : includes,
2988 link_with : [libshared],
2989 install_rpath : rootlibexecdir,
2991 install_dir : rootbindir)
2993 public_programs += executable(
2996 include_directories : includes,
2997 link_with : [libshared],
2998 install_rpath : rootlibexecdir,
3001 public_programs += executable(
3003 'src/cgtop/cgtop.c',
3004 include_directories : includes,
3005 link_with : [libshared],
3006 install_rpath : rootlibexecdir,
3011 'src/initctl/initctl.c',
3012 include_directories : includes,
3013 link_with : [libshared],
3014 install_rpath : rootlibexecdir,
3015 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
3016 install_dir : rootlibexecdir)
3018 public_programs += executable(
3020 'src/mount/mount-tool.c',
3021 include_directories : includes,
3022 link_with : [libshared],
3023 dependencies: [libmount],
3024 install_rpath : rootlibexecdir,
3027 meson.add_install_script(meson_make_symlink,
3028 'systemd-mount', join_paths(bindir, 'systemd-umount'))
3030 public_programs += executable(
3033 include_directories : includes,
3034 link_with : [libshared],
3035 install_rpath : rootlibexecdir,
3038 public_programs += executable(
3039 'systemd-stdio-bridge',
3040 'src/stdio-bridge/stdio-bridge.c',
3041 include_directories : includes,
3042 link_with : [libshared],
3043 dependencies : [versiondep],
3044 install_rpath : rootlibexecdir,
3047 public_programs += executable(
3050 include_directories : includes,
3051 link_with : [libshared],
3052 install_rpath : rootlibexecdir,
3058 'src/sysusers/sysusers.c',
3059 include_directories : includes,
3060 link_with : [libshared],
3061 install_rpath : rootlibexecdir,
3063 install_dir : rootbindir)
3064 public_programs += exe
3066 if want_tests != 'false'
3067 test('test-sysusers',
3069 # https://github.com/mesonbuild/meson/issues/2681
3070 args : exe.full_path())
3073 if have_standalone_binaries
3075 'systemd-sysusers.standalone',
3076 'src/sysusers/sysusers.c',
3077 include_directories : includes,
3078 c_args : '-DSTANDALONE',
3079 link_with : [libshared_static,
3084 install_dir : rootbindir)
3085 public_programs += exe
3087 if want_tests != 'false'
3088 test('test-sysusers.standalone',
3090 # https://github.com/mesonbuild/meson/issues/2681
3091 args : exe.full_path())
3096 if conf.get('ENABLE_TMPFILES') == 1
3099 systemd_tmpfiles_sources,
3100 include_directories : includes,
3101 link_with : [libshared],
3102 dependencies : [libacl],
3103 install_rpath : rootlibexecdir,
3105 install_dir : rootbindir)
3106 public_programs += exe
3108 if want_tests != 'false'
3109 test('test-systemd-tmpfiles',
3110 test_systemd_tmpfiles_py,
3111 # https://github.com/mesonbuild/meson/issues/2681
3112 args : exe.full_path())
3115 if have_standalone_binaries
3116 public_programs += executable(
3117 'systemd-tmpfiles.standalone',
3118 systemd_tmpfiles_sources,
3119 include_directories : includes,
3120 c_args : '-DSTANDALONE',
3121 link_with : [libshared_static,
3125 dependencies : [libacl],
3127 install_dir : rootbindir)
3131 if conf.get('ENABLE_HWDB') == 1
3132 public_programs += executable(
3135 include_directories : includes,
3136 link_with : udev_link_with,
3137 install_rpath : udev_rpath,
3139 install_dir : rootbindir)
3142 if conf.get('ENABLE_QUOTACHECK') == 1
3144 'systemd-quotacheck',
3145 'src/quotacheck/quotacheck.c',
3146 include_directories : includes,
3147 link_with : [libshared],
3148 install_rpath : rootlibexecdir,
3150 install_dir : rootlibexecdir)
3153 public_programs += executable(
3154 'systemd-socket-proxyd',
3155 'src/socket-proxy/socket-proxyd.c',
3156 include_directories : includes,
3157 link_with : [libshared],
3158 dependencies : [threads],
3159 install_rpath : rootlibexecdir,
3161 install_dir : rootlibexecdir)
3163 public_programs += executable(
3166 include_directories : includes,
3167 link_with : [libudevd_core],
3168 dependencies : [versiondep,
3174 install_rpath : udev_rpath,
3176 install_dir : rootbindir)
3180 systemd_shutdown_sources,
3181 include_directories : includes,
3182 link_with : [libshared],
3183 dependencies : [libmount],
3184 install_rpath : rootlibexecdir,
3186 install_dir : rootlibexecdir)
3189 'systemd-update-done',
3190 'src/update-done/update-done.c',
3191 include_directories : includes,
3192 link_with : [libshared],
3193 install_rpath : rootlibexecdir,
3195 install_dir : rootlibexecdir)
3198 'systemd-update-utmp',
3199 'src/update-utmp/update-utmp.c',
3200 include_directories : includes,
3201 link_with : [libshared],
3202 dependencies : [libaudit],
3203 install_rpath : rootlibexecdir,
3204 install : (conf.get('ENABLE_UTMP') == 1),
3205 install_dir : rootlibexecdir)
3207 if conf.get('HAVE_KMOD') == 1
3209 'systemd-modules-load',
3210 'src/modules-load/modules-load.c',
3211 include_directories : includes,
3212 link_with : [libshared],
3213 dependencies : [libkmod],
3214 install_rpath : rootlibexecdir,
3216 install_dir : rootlibexecdir)
3218 meson.add_install_script('sh', '-c',
3219 mkdir_p.format(modulesloaddir))
3220 if install_sysconfdir
3221 meson.add_install_script('sh', '-c',
3222 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
3226 public_programs += executable(
3228 systemd_nspawn_sources,
3229 include_directories : includes,
3230 link_with : [libnspawn_core,
3232 dependencies : [libblkid,
3234 install_rpath : rootlibexecdir,
3237 if conf.get('ENABLE_NETWORKD') == 1
3240 systemd_networkd_sources,
3241 include_directories : network_includes,
3242 link_with : [libnetworkd_core,
3244 networkd_link_with],
3245 dependencies : [threads],
3246 install_rpath : rootlibexecdir,
3248 install_dir : rootlibexecdir)
3251 'systemd-networkd-wait-online',
3252 systemd_networkd_wait_online_sources,
3253 include_directories : includes,
3254 link_with : [networkd_link_with],
3255 install_rpath : rootlibexecdir,
3257 install_dir : rootlibexecdir)
3259 public_programs += executable(
3262 include_directories : libsystemd_network_includes,
3263 link_with : [libsystemd_network,
3264 networkd_link_with],
3265 install_rpath : rootlibexecdir,
3267 install_dir : rootbindir)
3270 'systemd-network-generator',
3271 network_generator_sources,
3272 include_directories : includes,
3273 link_with : [networkd_link_with],
3274 install_rpath : rootlibexecdir,
3276 install_dir : rootlibexecdir)
3278 if want_tests != 'false'
3279 test('test-network-generator-conversion',
3280 test_network_generator_conversion_sh,
3281 # https://github.com/mesonbuild/meson/issues/2681
3282 args : exe.full_path())
3287 'systemd-sulogin-shell',
3288 'src/sulogin-shell/sulogin-shell.c',
3289 include_directories : includes,
3290 link_with : [libshared],
3291 install_rpath : rootlibexecdir,
3293 install_dir : rootlibexecdir)
3295 ############################################################
3298 'systemd-runtest.env',
3299 output : 'systemd-runtest.env',
3300 command : ['sh', '-c', '{ ' +
3301 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
3302 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
3304 build_by_default : true)
3306 foreach tuple : tests
3308 link_with = tuple.length() > 1 and tuple[1].length() > 0 ? tuple[1] : [libshared]
3309 dependencies = tuple.length() > 2 ? tuple[2] : []
3310 incs = tuple.length() > 3 and tuple[3].length() > 0 ? tuple[3] : includes
3311 condition = tuple.length() > 4 ? tuple[4] : ''
3312 type = tuple.length() > 5 ? tuple[5] : ''
3313 defs = tuple.length() > 6 ? tuple[6] : []
3314 parallel = tuple.length() > 7 ? tuple[7] : true
3317 name = sources[0].split('/')[-1].split('.')[0]
3318 if type.startswith('timeout=')
3319 timeout = type.split('=')[1].to_int()
3323 if condition == '' or conf.get(condition) == 1
3327 include_directories : incs,
3328 link_with : link_with,
3329 dependencies : [versiondep,
3332 build_by_default : want_tests != 'false',
3333 install_rpath : rootlibexecdir,
3334 install : install_tests,
3335 install_dir : join_paths(testsdir, type))
3338 message('@0@ is a manual test'.format(name))
3339 elif type == 'unsafe' and want_tests != 'unsafe'
3340 message('@0@ is an unsafe test'.format(name))
3341 elif want_tests != 'false'
3347 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3352 'test-libsystemd-sym',
3353 test_libsystemd_sym_c,
3354 include_directories : includes,
3355 link_with : [libsystemd],
3356 build_by_default : want_tests != 'false',
3357 install : install_tests,
3358 install_dir : testsdir)
3359 if want_tests != 'false'
3360 test('test-libsystemd-sym', exe)
3364 'test-libsystemd-static-sym',
3365 test_libsystemd_sym_c,
3366 include_directories : includes,
3367 link_with : [install_libsystemd_static],
3368 dependencies : [threads], # threads is already included in dependencies on the library,
3369 # but does not seem to get propagated. Add here as a work-around.
3370 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3371 install : install_tests and static_libsystemd_pic,
3372 install_dir : testsdir)
3373 if want_tests != 'false' and static_libsystemd_pic
3374 test('test-libsystemd-static-sym', exe)
3380 include_directories : libudev_includes,
3381 c_args : '-Wno-deprecated-declarations',
3382 link_with : [libudev],
3383 build_by_default : want_tests != 'false',
3384 install : install_tests,
3385 install_dir : testsdir)
3386 if want_tests != 'false'
3387 test('test-libudev-sym', exe)
3391 'test-libudev-static-sym',
3393 include_directories : libudev_includes,
3394 c_args : '-Wno-deprecated-declarations',
3395 link_with : [install_libudev_static],
3396 build_by_default : want_tests != 'false' and static_libudev_pic,
3397 install : install_tests and static_libudev_pic,
3398 install_dir : testsdir)
3399 if want_tests != 'false' and static_libudev_pic
3400 test('test-libudev-static-sym', exe)
3403 ############################################################
3407 foreach tuple : fuzzers
3409 link_with = tuple.length() > 1 and tuple[1].length() > 0 ? tuple[1] : [libshared]
3410 dependencies = tuple.length() > 2 ? tuple[2] : []
3411 incs = tuple.length() > 3 and tuple[3].length() > 0 ? tuple[3] : includes
3412 defs = tuple.length() > 4 ? tuple[4] : []
3416 dependencies += fuzzing_engine
3418 if fuzzing_engine.found()
3419 dependencies += fuzzing_engine
3421 link_args += ['-fsanitize=fuzzer']
3424 sources += 'src/fuzz/fuzz-main.c'
3427 name = sources[0].split('/')[-1].split('.')[0]
3429 fuzzer_exes += executable(
3432 include_directories : [incs, include_directories('src/fuzz')],
3433 link_with : link_with,
3434 dependencies : dependencies,
3436 link_args: link_args,
3438 build_by_default : fuzz_tests or fuzzer_build)
3443 depends : fuzzer_exes,
3446 ############################################################
3449 subdir('sysusers.d')
3450 subdir('tmpfiles.d')
3456 subdir('shell-completion/bash')
3457 subdir('shell-completion/zsh')
3458 subdir('docs/sysvinit')
3459 subdir('docs/var-log')
3461 install_subdir('factory/etc',
3462 install_dir : factorydir)
3464 if install_sysconfdir
3465 install_data('xorg/50-systemd-user.sh',
3466 install_dir : xinitrcdir)
3468 install_data('modprobe.d/systemd.conf',
3469 install_dir : modprobedir)
3470 install_data('LICENSE.GPL2',
3474 'docs/CODING_STYLE.md',
3475 'docs/DISTRO_PORTING.md',
3476 'docs/ENVIRONMENT.md',
3478 'docs/TRANSIENT-SETTINGS.md',
3479 'docs/TRANSLATORS.md',
3480 'docs/UIDS-GIDS.md',
3481 'docs/GVARIANT-SERIALIZATION.md',
3482 install_dir : docdir)
3484 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3485 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3487 ############################################################
3489 check_help = find_program('tools/check-help.sh')
3491 foreach exec : public_programs
3492 name = exec.full_path().split('/')[-1]
3493 if want_tests != 'false'
3494 test('check-help-' + name,
3496 args : exec.full_path())
3500 ############################################################
3502 check_directives_sh = find_program('tools/check-directives.sh')
3504 if want_tests != 'false'
3505 test('check-directives',
3506 check_directives_sh,
3507 args : project_source_root)
3510 ############################################################
3512 # Enable tests for all supported sanitizers
3513 foreach tuple : sanitizers
3514 sanitizer = tuple[0]
3517 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3519 foreach p : fuzz_regression_tests
3520 b = p.split('/')[-2]
3521 c = p.split('/')[-1]
3523 name = '@0@:@1@'.format(b, sanitizer)
3526 if want_tests == 'false'
3527 message('Not compiling @0@ because tests is set to false'.format(name))
3529 exe = custom_target(
3533 command : [env, 'ln', '-fs',
3534 join_paths(build.full_path(), b),
3536 build_by_default : true)
3538 message('Not compiling @0@ because fuzz-tests is set to false'.format(name))
3544 test('@0@_@1@_@2@'.format(b, c, sanitizer),
3546 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
3548 args : [exe.full_path(),
3549 join_paths(project_source_root, p)])
3556 ############################################################
3559 all_files = run_command(
3560 'env', '-u', 'GIT_WORK_TREE',
3562 '--git-dir=@0@/.git'.format(project_source_root),
3563 'ls-files', ':/*.[ch]')
3565 all_files = files(all_files.stdout().split())
3570 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3573 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3577 git_contrib_sh = find_program('tools/git-contrib.sh')
3580 command : [git_contrib_sh])
3584 git_head = run_command(
3586 ['--git-dir=@0@/.git'.format(project_source_root),
3587 'rev-parse', 'HEAD']).stdout().strip()
3588 git_head_short = run_command(
3590 ['--git-dir=@0@/.git'.format(project_source_root),
3591 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3595 command : ['git', 'archive',
3596 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3598 '--prefix', 'systemd-@0@/'.format(git_head),
3602 ############################################################
3604 check_api_docs_sh = find_program('tools/check-api-docs.sh')
3607 depends : [man, libsystemd, libudev],
3608 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3610 ############################################################
3612 if dbus_docs.length() > 0
3615 output : 'update-dbus-docs',
3616 command : [update_dbus_docs_py,
3617 '--build-dir=@0@'.format(project_build_root),
3621 if conf.get('BUILD_MODE') == 'BUILD_MODE_DEVELOPER'
3622 test('dbus-docs-fresh',
3623 update_dbus_docs_py,
3624 args : ['--build-dir=@0@'.format(project_build_root),
3625 '--test'] + dbus_docs)
3631 output : 'update-man-rules',
3632 command : ['sh', '-c',
3633 'cd @0@ && '.format(meson.build_root()) +
3634 'python3 @0@/tools/update-man-rules.py $(find @0@ -wholename "*/man/*.xml") >t && '.format(project_source_root) +
3635 'mv t @0@/man/rules/meson.build'.format(meson.current_source_dir())],
3636 depend_files : custom_entities_ent)
3638 ############################################################
3639 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3642 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3644 'build mode: @0@'.format(get_option('mode')),
3645 'split /usr: @0@'.format(split_usr),
3646 'split bin-sbin: @0@'.format(split_bin),
3647 'prefix directory: @0@'.format(prefixdir),
3648 'rootprefix directory: @0@'.format(rootprefixdir),
3649 'sysconf directory: @0@'.format(sysconfdir),
3650 'include directory: @0@'.format(includedir),
3651 'lib directory: @0@'.format(libdir),
3652 'rootlib directory: @0@'.format(rootlibdir),
3653 'SysV init scripts: @0@'.format(sysvinit_path),
3654 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3655 'PAM modules directory: @0@'.format(pamlibdir),
3656 'PAM configuration directory: @0@'.format(pamconfdir),
3657 'RPM macros directory: @0@'.format(rpmmacrosdir),
3658 'modprobe.d directory: @0@'.format(modprobedir),
3659 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3660 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3661 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3662 'bash completions directory: @0@'.format(bashcompletiondir),
3663 'zsh completions directory: @0@'.format(zshcompletiondir),
3664 'extra start script: @0@'.format(get_option('rc-local')),
3665 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3666 get_option('debug-tty')),
3667 'TTY GID: @0@'.format(tty_gid),
3668 'users GID: @0@'.format(substs.get('USERS_GID')),
3669 'system UIDs: <=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_UID_MAX'),
3670 conf.get('SYSTEM_ALLOC_UID_MIN')),
3671 'system GIDs: <=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_GID_MAX'),
3672 conf.get('SYSTEM_ALLOC_GID_MIN')),
3673 'dynamic UIDs: @0@…@1@'.format(dynamic_uid_min, dynamic_uid_max),
3674 'container UID bases: @0@…@1@'.format(container_uid_base_min, container_uid_base_max),
3675 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3676 'render group access mode: @0@'.format(get_option('group-render-mode')),
3677 'certificate root directory: @0@'.format(get_option('certificate-root')),
3678 'support URL: @0@'.format(support_url),
3679 'nobody user name: @0@'.format(nobody_user),
3680 'nobody group name: @0@'.format(nobody_group),
3681 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3683 'default DNSSEC mode: @0@'.format(default_dnssec),
3684 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3685 'default mDNS mode: @0@'.format(default_mdns),
3686 'default LLMNR mode: @0@'.format(default_llmnr),
3687 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3688 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3689 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3690 'default locale: @0@'.format(default_locale),
3691 'default user $PATH: @0@'.format(default_user_path_display),
3692 'systemd service watchdog: @0@'.format(watchdog_opt)]
3694 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3695 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3697 'default DNS servers: @0@'.format(alt_dns_servers),
3698 'default NTP servers: @0@'.format(alt_ntp_servers)]
3700 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3701 '@@0@'.format(time_epoch)).stdout().strip()
3703 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3706 'static libsystemd: @0@'.format(static_libsystemd),
3707 'static libudev: @0@'.format(static_libudev)]
3710 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3711 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3712 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3714 if conf.get('ENABLE_EFI') == 1
3715 status += 'efi arch: @0@'.format(efi_arch)
3719 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3720 'EFI CC @0@'.format(' '.join(efi_cc)),
3721 'EFI lds: @0@'.format(efi_lds),
3722 'EFI crt0: @0@'.format(efi_crt0),
3723 'EFI include directory: @0@'.format(efi_incdir)]
3758 ['compat-mutable-uid-boundaries'],
3789 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3790 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3795 ['legacy pkla', install_polkit_pkla],
3797 ['gnu-efi', have_gnu_efi],
3810 ['man pages', want_man],
3811 ['html pages', want_html],
3812 ['man page indices', want_man and have_lxml],
3817 ['adm group', get_option('adm-group')],
3818 ['wheel group', get_option('wheel-group')],
3821 ['debug mmap cache'],
3823 ['valgrind', conf.get('VALGRIND') == 1],
3824 ['trace logging', conf.get('LOG_TRACE') == 1],
3825 ['install tests', install_tests],
3826 ['link-udev-shared', get_option('link-udev-shared')],
3827 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3828 ['link-networkd-shared', get_option('link-networkd-shared')],
3829 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3830 ['kernel-install', get_option('kernel-install')],
3831 ['systemd-analyze', conf.get('ENABLE_ANALYZE') == 1],
3833 ['standalone-binaries', get_option('standalone-binaries')],
3836 if tuple.length() >= 2
3839 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3840 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3841 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3852 'enabled features: @0@'.format(', '.join(found)),
3854 'disabled features: @0@'.format(', '.join(missing)),
3856 message('\n '.join(status))
3858 if rootprefixdir != rootprefix_default
3860 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3861 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3862 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))