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 <malloc.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 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
671 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
673 default_hierarchy = get_option('default-hierarchy')
674 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
675 description : 'default cgroup hierarchy as string')
676 if default_hierarchy == 'legacy'
677 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
678 elif default_hierarchy == 'hybrid'
679 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
681 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
684 default_net_naming_scheme = get_option('default-net-naming-scheme')
685 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
687 time_epoch = get_option('time-epoch')
689 time_epoch = run_command('sh', ['-c', 'echo "$SOURCE_DATE_EPOCH"']).stdout().strip()
690 if time_epoch == '' and git.found() and run_command('test', '-e', '.git').returncode() == 0
691 # If we're in a git repository, use the creation time of the latest git tag.
692 latest_tag = run_command('git', 'describe', '--abbrev=0', '--tags').stdout().strip()
693 time_epoch = run_command('git', 'log', '-1', '--format=%at', latest_tag).stdout()
697 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
699 time_epoch = time_epoch.to_int()
701 conf.set('TIME_EPOCH', time_epoch)
703 foreach tuple : [['system-alloc-uid-min', 'SYS_UID_MIN', 1], # Also see login.defs(5).
704 ['system-uid-max', 'SYS_UID_MAX', 999],
705 ['system-alloc-gid-min', 'SYS_GID_MIN', 1],
706 ['system-gid-max', 'SYS_GID_MAX', 999]]
707 v = get_option(tuple[0])
711 '/^\s*@0@\s+/ { uid=$2 } END { print uid }'.format(tuple[1]),
712 '/etc/login.defs').stdout().strip()
719 conf.set(tuple[0].underscorify().to_upper(), v)
720 substs.set(tuple[0].underscorify().to_upper(), v)
722 if conf.get('SYSTEM_ALLOC_UID_MIN') >= conf.get('SYSTEM_UID_MAX')
723 error('Invalid uid allocation range')
725 if conf.get('SYSTEM_ALLOC_GID_MIN') >= conf.get('SYSTEM_GID_MAX')
726 error('Invalid gid allocation range')
729 dynamic_uid_min = get_option('dynamic-uid-min')
730 dynamic_uid_max = get_option('dynamic-uid-max')
731 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
732 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
733 substs.set('dynamicuidmin', dynamic_uid_min)
734 substs.set('dynamicuidmax', dynamic_uid_max)
736 container_uid_base_min = get_option('container-uid-base-min')
737 container_uid_base_max = get_option('container-uid-base-max')
738 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
739 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
740 substs.set('containeruidbasemin', container_uid_base_min)
741 substs.set('containeruidbasemax', container_uid_base_max)
743 nobody_user = get_option('nobody-user')
744 nobody_group = get_option('nobody-group')
746 if not meson.is_cross_build()
747 getent_result = run_command('getent', 'passwd', '65534')
748 if getent_result.returncode() == 0
749 name = getent_result.stdout().split(':')[0]
750 if name != nobody_user
752 '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) +
753 'Your build will result in an user table setup that is incompatible with the local system.')
756 id_result = run_command('id', '-u', nobody_user)
757 if id_result.returncode() == 0
758 id = id_result.stdout().to_int()
761 '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) +
762 'Your build will result in an user table setup that is incompatible with the local system.')
766 getent_result = run_command('getent', 'group', '65534')
767 if getent_result.returncode() == 0
768 name = getent_result.stdout().split(':')[0]
769 if name != nobody_group
771 '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) +
772 'Your build will result in an group table setup that is incompatible with the local system.')
775 id_result = run_command('id', '-g', nobody_group)
776 if id_result.returncode() == 0
777 id = id_result.stdout().to_int()
780 '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) +
781 'Your build will result in an group table setup that is incompatible with the local system.')
785 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
787 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
788 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
791 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
792 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
793 substs.set('NOBODY_USER_NAME', nobody_user)
794 substs.set('NOBODY_GROUP_NAME', nobody_group)
796 tty_gid = get_option('tty-gid')
797 conf.set('TTY_GID', tty_gid)
798 substs.set('TTY_GID', tty_gid)
800 # Ensure provided GID argument is numeric, otherwise fall back to default assignment
801 users_gid = get_option('users-gid')
802 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
804 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
805 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
807 dev_kvm_mode = get_option('dev-kvm-mode')
808 substs.set('DEV_KVM_MODE', dev_kvm_mode)
809 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
810 group_render_mode = get_option('group-render-mode')
811 substs.set('GROUP_RENDER_MODE', group_render_mode)
812 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
814 kill_user_processes = get_option('default-kill-user-processes')
815 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
816 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
817 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
819 dns_servers = get_option('dns-servers')
820 conf.set_quoted('DNS_SERVERS', dns_servers)
821 substs.set('DNS_SERVERS', dns_servers)
823 ntp_servers = get_option('ntp-servers')
824 conf.set_quoted('NTP_SERVERS', ntp_servers)
825 substs.set('NTP_SERVERS', ntp_servers)
827 default_locale = get_option('default-locale')
828 if default_locale == ''
829 if not meson.is_cross_build()
830 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
831 default_locale = run_command(choose_default_locale_sh).stdout().strip()
833 default_locale = 'C.UTF-8'
836 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
838 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
840 service_watchdog = get_option('service-watchdog')
841 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
842 substs.set('SERVICE_WATCHDOG', watchdog_value)
844 substs.set('SUSHELL', get_option('debug-shell'))
845 substs.set('DEBUGTTY', get_option('debug-tty'))
846 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
848 enable_debug_hashmap = false
849 enable_debug_mmap_cache = false
850 enable_debug_siphash = false
851 foreach name : get_option('debug-extra')
853 enable_debug_hashmap = true
854 elif name == 'mmap-cache'
855 enable_debug_mmap_cache = true
856 elif name == 'siphash'
857 enable_debug_siphash = true
859 message('unknown debug option "@0@", ignoring'.format(name))
862 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
863 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
864 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
866 conf.set10('VALGRIND', get_option('valgrind'))
867 conf.set10('LOG_TRACE', get_option('log-trace'))
869 default_user_path = get_option('user-path')
870 if default_user_path != ''
871 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
872 default_user_path_display = default_user_path
874 # meson 0.49 fails when ?: is used in .format()
875 default_user_path_display = '(same as system services)'
879 #####################################################################
881 threads = dependency('threads')
882 librt = cc.find_library('rt')
883 libm = cc.find_library('m')
884 libdl = cc.find_library('dl')
885 libcrypt = cc.find_library('crypt')
887 crypt_header = conf.get('HAVE_CRYPT_H') == 1 ? '''#include <crypt.h>''' : '''#include <unistd.h>'''
889 ['crypt_ra', crypt_header],
890 ['crypt_preferred_method', crypt_header],
891 ['crypt_gensalt_ra', crypt_header]]
893 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE',
894 dependencies : libcrypt)
895 conf.set10('HAVE_' + ident[0].to_upper(), have)
898 libcap = dependency('libcap', required : false)
899 if not libcap.found()
900 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
901 libcap = cc.find_library('cap')
904 libmount = dependency('mount',
905 version : fuzzer_build ? '>= 0' : '>= 2.30')
907 want_libfdisk = get_option('fdisk')
908 if want_libfdisk != 'false' and not skip_deps
909 libfdisk = dependency('fdisk',
911 required : want_libfdisk == 'true')
912 have = libfdisk.found()
917 conf.set10('HAVE_LIBFDISK', have)
919 want_pwquality = get_option('pwquality')
920 if want_pwquality != 'false' and not skip_deps
921 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
922 have = libpwquality.found()
927 conf.set10('HAVE_PWQUALITY', have)
929 want_seccomp = get_option('seccomp')
930 if want_seccomp != 'false' and not skip_deps
931 libseccomp = dependency('libseccomp',
932 version : '>= 2.3.1',
933 required : want_seccomp == 'true')
934 have = libseccomp.found()
939 conf.set10('HAVE_SECCOMP', have)
941 want_selinux = get_option('selinux')
942 if want_selinux != 'false' and not skip_deps
943 libselinux = dependency('libselinux',
944 version : '>= 2.1.9',
945 required : want_selinux == 'true')
946 have = libselinux.found()
951 conf.set10('HAVE_SELINUX', have)
953 want_apparmor = get_option('apparmor')
954 if want_apparmor != 'false' and not skip_deps
955 libapparmor = dependency('libapparmor',
957 required : want_apparmor == 'true')
958 have = libapparmor.found()
963 conf.set10('HAVE_APPARMOR', have)
965 smack_run_label = get_option('smack-run-label')
966 if smack_run_label != ''
967 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
970 want_polkit = get_option('polkit')
971 install_polkit = false
972 install_polkit_pkla = false
973 if want_polkit != 'false' and not skip_deps
974 install_polkit = true
976 libpolkit = dependency('polkit-gobject-1',
978 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
979 message('Old polkit detected, will install pkla files')
980 install_polkit_pkla = true
983 conf.set10('ENABLE_POLKIT', install_polkit)
985 want_acl = get_option('acl')
986 if want_acl != 'false' and not skip_deps
987 libacl = cc.find_library('acl', required : want_acl == 'true')
988 have = libacl.found()
993 conf.set10('HAVE_ACL', have)
995 want_audit = get_option('audit')
996 if want_audit != 'false' and not skip_deps
997 libaudit = dependency('audit', required : want_audit == 'true')
998 have = libaudit.found()
1003 conf.set10('HAVE_AUDIT', have)
1005 want_blkid = get_option('blkid')
1006 if want_blkid != 'false' and not skip_deps
1007 libblkid = dependency('blkid', required : want_blkid == 'true')
1008 have = libblkid.found()
1013 conf.set10('HAVE_BLKID', have)
1015 want_kmod = get_option('kmod')
1016 if want_kmod != 'false' and not skip_deps
1017 libkmod = dependency('libkmod',
1019 required : want_kmod == 'true')
1020 have = libkmod.found()
1025 conf.set10('HAVE_KMOD', have)
1027 want_pam = get_option('pam')
1028 if want_pam != 'false' and not skip_deps
1029 libpam = cc.find_library('pam', required : want_pam == 'true')
1030 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
1031 have = libpam.found() and libpam_misc.found()
1037 conf.set10('HAVE_PAM', have)
1039 want_microhttpd = get_option('microhttpd')
1040 if want_microhttpd != 'false' and not skip_deps
1041 libmicrohttpd = dependency('libmicrohttpd',
1042 version : '>= 0.9.33',
1043 required : want_microhttpd == 'true')
1044 have = libmicrohttpd.found()
1049 conf.set10('HAVE_MICROHTTPD', have)
1051 want_libcryptsetup = get_option('libcryptsetup')
1052 if want_libcryptsetup != 'false' and not skip_deps
1053 libcryptsetup = dependency('libcryptsetup',
1054 version : '>= 2.0.1',
1055 required : want_libcryptsetup == 'true')
1056 have = libcryptsetup.found()
1058 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1059 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
1060 conf.set10('HAVE_CRYPT_ACTIVATE_BY_SIGNED_KEY',
1061 have and cc.has_function('crypt_activate_by_signed_key', dependencies : libcryptsetup))
1066 conf.set10('HAVE_LIBCRYPTSETUP', have)
1068 want_libcurl = get_option('libcurl')
1069 if want_libcurl != 'false' and not skip_deps
1070 libcurl = dependency('libcurl',
1071 version : '>= 7.32.0',
1072 required : want_libcurl == 'true')
1073 have = libcurl.found()
1078 conf.set10('HAVE_LIBCURL', have)
1079 conf.set10('CURL_NO_OLDIES', get_option('mode') == 'developer')
1081 want_libidn = get_option('libidn')
1082 want_libidn2 = get_option('libidn2')
1083 if want_libidn == 'true' and want_libidn2 == 'true'
1084 error('libidn and libidn2 cannot be requested simultaneously')
1087 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1088 libidn = dependency('libidn2',
1089 required : want_libidn2 == 'true')
1090 have = libidn.found()
1095 conf.set10('HAVE_LIBIDN2', have)
1096 if not have and want_libidn != 'false' and not skip_deps
1097 # libidn is used for both libidn and libidn2 objects
1098 libidn = dependency('libidn',
1099 required : want_libidn == 'true')
1100 have = libidn.found()
1104 conf.set10('HAVE_LIBIDN', have)
1106 want_libiptc = get_option('libiptc')
1107 if want_libiptc != 'false' and not skip_deps
1108 libiptc = dependency('libiptc',
1109 required : want_libiptc == 'true')
1110 have = libiptc.found()
1115 conf.set10('HAVE_LIBIPTC', have)
1117 want_qrencode = get_option('qrencode')
1118 if want_qrencode != 'false' and not skip_deps
1119 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_elfutils = get_option('elfutils')
1191 if want_elfutils != 'false' and not skip_deps
1192 libdw = dependency('libdw',
1193 required : want_elfutils == 'true')
1194 have = libdw.found()
1199 conf.set10('HAVE_ELFUTILS', have)
1201 want_zlib = get_option('zlib')
1202 if want_zlib != 'false' and not skip_deps
1203 libz = dependency('zlib',
1204 required : want_zlib == 'true')
1210 conf.set10('HAVE_ZLIB', have)
1212 want_bzip2 = get_option('bzip2')
1213 if want_bzip2 != 'false' and not skip_deps
1214 libbzip2 = cc.find_library('bz2',
1215 required : want_bzip2 == 'true')
1216 have = libbzip2.found()
1221 conf.set10('HAVE_BZIP2', have)
1223 want_xz = get_option('xz')
1224 if want_xz != 'false' and not skip_deps
1225 libxz = dependency('liblzma',
1226 required : want_xz == 'true')
1227 have_xz = libxz.found()
1232 conf.set10('HAVE_XZ', have_xz)
1234 want_lz4 = get_option('lz4')
1235 if want_lz4 != 'false' and not skip_deps
1236 liblz4 = dependency('liblz4',
1237 version : '>= 1.3.0',
1238 required : want_lz4 == 'true')
1239 have_lz4 = liblz4.found()
1244 conf.set10('HAVE_LZ4', have_lz4)
1246 want_zstd = get_option('zstd')
1247 if want_zstd != 'false' and not skip_deps
1248 libzstd = dependency('libzstd',
1249 required : want_zstd == 'true',
1250 version : '>= 1.4.0')
1251 have_zstd = libzstd.found()
1256 conf.set10('HAVE_ZSTD', have_zstd)
1258 conf.set10('HAVE_COMPRESSION', have_xz or have_lz4 or have_zstd)
1260 want_xkbcommon = get_option('xkbcommon')
1261 if want_xkbcommon != 'false' and not skip_deps
1262 libxkbcommon = dependency('xkbcommon',
1263 version : '>= 0.3.0',
1264 required : want_xkbcommon == 'true')
1265 have = libxkbcommon.found()
1270 conf.set10('HAVE_XKBCOMMON', have)
1272 want_pcre2 = get_option('pcre2')
1273 if want_pcre2 != 'false'
1274 libpcre2 = dependency('libpcre2-8',
1275 required : want_pcre2 == 'true')
1276 have = libpcre2.found()
1281 conf.set10('HAVE_PCRE2', have)
1283 want_glib = get_option('glib')
1284 if want_glib != 'false' and not skip_deps
1285 libglib = dependency('glib-2.0',
1286 version : '>= 2.22.0',
1287 required : want_glib == 'true')
1288 libgobject = dependency('gobject-2.0',
1289 version : '>= 2.22.0',
1290 required : want_glib == 'true')
1291 libgio = dependency('gio-2.0',
1292 required : want_glib == 'true')
1293 have = libglib.found() and libgobject.found() and libgio.found()
1300 conf.set10('HAVE_GLIB', have)
1302 want_dbus = get_option('dbus')
1303 if want_dbus != 'false' and not skip_deps
1304 libdbus = dependency('dbus-1',
1305 version : '>= 1.3.2',
1306 required : want_dbus == 'true')
1307 have = libdbus.found()
1312 conf.set10('HAVE_DBUS', have)
1314 default_dnssec = get_option('default-dnssec')
1316 default_dnssec = 'no'
1318 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1319 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1320 default_dnssec = 'no'
1322 conf.set('DEFAULT_DNSSEC_MODE',
1323 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1324 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1326 dns_over_tls = get_option('dns-over-tls')
1327 if dns_over_tls != 'false'
1328 if dns_over_tls == 'openssl'
1331 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1332 if dns_over_tls == 'gnutls' and not have_gnutls
1333 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1336 if dns_over_tls == 'gnutls' or have_gnutls
1337 have_openssl = false
1339 have_openssl = conf.get('HAVE_OPENSSL') == 1
1340 if dns_over_tls != 'auto' and not have_openssl
1341 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1342 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1345 have = have_gnutls or have_openssl
1349 have_openssl = false
1351 conf.set10('ENABLE_DNS_OVER_TLS', have)
1352 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1353 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1355 default_dns_over_tls = get_option('default-dns-over-tls')
1357 default_dns_over_tls = 'no'
1359 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1360 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.')
1361 default_dns_over_tls = 'no'
1363 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1364 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1365 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1367 default_mdns = get_option('default-mdns')
1368 conf.set('DEFAULT_MDNS_MODE',
1369 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
1370 substs.set('DEFAULT_MDNS_MODE', default_mdns)
1372 default_llmnr = get_option('default-llmnr')
1373 conf.set('DEFAULT_LLMNR_MODE',
1374 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
1375 substs.set('DEFAULT_LLMNR_MODE', default_llmnr)
1377 want_repart = get_option('repart')
1378 if want_repart != 'false'
1379 have = (conf.get('HAVE_OPENSSL') == 1 and
1380 conf.get('HAVE_LIBFDISK') == 1)
1381 if want_repart == 'true' and not have
1382 error('repart support was requested, but dependencies are not available')
1387 conf.set10('ENABLE_REPART', have)
1389 want_importd = get_option('importd')
1390 if want_importd != 'false'
1391 have = (conf.get('HAVE_LIBCURL') == 1 and
1392 conf.get('HAVE_ZLIB') == 1 and
1393 conf.get('HAVE_XZ') == 1 and
1394 conf.get('HAVE_GCRYPT') == 1)
1395 if want_importd == 'true' and not have
1396 error('importd support was requested, but dependencies are not available')
1401 conf.set10('ENABLE_IMPORTD', have)
1403 want_homed = get_option('homed')
1404 if want_homed != 'false'
1405 have = (conf.get('HAVE_OPENSSL') == 1 and
1406 conf.get('HAVE_LIBFDISK') == 1 and
1407 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1408 if want_homed == 'true' and not have
1409 error('homed support was requested, but dependencies are not available')
1414 conf.set10('ENABLE_HOMED', have)
1416 have = have and conf.get('HAVE_PAM') == 1
1417 conf.set10('ENABLE_PAM_HOME', have)
1419 have = get_option('oomd')
1421 have = get_option('mode') == 'developer'
1423 have = have == 'true'
1424 if have and get_option('mode') != 'developer'
1425 warning('oomd is not ready for release mode (yet)')
1428 conf.set10('ENABLE_OOMD', have)
1429 substs.set10('ENABLE_OOMD', have)
1431 want_remote = get_option('remote')
1432 if want_remote != 'false'
1433 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1434 conf.get('HAVE_LIBCURL') == 1]
1435 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1436 # it's possible to build one without the other. Complain only if
1437 # support was explicitly requested. The auxiliary files like sysusers
1438 # config should be installed when any of the programs are built.
1439 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1440 error('remote support was requested, but dependencies are not available')
1442 have = have_deps[0] or have_deps[1]
1446 conf.set10('ENABLE_REMOTE', have)
1448 foreach term : ['analyze',
1462 'compat-mutable-uid-boundaries',
1486 have = get_option(term)
1487 name = 'ENABLE_' + term.underscorify().to_upper()
1488 conf.set10(name, have)
1489 substs.set10(name, have)
1492 enable_sysusers = conf.get('ENABLE_SYSUSERS') == 1
1494 foreach tuple : [['nss-mymachines', 'machined'],
1495 ['nss-resolve', 'resolve']]
1496 want = get_option(tuple[0])
1498 have = get_option(tuple[1])
1499 if want == 'true' and not have
1500 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1505 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1506 conf.set10(name, have)
1510 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1511 'ENABLE_NSS_MYMACHINES',
1512 'ENABLE_NSS_RESOLVE',
1513 'ENABLE_NSS_SYSTEMD']
1514 if conf.get(term) == 1
1518 conf.set10('ENABLE_NSS', enable_nss)
1520 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1525 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1527 #####################################################################
1529 if get_option('efi')
1530 efi_arch = host_machine.cpu_family()
1532 if efi_arch == 'x86'
1533 EFI_MACHINE_TYPE_NAME = 'ia32'
1534 gnu_efi_arch = 'ia32'
1535 elif efi_arch == 'x86_64'
1536 EFI_MACHINE_TYPE_NAME = 'x64'
1537 gnu_efi_arch = 'x86_64'
1538 elif efi_arch == 'arm'
1539 EFI_MACHINE_TYPE_NAME = 'arm'
1540 gnu_efi_arch = 'arm'
1541 elif efi_arch == 'aarch64'
1542 EFI_MACHINE_TYPE_NAME = 'aa64'
1543 gnu_efi_arch = 'aarch64'
1545 EFI_MACHINE_TYPE_NAME = ''
1550 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1552 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1556 conf.set10('ENABLE_EFI', have)
1558 #####################################################################
1560 config_h = configure_file(
1561 output : 'config.h',
1562 configuration : conf)
1564 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1566 includes = include_directories('src/basic',
1571 'src/journal-remote',
1572 'src/libsystemd-network',
1573 'src/libsystemd/sd-bus',
1574 'src/libsystemd/sd-device',
1575 'src/libsystemd/sd-event',
1576 'src/libsystemd/sd-hwdb',
1577 'src/libsystemd/sd-id128',
1578 'src/libsystemd/sd-netlink',
1579 'src/libsystemd/sd-network',
1580 'src/libsystemd/sd-resolve',
1588 'src/time-wait-sync',
1591 'src/xdg-autostart-generator',
1594 add_project_arguments('-include', 'config.h', language : 'c')
1596 generate_gperfs = find_program('tools/generate-gperfs.py')
1600 subdir('src/libudev')
1601 subdir('src/systemd')
1603 subdir('src/libsystemd')
1604 subdir('src/libsystemd-network')
1605 subdir('src/journal')
1608 libjournal_core = static_library(
1610 libjournal_core_sources,
1612 include_directories : includes,
1615 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1616 libsystemd = shared_library(
1619 version : libsystemd_version,
1620 include_directories : includes,
1621 link_args : ['-shared',
1622 '-Wl,--version-script=' + libsystemd_sym_path],
1623 link_with : [libbasic,
1625 link_whole : [libsystemd_static,
1627 dependencies : [threads,
1632 link_depends : libsystemd_sym,
1634 install_dir : rootlibdir)
1636 static_libsystemd = get_option('static-libsystemd')
1637 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1639 install_libsystemd_static = static_library(
1642 journal_client_sources,
1644 basic_gcrypt_sources,
1646 include_directories : includes,
1647 build_by_default : static_libsystemd != 'false',
1648 install : static_libsystemd != 'false',
1649 install_dir : rootlibdir,
1650 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1651 dependencies : [threads,
1661 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1663 ############################################################
1665 autosuspend_update_sh = find_program('tools/autosuspend-update.sh')
1666 hwdb_update_sh = find_program('tools/hwdb-update.sh')
1667 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1668 make_directive_index_py = find_program('tools/make-directive-index.py')
1669 make_man_index_py = find_program('tools/make-man-index.py')
1670 syscall_names_update_sh = find_program('tools/syscall-names-update.sh')
1671 xml_helper_py = find_program('tools/xml_helper.py')
1672 update_dbus_docs_py = find_program('tools/update-dbus-docs.py')
1674 ############################################################
1676 # binaries that have --help and are intended for use by humans,
1677 # usually, but not always, installed in /bin.
1678 public_programs = []
1680 subdir('src/shared')
1682 subdir('src/shutdown')
1684 subdir('src/network')
1686 subdir('src/analyze')
1687 subdir('src/journal-remote')
1688 subdir('src/coredump')
1689 subdir('src/pstore')
1691 subdir('src/hostname')
1692 subdir('src/import')
1693 subdir('src/partition')
1694 subdir('src/kernel-install')
1695 subdir('src/locale')
1696 subdir('src/machine')
1697 subdir('src/portable')
1698 subdir('src/userdb')
1700 subdir('src/nspawn')
1701 subdir('src/resolve')
1702 subdir('src/timedate')
1703 subdir('src/timesync')
1704 subdir('src/tmpfiles')
1705 subdir('src/vconsole')
1706 subdir('src/boot/efi')
1713 ############################################################
1715 # only static linking apart from libdl, to make sure that the
1716 # module is linked to all libraries that it uses.
1717 test_dlopen = executable(
1721 include_directories : includes,
1722 link_with : [libbasic],
1723 dependencies : [libdl],
1724 build_by_default : want_tests != 'false')
1726 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1727 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h src/nss-systemd/nss-systemd.h'],
1728 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1729 ['resolve', 'ENABLE_NSS_RESOLVE']]
1731 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1735 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1736 version_script_arg = join_paths(project_source_root, sym)
1738 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1739 if tuple.length() > 2
1740 sources += tuple[2].split()
1743 nss = shared_library(
1748 include_directories : includes,
1749 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1750 link_args : ['-Wl,-z,nodelete',
1752 '-Wl,--version-script=' + version_script_arg],
1753 link_with : [libsystemd_static,
1756 dependencies : [threads,
1760 install_dir : rootlibdir)
1762 # We cannot use shared_module because it does not support version suffix.
1763 # Unfortunately shared_library insists on creating the symlink…
1764 meson.add_install_script('sh', '-c',
1765 'rm $DESTDIR@0@/libnss_@1@.so'
1766 .format(rootlibdir, module))
1768 if want_tests != 'false'
1769 test('dlopen-nss_' + module,
1771 # path to dlopen must include a slash
1772 args : nss.full_path())
1777 ############################################################
1782 include_directories : includes,
1783 link_with : [libcore,
1785 dependencies : [versiondep,
1792 install_rpath : rootlibexecdir,
1794 install_dir : rootlibexecdir)
1796 meson.add_install_script(meson_make_symlink,
1797 join_paths(rootlibexecdir, 'systemd'),
1798 join_paths(rootsbindir, 'init'))
1800 public_programs += executable(
1802 systemd_analyze_sources,
1803 include_directories : includes,
1804 link_with : [libcore,
1806 dependencies : [versiondep,
1813 install_rpath : rootlibexecdir,
1814 install : conf.get('ENABLE_ANALYZE'))
1818 systemd_journald_sources,
1819 include_directories : includes,
1820 link_with : [libjournal_core,
1822 dependencies : [threads,
1827 install_rpath : rootlibexecdir,
1829 install_dir : rootlibexecdir)
1831 public_programs += executable(
1833 systemd_cat_sources,
1834 include_directories : includes,
1835 link_with : [libjournal_core,
1837 dependencies : [threads],
1838 install_rpath : rootlibexecdir,
1841 public_programs += executable(
1844 include_directories : includes,
1845 link_with : [libshared],
1846 dependencies : [threads,
1852 install_rpath : rootlibexecdir,
1854 install_dir : rootbindir)
1857 'systemd-getty-generator',
1858 'src/getty-generator/getty-generator.c',
1859 include_directories : includes,
1860 link_with : [libshared],
1861 install_rpath : rootlibexecdir,
1863 install_dir : systemgeneratordir)
1866 'systemd-debug-generator',
1867 'src/debug-generator/debug-generator.c',
1868 include_directories : includes,
1869 link_with : [libshared],
1870 install_rpath : rootlibexecdir,
1872 install_dir : systemgeneratordir)
1875 'systemd-run-generator',
1876 'src/run-generator/run-generator.c',
1877 include_directories : includes,
1878 link_with : [libshared],
1879 install_rpath : rootlibexecdir,
1881 install_dir : systemgeneratordir)
1884 'systemd-fstab-generator',
1885 'src/fstab-generator/fstab-generator.c',
1886 include_directories : includes,
1887 link_with : [libcore_shared,
1889 install_rpath : rootlibexecdir,
1891 install_dir : systemgeneratordir)
1893 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1895 '30-systemd-environment-d-generator',
1896 'src/environment-d-generator/environment-d-generator.c',
1897 include_directories : includes,
1898 link_with : [libshared],
1899 install_rpath : rootlibexecdir,
1901 install_dir : userenvgeneratordir)
1903 meson.add_install_script(meson_make_symlink,
1904 join_paths(sysconfdir, 'environment'),
1905 join_paths(environmentdir, '99-environment.conf'))
1908 if conf.get('ENABLE_HIBERNATE') == 1
1910 'systemd-hibernate-resume-generator',
1911 'src/hibernate-resume/hibernate-resume-generator.c',
1912 include_directories : includes,
1913 link_with : [libshared],
1914 install_rpath : rootlibexecdir,
1916 install_dir : systemgeneratordir)
1919 'systemd-hibernate-resume',
1920 'src/hibernate-resume/hibernate-resume.c',
1921 include_directories : includes,
1922 link_with : [libshared],
1923 install_rpath : rootlibexecdir,
1925 install_dir : rootlibexecdir)
1928 if conf.get('HAVE_BLKID') == 1
1930 'systemd-gpt-auto-generator',
1931 'src/gpt-auto-generator/gpt-auto-generator.c',
1932 'src/shared/blkid-util.h',
1933 include_directories : includes,
1934 link_with : [libshared],
1935 dependencies : libblkid,
1936 install_rpath : rootlibexecdir,
1938 install_dir : systemgeneratordir)
1940 public_programs += executable(
1942 'src/dissect/dissect.c',
1943 include_directories : includes,
1944 link_with : [libshared],
1945 install_rpath : rootlibexecdir,
1949 if conf.get('ENABLE_RESOLVE') == 1
1952 systemd_resolved_sources,
1953 include_directories : includes,
1954 link_with : [libshared,
1956 libsystemd_resolve_core],
1957 dependencies : systemd_resolved_dependencies,
1958 install_rpath : rootlibexecdir,
1960 install_dir : rootlibexecdir)
1962 public_programs += executable(
1965 include_directories : includes,
1966 link_with : [libshared,
1968 libsystemd_resolve_core],
1969 dependencies : [threads,
1973 install_rpath : rootlibexecdir,
1976 meson.add_install_script(meson_make_symlink,
1977 join_paths(bindir, 'resolvectl'),
1978 join_paths(rootsbindir, 'resolvconf'))
1980 meson.add_install_script(meson_make_symlink,
1981 join_paths(bindir, 'resolvectl'),
1982 join_paths(bindir, 'systemd-resolve'))
1985 if conf.get('ENABLE_LOGIND') == 1
1988 systemd_logind_sources,
1989 include_directories : includes,
1990 link_with : [liblogind_core,
1992 dependencies : [threads,
1994 install_rpath : rootlibexecdir,
1996 install_dir : rootlibexecdir)
1998 public_programs += executable(
2001 include_directories : includes,
2002 link_with : [libshared],
2003 dependencies : [threads,
2007 install_rpath : rootlibexecdir,
2009 install_dir : rootbindir)
2011 public_programs += executable(
2013 'src/login/inhibit.c',
2014 include_directories : includes,
2015 link_with : [libshared],
2016 install_rpath : rootlibexecdir,
2018 install_dir : rootbindir)
2020 if conf.get('HAVE_PAM') == 1
2021 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
2022 pam_systemd = shared_library(
2026 include_directories : includes,
2027 link_args : ['-shared',
2028 '-Wl,--version-script=' + version_script_arg],
2029 link_with : [libsystemd_static,
2031 dependencies : [threads,
2034 link_depends : pam_systemd_sym,
2036 install_dir : pamlibdir)
2038 if want_tests != 'false'
2039 test('dlopen-pam_systemd',
2041 # path to dlopen must include a slash
2042 args : pam_systemd.full_path())
2047 'systemd-user-runtime-dir',
2048 user_runtime_dir_sources,
2049 include_directories : includes,
2050 link_with : [libshared],
2051 install_rpath : rootlibexecdir,
2053 install_dir : rootlibexecdir)
2056 if conf.get('HAVE_PAM') == 1
2058 'systemd-user-sessions',
2059 'src/user-sessions/user-sessions.c',
2060 include_directories : includes,
2061 link_with : [libshared],
2062 install_rpath : rootlibexecdir,
2064 install_dir : rootlibexecdir)
2067 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
2068 public_programs += executable(
2070 'src/boot/bootctl.c',
2071 include_directories : includes,
2072 link_with : [libshared],
2073 dependencies : [libblkid],
2074 install_rpath : rootlibexecdir,
2077 public_programs += executable(
2078 'systemd-bless-boot',
2079 'src/boot/bless-boot.c',
2080 include_directories : includes,
2081 link_with : [libshared],
2082 dependencies : [libblkid],
2083 install_rpath : rootlibexecdir,
2085 install_dir : rootlibexecdir)
2088 'systemd-bless-boot-generator',
2089 'src/boot/bless-boot-generator.c',
2090 include_directories : includes,
2091 link_with : [libshared],
2092 install_rpath : rootlibexecdir,
2094 install_dir : systemgeneratordir)
2098 'systemd-boot-check-no-failures',
2099 'src/boot/boot-check-no-failures.c',
2100 include_directories : includes,
2101 link_with : [libshared],
2102 dependencies : [libblkid],
2103 install_rpath : rootlibexecdir,
2105 install_dir : rootlibexecdir)
2107 public_programs += executable(
2108 'systemd-socket-activate',
2109 'src/activate/activate.c',
2110 include_directories : includes,
2111 link_with : [libshared],
2112 dependencies : [threads],
2113 install_rpath : rootlibexecdir,
2116 if get_option('link-systemctl-shared')
2117 systemctl_link_with = [libshared]
2119 systemctl_link_with = [libsystemd_static,
2125 public_programs += executable(
2127 'src/systemctl/systemctl-add-dependency.c',
2128 'src/systemctl/systemctl-add-dependency.h',
2129 'src/systemctl/systemctl-cancel-job.c',
2130 'src/systemctl/systemctl-cancel-job.h',
2131 'src/systemctl/systemctl-clean-or-freeze.c',
2132 'src/systemctl/systemctl-clean-or-freeze.h',
2133 'src/systemctl/systemctl-compat-halt.c',
2134 'src/systemctl/systemctl-compat-halt.h',
2135 'src/systemctl/systemctl-compat-runlevel.c',
2136 'src/systemctl/systemctl-compat-runlevel.h',
2137 'src/systemctl/systemctl-compat-shutdown.c',
2138 'src/systemctl/systemctl-compat-shutdown.h',
2139 'src/systemctl/systemctl-compat-telinit.c',
2140 'src/systemctl/systemctl-compat-telinit.h',
2141 'src/systemctl/systemctl-daemon-reload.c',
2142 'src/systemctl/systemctl-daemon-reload.h',
2143 'src/systemctl/systemctl-edit.c',
2144 'src/systemctl/systemctl-edit.h',
2145 'src/systemctl/systemctl-enable.c',
2146 'src/systemctl/systemctl-enable.h',
2147 'src/systemctl/systemctl-is-active.c',
2148 'src/systemctl/systemctl-is-active.h',
2149 'src/systemctl/systemctl-is-enabled.c',
2150 'src/systemctl/systemctl-is-enabled.h',
2151 'src/systemctl/systemctl-is-system-running.c',
2152 'src/systemctl/systemctl-is-system-running.h',
2153 'src/systemctl/systemctl-kill.c',
2154 'src/systemctl/systemctl-kill.h',
2155 'src/systemctl/systemctl-list-dependencies.c',
2156 'src/systemctl/systemctl-list-dependencies.h',
2157 'src/systemctl/systemctl-list-jobs.c',
2158 'src/systemctl/systemctl-list-jobs.h',
2159 'src/systemctl/systemctl-list-machines.c',
2160 'src/systemctl/systemctl-list-machines.h',
2161 'src/systemctl/systemctl-list-unit-files.c',
2162 'src/systemctl/systemctl-list-unit-files.h',
2163 'src/systemctl/systemctl-list-units.c',
2164 'src/systemctl/systemctl-list-units.h',
2165 'src/systemctl/systemctl-log-setting.c',
2166 'src/systemctl/systemctl-log-setting.h',
2167 'src/systemctl/systemctl-logind.c',
2168 'src/systemctl/systemctl-logind.h',
2169 'src/systemctl/systemctl-preset-all.c',
2170 'src/systemctl/systemctl-preset-all.h',
2171 'src/systemctl/systemctl-reset-failed.c',
2172 'src/systemctl/systemctl-reset-failed.h',
2173 'src/systemctl/systemctl-service-watchdogs.c',
2174 'src/systemctl/systemctl-service-watchdogs.h',
2175 'src/systemctl/systemctl-set-default.c',
2176 'src/systemctl/systemctl-set-default.h',
2177 'src/systemctl/systemctl-set-environment.c',
2178 'src/systemctl/systemctl-set-environment.h',
2179 'src/systemctl/systemctl-set-property.c',
2180 'src/systemctl/systemctl-set-property.h',
2181 'src/systemctl/systemctl-show.c',
2182 'src/systemctl/systemctl-show.h',
2183 'src/systemctl/systemctl-start-special.c',
2184 'src/systemctl/systemctl-start-special.h',
2185 'src/systemctl/systemctl-start-unit.c',
2186 'src/systemctl/systemctl-start-unit.h',
2187 'src/systemctl/systemctl-switch-root.c',
2188 'src/systemctl/systemctl-switch-root.h',
2189 'src/systemctl/systemctl-sysv-compat.c',
2190 'src/systemctl/systemctl-sysv-compat.h',
2191 'src/systemctl/systemctl-trivial-method.c',
2192 'src/systemctl/systemctl-trivial-method.h',
2193 'src/systemctl/systemctl-util.c',
2194 'src/systemctl/systemctl-util.c',
2195 'src/systemctl/systemctl-util.h',
2196 'src/systemctl/systemctl.c',
2197 'src/systemctl/systemctl.h',
2198 include_directories : includes,
2199 link_with : systemctl_link_with,
2200 dependencies : [threads,
2206 install_rpath : rootlibexecdir,
2208 install_dir : rootbindir)
2210 if conf.get('ENABLE_PORTABLED') == 1
2212 'systemd-portabled',
2213 systemd_portabled_sources,
2214 include_directories : includes,
2215 link_with : [libshared],
2216 dependencies : [threads],
2217 install_rpath : rootlibexecdir,
2219 install_dir : rootlibexecdir)
2221 public_programs += executable(
2223 'src/portable/portablectl.c',
2224 include_directories : includes,
2225 link_with : [libshared],
2226 dependencies : [threads],
2227 install_rpath : rootlibexecdir,
2229 install_dir : rootbindir)
2232 if conf.get('ENABLE_USERDB') == 1
2235 systemd_userwork_sources,
2236 include_directories : includes,
2237 link_with : [libshared],
2238 dependencies : [threads],
2239 install_rpath : rootlibexecdir,
2241 install_dir : rootlibexecdir)
2245 systemd_userdbd_sources,
2246 include_directories : includes,
2247 link_with : [libshared],
2248 dependencies : [threads],
2249 install_rpath : rootlibexecdir,
2251 install_dir : rootlibexecdir)
2253 public_programs += executable(
2256 include_directories : includes,
2257 link_with : [libshared],
2258 dependencies : [threads],
2259 install_rpath : rootlibexecdir,
2261 install_dir : rootbindir)
2264 if conf.get('ENABLE_HOMED') == 1
2267 systemd_homework_sources,
2268 include_directories : includes,
2269 link_with : [libshared],
2270 dependencies : [threads,
2278 install_rpath : rootlibexecdir,
2280 install_dir : rootlibexecdir)
2284 systemd_homed_sources,
2285 include_directories : includes,
2286 link_with : [libshared],
2287 dependencies : [threads,
2290 install_rpath : rootlibexecdir,
2292 install_dir : rootlibexecdir)
2294 public_programs += executable(
2297 include_directories : includes,
2298 link_with : [libshared],
2299 dependencies : [threads,
2305 install_rpath : rootlibexecdir,
2307 install_dir : rootbindir)
2309 if conf.get('HAVE_PAM') == 1
2310 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2311 pam_systemd = shared_library(
2315 include_directories : includes,
2316 link_args : ['-shared',
2317 '-Wl,--version-script=' + version_script_arg],
2318 link_with : [libsystemd_static,
2320 dependencies : [threads,
2324 link_depends : pam_systemd_home_sym,
2326 install_dir : pamlibdir)
2330 foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
2331 (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
2332 meson.add_install_script(meson_make_symlink,
2333 join_paths(rootbindir, 'systemctl'),
2334 join_paths(rootsbindir, alias))
2337 meson.add_install_script(meson_make_symlink,
2338 join_paths(rootbindir, 'udevadm'),
2339 join_paths(rootlibexecdir, 'systemd-udevd'))
2341 if conf.get('ENABLE_BACKLIGHT') == 1
2343 'systemd-backlight',
2344 'src/backlight/backlight.c',
2345 include_directories : includes,
2346 link_with : [libshared],
2347 install_rpath : rootlibexecdir,
2349 install_dir : rootlibexecdir)
2352 if conf.get('ENABLE_RFKILL') == 1
2355 'src/rfkill/rfkill.c',
2356 include_directories : includes,
2357 link_with : [libshared],
2358 install_rpath : rootlibexecdir,
2360 install_dir : rootlibexecdir)
2364 'systemd-system-update-generator',
2365 'src/system-update-generator/system-update-generator.c',
2366 include_directories : includes,
2367 link_with : [libshared],
2368 install_rpath : rootlibexecdir,
2370 install_dir : systemgeneratordir)
2372 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2373 systemd_cryptsetup_sources = files('''
2374 src/cryptsetup/cryptsetup-pkcs11.h
2375 src/cryptsetup/cryptsetup-keyfile.c
2376 src/cryptsetup/cryptsetup-keyfile.h
2377 src/cryptsetup/cryptsetup.c
2380 if conf.get('HAVE_P11KIT') == 1
2381 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2385 'systemd-cryptsetup',
2386 systemd_cryptsetup_sources,
2387 include_directories : includes,
2388 link_with : [libshared],
2389 dependencies : [libcryptsetup,
2391 install_rpath : rootlibexecdir,
2393 install_dir : rootlibexecdir)
2396 'systemd-cryptsetup-generator',
2397 'src/cryptsetup/cryptsetup-generator.c',
2398 include_directories : includes,
2399 link_with : [libshared],
2400 install_rpath : rootlibexecdir,
2402 install_dir : systemgeneratordir)
2405 'systemd-veritysetup',
2406 'src/veritysetup/veritysetup.c',
2407 include_directories : includes,
2408 link_with : [libshared],
2409 dependencies : [libcryptsetup],
2410 install_rpath : rootlibexecdir,
2412 install_dir : rootlibexecdir)
2415 'systemd-veritysetup-generator',
2416 'src/veritysetup/veritysetup-generator.c',
2417 include_directories : includes,
2418 link_with : [libshared],
2419 install_rpath : rootlibexecdir,
2421 install_dir : systemgeneratordir)
2424 if conf.get('HAVE_SYSV_COMPAT') == 1
2426 'systemd-sysv-generator',
2427 'src/sysv-generator/sysv-generator.c',
2428 include_directories : includes,
2429 link_with : [libshared],
2430 install_rpath : rootlibexecdir,
2432 install_dir : systemgeneratordir)
2435 'systemd-rc-local-generator',
2436 'src/rc-local-generator/rc-local-generator.c',
2437 include_directories : includes,
2438 link_with : [libshared],
2439 install_rpath : rootlibexecdir,
2441 install_dir : systemgeneratordir)
2444 if conf.get('ENABLE_XDG_AUTOSTART') == 1
2446 'systemd-xdg-autostart-generator',
2447 'src/xdg-autostart-generator/xdg-autostart-generator.c',
2448 'src/xdg-autostart-generator/xdg-autostart-service.c',
2449 include_directories : includes,
2450 link_with : [libshared],
2451 install_rpath : rootlibexecdir,
2453 install_dir : usergeneratordir)
2456 'systemd-xdg-autostart-condition',
2457 'src/xdg-autostart-generator/xdg-autostart-condition.c',
2458 include_directories : includes,
2459 link_with : [libshared],
2460 install_rpath : rootlibexecdir,
2462 install_dir : rootlibexecdir)
2465 if conf.get('ENABLE_HOSTNAMED') == 1
2467 'systemd-hostnamed',
2468 'src/hostname/hostnamed.c',
2469 include_directories : includes,
2470 link_with : [libshared],
2471 install_rpath : rootlibexecdir,
2473 install_dir : rootlibexecdir)
2475 public_programs += executable(
2477 'src/hostname/hostnamectl.c',
2478 include_directories : includes,
2479 link_with : [libshared],
2480 install_rpath : rootlibexecdir,
2484 if conf.get('ENABLE_LOCALED') == 1
2485 if conf.get('HAVE_XKBCOMMON') == 1
2486 # logind will load libxkbcommon.so dynamically on its own
2494 systemd_localed_sources,
2495 include_directories : includes,
2496 link_with : [libshared],
2497 dependencies : deps,
2498 install_rpath : rootlibexecdir,
2500 install_dir : rootlibexecdir)
2502 public_programs += executable(
2505 include_directories : includes,
2506 link_with : [libshared],
2507 install_rpath : rootlibexecdir,
2511 if conf.get('ENABLE_TIMEDATED') == 1
2513 'systemd-timedated',
2514 'src/timedate/timedated.c',
2515 include_directories : includes,
2516 link_with : [libshared],
2517 install_rpath : rootlibexecdir,
2519 install_dir : rootlibexecdir)
2522 if conf.get('ENABLE_TIMEDATECTL') == 1
2523 public_programs += executable(
2525 'src/timedate/timedatectl.c',
2526 include_directories : includes,
2527 install_rpath : rootlibexecdir,
2528 link_with : [libshared],
2529 dependencies : [libm],
2533 if conf.get('ENABLE_TIMESYNCD') == 1
2534 if get_option('link-timesyncd-shared')
2535 timesyncd_link_with = [libshared]
2537 timesyncd_link_with = [libsystemd_static,
2544 'systemd-timesyncd',
2545 systemd_timesyncd_sources,
2546 include_directories : includes,
2547 link_with : [timesyncd_link_with],
2548 dependencies : [threads,
2550 install_rpath : rootlibexecdir,
2552 install_dir : rootlibexecdir)
2555 'systemd-time-wait-sync',
2556 'src/time-wait-sync/time-wait-sync.c',
2557 include_directories : includes,
2558 link_with : [timesyncd_link_with],
2559 install_rpath : rootlibexecdir,
2561 install_dir : rootlibexecdir)
2564 if conf.get('ENABLE_MACHINED') == 1
2567 systemd_machined_sources,
2568 include_directories : includes,
2569 link_with : [libmachine_core,
2571 install_rpath : rootlibexecdir,
2573 install_dir : rootlibexecdir)
2575 public_programs += executable(
2577 'src/machine/machinectl.c',
2578 include_directories : includes,
2579 link_with : [libshared],
2580 dependencies : [threads,
2584 install_rpath : rootlibexecdir,
2586 install_dir : rootbindir)
2589 if conf.get('ENABLE_IMPORTD') == 1
2592 systemd_importd_sources,
2593 include_directories : includes,
2594 link_with : [libshared],
2595 dependencies : [threads],
2596 install_rpath : rootlibexecdir,
2598 install_dir : rootlibexecdir)
2600 systemd_pull = executable(
2602 systemd_pull_sources,
2603 include_directories : includes,
2604 link_with : [libshared],
2605 dependencies : [versiondep,
2611 install_rpath : rootlibexecdir,
2613 install_dir : rootlibexecdir)
2615 systemd_import = executable(
2617 systemd_import_sources,
2618 include_directories : includes,
2619 link_with : [libshared],
2620 dependencies : [libcurl,
2624 install_rpath : rootlibexecdir,
2626 install_dir : rootlibexecdir)
2628 systemd_import_fs = executable(
2629 'systemd-import-fs',
2630 systemd_import_fs_sources,
2631 include_directories : includes,
2632 link_with : [libshared],
2633 install_rpath : rootlibexecdir,
2635 install_dir : rootlibexecdir)
2637 systemd_export = executable(
2639 systemd_export_sources,
2640 include_directories : includes,
2641 link_with : [libshared],
2642 dependencies : [libcurl,
2646 install_rpath : rootlibexecdir,
2648 install_dir : rootlibexecdir)
2650 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2653 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2654 public_programs += executable(
2655 'systemd-journal-upload',
2656 systemd_journal_upload_sources,
2657 include_directories : includes,
2658 link_with : [libshared],
2659 dependencies : [versiondep,
2666 install_rpath : rootlibexecdir,
2668 install_dir : rootlibexecdir)
2671 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2672 public_programs += executable(
2673 'systemd-journal-remote',
2674 systemd_journal_remote_sources,
2675 include_directories : includes,
2676 link_with : [libshared,
2677 libsystemd_journal_remote],
2678 dependencies : [threads,
2684 install_rpath : rootlibexecdir,
2686 install_dir : rootlibexecdir)
2688 public_programs += executable(
2689 'systemd-journal-gatewayd',
2690 systemd_journal_gatewayd_sources,
2691 include_directories : includes,
2692 link_with : [libshared],
2693 dependencies : [threads,
2699 install_rpath : rootlibexecdir,
2701 install_dir : rootlibexecdir)
2704 if conf.get('ENABLE_COREDUMP') == 1
2707 systemd_coredump_sources,
2708 include_directories : includes,
2709 link_with : [libshared],
2710 dependencies : [threads,
2716 install_rpath : rootlibexecdir,
2718 install_dir : rootlibexecdir)
2720 public_programs += executable(
2722 coredumpctl_sources,
2723 include_directories : includes,
2724 link_with : [libshared],
2725 dependencies : [threads,
2729 install_rpath : rootlibexecdir,
2733 if conf.get('ENABLE_PSTORE') == 1
2736 systemd_pstore_sources,
2737 include_directories : includes,
2738 link_with : [libshared],
2739 dependencies : [threads,
2745 install_rpath : rootlibexecdir,
2747 install_dir : rootlibexecdir)
2750 if conf.get('ENABLE_OOMD') == 1
2751 executable('systemd-oomd',
2752 systemd_oomd_sources,
2753 include_directories : includes,
2754 link_with : [libshared],
2756 install_rpath : rootlibexecdir,
2758 install_dir : rootlibexecdir)
2760 public_programs += executable(
2763 include_directories : includes,
2764 link_with : [libshared],
2766 install_rpath : rootlibexecdir,
2768 install_dir : rootbindir)
2771 if conf.get('ENABLE_BINFMT') == 1
2772 public_programs += executable(
2774 'src/binfmt/binfmt.c',
2775 include_directories : includes,
2776 link_with : [libshared],
2777 install_rpath : rootlibexecdir,
2779 install_dir : rootlibexecdir)
2781 meson.add_install_script('sh', '-c',
2782 mkdir_p.format(binfmtdir))
2783 if install_sysconfdir
2784 meson.add_install_script('sh', '-c',
2785 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2789 if conf.get('ENABLE_REPART') == 1
2792 systemd_repart_sources,
2793 include_directories : includes,
2794 link_with : [libshared],
2795 dependencies : [threads,
2799 install_rpath : rootlibexecdir,
2801 install_dir : rootbindir)
2802 public_programs += exe
2804 if want_tests != 'false'
2807 args : exe.full_path())
2811 if conf.get('ENABLE_VCONSOLE') == 1
2813 'systemd-vconsole-setup',
2814 'src/vconsole/vconsole-setup.c',
2815 include_directories : includes,
2816 link_with : [libshared],
2817 install_rpath : rootlibexecdir,
2819 install_dir : rootlibexecdir)
2822 if conf.get('ENABLE_RANDOMSEED') == 1
2824 'systemd-random-seed',
2825 'src/random-seed/random-seed.c',
2826 include_directories : includes,
2827 link_with : [libshared],
2828 install_rpath : rootlibexecdir,
2830 install_dir : rootlibexecdir)
2833 if conf.get('ENABLE_FIRSTBOOT') == 1
2835 'systemd-firstboot',
2836 'src/firstboot/firstboot.c',
2837 include_directories : includes,
2838 link_with : [libshared],
2839 dependencies : [libcrypt],
2840 install_rpath : rootlibexecdir,
2842 install_dir : rootbindir)
2846 'systemd-remount-fs',
2847 'src/remount-fs/remount-fs.c',
2848 include_directories : includes,
2849 link_with : [libcore_shared,
2851 install_rpath : rootlibexecdir,
2853 install_dir : rootlibexecdir)
2856 'systemd-machine-id-setup',
2857 'src/machine-id-setup/machine-id-setup-main.c',
2858 include_directories : includes,
2859 link_with : [libcore_shared,
2861 install_rpath : rootlibexecdir,
2863 install_dir : rootbindir)
2868 include_directories : includes,
2869 link_with : [libshared],
2870 install_rpath : rootlibexecdir,
2872 install_dir : rootlibexecdir)
2874 executable('systemd-growfs',
2875 'src/partition/growfs.c',
2876 include_directories : includes,
2877 link_with : [libshared],
2878 install_rpath : rootlibexecdir,
2880 install_dir : rootlibexecdir)
2884 'src/partition/makefs.c',
2885 include_directories : includes,
2886 link_with : [libshared],
2887 install_rpath : rootlibexecdir,
2889 install_dir : rootlibexecdir)
2893 'src/sleep/sleep.c',
2894 include_directories : includes,
2895 link_with : [libshared],
2896 install_rpath : rootlibexecdir,
2898 install_dir : rootlibexecdir)
2900 if install_sysconfdir
2901 install_data('src/sleep/sleep.conf',
2902 install_dir : pkgsysconfdir)
2905 public_programs += executable(
2907 'src/sysctl/sysctl.c',
2908 include_directories : includes,
2909 link_with : [libshared],
2910 install_rpath : rootlibexecdir,
2912 install_dir : rootlibexecdir)
2916 'src/ac-power/ac-power.c',
2917 include_directories : includes,
2918 link_with : [libshared],
2919 install_rpath : rootlibexecdir,
2921 install_dir : rootlibexecdir)
2923 public_programs += executable(
2924 'systemd-detect-virt',
2925 'src/detect-virt/detect-virt.c',
2926 include_directories : includes,
2927 link_with : [libshared],
2928 install_rpath : rootlibexecdir,
2931 public_programs += executable(
2933 'src/delta/delta.c',
2934 include_directories : includes,
2935 link_with : [libshared],
2936 install_rpath : rootlibexecdir,
2939 public_programs += executable(
2941 'src/escape/escape.c',
2942 include_directories : includes,
2943 link_with : [libshared],
2944 install_rpath : rootlibexecdir,
2946 install_dir : rootbindir)
2948 public_programs += executable(
2950 'src/notify/notify.c',
2951 include_directories : includes,
2952 link_with : [libshared],
2953 install_rpath : rootlibexecdir,
2955 install_dir : rootbindir)
2958 'systemd-volatile-root',
2959 'src/volatile-root/volatile-root.c',
2960 include_directories : includes,
2961 link_with : [libshared],
2962 install_rpath : rootlibexecdir,
2963 install : conf.get('ENABLE_INITRD') == 1,
2964 install_dir : rootlibexecdir)
2967 'systemd-cgroups-agent',
2968 'src/cgroups-agent/cgroups-agent.c',
2969 include_directories : includes,
2970 link_with : [libshared],
2971 install_rpath : rootlibexecdir,
2973 install_dir : rootlibexecdir)
2975 public_programs += executable(
2977 'src/id128/id128.c',
2978 include_directories : includes,
2979 link_with : [libshared],
2980 install_rpath : rootlibexecdir,
2983 public_programs += executable(
2986 include_directories : includes,
2987 link_with : [libshared],
2988 install_rpath : rootlibexecdir,
2991 public_programs += executable(
2992 'systemd-ask-password',
2993 'src/ask-password/ask-password.c',
2994 include_directories : includes,
2995 link_with : [libshared],
2996 install_rpath : rootlibexecdir,
2998 install_dir : rootbindir)
3001 'systemd-reply-password',
3002 'src/reply-password/reply-password.c',
3003 include_directories : includes,
3004 link_with : [libshared],
3005 install_rpath : rootlibexecdir,
3007 install_dir : rootlibexecdir)
3009 public_programs += executable(
3010 'systemd-tty-ask-password-agent',
3011 'src/tty-ask-password-agent/tty-ask-password-agent.c',
3012 include_directories : includes,
3013 link_with : [libshared],
3014 install_rpath : rootlibexecdir,
3016 install_dir : rootbindir)
3018 public_programs += executable(
3021 include_directories : includes,
3022 link_with : [libshared],
3023 install_rpath : rootlibexecdir,
3026 public_programs += executable(
3028 'src/cgtop/cgtop.c',
3029 include_directories : includes,
3030 link_with : [libshared],
3031 install_rpath : rootlibexecdir,
3036 'src/initctl/initctl.c',
3037 include_directories : includes,
3038 link_with : [libshared],
3039 install_rpath : rootlibexecdir,
3040 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
3041 install_dir : rootlibexecdir)
3043 public_programs += executable(
3045 'src/mount/mount-tool.c',
3046 include_directories : includes,
3047 link_with : [libshared],
3048 dependencies: [libmount],
3049 install_rpath : rootlibexecdir,
3052 meson.add_install_script(meson_make_symlink,
3053 'systemd-mount', join_paths(bindir, 'systemd-umount'))
3055 public_programs += executable(
3058 include_directories : includes,
3059 link_with : [libshared],
3060 install_rpath : rootlibexecdir,
3063 public_programs += executable(
3064 'systemd-stdio-bridge',
3065 'src/stdio-bridge/stdio-bridge.c',
3066 include_directories : includes,
3067 link_with : [libshared],
3068 dependencies : [versiondep],
3069 install_rpath : rootlibexecdir,
3072 public_programs += executable(
3074 'src/busctl/busctl.c',
3075 'src/busctl/busctl-introspect.c',
3076 'src/busctl/busctl-introspect.h',
3077 include_directories : includes,
3078 link_with : [libshared],
3079 install_rpath : rootlibexecdir,
3085 'src/sysusers/sysusers.c',
3086 include_directories : includes,
3087 link_with : [libshared],
3088 install_rpath : rootlibexecdir,
3090 install_dir : rootbindir)
3091 public_programs += exe
3093 if want_tests != 'false'
3094 test('test-sysusers',
3096 # https://github.com/mesonbuild/meson/issues/2681
3097 args : exe.full_path())
3100 if have_standalone_binaries
3102 'systemd-sysusers.standalone',
3103 'src/sysusers/sysusers.c',
3104 include_directories : includes,
3105 c_args : '-DSTANDALONE',
3106 link_with : [libshared_static,
3112 install_dir : rootbindir)
3113 public_programs += exe
3115 if want_tests != 'false'
3116 test('test-sysusers.standalone',
3118 # https://github.com/mesonbuild/meson/issues/2681
3119 args : exe.full_path())
3124 if conf.get('ENABLE_TMPFILES') == 1
3127 systemd_tmpfiles_sources,
3128 include_directories : includes,
3129 link_with : [libshared],
3130 dependencies : [libacl],
3131 install_rpath : rootlibexecdir,
3133 install_dir : rootbindir)
3134 public_programs += exe
3136 if want_tests != 'false'
3137 test('test-systemd-tmpfiles',
3138 test_systemd_tmpfiles_py,
3139 # https://github.com/mesonbuild/meson/issues/2681
3140 args : exe.full_path())
3143 if have_standalone_binaries
3144 public_programs += executable(
3145 'systemd-tmpfiles.standalone',
3146 systemd_tmpfiles_sources,
3147 include_directories : includes,
3148 c_args : '-DSTANDALONE',
3149 link_with : [libshared_static,
3154 dependencies : [libacl],
3156 install_dir : rootbindir)
3160 if conf.get('ENABLE_HWDB') == 1
3161 public_programs += executable(
3164 'src/libsystemd/sd-hwdb/hwdb-internal.h',
3165 include_directories : includes,
3166 link_with : [libudev_static],
3167 install_rpath : udev_rpath,
3169 install_dir : rootbindir)
3172 if conf.get('ENABLE_QUOTACHECK') == 1
3174 'systemd-quotacheck',
3175 'src/quotacheck/quotacheck.c',
3176 include_directories : includes,
3177 link_with : [libshared],
3178 install_rpath : rootlibexecdir,
3180 install_dir : rootlibexecdir)
3183 public_programs += executable(
3184 'systemd-socket-proxyd',
3185 'src/socket-proxy/socket-proxyd.c',
3186 include_directories : includes,
3187 link_with : [libshared],
3188 dependencies : [threads],
3189 install_rpath : rootlibexecdir,
3191 install_dir : rootlibexecdir)
3193 public_programs += executable(
3196 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
3197 include_directories : includes,
3198 link_with : [libudev_core,
3200 dependencies : [versiondep,
3206 install_rpath : udev_rpath,
3208 install_dir : rootbindir)
3212 systemd_shutdown_sources,
3213 include_directories : includes,
3214 link_with : [libcore_shared,
3216 dependencies : [libmount],
3217 install_rpath : rootlibexecdir,
3219 install_dir : rootlibexecdir)
3222 'systemd-update-done',
3223 'src/update-done/update-done.c',
3224 include_directories : includes,
3225 link_with : [libshared],
3226 install_rpath : rootlibexecdir,
3228 install_dir : rootlibexecdir)
3231 'systemd-update-utmp',
3232 'src/update-utmp/update-utmp.c',
3233 include_directories : includes,
3234 link_with : [libshared],
3235 dependencies : [libaudit],
3236 install_rpath : rootlibexecdir,
3237 install : (conf.get('ENABLE_UTMP') == 1),
3238 install_dir : rootlibexecdir)
3240 if conf.get('HAVE_KMOD') == 1
3242 'systemd-modules-load',
3243 'src/modules-load/modules-load.c',
3244 include_directories : includes,
3245 link_with : [libshared],
3246 dependencies : [libkmod],
3247 install_rpath : rootlibexecdir,
3249 install_dir : rootlibexecdir)
3251 meson.add_install_script('sh', '-c',
3252 mkdir_p.format(modulesloaddir))
3253 if install_sysconfdir
3254 meson.add_install_script('sh', '-c',
3255 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
3259 public_programs += executable(
3261 systemd_nspawn_sources,
3262 include_directories : includes,
3263 link_with : [libcore_shared,
3266 dependencies : [libblkid,
3268 install_rpath : rootlibexecdir,
3271 if conf.get('ENABLE_NETWORKD') == 1
3274 systemd_networkd_sources,
3275 include_directories : network_include_dir,
3276 link_with : [libnetworkd_core,
3279 networkd_link_with],
3280 dependencies : [threads],
3281 install_rpath : rootlibexecdir,
3283 install_dir : rootlibexecdir)
3286 'systemd-networkd-wait-online',
3287 systemd_networkd_wait_online_sources,
3288 include_directories : includes,
3289 link_with : [libnetworkd_core,
3290 networkd_link_with],
3291 install_rpath : rootlibexecdir,
3293 install_dir : rootlibexecdir)
3295 public_programs += executable(
3298 include_directories : includes,
3299 link_with : [libsystemd_network,
3300 networkd_link_with],
3301 install_rpath : rootlibexecdir,
3303 install_dir : rootbindir)
3306 'systemd-network-generator',
3307 network_generator_sources,
3308 include_directories : includes,
3309 link_with : [networkd_link_with],
3310 install_rpath : rootlibexecdir,
3312 install_dir : rootlibexecdir)
3314 if want_tests != 'false'
3315 test('test-network-generator-conversion',
3316 test_network_generator_conversion_sh,
3317 # https://github.com/mesonbuild/meson/issues/2681
3318 args : exe.full_path())
3323 'systemd-sulogin-shell',
3324 ['src/sulogin-shell/sulogin-shell.c'],
3325 include_directories : includes,
3326 link_with : [libshared],
3327 install_rpath : rootlibexecdir,
3329 install_dir : rootlibexecdir)
3331 ############################################################
3334 'systemd-runtest.env',
3335 output : 'systemd-runtest.env',
3336 command : ['sh', '-c', '{ ' +
3337 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
3338 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
3340 build_by_default : true)
3342 foreach tuple : tests
3344 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3345 dependencies = tuple[2]
3346 condition = tuple.length() >= 4 ? tuple[3] : ''
3347 type = tuple.length() >= 5 ? tuple[4] : ''
3348 defs = tuple.length() >= 6 ? tuple[5] : []
3349 incs = tuple.length() >= 7 ? tuple[6] : includes
3350 parallel = tuple.length() >= 8 ? tuple[7] : true
3353 name = sources[0].split('/')[-1].split('.')[0]
3354 if type.startswith('timeout=')
3355 timeout = type.split('=')[1].to_int()
3359 if condition == '' or conf.get(condition) == 1
3363 include_directories : incs,
3364 link_with : link_with,
3365 dependencies : [versiondep,
3368 build_by_default : want_tests != 'false',
3369 install_rpath : rootlibexecdir,
3370 install : install_tests,
3371 install_dir : join_paths(testsdir, type))
3374 message('@0@ is a manual test'.format(name))
3375 elif type == 'unsafe' and want_tests != 'unsafe'
3376 message('@0@ is an unsafe test'.format(name))
3377 elif want_tests != 'false'
3383 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3388 'test-libsystemd-sym',
3389 test_libsystemd_sym_c,
3390 include_directories : includes,
3391 link_with : [libsystemd],
3392 build_by_default : want_tests != 'false',
3393 install : install_tests,
3394 install_dir : testsdir)
3395 if want_tests != 'false'
3396 test('test-libsystemd-sym', exe)
3400 'test-libsystemd-static-sym',
3401 test_libsystemd_sym_c,
3402 include_directories : includes,
3403 link_with : [install_libsystemd_static],
3404 dependencies : [threads], # threads is already included in dependencies on the library,
3405 # but does not seem to get propagated. Add here as a work-around.
3406 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3407 install : install_tests and static_libsystemd_pic,
3408 install_dir : testsdir)
3409 if want_tests != 'false' and static_libsystemd_pic
3410 test('test-libsystemd-static-sym', exe)
3416 include_directories : includes,
3417 c_args : '-Wno-deprecated-declarations',
3418 link_with : [libudev],
3419 build_by_default : want_tests != 'false',
3420 install : install_tests,
3421 install_dir : testsdir)
3422 if want_tests != 'false'
3423 test('test-libudev-sym', exe)
3427 'test-libudev-static-sym',
3429 include_directories : includes,
3430 c_args : '-Wno-deprecated-declarations',
3431 link_with : [install_libudev_static],
3432 build_by_default : want_tests != 'false' and static_libudev_pic,
3433 install : install_tests and static_libudev_pic,
3434 install_dir : testsdir)
3435 if want_tests != 'false' and static_libudev_pic
3436 test('test-libudev-static-sym', exe)
3439 ############################################################
3443 foreach tuple : fuzzers
3445 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3446 dependencies = tuple[2]
3447 defs = tuple.length() >= 4 ? tuple[3] : []
3448 incs = tuple.length() >= 5 ? tuple[4] : includes
3452 dependencies += fuzzing_engine
3454 if fuzzing_engine.found()
3455 dependencies += fuzzing_engine
3457 link_args += ['-fsanitize=fuzzer']
3460 sources += 'src/fuzz/fuzz-main.c'
3463 name = sources[0].split('/')[-1].split('.')[0]
3465 fuzzer_exes += executable(
3468 include_directories : [incs, include_directories('src/fuzz')],
3469 link_with : link_with,
3470 dependencies : dependencies,
3472 link_args: link_args,
3474 build_by_default : fuzz_tests or fuzzer_build)
3479 depends : fuzzer_exes,
3482 ############################################################
3485 subdir('sysusers.d')
3486 subdir('tmpfiles.d')
3492 subdir('shell-completion/bash')
3493 subdir('shell-completion/zsh')
3494 subdir('docs/sysvinit')
3495 subdir('docs/var-log')
3497 install_subdir('factory/etc',
3498 install_dir : factorydir)
3500 if install_sysconfdir
3501 install_data('xorg/50-systemd-user.sh',
3502 install_dir : xinitrcdir)
3504 install_data('modprobe.d/systemd.conf',
3505 install_dir : modprobedir)
3506 install_data('LICENSE.GPL2',
3510 'docs/CODING_STYLE.md',
3511 'docs/DISTRO_PORTING.md',
3512 'docs/ENVIRONMENT.md',
3514 'docs/TRANSIENT-SETTINGS.md',
3515 'docs/TRANSLATORS.md',
3516 'docs/UIDS-GIDS.md',
3517 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3518 install_dir : docdir)
3520 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3521 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3523 ############################################################
3525 check_help = find_program('tools/check-help.sh')
3527 foreach exec : public_programs
3528 name = exec.full_path().split('/')[-1]
3529 if want_tests != 'false'
3530 test('check-help-' + name,
3532 args : exec.full_path())
3536 ############################################################
3538 check_directives_sh = find_program('tools/check-directives.sh')
3540 if want_tests != 'false'
3541 test('check-directives',
3542 check_directives_sh,
3543 args : project_source_root)
3546 ############################################################
3548 # Enable tests for all supported sanitizers
3549 foreach tuple : sanitizers
3550 sanitizer = tuple[0]
3553 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3555 foreach p : fuzz_regression_tests
3556 b = p.split('/')[-2]
3557 c = p.split('/')[-1]
3559 name = '@0@:@1@'.format(b, sanitizer)
3562 if want_tests == 'false'
3563 message('Not compiling @0@ because tests is set to false'.format(name))
3565 exe = custom_target(
3569 command : [env, 'ln', '-fs',
3570 join_paths(build.full_path(), b),
3572 build_by_default : true)
3574 message('Not compiling @0@ because fuzz-tests is set to false'.format(name))
3580 test('@0@_@1@_@2@'.format(b, c, sanitizer),
3582 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
3584 args : [exe.full_path(),
3585 join_paths(project_source_root, p)])
3592 ############################################################
3595 all_files = run_command(
3597 ['--git-dir=@0@/.git'.format(project_source_root),
3600 all_files = files(all_files.stdout().split())
3605 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3608 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3612 git_contrib_sh = find_program('tools/git-contrib.sh')
3615 command : [git_contrib_sh])
3619 git_head = run_command(
3621 ['--git-dir=@0@/.git'.format(project_source_root),
3622 'rev-parse', 'HEAD']).stdout().strip()
3623 git_head_short = run_command(
3625 ['--git-dir=@0@/.git'.format(project_source_root),
3626 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3630 command : ['git', 'archive',
3631 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3633 '--prefix', 'systemd-@0@/'.format(git_head),
3637 ############################################################
3639 check_api_docs_sh = find_program('tools/check-api-docs.sh')
3642 depends : [man, libsystemd, libudev],
3643 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3645 ############################################################
3646 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3649 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3651 'build mode: @0@'.format(get_option('mode')),
3652 'split /usr: @0@'.format(split_usr),
3653 'split bin-sbin: @0@'.format(split_bin),
3654 'prefix directory: @0@'.format(prefixdir),
3655 'rootprefix directory: @0@'.format(rootprefixdir),
3656 'sysconf directory: @0@'.format(sysconfdir),
3657 'include directory: @0@'.format(includedir),
3658 'lib directory: @0@'.format(libdir),
3659 'rootlib directory: @0@'.format(rootlibdir),
3660 'SysV init scripts: @0@'.format(sysvinit_path),
3661 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3662 'PAM modules directory: @0@'.format(pamlibdir),
3663 'PAM configuration directory: @0@'.format(pamconfdir),
3664 'RPM macros directory: @0@'.format(rpmmacrosdir),
3665 'modprobe.d directory: @0@'.format(modprobedir),
3666 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3667 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3668 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3669 'bash completions directory: @0@'.format(bashcompletiondir),
3670 'zsh completions directory: @0@'.format(zshcompletiondir),
3671 'extra start script: @0@'.format(get_option('rc-local')),
3672 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3673 get_option('debug-tty')),
3674 'TTY GID: @0@'.format(tty_gid),
3675 'users GID: @0@'.format(substs.get('USERS_GID')),
3676 'system UIDs: <=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_UID_MAX'),
3677 conf.get('SYSTEM_ALLOC_UID_MIN')),
3678 'system GIDs: <=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_GID_MAX'),
3679 conf.get('SYSTEM_ALLOC_GID_MIN')),
3680 'dynamic UIDs: @0@–@1@'.format(dynamic_uid_min, dynamic_uid_max),
3681 'container UID bases: @0@–@1@'.format(container_uid_base_min, container_uid_base_max),
3682 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3683 'render group access mode: @0@'.format(get_option('group-render-mode')),
3684 'certificate root directory: @0@'.format(get_option('certificate-root')),
3685 'support URL: @0@'.format(support_url),
3686 'nobody user name: @0@'.format(nobody_user),
3687 'nobody group name: @0@'.format(nobody_group),
3688 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3689 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3691 'default DNSSEC mode: @0@'.format(default_dnssec),
3692 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3693 'default mDNS mode: @0@'.format(default_mdns),
3694 'default LLMNR mode: @0@'.format(default_llmnr),
3695 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3696 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3697 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3698 'default locale: @0@'.format(default_locale),
3699 'default user $PATH: @0@'.format(default_user_path_display),
3700 'systemd service watchdog: @0@'.format(watchdog_opt)]
3702 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3703 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3705 'default DNS servers: @0@'.format(alt_dns_servers),
3706 'default NTP servers: @0@'.format(alt_ntp_servers)]
3708 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3709 '@@0@'.format(time_epoch)).stdout().strip()
3711 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3714 'static libsystemd: @0@'.format(static_libsystemd),
3715 'static libudev: @0@'.format(static_libudev)]
3718 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3719 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3720 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3722 if conf.get('ENABLE_EFI') == 1
3723 status += 'efi arch: @0@'.format(efi_arch)
3727 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3728 'EFI CC @0@'.format(' '.join(efi_cc)),
3729 'EFI lds: @0@'.format(efi_lds),
3730 'EFI crt0: @0@'.format(efi_crt0),
3731 'EFI include directory: @0@'.format(efi_incdir)]
3765 ['compat-mutable-uid-boundaries'],
3794 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3795 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3800 ['legacy pkla', install_polkit_pkla],
3802 ['gnu-efi', have_gnu_efi],
3815 ['man pages', want_man],
3816 ['html pages', want_html],
3817 ['man page indices', want_man and have_lxml],
3822 ['adm group', get_option('adm-group')],
3823 ['wheel group', get_option('wheel-group')],
3826 ['debug mmap cache'],
3828 ['valgrind', conf.get('VALGRIND') == 1],
3829 ['trace logging', conf.get('LOG_TRACE') == 1],
3830 ['install tests', install_tests],
3831 ['link-udev-shared', get_option('link-udev-shared')],
3832 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3833 ['link-networkd-shared', get_option('link-networkd-shared')],
3834 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3835 ['kernel-install', get_option('kernel-install')],
3836 ['systemd-analyze', conf.get('ENABLE_ANALYZE') == 1],
3840 if tuple.length() >= 2
3843 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3844 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3845 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3856 'enabled features: @0@'.format(', '.join(found)),
3858 'disabled features: @0@'.format(', '.join(missing)),
3860 message('\n '.join(status))
3862 if rootprefixdir != rootprefix_default
3864 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3865 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3866 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))