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'
71 conf.set10('HAVE_SPLIT_USR', split_usr,
72 description : '/usr/bin and /bin directories are separate')
74 if get_option('split-bin') == 'auto'
75 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
77 split_bin = get_option('split-bin') == 'true'
79 conf.set10('HAVE_SPLIT_BIN', split_bin,
80 description : 'bin and sbin directories are separate')
82 rootprefixdir = get_option('rootprefix')
83 # Unusual rootprefixdir values are used by some distros
84 # (see https://github.com/systemd/systemd/pull/7461).
85 rootprefix_default = split_usr ? '/' : '/usr'
86 if rootprefixdir == ''
87 rootprefixdir = rootprefix_default
89 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
91 have_standalone_binaries = get_option('standalone-binaries')
93 sysvinit_path = get_option('sysvinit-path')
94 sysvrcnd_path = get_option('sysvrcnd-path')
95 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
96 description : 'SysV init scripts and rcN.d links are supported')
98 if get_option('hibernate') and not get_option('initrd')
99 error('hibernate depends on initrd')
102 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
103 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
104 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
106 # join_paths ignores the preceding arguments if an absolute component is
107 # encountered, so this should canonicalize various paths when they are
108 # absolute or relative.
109 prefixdir = get_option('prefix')
110 if not prefixdir.startswith('/')
111 error('Prefix is not absolute: "@0@"'.format(prefixdir))
113 bindir = join_paths(prefixdir, get_option('bindir'))
114 libdir = join_paths(prefixdir, get_option('libdir'))
115 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
116 includedir = join_paths(prefixdir, get_option('includedir'))
117 datadir = join_paths(prefixdir, get_option('datadir'))
118 localstatedir = join_paths('/', get_option('localstatedir'))
120 rootbindir = join_paths(rootprefixdir, 'bin')
121 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
122 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
124 rootlibdir = get_option('rootlibdir')
126 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
129 install_sysconfdir = get_option('install-sysconfdir')
130 # Dirs of external packages
131 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
132 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
133 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
134 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
135 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
136 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
137 rpmmacrosdir = get_option('rpmmacrosdir')
138 if rpmmacrosdir != 'no'
139 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
141 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
144 pkgdatadir = join_paths(datadir, 'systemd')
145 environmentdir = join_paths(prefixdir, 'lib/environment.d')
146 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
147 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
148 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
149 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
150 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
151 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
152 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
153 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
154 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
155 pkgincludedir = join_paths(includedir, 'systemd')
156 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
157 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
158 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
159 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
160 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
161 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
162 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
163 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
164 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
165 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
166 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
167 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
168 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
169 factorydir = join_paths(datadir, 'factory')
170 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
171 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
172 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
173 catalogstatedir = join_paths(systemdstatedir, 'catalog')
174 randomseeddir = join_paths(localstatedir, 'lib/systemd')
175 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
176 ntpservicelistdir = join_paths(rootprefixdir, 'lib/systemd/ntp-units.d')
178 docdir = get_option('docdir')
180 docdir = join_paths(datadir, 'doc/systemd')
183 dbuspolicydir = get_option('dbuspolicydir')
184 if dbuspolicydir == ''
185 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
188 dbussessionservicedir = get_option('dbussessionservicedir')
189 if dbussessionservicedir == ''
190 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
193 dbussystemservicedir = get_option('dbussystemservicedir')
194 if dbussystemservicedir == ''
195 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
198 pamlibdir = get_option('pamlibdir')
200 pamlibdir = join_paths(rootlibdir, 'security')
203 pamconfdir = get_option('pamconfdir')
205 pamconfdir = join_paths(prefixdir, 'lib/pam.d')
208 memory_accounting_default = get_option('memory-accounting-default')
209 status_unit_format_default = get_option('status-unit-format-default')
211 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
212 conf.set_quoted('SYSTEM_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'system'))
213 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
214 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
215 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
216 conf.set_quoted('RC_LOCAL_PATH', get_option('rc-local'))
218 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
219 conf.set10('ENABLE_FEXECVE', get_option('fexecve'))
221 conf.set_quoted('USER_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'user'))
222 conf.set_quoted('USER_DATA_UNIT_DIR', userunitdir)
223 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
224 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
225 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
226 conf.set_quoted('SYSTEMD_CGROUPS_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
227 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
228 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
229 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
230 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
231 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
232 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
233 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
234 conf.set_quoted('ROOTPREFIX', rootprefixdir)
235 conf.set_quoted('ROOTPREFIX_NOSLASH', rootprefixdir_noslash)
236 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
237 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
238 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
239 conf.set_quoted('SYSTEM_GENERATOR_DIR', systemgeneratordir)
240 conf.set_quoted('USER_GENERATOR_DIR', usergeneratordir)
241 conf.set_quoted('SYSTEM_ENV_GENERATOR_DIR', systemenvgeneratordir)
242 conf.set_quoted('USER_ENV_GENERATOR_DIR', userenvgeneratordir)
243 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
244 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
245 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
246 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
247 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
248 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
249 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
250 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
251 conf.set_quoted('LIBDIR', libdir)
252 conf.set_quoted('ROOTLIBDIR', rootlibdir)
253 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
254 conf.set_quoted('BOOTLIBDIR', bootlibdir)
255 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
256 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
257 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
258 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
259 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
260 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
261 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
262 conf.set_quoted('SYSTEMD_HOMEWORK_PATH', join_paths(rootlibexecdir, 'systemd-homework'))
263 conf.set_quoted('SYSTEMD_USERWORK_PATH', join_paths(rootlibexecdir, 'systemd-userwork'))
264 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
265 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
266 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
268 substs.set('prefix', prefixdir)
269 substs.set('rootprefix', rootprefixdir)
270 substs.set('rootprefix_noslash', rootprefixdir_noslash)
271 substs.set('exec_prefix', prefixdir)
272 substs.set('libdir', libdir)
273 substs.set('rootlibdir', rootlibdir)
274 substs.set('includedir', includedir)
275 substs.set('sysconfdir', sysconfdir)
276 substs.set('bindir', bindir)
277 substs.set('rootbindir', rootbindir)
278 substs.set('rootlibexecdir', rootlibexecdir)
279 substs.set('systemunitdir', systemunitdir)
280 substs.set('userunitdir', userunitdir)
281 substs.set('systempresetdir', systempresetdir)
282 substs.set('userpresetdir', userpresetdir)
283 substs.set('udevhwdbdir', udevhwdbdir)
284 substs.set('udevrulesdir', udevrulesdir)
285 substs.set('udevlibexecdir', udevlibexecdir)
286 substs.set('environmentdir', environmentdir)
287 substs.set('catalogdir', catalogdir)
288 substs.set('tmpfilesdir', tmpfilesdir)
289 substs.set('sysusersdir', sysusersdir)
290 substs.set('sysctldir', sysctldir)
291 substs.set('binfmtdir', binfmtdir)
292 substs.set('modulesloaddir', modulesloaddir)
293 substs.set('modprobedir', modprobedir)
294 substs.set('systemgeneratordir', systemgeneratordir)
295 substs.set('usergeneratordir', usergeneratordir)
296 substs.set('systemenvgeneratordir', systemenvgeneratordir)
297 substs.set('userenvgeneratordir', userenvgeneratordir)
298 substs.set('systemshutdowndir', systemshutdowndir)
299 substs.set('systemsleepdir', systemsleepdir)
300 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
301 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
302 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
303 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
304 substs.set('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
305 substs.set('RC_LOCAL_PATH', get_option('rc-local'))
306 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
307 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
308 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
309 substs.set('BUILD_ROOT', project_build_root)
311 #####################################################################
313 cc = meson.get_compiler('c')
314 pkgconfig = import('pkgconfig')
315 check_compilation_sh = find_program('tools/check-compilation.sh')
316 meson_build_sh = find_program('tools/meson-build.sh')
318 want_tests = get_option('tests')
319 slow_tests = want_tests != 'false' and get_option('slow-tests')
320 fuzz_tests = want_tests != 'false' and get_option('fuzz-tests')
321 install_tests = get_option('install-tests')
323 if add_languages('cpp', required : fuzzer_build)
324 # Used only for tests
325 cxx = meson.get_compiler('cpp')
326 cxx_cmd = ' '.join(cxx.cmd_array())
332 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
333 if fuzzing_engine.found()
334 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
335 elif cc.has_argument('-fsanitize=fuzzer-no-link')
336 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
338 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
341 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
344 # Those generate many false positives, and we do not want to change the code to
346 basic_disabled_warnings = [
347 '-Wno-unused-parameter',
348 '-Wno-missing-field-initializers',
349 '-Wno-unused-result',
350 '-Wno-format-signedness',
353 possible_cc_flags = [
356 '-Wmissing-include-dirs',
357 '-Wold-style-definition',
361 '-Wsuggest-attribute=noreturn',
362 '-Werror=missing-prototypes',
363 '-Werror=implicit-function-declaration',
364 '-Werror=missing-declarations',
365 '-Werror=return-type',
366 '-Werror=incompatible-pointer-types',
368 '-Wstrict-prototypes',
370 '-Wmissing-noreturn',
371 '-Wimplicit-fallthrough=5',
374 '-Wstrict-aliasing=2',
377 '-Werror=shift-count-overflow',
378 '-Werror=shift-overflow=2',
382 # negative arguments are correctly detected starting with meson 0.46.
383 '-Wno-error=#warnings', # clang
384 '-Wno-string-plus-int', # clang
386 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
387 # optimizations enabled, producing essentially false positives.
388 '-Wno-maybe-uninitialized',
392 '-fdiagnostics-show-option',
393 '-fno-strict-aliasing',
394 '-fvisibility=hidden',
396 '-fstack-protector-strong',
397 '--param=ssp-buffer-size=4',
400 # --as-needed and --no-undefined are provided by meson by default,
401 # run mesonconf to see what is enabled
402 possible_link_flags = [
408 if cc.get_id() == 'clang'
409 possible_cc_flags += [
410 '-Wno-typedef-redefinition',
411 '-Wno-gnu-variable-sized-type-not-at-end',
415 if get_option('buildtype') != 'debug'
416 possible_cc_flags += [
417 '-ffunction-sections',
421 possible_link_flags += '-Wl,--gc-sections'
424 add_project_arguments(cc.get_supported_arguments(basic_disabled_warnings), language : 'c')
425 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
426 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
428 have = cc.has_argument('-Wzero-length-bounds')
429 conf.set10('HAVE_ZERO_LENGTH_BOUNDS', have)
433 #include <inttypes.h>
434 typedef uint64_t usec_t;
435 usec_t now(clockid_t clock);
440 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
441 add_project_arguments('-Werror=shadow', language : 'c')
445 add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp')
448 cpp = ' '.join(cc.cmd_array()) + ' -E'
450 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
452 #####################################################################
453 # compilation result tests
455 conf.set('_GNU_SOURCE', true)
456 conf.set('__SANE_USERSPACE_TYPES__', true)
457 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
459 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
460 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
461 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
462 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
466 #include <sys/stat.h>
469 foreach decl : ['char16_t',
474 # We get -1 if the size cannot be determined
475 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
477 if decl == 'struct statx'
479 want_linux_stat_h = false
481 have = cc.sizeof(decl,
482 prefix : decl_headers + '#include <linux/stat.h>',
483 args : '-D_GNU_SOURCE') > 0
484 want_linux_stat_h = have
488 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
491 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
493 foreach ident : ['secure_getenv', '__secure_getenv']
494 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
498 ['memfd_create', '''#include <sys/mman.h>'''],
499 ['gettid', '''#include <sys/types.h>
500 #include <unistd.h>'''],
501 ['pivot_root', '''#include <stdlib.h>
502 #include <unistd.h>'''], # no known header declares pivot_root
503 ['name_to_handle_at', '''#include <sys/types.h>
504 #include <sys/stat.h>
505 #include <fcntl.h>'''],
506 ['setns', '''#include <sched.h>'''],
507 ['renameat2', '''#include <stdio.h>
508 #include <fcntl.h>'''],
509 ['kcmp', '''#include <linux/kcmp.h>'''],
510 ['keyctl', '''#include <sys/types.h>
511 #include <keyutils.h>'''],
512 ['copy_file_range', '''#include <sys/syscall.h>
513 #include <unistd.h>'''],
514 ['bpf', '''#include <sys/syscall.h>
515 #include <unistd.h>'''],
516 ['statx', '''#include <sys/types.h>
517 #include <sys/stat.h>
518 #include <unistd.h>'''],
519 ['explicit_bzero' , '''#include <string.h>'''],
520 ['reallocarray', '''#include <stdlib.h>'''],
521 ['set_mempolicy', '''#include <stdlib.h>
522 #include <unistd.h>'''],
523 ['get_mempolicy', '''#include <stdlib.h>
524 #include <unistd.h>'''],
525 ['pidfd_send_signal', '''#include <stdlib.h>
528 #include <sys/wait.h>'''],
529 ['pidfd_open', '''#include <stdlib.h>
532 #include <sys/wait.h>'''],
533 ['rt_sigqueueinfo', '''#include <stdlib.h>
536 #include <sys/wait.h>'''],
537 ['mallinfo', '''#include <malloc.h>'''],
538 ['execveat', '''#include <unistd.h>'''],
539 ['close_range', '''#include <unistd.h>'''],
542 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
543 conf.set10('HAVE_' + ident[0].to_upper(), have)
546 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
547 conf.set10('USE_SYS_RANDOM_H', true)
548 conf.set10('HAVE_GETRANDOM', true)
550 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
551 conf.set10('USE_SYS_RANDOM_H', false)
552 conf.set10('HAVE_GETRANDOM', have)
555 #####################################################################
557 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
559 get_option('version-tag'),
560 meson.project_version()]
563 input : 'src/version/version.h.in',
564 output : 'version.h',
567 versiondep = declare_dependency(sources: version_h)
569 sed = find_program('sed')
570 awk = find_program('awk')
571 m4 = find_program('m4')
572 stat = find_program('stat')
573 git = find_program('git', required : false)
574 env = find_program('env')
575 perl = find_program('perl', required : false)
577 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
578 mkdir_p = 'mkdir -p $DESTDIR/@0@'
579 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
580 splash_bmp = files('test/splash.bmp')
582 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
583 # /usr/sbin, /sbin, and fall back to the default from middle column.
584 progs = [['quotaon', '/usr/sbin/quotaon' ],
585 ['quotacheck', '/usr/sbin/quotacheck' ],
586 ['kmod', '/usr/bin/kmod' ],
587 ['kexec', '/usr/sbin/kexec' ],
588 ['sulogin', '/usr/sbin/sulogin' ],
589 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
590 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
591 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
592 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
593 ['nologin', '/usr/sbin/nologin', ],
596 path = get_option(prog[0] + '-path')
598 message('Using @1@ for @0@'.format(prog[0], path))
600 exe = find_program(prog[0],
601 '/usr/sbin/' + prog[0],
604 path = exe.found() ? exe.path() : prog[1]
606 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
607 conf.set_quoted(name, path)
608 substs.set(name, path)
611 conf.set_quoted('TELINIT', get_option('telinit-path'))
613 if run_command('ln', '--relative', '--help').returncode() != 0
614 error('ln does not support --relative (added in coreutils 8.16)')
617 ############################################################
619 gperf = find_program('gperf')
621 gperf_test_format = '''
623 const char * in_word_set(const char *, @0@);
626 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
627 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
628 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
629 if cc.compiles(gperf_test)
630 gperf_len_type = 'size_t'
632 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
633 if cc.compiles(gperf_test)
634 gperf_len_type = 'unsigned'
636 error('unable to determine gperf len type')
639 message('gperf len type is @0@'.format(gperf_len_type))
640 conf.set('GPERF_LEN_TYPE', gperf_len_type,
641 description : 'The type of gperf "len" parameter')
643 ############################################################
645 if not cc.has_header('sys/capability.h')
646 error('POSIX caps headers not found')
648 foreach header : ['crypt.h',
650 'linux/vm_sockets.h',
652 'valgrind/memcheck.h',
653 'valgrind/valgrind.h',
656 conf.set10('HAVE_' + header.underscorify().to_upper(),
657 cc.has_header(header))
660 ############################################################
662 fallback_hostname = get_option('fallback-hostname')
663 if fallback_hostname == '' or fallback_hostname[0] == '.' or fallback_hostname[0] == '-'
664 error('Invalid fallback-hostname configuration')
665 # A more extensive test is done in test-hostname-util. Let's catch
666 # the most obvious errors here so we don't fail with an assert later.
668 conf.set_quoted('FALLBACK_HOSTNAME', fallback_hostname)
670 default_hierarchy = get_option('default-hierarchy')
671 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
672 description : 'default cgroup hierarchy as string')
673 if default_hierarchy == 'legacy'
674 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
675 elif default_hierarchy == 'hybrid'
676 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
678 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
681 default_net_naming_scheme = get_option('default-net-naming-scheme')
682 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
684 time_epoch = get_option('time-epoch')
686 time_epoch = run_command('sh', ['-c', 'echo "$SOURCE_DATE_EPOCH"']).stdout().strip()
687 if time_epoch == '' and git.found() and run_command('test', '-e', '.git').returncode() == 0
688 # If we're in a git repository, use the creation time of the latest git tag.
689 latest_tag = run_command('git', 'describe', '--abbrev=0', '--tags').stdout().strip()
690 time_epoch = run_command('git', 'log', '-1', '--format=%at', latest_tag).stdout()
694 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
696 time_epoch = time_epoch.to_int()
698 conf.set('TIME_EPOCH', time_epoch)
700 foreach tuple : [['system-alloc-uid-min', 'SYS_UID_MIN', 1], # Also see login.defs(5).
701 ['system-uid-max', 'SYS_UID_MAX', 999],
702 ['system-alloc-gid-min', 'SYS_GID_MIN', 1],
703 ['system-gid-max', 'SYS_GID_MAX', 999]]
704 v = get_option(tuple[0])
708 '/^\s*@0@\s+/ { uid=$2 } END { print uid }'.format(tuple[1]),
709 '/etc/login.defs').stdout().strip()
716 conf.set(tuple[0].underscorify().to_upper(), v)
717 substs.set(tuple[0].underscorify().to_upper(), v)
719 if conf.get('SYSTEM_ALLOC_UID_MIN') >= conf.get('SYSTEM_UID_MAX')
720 error('Invalid uid allocation range')
722 if conf.get('SYSTEM_ALLOC_GID_MIN') >= conf.get('SYSTEM_GID_MAX')
723 error('Invalid gid allocation range')
726 dynamic_uid_min = get_option('dynamic-uid-min')
727 dynamic_uid_max = get_option('dynamic-uid-max')
728 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
729 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
730 substs.set('dynamicuidmin', dynamic_uid_min)
731 substs.set('dynamicuidmax', dynamic_uid_max)
733 container_uid_base_min = get_option('container-uid-base-min')
734 container_uid_base_max = get_option('container-uid-base-max')
735 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
736 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
737 substs.set('containeruidbasemin', container_uid_base_min)
738 substs.set('containeruidbasemax', container_uid_base_max)
740 nobody_user = get_option('nobody-user')
741 nobody_group = get_option('nobody-group')
743 if not meson.is_cross_build()
744 getent_result = run_command('getent', 'passwd', '65534')
745 if getent_result.returncode() == 0
746 name = getent_result.stdout().split(':')[0]
747 if name != nobody_user
749 'The local user with the UID 65534 does not match the configured user name "@0@" of the nobody user (its name is @1@).\n'.format(nobody_user, name) +
750 'Your build will result in an user table setup that is incompatible with the local system.')
753 id_result = run_command('id', '-u', nobody_user)
754 if id_result.returncode() == 0
755 id = id_result.stdout().to_int()
758 'The local user with the configured user name "@0@" of the nobody user does not have UID 65534 (it has @1@).\n'.format(nobody_user, id) +
759 'Your build will result in an user table setup that is incompatible with the local system.')
763 getent_result = run_command('getent', 'group', '65534')
764 if getent_result.returncode() == 0
765 name = getent_result.stdout().split(':')[0]
766 if name != nobody_group
768 'The local group with the GID 65534 does not match the configured group name "@0@" of the nobody group (its name is @1@).\n'.format(nobody_group, name) +
769 'Your build will result in an group table setup that is incompatible with the local system.')
772 id_result = run_command('id', '-g', nobody_group)
773 if id_result.returncode() == 0
774 id = id_result.stdout().to_int()
777 'The local group with the configured group name "@0@" of the nobody group does not have UID 65534 (it has @1@).\n'.format(nobody_group, id) +
778 'Your build will result in an group table setup that is incompatible with the local system.')
782 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
784 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
785 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
788 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
789 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
790 substs.set('NOBODY_USER_NAME', nobody_user)
791 substs.set('NOBODY_GROUP_NAME', nobody_group)
793 tty_gid = get_option('tty-gid')
794 conf.set('TTY_GID', tty_gid)
795 substs.set('TTY_GID', tty_gid)
797 # Ensure provided GID argument is numeric, otherwise fall back to default assignment
798 users_gid = get_option('users-gid')
799 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
801 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
802 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
804 dev_kvm_mode = get_option('dev-kvm-mode')
805 substs.set('DEV_KVM_MODE', dev_kvm_mode)
806 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
807 group_render_mode = get_option('group-render-mode')
808 substs.set('GROUP_RENDER_MODE', group_render_mode)
809 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
811 kill_user_processes = get_option('default-kill-user-processes')
812 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
813 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
814 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
816 dns_servers = get_option('dns-servers')
817 conf.set_quoted('DNS_SERVERS', dns_servers)
818 substs.set('DNS_SERVERS', dns_servers)
820 ntp_servers = get_option('ntp-servers')
821 conf.set_quoted('NTP_SERVERS', ntp_servers)
822 substs.set('NTP_SERVERS', ntp_servers)
824 default_locale = get_option('default-locale')
825 if default_locale == ''
826 if not meson.is_cross_build()
827 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
828 default_locale = run_command(choose_default_locale_sh).stdout().strip()
830 default_locale = 'C.UTF-8'
833 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
835 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
837 service_watchdog = get_option('service-watchdog')
838 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
839 substs.set('SERVICE_WATCHDOG', watchdog_value)
841 substs.set('SUSHELL', get_option('debug-shell'))
842 substs.set('DEBUGTTY', get_option('debug-tty'))
843 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
845 enable_debug_hashmap = false
846 enable_debug_mmap_cache = false
847 enable_debug_siphash = false
848 foreach name : get_option('debug-extra')
850 enable_debug_hashmap = true
851 elif name == 'mmap-cache'
852 enable_debug_mmap_cache = true
853 elif name == 'siphash'
854 enable_debug_siphash = true
856 message('unknown debug option "@0@", ignoring'.format(name))
859 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
860 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
861 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
863 conf.set10('VALGRIND', get_option('valgrind'))
864 conf.set10('LOG_TRACE', get_option('log-trace'))
866 default_user_path = get_option('user-path')
867 if default_user_path != ''
868 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
869 default_user_path_display = default_user_path
871 # meson 0.49 fails when ?: is used in .format()
872 default_user_path_display = '(same as system services)'
876 #####################################################################
878 threads = dependency('threads')
879 librt = cc.find_library('rt')
880 libm = cc.find_library('m')
881 libdl = cc.find_library('dl')
882 libcrypt = cc.find_library('crypt')
884 crypt_header = conf.get('HAVE_CRYPT_H') == 1 ? '''#include <crypt.h>''' : '''#include <unistd.h>'''
886 ['crypt_ra', crypt_header],
887 ['crypt_preferred_method', crypt_header],
888 ['crypt_gensalt_ra', crypt_header]]
890 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE',
891 dependencies : libcrypt)
892 conf.set10('HAVE_' + ident[0].to_upper(), have)
895 libcap = dependency('libcap', required : false)
896 if not libcap.found()
897 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
898 libcap = cc.find_library('cap')
901 libmount = dependency('mount',
902 version : fuzzer_build ? '>= 0' : '>= 2.30')
904 want_libfdisk = get_option('fdisk')
905 if want_libfdisk != 'false' and not skip_deps
906 libfdisk = dependency('fdisk',
908 required : want_libfdisk == 'true')
909 have = libfdisk.found()
914 conf.set10('HAVE_LIBFDISK', have)
916 want_pwquality = get_option('pwquality')
917 if want_pwquality != 'false' and not skip_deps
918 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
919 have = libpwquality.found()
924 conf.set10('HAVE_PWQUALITY', have)
926 want_seccomp = get_option('seccomp')
927 if want_seccomp != 'false' and not skip_deps
928 libseccomp = dependency('libseccomp',
929 version : '>= 2.3.1',
930 required : want_seccomp == 'true')
931 have = libseccomp.found()
936 conf.set10('HAVE_SECCOMP', have)
938 want_selinux = get_option('selinux')
939 if want_selinux != 'false' and not skip_deps
940 libselinux = dependency('libselinux',
941 version : '>= 2.1.9',
942 required : want_selinux == 'true')
943 have = libselinux.found()
948 conf.set10('HAVE_SELINUX', have)
950 want_apparmor = get_option('apparmor')
951 if want_apparmor != 'false' and not skip_deps
952 libapparmor = dependency('libapparmor',
954 required : want_apparmor == 'true')
955 have = libapparmor.found()
960 conf.set10('HAVE_APPARMOR', have)
962 smack_run_label = get_option('smack-run-label')
963 if smack_run_label != ''
964 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
967 want_polkit = get_option('polkit')
968 install_polkit = false
969 install_polkit_pkla = false
970 if want_polkit != 'false' and not skip_deps
971 install_polkit = true
973 libpolkit = dependency('polkit-gobject-1',
975 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
976 message('Old polkit detected, will install pkla files')
977 install_polkit_pkla = true
980 conf.set10('ENABLE_POLKIT', install_polkit)
982 want_acl = get_option('acl')
983 if want_acl != 'false' and not skip_deps
984 libacl = cc.find_library('acl', required : want_acl == 'true')
985 have = libacl.found()
990 conf.set10('HAVE_ACL', have)
992 want_audit = get_option('audit')
993 if want_audit != 'false' and not skip_deps
994 libaudit = dependency('audit', required : want_audit == 'true')
995 have = libaudit.found()
1000 conf.set10('HAVE_AUDIT', have)
1002 want_blkid = get_option('blkid')
1003 if want_blkid != 'false' and not skip_deps
1004 libblkid = dependency('blkid', required : want_blkid == 'true')
1005 have = libblkid.found()
1010 conf.set10('HAVE_BLKID', have)
1012 want_kmod = get_option('kmod')
1013 if want_kmod != 'false' and not skip_deps
1014 libkmod = dependency('libkmod',
1016 required : want_kmod == 'true')
1017 have = libkmod.found()
1022 conf.set10('HAVE_KMOD', have)
1024 want_pam = get_option('pam')
1025 if want_pam != 'false' and not skip_deps
1026 libpam = cc.find_library('pam', required : want_pam == 'true')
1027 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
1028 have = libpam.found() and libpam_misc.found()
1034 conf.set10('HAVE_PAM', have)
1036 want_microhttpd = get_option('microhttpd')
1037 if want_microhttpd != 'false' and not skip_deps
1038 libmicrohttpd = dependency('libmicrohttpd',
1039 version : '>= 0.9.33',
1040 required : want_microhttpd == 'true')
1041 have = libmicrohttpd.found()
1046 conf.set10('HAVE_MICROHTTPD', have)
1048 want_libcryptsetup = get_option('libcryptsetup')
1049 if want_libcryptsetup != 'false' and not skip_deps
1050 libcryptsetup = dependency('libcryptsetup',
1051 version : '>= 2.0.1',
1052 required : want_libcryptsetup == 'true')
1053 have = libcryptsetup.found()
1055 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1056 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
1057 conf.set10('HAVE_CRYPT_ACTIVATE_BY_SIGNED_KEY',
1058 have and cc.has_function('crypt_activate_by_signed_key', dependencies : libcryptsetup))
1059 conf.set10('HAVE_CRYPT_TOKEN_MAX',
1060 have and cc.has_function('crypt_token_max', dependencies : libcryptsetup))
1065 conf.set10('HAVE_LIBCRYPTSETUP', have)
1067 want_libcurl = get_option('libcurl')
1068 if want_libcurl != 'false' and not skip_deps
1069 libcurl = dependency('libcurl',
1070 version : '>= 7.32.0',
1071 required : want_libcurl == 'true')
1072 have = libcurl.found()
1077 conf.set10('HAVE_LIBCURL', have)
1078 conf.set10('CURL_NO_OLDIES', get_option('mode') == 'developer')
1080 want_libidn = get_option('libidn')
1081 want_libidn2 = get_option('libidn2')
1082 if want_libidn == 'true' and want_libidn2 == 'true'
1083 error('libidn and libidn2 cannot be requested simultaneously')
1086 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1087 libidn = dependency('libidn2',
1088 required : want_libidn2 == 'true')
1089 have = libidn.found()
1094 conf.set10('HAVE_LIBIDN2', have)
1095 if not have and want_libidn != 'false' and not skip_deps
1096 # libidn is used for both libidn and libidn2 objects
1097 libidn = dependency('libidn',
1098 required : want_libidn == 'true')
1099 have = libidn.found()
1103 conf.set10('HAVE_LIBIDN', have)
1105 want_libiptc = get_option('libiptc')
1106 if want_libiptc != 'false' and not skip_deps
1107 libiptc = dependency('libiptc',
1108 required : want_libiptc == 'true')
1109 have = libiptc.found()
1114 conf.set10('HAVE_LIBIPTC', have)
1116 want_qrencode = get_option('qrencode')
1117 if want_qrencode != 'false' and not skip_deps
1118 libqrencode = dependency('libqrencode',
1120 required : want_qrencode == 'true')
1121 have = libqrencode.found()
1126 conf.set10('HAVE_QRENCODE', have)
1128 want_gcrypt = get_option('gcrypt')
1129 if want_gcrypt != 'false' and not skip_deps
1130 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1131 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1132 have = libgcrypt.found() and libgpg_error.found()
1137 # link to neither of the libs if one is not found
1141 conf.set10('HAVE_GCRYPT', have)
1143 want_gnutls = get_option('gnutls')
1144 if want_gnutls != 'false' and not skip_deps
1145 libgnutls = dependency('gnutls',
1146 version : '>= 3.1.4',
1147 required : want_gnutls == 'true')
1148 have = libgnutls.found()
1153 conf.set10('HAVE_GNUTLS', have)
1155 want_openssl = get_option('openssl')
1156 if want_openssl != 'false' and not skip_deps
1157 libopenssl = dependency('openssl',
1158 version : '>= 1.1.0',
1159 required : want_openssl == 'true')
1160 have = libopenssl.found()
1165 conf.set10('HAVE_OPENSSL', have)
1167 want_p11kit = get_option('p11kit')
1168 if want_p11kit != 'false' and not skip_deps
1169 libp11kit = dependency('p11-kit-1',
1170 version : '>= 0.23.3',
1171 required : want_p11kit == 'true')
1172 have = libp11kit.found()
1177 conf.set10('HAVE_P11KIT', have)
1179 want_libfido2 = get_option('libfido2')
1180 if want_libfido2 != 'false' and not skip_deps
1181 libfido2 = dependency('libfido2',
1182 required : want_libfido2 == 'true')
1183 have = libfido2.found()
1188 conf.set10('HAVE_LIBFIDO2', have)
1190 want_tpm2 = get_option('tpm2')
1191 if want_tpm2 != 'false' and not skip_deps
1192 tpm2 = dependency('tss2-esys tss2-rc tss2-mu',
1193 required : want_tpm2 == 'true')
1199 conf.set10('HAVE_TPM2', have)
1201 want_elfutils = get_option('elfutils')
1202 if want_elfutils != 'false' and not skip_deps
1203 libdw = dependency('libdw',
1204 required : want_elfutils == 'true')
1205 have = libdw.found()
1210 conf.set10('HAVE_ELFUTILS', have)
1212 want_zlib = get_option('zlib')
1213 if want_zlib != 'false' and not skip_deps
1214 libz = dependency('zlib',
1215 required : want_zlib == 'true')
1221 conf.set10('HAVE_ZLIB', have)
1223 want_bzip2 = get_option('bzip2')
1224 if want_bzip2 != 'false' and not skip_deps
1225 libbzip2 = cc.find_library('bz2',
1226 required : want_bzip2 == 'true')
1227 have = libbzip2.found()
1232 conf.set10('HAVE_BZIP2', have)
1234 want_xz = get_option('xz')
1235 if want_xz != 'false' and not skip_deps
1236 libxz = dependency('liblzma',
1237 required : want_xz == 'true')
1238 have_xz = libxz.found()
1243 conf.set10('HAVE_XZ', have_xz)
1245 want_lz4 = get_option('lz4')
1246 if want_lz4 != 'false' and not skip_deps
1247 liblz4 = dependency('liblz4',
1248 version : '>= 1.3.0',
1249 required : want_lz4 == 'true')
1250 have_lz4 = liblz4.found()
1255 conf.set10('HAVE_LZ4', have_lz4)
1257 want_zstd = get_option('zstd')
1258 if want_zstd != 'false' and not skip_deps
1259 libzstd = dependency('libzstd',
1260 required : want_zstd == 'true',
1261 version : '>= 1.4.0')
1262 have_zstd = libzstd.found()
1267 conf.set10('HAVE_ZSTD', have_zstd)
1269 conf.set10('HAVE_COMPRESSION', have_xz or have_lz4 or have_zstd)
1271 want_xkbcommon = get_option('xkbcommon')
1272 if want_xkbcommon != 'false' and not skip_deps
1273 libxkbcommon = dependency('xkbcommon',
1274 version : '>= 0.3.0',
1275 required : want_xkbcommon == 'true')
1276 have = libxkbcommon.found()
1281 conf.set10('HAVE_XKBCOMMON', have)
1283 want_pcre2 = get_option('pcre2')
1284 if want_pcre2 != 'false'
1285 libpcre2 = dependency('libpcre2-8',
1286 required : want_pcre2 == 'true')
1287 have = libpcre2.found()
1292 conf.set10('HAVE_PCRE2', have)
1294 want_glib = get_option('glib')
1295 if want_glib != 'false' and not skip_deps
1296 libglib = dependency('glib-2.0',
1297 version : '>= 2.22.0',
1298 required : want_glib == 'true')
1299 libgobject = dependency('gobject-2.0',
1300 version : '>= 2.22.0',
1301 required : want_glib == 'true')
1302 libgio = dependency('gio-2.0',
1303 required : want_glib == 'true')
1304 have = libglib.found() and libgobject.found() and libgio.found()
1311 conf.set10('HAVE_GLIB', have)
1313 want_dbus = get_option('dbus')
1314 if want_dbus != 'false' and not skip_deps
1315 libdbus = dependency('dbus-1',
1316 version : '>= 1.3.2',
1317 required : want_dbus == 'true')
1318 have = libdbus.found()
1323 conf.set10('HAVE_DBUS', have)
1325 default_dnssec = get_option('default-dnssec')
1327 default_dnssec = 'no'
1329 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1330 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1331 default_dnssec = 'no'
1333 conf.set('DEFAULT_DNSSEC_MODE',
1334 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1335 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1337 dns_over_tls = get_option('dns-over-tls')
1338 if dns_over_tls != 'false'
1339 if dns_over_tls == 'openssl'
1342 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1343 if dns_over_tls == 'gnutls' and not have_gnutls
1344 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1347 if dns_over_tls == 'gnutls' or have_gnutls
1348 have_openssl = false
1350 have_openssl = conf.get('HAVE_OPENSSL') == 1
1351 if dns_over_tls != 'auto' and not have_openssl
1352 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1353 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1356 have = have_gnutls or have_openssl
1360 have_openssl = false
1362 conf.set10('ENABLE_DNS_OVER_TLS', have)
1363 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1364 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1366 default_dns_over_tls = get_option('default-dns-over-tls')
1368 default_dns_over_tls = 'no'
1370 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1371 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.')
1372 default_dns_over_tls = 'no'
1374 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1375 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1376 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1378 default_mdns = get_option('default-mdns')
1379 conf.set('DEFAULT_MDNS_MODE',
1380 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
1381 substs.set('DEFAULT_MDNS_MODE', default_mdns)
1383 default_llmnr = get_option('default-llmnr')
1384 conf.set('DEFAULT_LLMNR_MODE',
1385 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
1386 substs.set('DEFAULT_LLMNR_MODE', default_llmnr)
1388 want_repart = get_option('repart')
1389 if want_repart != 'false'
1390 have = (conf.get('HAVE_OPENSSL') == 1 and
1391 conf.get('HAVE_LIBFDISK') == 1)
1392 if want_repart == 'true' and not have
1393 error('repart support was requested, but dependencies are not available')
1398 conf.set10('ENABLE_REPART', have)
1400 want_importd = get_option('importd')
1401 if want_importd != 'false'
1402 have = (conf.get('HAVE_LIBCURL') == 1 and
1403 conf.get('HAVE_ZLIB') == 1 and
1404 conf.get('HAVE_XZ') == 1 and
1405 conf.get('HAVE_GCRYPT') == 1)
1406 if want_importd == 'true' and not have
1407 error('importd support was requested, but dependencies are not available')
1412 conf.set10('ENABLE_IMPORTD', have)
1414 want_homed = get_option('homed')
1415 if want_homed != 'false'
1416 have = (conf.get('HAVE_OPENSSL') == 1 and
1417 conf.get('HAVE_LIBFDISK') == 1 and
1418 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1419 if want_homed == 'true' and not have
1420 error('homed support was requested, but dependencies are not available')
1425 conf.set10('ENABLE_HOMED', have)
1427 have = have and conf.get('HAVE_PAM') == 1
1428 conf.set10('ENABLE_PAM_HOME', have)
1430 have = get_option('oomd')
1432 have = get_option('mode') == 'developer'
1434 have = have == 'true'
1435 if have and get_option('mode') != 'developer'
1436 warning('oomd is not ready for release mode (yet)')
1439 conf.set10('ENABLE_OOMD', have)
1440 substs.set10('ENABLE_OOMD', have)
1442 want_remote = get_option('remote')
1443 if want_remote != 'false'
1444 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1445 conf.get('HAVE_LIBCURL') == 1]
1446 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1447 # it's possible to build one without the other. Complain only if
1448 # support was explicitly requested. The auxiliary files like sysusers
1449 # config should be installed when any of the programs are built.
1450 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1451 error('remote support was requested, but dependencies are not available')
1453 have = have_deps[0] or have_deps[1]
1457 conf.set10('ENABLE_REMOTE', have)
1459 foreach term : ['analyze',
1473 'compat-mutable-uid-boundaries',
1498 have = get_option(term)
1499 name = 'ENABLE_' + term.underscorify().to_upper()
1500 conf.set10(name, have)
1501 substs.set10(name, have)
1504 enable_sysusers = conf.get('ENABLE_SYSUSERS') == 1
1506 foreach tuple : [['nss-mymachines', 'machined'],
1507 ['nss-resolve', 'resolve']]
1508 want = get_option(tuple[0])
1510 have = get_option(tuple[1])
1511 if want == 'true' and not have
1512 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1517 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1518 conf.set10(name, have)
1522 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1523 'ENABLE_NSS_MYMACHINES',
1524 'ENABLE_NSS_RESOLVE',
1525 'ENABLE_NSS_SYSTEMD']
1526 if conf.get(term) == 1
1530 conf.set10('ENABLE_NSS', enable_nss)
1532 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1537 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1539 #####################################################################
1541 if get_option('efi')
1542 efi_arch = host_machine.cpu_family()
1544 if efi_arch == 'x86'
1545 EFI_MACHINE_TYPE_NAME = 'ia32'
1546 gnu_efi_arch = 'ia32'
1547 elif efi_arch == 'x86_64'
1548 EFI_MACHINE_TYPE_NAME = 'x64'
1549 gnu_efi_arch = 'x86_64'
1550 elif efi_arch == 'arm'
1551 EFI_MACHINE_TYPE_NAME = 'arm'
1552 gnu_efi_arch = 'arm'
1553 elif efi_arch == 'aarch64'
1554 EFI_MACHINE_TYPE_NAME = 'aa64'
1555 gnu_efi_arch = 'aarch64'
1557 EFI_MACHINE_TYPE_NAME = ''
1562 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1564 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1568 conf.set10('ENABLE_EFI', have)
1570 #####################################################################
1572 config_h = configure_file(
1573 output : 'config.h',
1574 configuration : conf)
1576 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1578 includes = include_directories('src/basic',
1583 'src/journal-remote',
1584 'src/libsystemd-network',
1585 'src/libsystemd/sd-bus',
1586 'src/libsystemd/sd-device',
1587 'src/libsystemd/sd-event',
1588 'src/libsystemd/sd-hwdb',
1589 'src/libsystemd/sd-id128',
1590 'src/libsystemd/sd-netlink',
1591 'src/libsystemd/sd-network',
1592 'src/libsystemd/sd-resolve',
1599 'src/time-wait-sync',
1602 'src/xdg-autostart-generator',
1605 add_project_arguments('-include', 'config.h', language : 'c')
1607 generate_gperfs = find_program('tools/generate-gperfs.py')
1611 subdir('src/libudev')
1612 subdir('src/systemd')
1614 subdir('src/libsystemd')
1615 subdir('src/libsystemd-network')
1616 subdir('src/journal')
1619 libjournal_core = static_library(
1621 libjournal_core_sources,
1623 include_directories : includes,
1626 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1627 libsystemd = shared_library(
1630 version : libsystemd_version,
1631 include_directories : includes,
1632 link_args : ['-shared',
1633 '-Wl,--version-script=' + libsystemd_sym_path],
1634 link_with : [libbasic,
1636 link_whole : [libsystemd_static,
1638 dependencies : [threads,
1643 link_depends : libsystemd_sym,
1645 install_dir : rootlibdir)
1647 static_libsystemd = get_option('static-libsystemd')
1648 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1650 install_libsystemd_static = static_library(
1653 journal_client_sources,
1655 basic_gcrypt_sources,
1657 include_directories : includes,
1658 build_by_default : static_libsystemd != 'false',
1659 install : static_libsystemd != 'false',
1660 install_dir : rootlibdir,
1661 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1662 dependencies : [threads,
1672 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1674 ############################################################
1676 autosuspend_update_sh = find_program('tools/autosuspend-update.sh')
1677 hwdb_update_sh = find_program('tools/hwdb-update.sh')
1678 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1679 make_directive_index_py = find_program('tools/make-directive-index.py')
1680 make_man_index_py = find_program('tools/make-man-index.py')
1681 syscall_names_update_sh = find_program('tools/syscall-names-update.sh')
1682 xml_helper_py = find_program('tools/xml_helper.py')
1683 update_dbus_docs_py = find_program('tools/update-dbus-docs.py')
1685 ############################################################
1687 # binaries that have --help and are intended for use by humans,
1688 # usually, but not always, installed in /bin.
1689 public_programs = []
1691 subdir('src/shared')
1693 subdir('src/shutdown')
1695 subdir('src/network')
1697 subdir('src/analyze')
1698 subdir('src/journal-remote')
1699 subdir('src/coredump')
1700 subdir('src/pstore')
1702 subdir('src/hostname')
1703 subdir('src/import')
1704 subdir('src/partition')
1705 subdir('src/kernel-install')
1706 subdir('src/locale')
1707 subdir('src/machine')
1708 subdir('src/portable')
1709 subdir('src/userdb')
1711 subdir('src/nspawn')
1712 subdir('src/resolve')
1713 subdir('src/timedate')
1714 subdir('src/timesync')
1715 subdir('src/tmpfiles')
1716 subdir('src/vconsole')
1717 subdir('src/boot/efi')
1724 ############################################################
1726 # only static linking apart from libdl, to make sure that the
1727 # module is linked to all libraries that it uses.
1728 test_dlopen = executable(
1732 include_directories : includes,
1733 link_with : [libbasic],
1734 dependencies : [libdl],
1735 build_by_default : want_tests != 'false')
1737 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1738 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h src/nss-systemd/nss-systemd.h'],
1739 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1740 ['resolve', 'ENABLE_NSS_RESOLVE']]
1742 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1746 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1747 version_script_arg = join_paths(project_source_root, sym)
1749 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1750 if tuple.length() > 2
1751 sources += tuple[2].split()
1754 nss = shared_library(
1759 include_directories : includes,
1760 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1761 link_args : ['-Wl,-z,nodelete',
1763 '-Wl,--version-script=' + version_script_arg],
1764 link_with : [libsystemd_static,
1767 dependencies : [threads,
1771 install_dir : rootlibdir)
1773 # We cannot use shared_module because it does not support version suffix.
1774 # Unfortunately shared_library insists on creating the symlink…
1775 meson.add_install_script('sh', '-c',
1776 'rm $DESTDIR@0@/libnss_@1@.so'
1777 .format(rootlibdir, module))
1779 if want_tests != 'false'
1780 test('dlopen-nss_' + module,
1782 # path to dlopen must include a slash
1783 args : nss.full_path())
1788 ############################################################
1793 include_directories : includes,
1794 link_with : [libcore,
1796 dependencies : [versiondep,
1803 install_rpath : rootlibexecdir,
1805 install_dir : rootlibexecdir)
1807 meson.add_install_script(meson_make_symlink,
1808 join_paths(rootlibexecdir, 'systemd'),
1809 join_paths(rootsbindir, 'init'))
1811 public_programs += executable(
1813 systemd_analyze_sources,
1814 include_directories : includes,
1815 link_with : [libcore,
1817 dependencies : [versiondep,
1824 install_rpath : rootlibexecdir,
1825 install : conf.get('ENABLE_ANALYZE'))
1829 systemd_journald_sources,
1830 include_directories : includes,
1831 link_with : [libjournal_core,
1833 dependencies : [threads,
1838 install_rpath : rootlibexecdir,
1840 install_dir : rootlibexecdir)
1842 public_programs += executable(
1844 systemd_cat_sources,
1845 include_directories : includes,
1846 link_with : [libjournal_core,
1848 dependencies : [threads],
1849 install_rpath : rootlibexecdir,
1852 public_programs += executable(
1855 include_directories : includes,
1856 link_with : [libshared],
1857 dependencies : [threads,
1863 install_rpath : rootlibexecdir,
1865 install_dir : rootbindir)
1868 'systemd-getty-generator',
1869 'src/getty-generator/getty-generator.c',
1870 include_directories : includes,
1871 link_with : [libshared],
1872 install_rpath : rootlibexecdir,
1874 install_dir : systemgeneratordir)
1877 'systemd-debug-generator',
1878 'src/debug-generator/debug-generator.c',
1879 include_directories : includes,
1880 link_with : [libshared],
1881 install_rpath : rootlibexecdir,
1883 install_dir : systemgeneratordir)
1886 'systemd-run-generator',
1887 'src/run-generator/run-generator.c',
1888 include_directories : includes,
1889 link_with : [libshared],
1890 install_rpath : rootlibexecdir,
1892 install_dir : systemgeneratordir)
1895 'systemd-fstab-generator',
1896 'src/fstab-generator/fstab-generator.c',
1897 include_directories : includes,
1898 link_with : [libcore_shared,
1900 install_rpath : rootlibexecdir,
1902 install_dir : systemgeneratordir)
1904 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1906 '30-systemd-environment-d-generator',
1907 'src/environment-d-generator/environment-d-generator.c',
1908 include_directories : includes,
1909 link_with : [libshared],
1910 install_rpath : rootlibexecdir,
1912 install_dir : userenvgeneratordir)
1914 meson.add_install_script(meson_make_symlink,
1915 join_paths(sysconfdir, 'environment'),
1916 join_paths(environmentdir, '99-environment.conf'))
1919 if conf.get('ENABLE_HIBERNATE') == 1
1921 'systemd-hibernate-resume-generator',
1922 'src/hibernate-resume/hibernate-resume-generator.c',
1923 include_directories : includes,
1924 link_with : [libshared],
1925 install_rpath : rootlibexecdir,
1927 install_dir : systemgeneratordir)
1930 'systemd-hibernate-resume',
1931 'src/hibernate-resume/hibernate-resume.c',
1932 include_directories : includes,
1933 link_with : [libshared],
1934 install_rpath : rootlibexecdir,
1936 install_dir : rootlibexecdir)
1939 if conf.get('HAVE_BLKID') == 1
1941 'systemd-gpt-auto-generator',
1942 'src/gpt-auto-generator/gpt-auto-generator.c',
1943 'src/shared/blkid-util.h',
1944 include_directories : includes,
1945 link_with : [libshared],
1946 dependencies : libblkid,
1947 install_rpath : rootlibexecdir,
1949 install_dir : systemgeneratordir)
1951 public_programs += executable(
1953 'src/dissect/dissect.c',
1954 include_directories : includes,
1955 link_with : [libshared],
1956 install_rpath : rootlibexecdir,
1960 if conf.get('ENABLE_RESOLVE') == 1
1963 systemd_resolved_sources,
1964 include_directories : includes,
1965 link_with : [libshared,
1967 libsystemd_resolve_core],
1968 dependencies : systemd_resolved_dependencies,
1969 install_rpath : rootlibexecdir,
1971 install_dir : rootlibexecdir)
1973 public_programs += executable(
1976 include_directories : includes,
1977 link_with : [libshared,
1979 libsystemd_resolve_core],
1980 dependencies : [threads,
1984 install_rpath : rootlibexecdir,
1987 meson.add_install_script(meson_make_symlink,
1988 join_paths(bindir, 'resolvectl'),
1989 join_paths(rootsbindir, 'resolvconf'))
1991 meson.add_install_script(meson_make_symlink,
1992 join_paths(bindir, 'resolvectl'),
1993 join_paths(bindir, 'systemd-resolve'))
1996 if conf.get('ENABLE_LOGIND') == 1
1999 systemd_logind_sources,
2000 include_directories : includes,
2001 link_with : [liblogind_core,
2003 dependencies : [threads,
2005 install_rpath : rootlibexecdir,
2007 install_dir : rootlibexecdir)
2009 public_programs += executable(
2012 include_directories : includes,
2013 link_with : [libshared],
2014 dependencies : [threads,
2018 install_rpath : rootlibexecdir,
2020 install_dir : rootbindir)
2022 public_programs += executable(
2024 'src/login/inhibit.c',
2025 include_directories : includes,
2026 link_with : [libshared],
2027 install_rpath : rootlibexecdir,
2029 install_dir : rootbindir)
2031 if conf.get('HAVE_PAM') == 1
2032 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
2033 pam_systemd = shared_library(
2037 include_directories : includes,
2038 link_args : ['-shared',
2039 '-Wl,--version-script=' + version_script_arg],
2040 link_with : [libsystemd_static,
2042 dependencies : [threads,
2045 link_depends : pam_systemd_sym,
2047 install_dir : pamlibdir)
2049 if want_tests != 'false'
2050 test('dlopen-pam_systemd',
2052 # path to dlopen must include a slash
2053 args : pam_systemd.full_path())
2058 'systemd-user-runtime-dir',
2059 user_runtime_dir_sources,
2060 include_directories : includes,
2061 link_with : [libshared],
2062 install_rpath : rootlibexecdir,
2064 install_dir : rootlibexecdir)
2067 if conf.get('HAVE_PAM') == 1
2069 'systemd-user-sessions',
2070 'src/user-sessions/user-sessions.c',
2071 include_directories : includes,
2072 link_with : [libshared],
2073 install_rpath : rootlibexecdir,
2075 install_dir : rootlibexecdir)
2078 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
2079 public_programs += executable(
2081 'src/boot/bootctl.c',
2082 include_directories : includes,
2083 link_with : [libshared],
2084 dependencies : [libblkid],
2085 install_rpath : rootlibexecdir,
2088 public_programs += executable(
2089 'systemd-bless-boot',
2090 'src/boot/bless-boot.c',
2091 include_directories : includes,
2092 link_with : [libshared],
2093 dependencies : [libblkid],
2094 install_rpath : rootlibexecdir,
2096 install_dir : rootlibexecdir)
2099 'systemd-bless-boot-generator',
2100 'src/boot/bless-boot-generator.c',
2101 include_directories : includes,
2102 link_with : [libshared],
2103 install_rpath : rootlibexecdir,
2105 install_dir : systemgeneratordir)
2109 'systemd-boot-check-no-failures',
2110 'src/boot/boot-check-no-failures.c',
2111 include_directories : includes,
2112 link_with : [libshared],
2113 dependencies : [libblkid],
2114 install_rpath : rootlibexecdir,
2116 install_dir : rootlibexecdir)
2118 public_programs += executable(
2119 'systemd-socket-activate',
2120 'src/activate/activate.c',
2121 include_directories : includes,
2122 link_with : [libshared],
2123 dependencies : [threads],
2124 install_rpath : rootlibexecdir,
2127 if get_option('link-systemctl-shared')
2128 systemctl_link_with = [libshared]
2130 systemctl_link_with = [libsystemd_static,
2136 public_programs += executable(
2138 'src/systemctl/systemctl-add-dependency.c',
2139 'src/systemctl/systemctl-add-dependency.h',
2140 'src/systemctl/systemctl-cancel-job.c',
2141 'src/systemctl/systemctl-cancel-job.h',
2142 'src/systemctl/systemctl-clean-or-freeze.c',
2143 'src/systemctl/systemctl-clean-or-freeze.h',
2144 'src/systemctl/systemctl-compat-halt.c',
2145 'src/systemctl/systemctl-compat-halt.h',
2146 'src/systemctl/systemctl-compat-runlevel.c',
2147 'src/systemctl/systemctl-compat-runlevel.h',
2148 'src/systemctl/systemctl-compat-shutdown.c',
2149 'src/systemctl/systemctl-compat-shutdown.h',
2150 'src/systemctl/systemctl-compat-telinit.c',
2151 'src/systemctl/systemctl-compat-telinit.h',
2152 'src/systemctl/systemctl-daemon-reload.c',
2153 'src/systemctl/systemctl-daemon-reload.h',
2154 'src/systemctl/systemctl-edit.c',
2155 'src/systemctl/systemctl-edit.h',
2156 'src/systemctl/systemctl-enable.c',
2157 'src/systemctl/systemctl-enable.h',
2158 'src/systemctl/systemctl-is-active.c',
2159 'src/systemctl/systemctl-is-active.h',
2160 'src/systemctl/systemctl-is-enabled.c',
2161 'src/systemctl/systemctl-is-enabled.h',
2162 'src/systemctl/systemctl-is-system-running.c',
2163 'src/systemctl/systemctl-is-system-running.h',
2164 'src/systemctl/systemctl-kill.c',
2165 'src/systemctl/systemctl-kill.h',
2166 'src/systemctl/systemctl-list-dependencies.c',
2167 'src/systemctl/systemctl-list-dependencies.h',
2168 'src/systemctl/systemctl-list-jobs.c',
2169 'src/systemctl/systemctl-list-jobs.h',
2170 'src/systemctl/systemctl-list-machines.c',
2171 'src/systemctl/systemctl-list-machines.h',
2172 'src/systemctl/systemctl-list-unit-files.c',
2173 'src/systemctl/systemctl-list-unit-files.h',
2174 'src/systemctl/systemctl-list-units.c',
2175 'src/systemctl/systemctl-list-units.h',
2176 'src/systemctl/systemctl-log-setting.c',
2177 'src/systemctl/systemctl-log-setting.h',
2178 'src/systemctl/systemctl-logind.c',
2179 'src/systemctl/systemctl-logind.h',
2180 'src/systemctl/systemctl-preset-all.c',
2181 'src/systemctl/systemctl-preset-all.h',
2182 'src/systemctl/systemctl-reset-failed.c',
2183 'src/systemctl/systemctl-reset-failed.h',
2184 'src/systemctl/systemctl-service-watchdogs.c',
2185 'src/systemctl/systemctl-service-watchdogs.h',
2186 'src/systemctl/systemctl-set-default.c',
2187 'src/systemctl/systemctl-set-default.h',
2188 'src/systemctl/systemctl-set-environment.c',
2189 'src/systemctl/systemctl-set-environment.h',
2190 'src/systemctl/systemctl-set-property.c',
2191 'src/systemctl/systemctl-set-property.h',
2192 'src/systemctl/systemctl-show.c',
2193 'src/systemctl/systemctl-show.h',
2194 'src/systemctl/systemctl-start-special.c',
2195 'src/systemctl/systemctl-start-special.h',
2196 'src/systemctl/systemctl-start-unit.c',
2197 'src/systemctl/systemctl-start-unit.h',
2198 'src/systemctl/systemctl-switch-root.c',
2199 'src/systemctl/systemctl-switch-root.h',
2200 'src/systemctl/systemctl-sysv-compat.c',
2201 'src/systemctl/systemctl-sysv-compat.h',
2202 'src/systemctl/systemctl-trivial-method.c',
2203 'src/systemctl/systemctl-trivial-method.h',
2204 'src/systemctl/systemctl-util.c',
2205 'src/systemctl/systemctl-util.c',
2206 'src/systemctl/systemctl-util.h',
2207 'src/systemctl/systemctl.c',
2208 'src/systemctl/systemctl.h',
2209 include_directories : includes,
2210 link_with : systemctl_link_with,
2211 dependencies : [threads,
2217 install_rpath : rootlibexecdir,
2219 install_dir : rootbindir)
2221 if conf.get('ENABLE_PORTABLED') == 1
2223 'systemd-portabled',
2224 systemd_portabled_sources,
2225 include_directories : includes,
2226 link_with : [libshared],
2227 dependencies : [threads],
2228 install_rpath : rootlibexecdir,
2230 install_dir : rootlibexecdir)
2232 public_programs += executable(
2234 'src/portable/portablectl.c',
2235 include_directories : includes,
2236 link_with : [libshared],
2237 dependencies : [threads],
2238 install_rpath : rootlibexecdir,
2240 install_dir : rootbindir)
2243 if conf.get('ENABLE_USERDB') == 1
2246 systemd_userwork_sources,
2247 include_directories : includes,
2248 link_with : [libshared],
2249 dependencies : [threads],
2250 install_rpath : rootlibexecdir,
2252 install_dir : rootlibexecdir)
2256 systemd_userdbd_sources,
2257 include_directories : includes,
2258 link_with : [libshared],
2259 dependencies : [threads],
2260 install_rpath : rootlibexecdir,
2262 install_dir : rootlibexecdir)
2264 public_programs += executable(
2267 include_directories : includes,
2268 link_with : [libshared],
2269 dependencies : [threads],
2270 install_rpath : rootlibexecdir,
2272 install_dir : rootbindir)
2275 if conf.get('ENABLE_HOMED') == 1
2278 systemd_homework_sources,
2279 include_directories : includes,
2280 link_with : [libshared],
2281 dependencies : [threads,
2288 install_rpath : rootlibexecdir,
2290 install_dir : rootlibexecdir)
2294 systemd_homed_sources,
2295 include_directories : includes,
2296 link_with : [libshared],
2297 dependencies : [threads,
2300 install_rpath : rootlibexecdir,
2302 install_dir : rootlibexecdir)
2304 public_programs += executable(
2307 include_directories : includes,
2308 link_with : [libshared],
2309 dependencies : [threads,
2314 install_rpath : rootlibexecdir,
2316 install_dir : rootbindir)
2318 if conf.get('HAVE_PAM') == 1
2319 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2320 pam_systemd = shared_library(
2324 include_directories : includes,
2325 link_args : ['-shared',
2326 '-Wl,--version-script=' + version_script_arg],
2327 link_with : [libsystemd_static,
2329 dependencies : [threads,
2333 link_depends : pam_systemd_home_sym,
2335 install_dir : pamlibdir)
2339 foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
2340 (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
2341 meson.add_install_script(meson_make_symlink,
2342 join_paths(rootbindir, 'systemctl'),
2343 join_paths(rootsbindir, alias))
2346 meson.add_install_script(meson_make_symlink,
2347 join_paths(rootbindir, 'udevadm'),
2348 join_paths(rootlibexecdir, 'systemd-udevd'))
2350 if conf.get('ENABLE_BACKLIGHT') == 1
2352 'systemd-backlight',
2353 'src/backlight/backlight.c',
2354 include_directories : includes,
2355 link_with : [libshared],
2356 install_rpath : rootlibexecdir,
2358 install_dir : rootlibexecdir)
2361 if conf.get('ENABLE_RFKILL') == 1
2364 'src/rfkill/rfkill.c',
2365 include_directories : includes,
2366 link_with : [libshared],
2367 install_rpath : rootlibexecdir,
2369 install_dir : rootlibexecdir)
2373 'systemd-system-update-generator',
2374 'src/system-update-generator/system-update-generator.c',
2375 include_directories : includes,
2376 link_with : [libshared],
2377 install_rpath : rootlibexecdir,
2379 install_dir : systemgeneratordir)
2381 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2382 systemd_cryptsetup_sources = files('''
2383 src/cryptsetup/cryptsetup-fido2.h
2384 src/cryptsetup/cryptsetup-keyfile.c
2385 src/cryptsetup/cryptsetup-keyfile.h
2386 src/cryptsetup/cryptsetup-pkcs11.h
2387 src/cryptsetup/cryptsetup-tpm2.h
2388 src/cryptsetup/cryptsetup.c
2391 if conf.get('HAVE_P11KIT') == 1
2392 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2395 if conf.get('HAVE_LIBFIDO2') == 1
2396 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-fido2.c')
2399 if conf.get('HAVE_TPM2') == 1
2400 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-tpm2.c')
2404 'systemd-cryptsetup',
2405 systemd_cryptsetup_sources,
2406 include_directories : includes,
2407 link_with : [libshared],
2408 dependencies : [libcryptsetup,
2410 install_rpath : rootlibexecdir,
2412 install_dir : rootlibexecdir)
2415 'systemd-cryptsetup-generator',
2416 'src/cryptsetup/cryptsetup-generator.c',
2417 include_directories : includes,
2418 link_with : [libshared],
2419 install_rpath : rootlibexecdir,
2421 install_dir : systemgeneratordir)
2424 'systemd-veritysetup',
2425 'src/veritysetup/veritysetup.c',
2426 include_directories : includes,
2427 link_with : [libshared],
2428 dependencies : [libcryptsetup],
2429 install_rpath : rootlibexecdir,
2431 install_dir : rootlibexecdir)
2434 'systemd-veritysetup-generator',
2435 'src/veritysetup/veritysetup-generator.c',
2436 include_directories : includes,
2437 link_with : [libshared],
2438 install_rpath : rootlibexecdir,
2440 install_dir : systemgeneratordir)
2442 systemd_cryptenroll_sources = files('''
2443 src/cryptenroll/cryptenroll-fido2.h
2444 src/cryptenroll/cryptenroll-list.c
2445 src/cryptenroll/cryptenroll-list.h
2446 src/cryptenroll/cryptenroll-password.c
2447 src/cryptenroll/cryptenroll-password.h
2448 src/cryptenroll/cryptenroll-pkcs11.h
2449 src/cryptenroll/cryptenroll-recovery.c
2450 src/cryptenroll/cryptenroll-recovery.h
2451 src/cryptenroll/cryptenroll-tpm2.h
2452 src/cryptenroll/cryptenroll-wipe.c
2453 src/cryptenroll/cryptenroll-wipe.h
2454 src/cryptenroll/cryptenroll.c
2455 src/cryptenroll/cryptenroll.h
2458 if conf.get('HAVE_P11KIT') == 1 and conf.get('HAVE_OPENSSL') == 1
2459 systemd_cryptenroll_sources += files('src/cryptenroll/cryptenroll-pkcs11.c')
2462 if conf.get('HAVE_LIBFIDO2') == 1
2463 systemd_cryptenroll_sources += files('src/cryptenroll/cryptenroll-fido2.c')
2466 if conf.get('HAVE_TPM2') == 1
2467 systemd_cryptenroll_sources += files('src/cryptenroll/cryptenroll-tpm2.c')
2471 'systemd-cryptenroll',
2472 systemd_cryptenroll_sources,
2473 include_directories : includes,
2474 link_with : [libshared],
2475 dependencies : [libcryptsetup,
2479 install_rpath : rootlibexecdir,
2481 install_dir : bindir)
2484 if conf.get('HAVE_SYSV_COMPAT') == 1
2486 'systemd-sysv-generator',
2487 'src/sysv-generator/sysv-generator.c',
2488 include_directories : includes,
2489 link_with : [libshared],
2490 install_rpath : rootlibexecdir,
2492 install_dir : systemgeneratordir)
2495 'systemd-rc-local-generator',
2496 'src/rc-local-generator/rc-local-generator.c',
2497 include_directories : includes,
2498 link_with : [libshared],
2499 install_rpath : rootlibexecdir,
2501 install_dir : systemgeneratordir)
2504 if conf.get('ENABLE_XDG_AUTOSTART') == 1
2506 'systemd-xdg-autostart-generator',
2507 'src/xdg-autostart-generator/xdg-autostart-generator.c',
2508 'src/xdg-autostart-generator/xdg-autostart-service.c',
2509 include_directories : includes,
2510 link_with : [libshared],
2511 install_rpath : rootlibexecdir,
2513 install_dir : usergeneratordir)
2516 'systemd-xdg-autostart-condition',
2517 'src/xdg-autostart-generator/xdg-autostart-condition.c',
2518 include_directories : includes,
2519 link_with : [libshared],
2520 install_rpath : rootlibexecdir,
2522 install_dir : rootlibexecdir)
2525 if conf.get('ENABLE_HOSTNAMED') == 1
2527 'systemd-hostnamed',
2528 'src/hostname/hostnamed.c',
2529 include_directories : includes,
2530 link_with : [libshared],
2531 install_rpath : rootlibexecdir,
2533 install_dir : rootlibexecdir)
2535 public_programs += executable(
2537 'src/hostname/hostnamectl.c',
2538 include_directories : includes,
2539 link_with : [libshared],
2540 install_rpath : rootlibexecdir,
2544 if conf.get('ENABLE_LOCALED') == 1
2545 if conf.get('HAVE_XKBCOMMON') == 1
2546 # logind will load libxkbcommon.so dynamically on its own
2554 systemd_localed_sources,
2555 include_directories : includes,
2556 link_with : [libshared],
2557 dependencies : deps,
2558 install_rpath : rootlibexecdir,
2560 install_dir : rootlibexecdir)
2562 public_programs += executable(
2565 include_directories : includes,
2566 link_with : [libshared],
2567 install_rpath : rootlibexecdir,
2571 if conf.get('ENABLE_TIMEDATED') == 1
2573 'systemd-timedated',
2574 'src/timedate/timedated.c',
2575 include_directories : includes,
2576 link_with : [libshared],
2577 install_rpath : rootlibexecdir,
2579 install_dir : rootlibexecdir)
2582 if conf.get('ENABLE_TIMEDATECTL') == 1
2583 public_programs += executable(
2585 'src/timedate/timedatectl.c',
2586 include_directories : includes,
2587 install_rpath : rootlibexecdir,
2588 link_with : [libshared],
2589 dependencies : [libm],
2593 if conf.get('ENABLE_TIMESYNCD') == 1
2594 if get_option('link-timesyncd-shared')
2595 timesyncd_link_with = [libshared]
2597 timesyncd_link_with = [libsystemd_static,
2604 'systemd-timesyncd',
2605 systemd_timesyncd_sources,
2606 include_directories : includes,
2607 link_with : [timesyncd_link_with],
2608 dependencies : [threads,
2610 install_rpath : rootlibexecdir,
2612 install_dir : rootlibexecdir)
2615 'systemd-time-wait-sync',
2616 'src/time-wait-sync/time-wait-sync.c',
2617 include_directories : includes,
2618 link_with : [timesyncd_link_with],
2619 install_rpath : rootlibexecdir,
2621 install_dir : rootlibexecdir)
2624 if conf.get('ENABLE_MACHINED') == 1
2627 systemd_machined_sources,
2628 include_directories : includes,
2629 link_with : [libmachine_core,
2631 install_rpath : rootlibexecdir,
2633 install_dir : rootlibexecdir)
2635 public_programs += executable(
2637 'src/machine/machinectl.c',
2638 include_directories : includes,
2639 link_with : [libshared],
2640 dependencies : [threads,
2644 install_rpath : rootlibexecdir,
2646 install_dir : rootbindir)
2649 if conf.get('ENABLE_IMPORTD') == 1
2652 systemd_importd_sources,
2653 include_directories : includes,
2654 link_with : [libshared],
2655 dependencies : [threads],
2656 install_rpath : rootlibexecdir,
2658 install_dir : rootlibexecdir)
2660 systemd_pull = executable(
2662 systemd_pull_sources,
2663 include_directories : includes,
2664 link_with : [libshared],
2665 dependencies : [versiondep,
2671 install_rpath : rootlibexecdir,
2673 install_dir : rootlibexecdir)
2675 systemd_import = executable(
2677 systemd_import_sources,
2678 include_directories : includes,
2679 link_with : [libshared],
2680 dependencies : [libcurl,
2684 install_rpath : rootlibexecdir,
2686 install_dir : rootlibexecdir)
2688 systemd_import_fs = executable(
2689 'systemd-import-fs',
2690 systemd_import_fs_sources,
2691 include_directories : includes,
2692 link_with : [libshared],
2693 install_rpath : rootlibexecdir,
2695 install_dir : rootlibexecdir)
2697 systemd_export = executable(
2699 systemd_export_sources,
2700 include_directories : includes,
2701 link_with : [libshared],
2702 dependencies : [libcurl,
2706 install_rpath : rootlibexecdir,
2708 install_dir : rootlibexecdir)
2710 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2713 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2714 public_programs += executable(
2715 'systemd-journal-upload',
2716 systemd_journal_upload_sources,
2717 include_directories : includes,
2718 link_with : [libshared],
2719 dependencies : [versiondep,
2726 install_rpath : rootlibexecdir,
2728 install_dir : rootlibexecdir)
2731 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2732 public_programs += executable(
2733 'systemd-journal-remote',
2734 systemd_journal_remote_sources,
2735 include_directories : includes,
2736 link_with : [libshared,
2737 libsystemd_journal_remote],
2738 dependencies : [threads,
2744 install_rpath : rootlibexecdir,
2746 install_dir : rootlibexecdir)
2748 public_programs += executable(
2749 'systemd-journal-gatewayd',
2750 systemd_journal_gatewayd_sources,
2751 include_directories : includes,
2752 link_with : [libshared],
2753 dependencies : [threads,
2759 install_rpath : rootlibexecdir,
2761 install_dir : rootlibexecdir)
2764 if conf.get('ENABLE_COREDUMP') == 1
2767 systemd_coredump_sources,
2768 include_directories : includes,
2769 link_with : [libshared],
2770 dependencies : [threads,
2776 install_rpath : rootlibexecdir,
2778 install_dir : rootlibexecdir)
2780 public_programs += executable(
2782 coredumpctl_sources,
2783 include_directories : includes,
2784 link_with : [libshared],
2785 dependencies : [threads,
2789 install_rpath : rootlibexecdir,
2793 if conf.get('ENABLE_PSTORE') == 1
2796 systemd_pstore_sources,
2797 include_directories : includes,
2798 link_with : [libshared],
2799 dependencies : [threads,
2805 install_rpath : rootlibexecdir,
2807 install_dir : rootlibexecdir)
2810 if conf.get('ENABLE_OOMD') == 1
2811 executable('systemd-oomd',
2812 systemd_oomd_sources,
2813 include_directories : includes,
2814 link_with : [libshared],
2816 install_rpath : rootlibexecdir,
2818 install_dir : rootlibexecdir)
2820 public_programs += executable(
2823 include_directories : includes,
2824 link_with : [libshared],
2826 install_rpath : rootlibexecdir,
2828 install_dir : rootbindir)
2831 if conf.get('ENABLE_BINFMT') == 1
2832 public_programs += executable(
2834 'src/binfmt/binfmt.c',
2835 include_directories : includes,
2836 link_with : [libshared],
2837 install_rpath : rootlibexecdir,
2839 install_dir : rootlibexecdir)
2841 meson.add_install_script('sh', '-c',
2842 mkdir_p.format(binfmtdir))
2843 if install_sysconfdir
2844 meson.add_install_script('sh', '-c',
2845 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2849 if conf.get('ENABLE_REPART') == 1
2852 systemd_repart_sources,
2853 include_directories : includes,
2854 link_with : [libshared],
2855 dependencies : [threads,
2859 install_rpath : rootlibexecdir,
2861 install_dir : rootbindir)
2862 public_programs += exe
2864 if want_tests != 'false'
2867 args : exe.full_path())
2871 if conf.get('ENABLE_VCONSOLE') == 1
2873 'systemd-vconsole-setup',
2874 'src/vconsole/vconsole-setup.c',
2875 include_directories : includes,
2876 link_with : [libshared],
2877 install_rpath : rootlibexecdir,
2879 install_dir : rootlibexecdir)
2882 if conf.get('ENABLE_RANDOMSEED') == 1
2884 'systemd-random-seed',
2885 'src/random-seed/random-seed.c',
2886 include_directories : includes,
2887 link_with : [libshared],
2888 install_rpath : rootlibexecdir,
2890 install_dir : rootlibexecdir)
2893 if conf.get('ENABLE_FIRSTBOOT') == 1
2895 'systemd-firstboot',
2896 'src/firstboot/firstboot.c',
2897 include_directories : includes,
2898 link_with : [libshared],
2899 dependencies : [libcrypt],
2900 install_rpath : rootlibexecdir,
2902 install_dir : rootbindir)
2906 'systemd-remount-fs',
2907 'src/remount-fs/remount-fs.c',
2908 include_directories : includes,
2909 link_with : [libcore_shared,
2911 install_rpath : rootlibexecdir,
2913 install_dir : rootlibexecdir)
2916 'systemd-machine-id-setup',
2917 'src/machine-id-setup/machine-id-setup-main.c',
2918 include_directories : includes,
2919 link_with : [libcore_shared,
2921 install_rpath : rootlibexecdir,
2923 install_dir : rootbindir)
2928 include_directories : includes,
2929 link_with : [libshared],
2930 install_rpath : rootlibexecdir,
2932 install_dir : rootlibexecdir)
2934 executable('systemd-growfs',
2935 'src/partition/growfs.c',
2936 include_directories : includes,
2937 link_with : [libshared],
2938 install_rpath : rootlibexecdir,
2940 install_dir : rootlibexecdir)
2944 'src/partition/makefs.c',
2945 include_directories : includes,
2946 link_with : [libshared],
2947 install_rpath : rootlibexecdir,
2949 install_dir : rootlibexecdir)
2953 'src/sleep/sleep.c',
2954 include_directories : includes,
2955 link_with : [libshared],
2956 install_rpath : rootlibexecdir,
2958 install_dir : rootlibexecdir)
2960 if install_sysconfdir
2961 install_data('src/sleep/sleep.conf',
2962 install_dir : pkgsysconfdir)
2965 public_programs += executable(
2967 'src/sysctl/sysctl.c',
2968 include_directories : includes,
2969 link_with : [libshared],
2970 install_rpath : rootlibexecdir,
2972 install_dir : rootlibexecdir)
2976 'src/ac-power/ac-power.c',
2977 include_directories : includes,
2978 link_with : [libshared],
2979 install_rpath : rootlibexecdir,
2981 install_dir : rootlibexecdir)
2983 public_programs += executable(
2984 'systemd-detect-virt',
2985 'src/detect-virt/detect-virt.c',
2986 include_directories : includes,
2987 link_with : [libshared],
2988 install_rpath : rootlibexecdir,
2991 public_programs += executable(
2993 'src/delta/delta.c',
2994 include_directories : includes,
2995 link_with : [libshared],
2996 install_rpath : rootlibexecdir,
2999 public_programs += executable(
3001 'src/escape/escape.c',
3002 include_directories : includes,
3003 link_with : [libshared],
3004 install_rpath : rootlibexecdir,
3006 install_dir : rootbindir)
3008 public_programs += executable(
3010 'src/notify/notify.c',
3011 include_directories : includes,
3012 link_with : [libshared],
3013 install_rpath : rootlibexecdir,
3015 install_dir : rootbindir)
3018 'systemd-volatile-root',
3019 'src/volatile-root/volatile-root.c',
3020 include_directories : includes,
3021 link_with : [libshared],
3022 install_rpath : rootlibexecdir,
3023 install : conf.get('ENABLE_INITRD') == 1,
3024 install_dir : rootlibexecdir)
3027 'systemd-cgroups-agent',
3028 'src/cgroups-agent/cgroups-agent.c',
3029 include_directories : includes,
3030 link_with : [libshared],
3031 install_rpath : rootlibexecdir,
3033 install_dir : rootlibexecdir)
3035 public_programs += executable(
3037 'src/id128/id128.c',
3038 include_directories : includes,
3039 link_with : [libshared],
3040 install_rpath : rootlibexecdir,
3043 public_programs += executable(
3046 include_directories : includes,
3047 link_with : [libshared],
3048 install_rpath : rootlibexecdir,
3051 public_programs += executable(
3052 'systemd-ask-password',
3053 'src/ask-password/ask-password.c',
3054 include_directories : includes,
3055 link_with : [libshared],
3056 install_rpath : rootlibexecdir,
3058 install_dir : rootbindir)
3061 'systemd-reply-password',
3062 'src/reply-password/reply-password.c',
3063 include_directories : includes,
3064 link_with : [libshared],
3065 install_rpath : rootlibexecdir,
3067 install_dir : rootlibexecdir)
3069 public_programs += executable(
3070 'systemd-tty-ask-password-agent',
3071 'src/tty-ask-password-agent/tty-ask-password-agent.c',
3072 include_directories : includes,
3073 link_with : [libshared],
3074 install_rpath : rootlibexecdir,
3076 install_dir : rootbindir)
3078 public_programs += executable(
3081 include_directories : includes,
3082 link_with : [libshared],
3083 install_rpath : rootlibexecdir,
3086 public_programs += executable(
3088 'src/cgtop/cgtop.c',
3089 include_directories : includes,
3090 link_with : [libshared],
3091 install_rpath : rootlibexecdir,
3096 'src/initctl/initctl.c',
3097 include_directories : includes,
3098 link_with : [libshared],
3099 install_rpath : rootlibexecdir,
3100 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
3101 install_dir : rootlibexecdir)
3103 public_programs += executable(
3105 'src/mount/mount-tool.c',
3106 include_directories : includes,
3107 link_with : [libshared],
3108 dependencies: [libmount],
3109 install_rpath : rootlibexecdir,
3112 meson.add_install_script(meson_make_symlink,
3113 'systemd-mount', join_paths(bindir, 'systemd-umount'))
3115 public_programs += executable(
3118 include_directories : includes,
3119 link_with : [libshared],
3120 install_rpath : rootlibexecdir,
3123 public_programs += executable(
3124 'systemd-stdio-bridge',
3125 'src/stdio-bridge/stdio-bridge.c',
3126 include_directories : includes,
3127 link_with : [libshared],
3128 dependencies : [versiondep],
3129 install_rpath : rootlibexecdir,
3132 public_programs += executable(
3134 'src/busctl/busctl.c',
3135 'src/busctl/busctl-introspect.c',
3136 'src/busctl/busctl-introspect.h',
3137 include_directories : includes,
3138 link_with : [libshared],
3139 install_rpath : rootlibexecdir,
3145 'src/sysusers/sysusers.c',
3146 include_directories : includes,
3147 link_with : [libshared],
3148 install_rpath : rootlibexecdir,
3150 install_dir : rootbindir)
3151 public_programs += exe
3153 if want_tests != 'false'
3154 test('test-sysusers',
3156 # https://github.com/mesonbuild/meson/issues/2681
3157 args : exe.full_path())
3160 if have_standalone_binaries
3162 'systemd-sysusers.standalone',
3163 'src/sysusers/sysusers.c',
3164 include_directories : includes,
3165 c_args : '-DSTANDALONE',
3166 link_with : [libshared_static,
3172 install_dir : rootbindir)
3173 public_programs += exe
3175 if want_tests != 'false'
3176 test('test-sysusers.standalone',
3178 # https://github.com/mesonbuild/meson/issues/2681
3179 args : exe.full_path())
3184 if conf.get('ENABLE_TMPFILES') == 1
3187 systemd_tmpfiles_sources,
3188 include_directories : includes,
3189 link_with : [libshared],
3190 dependencies : [libacl],
3191 install_rpath : rootlibexecdir,
3193 install_dir : rootbindir)
3194 public_programs += exe
3196 if want_tests != 'false'
3197 test('test-systemd-tmpfiles',
3198 test_systemd_tmpfiles_py,
3199 # https://github.com/mesonbuild/meson/issues/2681
3200 args : exe.full_path())
3203 if have_standalone_binaries
3204 public_programs += executable(
3205 'systemd-tmpfiles.standalone',
3206 systemd_tmpfiles_sources,
3207 include_directories : includes,
3208 c_args : '-DSTANDALONE',
3209 link_with : [libshared_static,
3214 dependencies : [libacl],
3216 install_dir : rootbindir)
3220 if conf.get('ENABLE_HWDB') == 1
3221 public_programs += executable(
3224 'src/libsystemd/sd-hwdb/hwdb-internal.h',
3225 include_directories : includes,
3226 link_with : udev_link_with,
3227 install_rpath : udev_rpath,
3229 install_dir : rootbindir)
3232 if conf.get('ENABLE_QUOTACHECK') == 1
3234 'systemd-quotacheck',
3235 'src/quotacheck/quotacheck.c',
3236 include_directories : includes,
3237 link_with : [libshared],
3238 install_rpath : rootlibexecdir,
3240 install_dir : rootlibexecdir)
3243 public_programs += executable(
3244 'systemd-socket-proxyd',
3245 'src/socket-proxy/socket-proxyd.c',
3246 include_directories : includes,
3247 link_with : [libshared],
3248 dependencies : [threads],
3249 install_rpath : rootlibexecdir,
3251 install_dir : rootlibexecdir)
3253 public_programs += executable(
3256 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
3257 include_directories : includes,
3258 link_with : [libudevd_core],
3259 dependencies : [versiondep,
3265 install_rpath : udev_rpath,
3267 install_dir : rootbindir)
3271 systemd_shutdown_sources,
3272 include_directories : includes,
3273 link_with : [libcore_shared,
3275 dependencies : [libmount],
3276 install_rpath : rootlibexecdir,
3278 install_dir : rootlibexecdir)
3281 'systemd-update-done',
3282 'src/update-done/update-done.c',
3283 include_directories : includes,
3284 link_with : [libshared],
3285 install_rpath : rootlibexecdir,
3287 install_dir : rootlibexecdir)
3290 'systemd-update-utmp',
3291 'src/update-utmp/update-utmp.c',
3292 include_directories : includes,
3293 link_with : [libshared],
3294 dependencies : [libaudit],
3295 install_rpath : rootlibexecdir,
3296 install : (conf.get('ENABLE_UTMP') == 1),
3297 install_dir : rootlibexecdir)
3299 if conf.get('HAVE_KMOD') == 1
3301 'systemd-modules-load',
3302 'src/modules-load/modules-load.c',
3303 include_directories : includes,
3304 link_with : [libshared],
3305 dependencies : [libkmod],
3306 install_rpath : rootlibexecdir,
3308 install_dir : rootlibexecdir)
3310 meson.add_install_script('sh', '-c',
3311 mkdir_p.format(modulesloaddir))
3312 if install_sysconfdir
3313 meson.add_install_script('sh', '-c',
3314 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
3318 public_programs += executable(
3320 systemd_nspawn_sources,
3321 include_directories : includes,
3322 link_with : [libcore_shared,
3325 dependencies : [libblkid,
3327 install_rpath : rootlibexecdir,
3330 if conf.get('ENABLE_NETWORKD') == 1
3333 systemd_networkd_sources,
3334 include_directories : network_include_dir,
3335 link_with : [libnetworkd_core,
3337 networkd_link_with],
3338 dependencies : [threads],
3339 install_rpath : rootlibexecdir,
3341 install_dir : rootlibexecdir)
3344 'systemd-networkd-wait-online',
3345 systemd_networkd_wait_online_sources,
3346 include_directories : includes,
3347 link_with : [libnetworkd_core,
3348 networkd_link_with],
3349 install_rpath : rootlibexecdir,
3351 install_dir : rootlibexecdir)
3353 public_programs += executable(
3356 include_directories : includes,
3357 link_with : [libsystemd_network,
3358 networkd_link_with],
3359 install_rpath : rootlibexecdir,
3361 install_dir : rootbindir)
3364 'systemd-network-generator',
3365 network_generator_sources,
3366 include_directories : includes,
3367 link_with : [networkd_link_with],
3368 install_rpath : rootlibexecdir,
3370 install_dir : rootlibexecdir)
3372 if want_tests != 'false'
3373 test('test-network-generator-conversion',
3374 test_network_generator_conversion_sh,
3375 # https://github.com/mesonbuild/meson/issues/2681
3376 args : exe.full_path())
3381 'systemd-sulogin-shell',
3382 ['src/sulogin-shell/sulogin-shell.c'],
3383 include_directories : includes,
3384 link_with : [libshared],
3385 install_rpath : rootlibexecdir,
3387 install_dir : rootlibexecdir)
3389 ############################################################
3392 'systemd-runtest.env',
3393 output : 'systemd-runtest.env',
3394 command : ['sh', '-c', '{ ' +
3395 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
3396 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
3398 build_by_default : true)
3400 foreach tuple : tests
3402 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3403 dependencies = tuple[2]
3404 condition = tuple.length() >= 4 ? tuple[3] : ''
3405 type = tuple.length() >= 5 ? tuple[4] : ''
3406 defs = tuple.length() >= 6 ? tuple[5] : []
3407 incs = tuple.length() >= 7 ? tuple[6] : includes
3408 parallel = tuple.length() >= 8 ? tuple[7] : true
3411 name = sources[0].split('/')[-1].split('.')[0]
3412 if type.startswith('timeout=')
3413 timeout = type.split('=')[1].to_int()
3417 if condition == '' or conf.get(condition) == 1
3421 include_directories : incs,
3422 link_with : link_with,
3423 dependencies : [versiondep,
3426 build_by_default : want_tests != 'false',
3427 install_rpath : rootlibexecdir,
3428 install : install_tests,
3429 install_dir : join_paths(testsdir, type))
3432 message('@0@ is a manual test'.format(name))
3433 elif type == 'unsafe' and want_tests != 'unsafe'
3434 message('@0@ is an unsafe test'.format(name))
3435 elif want_tests != 'false'
3441 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3446 'test-libsystemd-sym',
3447 test_libsystemd_sym_c,
3448 include_directories : includes,
3449 link_with : [libsystemd],
3450 build_by_default : want_tests != 'false',
3451 install : install_tests,
3452 install_dir : testsdir)
3453 if want_tests != 'false'
3454 test('test-libsystemd-sym', exe)
3458 'test-libsystemd-static-sym',
3459 test_libsystemd_sym_c,
3460 include_directories : includes,
3461 link_with : [install_libsystemd_static],
3462 dependencies : [threads], # threads is already included in dependencies on the library,
3463 # but does not seem to get propagated. Add here as a work-around.
3464 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3465 install : install_tests and static_libsystemd_pic,
3466 install_dir : testsdir)
3467 if want_tests != 'false' and static_libsystemd_pic
3468 test('test-libsystemd-static-sym', exe)
3474 include_directories : libudev_includes,
3475 c_args : '-Wno-deprecated-declarations',
3476 link_with : [libudev],
3477 build_by_default : want_tests != 'false',
3478 install : install_tests,
3479 install_dir : testsdir)
3480 if want_tests != 'false'
3481 test('test-libudev-sym', exe)
3485 'test-libudev-static-sym',
3487 include_directories : libudev_includes,
3488 c_args : '-Wno-deprecated-declarations',
3489 link_with : [install_libudev_static],
3490 build_by_default : want_tests != 'false' and static_libudev_pic,
3491 install : install_tests and static_libudev_pic,
3492 install_dir : testsdir)
3493 if want_tests != 'false' and static_libudev_pic
3494 test('test-libudev-static-sym', exe)
3497 ############################################################
3501 foreach tuple : fuzzers
3503 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3504 dependencies = tuple[2]
3505 defs = tuple.length() >= 4 ? tuple[3] : []
3506 incs = tuple.length() >= 5 ? tuple[4] : includes
3510 dependencies += fuzzing_engine
3512 if fuzzing_engine.found()
3513 dependencies += fuzzing_engine
3515 link_args += ['-fsanitize=fuzzer']
3518 sources += 'src/fuzz/fuzz-main.c'
3521 name = sources[0].split('/')[-1].split('.')[0]
3523 fuzzer_exes += executable(
3526 include_directories : [incs, include_directories('src/fuzz')],
3527 link_with : link_with,
3528 dependencies : dependencies,
3530 link_args: link_args,
3532 build_by_default : fuzz_tests or fuzzer_build)
3537 depends : fuzzer_exes,
3540 ############################################################
3543 subdir('sysusers.d')
3544 subdir('tmpfiles.d')
3550 subdir('shell-completion/bash')
3551 subdir('shell-completion/zsh')
3552 subdir('docs/sysvinit')
3553 subdir('docs/var-log')
3555 install_subdir('factory/etc',
3556 install_dir : factorydir)
3558 if install_sysconfdir
3559 install_data('xorg/50-systemd-user.sh',
3560 install_dir : xinitrcdir)
3562 install_data('modprobe.d/systemd.conf',
3563 install_dir : modprobedir)
3564 install_data('LICENSE.GPL2',
3568 'docs/CODING_STYLE.md',
3569 'docs/DISTRO_PORTING.md',
3570 'docs/ENVIRONMENT.md',
3572 'docs/TRANSIENT-SETTINGS.md',
3573 'docs/TRANSLATORS.md',
3574 'docs/UIDS-GIDS.md',
3575 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3576 install_dir : docdir)
3578 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3579 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3581 ############################################################
3583 check_help = find_program('tools/check-help.sh')
3585 foreach exec : public_programs
3586 name = exec.full_path().split('/')[-1]
3587 if want_tests != 'false'
3588 test('check-help-' + name,
3590 args : exec.full_path())
3594 ############################################################
3596 check_directives_sh = find_program('tools/check-directives.sh')
3598 if want_tests != 'false'
3599 test('check-directives',
3600 check_directives_sh,
3601 args : project_source_root)
3604 ############################################################
3606 # Enable tests for all supported sanitizers
3607 foreach tuple : sanitizers
3608 sanitizer = tuple[0]
3611 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3613 foreach p : fuzz_regression_tests
3614 b = p.split('/')[-2]
3615 c = p.split('/')[-1]
3617 name = '@0@:@1@'.format(b, sanitizer)
3620 if want_tests == 'false'
3621 message('Not compiling @0@ because tests is set to false'.format(name))
3623 exe = custom_target(
3627 command : [env, 'ln', '-fs',
3628 join_paths(build.full_path(), b),
3630 build_by_default : true)
3632 message('Not compiling @0@ because fuzz-tests is set to false'.format(name))
3638 test('@0@_@1@_@2@'.format(b, c, sanitizer),
3640 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
3642 args : [exe.full_path(),
3643 join_paths(project_source_root, p)])
3650 ############################################################
3653 all_files = run_command(
3655 ['--git-dir=@0@/.git'.format(project_source_root),
3658 all_files = files(all_files.stdout().split())
3663 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3666 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3670 git_contrib_sh = find_program('tools/git-contrib.sh')
3673 command : [git_contrib_sh])
3677 git_head = run_command(
3679 ['--git-dir=@0@/.git'.format(project_source_root),
3680 'rev-parse', 'HEAD']).stdout().strip()
3681 git_head_short = run_command(
3683 ['--git-dir=@0@/.git'.format(project_source_root),
3684 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3688 command : ['git', 'archive',
3689 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3691 '--prefix', 'systemd-@0@/'.format(git_head),
3695 ############################################################
3697 check_api_docs_sh = find_program('tools/check-api-docs.sh')
3700 depends : [man, libsystemd, libudev],
3701 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3703 ############################################################
3704 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3707 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3709 'build mode: @0@'.format(get_option('mode')),
3710 'split /usr: @0@'.format(split_usr),
3711 'split bin-sbin: @0@'.format(split_bin),
3712 'prefix directory: @0@'.format(prefixdir),
3713 'rootprefix directory: @0@'.format(rootprefixdir),
3714 'sysconf directory: @0@'.format(sysconfdir),
3715 'include directory: @0@'.format(includedir),
3716 'lib directory: @0@'.format(libdir),
3717 'rootlib directory: @0@'.format(rootlibdir),
3718 'SysV init scripts: @0@'.format(sysvinit_path),
3719 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3720 'PAM modules directory: @0@'.format(pamlibdir),
3721 'PAM configuration directory: @0@'.format(pamconfdir),
3722 'RPM macros directory: @0@'.format(rpmmacrosdir),
3723 'modprobe.d directory: @0@'.format(modprobedir),
3724 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3725 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3726 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3727 'bash completions directory: @0@'.format(bashcompletiondir),
3728 'zsh completions directory: @0@'.format(zshcompletiondir),
3729 'extra start script: @0@'.format(get_option('rc-local')),
3730 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3731 get_option('debug-tty')),
3732 'TTY GID: @0@'.format(tty_gid),
3733 'users GID: @0@'.format(substs.get('USERS_GID')),
3734 'system UIDs: <=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_UID_MAX'),
3735 conf.get('SYSTEM_ALLOC_UID_MIN')),
3736 'system GIDs: <=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_GID_MAX'),
3737 conf.get('SYSTEM_ALLOC_GID_MIN')),
3738 'dynamic UIDs: @0@–@1@'.format(dynamic_uid_min, dynamic_uid_max),
3739 'container UID bases: @0@–@1@'.format(container_uid_base_min, container_uid_base_max),
3740 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3741 'render group access mode: @0@'.format(get_option('group-render-mode')),
3742 'certificate root directory: @0@'.format(get_option('certificate-root')),
3743 'support URL: @0@'.format(support_url),
3744 'nobody user name: @0@'.format(nobody_user),
3745 'nobody group name: @0@'.format(nobody_group),
3746 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3748 'default DNSSEC mode: @0@'.format(default_dnssec),
3749 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3750 'default mDNS mode: @0@'.format(default_mdns),
3751 'default LLMNR mode: @0@'.format(default_llmnr),
3752 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3753 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3754 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3755 'default locale: @0@'.format(default_locale),
3756 'default user $PATH: @0@'.format(default_user_path_display),
3757 'systemd service watchdog: @0@'.format(watchdog_opt)]
3759 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3760 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3762 'default DNS servers: @0@'.format(alt_dns_servers),
3763 'default NTP servers: @0@'.format(alt_ntp_servers)]
3765 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3766 '@@0@'.format(time_epoch)).stdout().strip()
3768 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3771 'static libsystemd: @0@'.format(static_libsystemd),
3772 'static libudev: @0@'.format(static_libudev)]
3775 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3776 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3777 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3779 if conf.get('ENABLE_EFI') == 1
3780 status += 'efi arch: @0@'.format(efi_arch)
3784 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3785 'EFI CC @0@'.format(' '.join(efi_cc)),
3786 'EFI lds: @0@'.format(efi_lds),
3787 'EFI crt0: @0@'.format(efi_crt0),
3788 'EFI include directory: @0@'.format(efi_incdir)]
3823 ['compat-mutable-uid-boundaries'],
3853 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3854 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3859 ['legacy pkla', install_polkit_pkla],
3861 ['gnu-efi', have_gnu_efi],
3874 ['man pages', want_man],
3875 ['html pages', want_html],
3876 ['man page indices', want_man and have_lxml],
3881 ['adm group', get_option('adm-group')],
3882 ['wheel group', get_option('wheel-group')],
3885 ['debug mmap cache'],
3887 ['valgrind', conf.get('VALGRIND') == 1],
3888 ['trace logging', conf.get('LOG_TRACE') == 1],
3889 ['install tests', install_tests],
3890 ['link-udev-shared', get_option('link-udev-shared')],
3891 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3892 ['link-networkd-shared', get_option('link-networkd-shared')],
3893 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3894 ['kernel-install', get_option('kernel-install')],
3895 ['systemd-analyze', conf.get('ENABLE_ANALYZE') == 1],
3899 if tuple.length() >= 2
3902 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3903 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3904 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3915 'enabled features: @0@'.format(', '.join(found)),
3917 'disabled features: @0@'.format(', '.join(missing)),
3919 message('\n '.join(status))
3921 if rootprefixdir != rootprefix_default
3923 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3924 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3925 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))