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())
220 conf.set_quoted('USER_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'user'))
221 conf.set_quoted('USER_DATA_UNIT_DIR', userunitdir)
222 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
223 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
224 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
225 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
226 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
227 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
228 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
229 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
230 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
231 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
232 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
233 conf.set_quoted('ROOTPREFIX', rootprefixdir)
234 conf.set_quoted('ROOTPREFIX_NOSLASH', rootprefixdir_noslash)
235 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
236 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
237 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
238 conf.set_quoted('SYSTEM_GENERATOR_DIR', systemgeneratordir)
239 conf.set_quoted('USER_GENERATOR_DIR', usergeneratordir)
240 conf.set_quoted('SYSTEM_ENV_GENERATOR_DIR', systemenvgeneratordir)
241 conf.set_quoted('USER_ENV_GENERATOR_DIR', userenvgeneratordir)
242 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
243 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
244 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
245 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
246 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
247 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
248 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
249 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
250 conf.set_quoted('LIBDIR', libdir)
251 conf.set_quoted('ROOTLIBDIR', rootlibdir)
252 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
253 conf.set_quoted('BOOTLIBDIR', bootlibdir)
254 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
255 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
256 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
257 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
258 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
259 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
260 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
261 conf.set_quoted('SYSTEMD_HOMEWORK_PATH', join_paths(rootlibexecdir, 'systemd-homework'))
262 conf.set_quoted('SYSTEMD_USERWORK_PATH', join_paths(rootlibexecdir, 'systemd-userwork'))
263 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
264 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
265 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
267 substs.set('prefix', prefixdir)
268 substs.set('rootprefix', rootprefixdir)
269 substs.set('rootprefix_noslash', rootprefixdir_noslash)
270 substs.set('exec_prefix', prefixdir)
271 substs.set('libdir', libdir)
272 substs.set('rootlibdir', rootlibdir)
273 substs.set('includedir', includedir)
274 substs.set('sysconfdir', sysconfdir)
275 substs.set('bindir', bindir)
276 substs.set('rootbindir', rootbindir)
277 substs.set('rootlibexecdir', rootlibexecdir)
278 substs.set('systemunitdir', systemunitdir)
279 substs.set('userunitdir', userunitdir)
280 substs.set('systempresetdir', systempresetdir)
281 substs.set('userpresetdir', userpresetdir)
282 substs.set('udevhwdbdir', udevhwdbdir)
283 substs.set('udevrulesdir', udevrulesdir)
284 substs.set('udevlibexecdir', udevlibexecdir)
285 substs.set('environmentdir', environmentdir)
286 substs.set('catalogdir', catalogdir)
287 substs.set('tmpfilesdir', tmpfilesdir)
288 substs.set('sysusersdir', sysusersdir)
289 substs.set('sysctldir', sysctldir)
290 substs.set('binfmtdir', binfmtdir)
291 substs.set('modulesloaddir', modulesloaddir)
292 substs.set('modprobedir', modprobedir)
293 substs.set('systemgeneratordir', systemgeneratordir)
294 substs.set('usergeneratordir', usergeneratordir)
295 substs.set('systemenvgeneratordir', systemenvgeneratordir)
296 substs.set('userenvgeneratordir', userenvgeneratordir)
297 substs.set('systemshutdowndir', systemshutdowndir)
298 substs.set('systemsleepdir', systemsleepdir)
299 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
300 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
301 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
302 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
303 substs.set('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
304 substs.set('RC_LOCAL_PATH', get_option('rc-local'))
305 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
306 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
307 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
308 substs.set('BUILD_ROOT', project_build_root)
310 #####################################################################
312 cc = meson.get_compiler('c')
313 pkgconfig = import('pkgconfig')
314 check_compilation_sh = find_program('tools/check-compilation.sh')
315 meson_build_sh = find_program('tools/meson-build.sh')
317 want_tests = get_option('tests')
318 slow_tests = want_tests != 'false' and get_option('slow-tests')
319 fuzz_tests = want_tests != 'false' and get_option('fuzz-tests')
320 install_tests = get_option('install-tests')
322 if add_languages('cpp', required : fuzzer_build)
323 # Used only for tests
324 cxx = meson.get_compiler('cpp')
325 cxx_cmd = ' '.join(cxx.cmd_array())
331 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
332 if fuzzing_engine.found()
333 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
334 elif cc.has_argument('-fsanitize=fuzzer-no-link')
335 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
337 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
340 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
343 # Those generate many false positives, and we do not want to change the code to
345 basic_disabled_warnings = [
346 '-Wno-unused-parameter',
347 '-Wno-missing-field-initializers',
348 '-Wno-unused-result',
349 '-Wno-format-signedness',
352 possible_cc_flags = [
355 '-Wmissing-include-dirs',
356 '-Wold-style-definition',
360 '-Wsuggest-attribute=noreturn',
361 '-Werror=missing-prototypes',
362 '-Werror=implicit-function-declaration',
363 '-Werror=missing-declarations',
364 '-Werror=return-type',
365 '-Werror=incompatible-pointer-types',
367 '-Wstrict-prototypes',
369 '-Wmissing-noreturn',
370 '-Wimplicit-fallthrough=5',
373 '-Wstrict-aliasing=2',
376 '-Werror=shift-count-overflow',
377 '-Werror=shift-overflow=2',
381 # negative arguments are correctly detected starting with meson 0.46.
382 '-Wno-error=#warnings', # clang
383 '-Wno-string-plus-int', # clang
385 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
386 # optimizations enabled, producing essentially false positives.
387 '-Wno-maybe-uninitialized',
391 '-fdiagnostics-show-option',
392 '-fno-strict-aliasing',
393 '-fvisibility=hidden',
395 '-fstack-protector-strong',
396 '--param=ssp-buffer-size=4',
399 # --as-needed and --no-undefined are provided by meson by default,
400 # run mesonconf to see what is enabled
401 possible_link_flags = [
407 if cc.get_id() == 'clang'
408 possible_cc_flags += [
409 '-Wno-typedef-redefinition',
410 '-Wno-gnu-variable-sized-type-not-at-end',
414 if get_option('buildtype') != 'debug'
415 possible_cc_flags += [
416 '-ffunction-sections',
420 possible_link_flags += '-Wl,--gc-sections'
423 add_project_arguments(cc.get_supported_arguments(basic_disabled_warnings), language : 'c')
424 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
425 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
427 have = cc.has_argument('-Wzero-length-bounds')
428 conf.set10('HAVE_ZERO_LENGTH_BOUNDS', have)
432 #include <inttypes.h>
433 typedef uint64_t usec_t;
434 usec_t now(clockid_t clock);
439 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
440 add_project_arguments('-Werror=shadow', language : 'c')
444 add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp')
447 cpp = ' '.join(cc.cmd_array()) + ' -E'
449 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
451 #####################################################################
452 # compilation result tests
454 conf.set('_GNU_SOURCE', true)
455 conf.set('__SANE_USERSPACE_TYPES__', true)
456 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
458 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
459 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
460 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
461 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
465 #include <sys/stat.h>
468 foreach decl : ['char16_t',
473 # We get -1 if the size cannot be determined
474 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
476 if decl == 'struct statx'
478 want_linux_stat_h = false
480 have = cc.sizeof(decl,
481 prefix : decl_headers + '#include <linux/stat.h>',
482 args : '-D_GNU_SOURCE') > 0
483 want_linux_stat_h = have
487 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
490 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
492 foreach ident : ['secure_getenv', '__secure_getenv']
493 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
497 ['memfd_create', '''#include <sys/mman.h>'''],
498 ['gettid', '''#include <sys/types.h>
499 #include <unistd.h>'''],
500 ['pivot_root', '''#include <stdlib.h>
501 #include <unistd.h>'''], # no known header declares pivot_root
502 ['name_to_handle_at', '''#include <sys/types.h>
503 #include <sys/stat.h>
504 #include <fcntl.h>'''],
505 ['setns', '''#include <sched.h>'''],
506 ['renameat2', '''#include <stdio.h>
507 #include <fcntl.h>'''],
508 ['kcmp', '''#include <linux/kcmp.h>'''],
509 ['keyctl', '''#include <sys/types.h>
510 #include <keyutils.h>'''],
511 ['copy_file_range', '''#include <sys/syscall.h>
512 #include <unistd.h>'''],
513 ['bpf', '''#include <sys/syscall.h>
514 #include <unistd.h>'''],
515 ['statx', '''#include <sys/types.h>
516 #include <sys/stat.h>
517 #include <unistd.h>'''],
518 ['explicit_bzero' , '''#include <string.h>'''],
519 ['reallocarray', '''#include <malloc.h>'''],
520 ['set_mempolicy', '''#include <stdlib.h>
521 #include <unistd.h>'''],
522 ['get_mempolicy', '''#include <stdlib.h>
523 #include <unistd.h>'''],
524 ['pidfd_send_signal', '''#include <stdlib.h>
527 #include <sys/wait.h>'''],
528 ['pidfd_open', '''#include <stdlib.h>
531 #include <sys/wait.h>'''],
532 ['rt_sigqueueinfo', '''#include <stdlib.h>
535 #include <sys/wait.h>'''],
536 ['mallinfo', '''#include <malloc.h>'''],
537 ['close_range', '''#include <unistd.h>'''],
540 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
541 conf.set10('HAVE_' + ident[0].to_upper(), have)
544 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
545 conf.set10('USE_SYS_RANDOM_H', true)
546 conf.set10('HAVE_GETRANDOM', true)
548 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
549 conf.set10('USE_SYS_RANDOM_H', false)
550 conf.set10('HAVE_GETRANDOM', have)
553 #####################################################################
555 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
557 get_option('version-tag'),
558 meson.project_version()]
561 input : 'src/version/version.h.in',
562 output : 'version.h',
565 versiondep = declare_dependency(sources: version_h)
567 sed = find_program('sed')
568 awk = find_program('awk')
569 m4 = find_program('m4')
570 stat = find_program('stat')
571 git = find_program('git', required : false)
572 env = find_program('env')
573 perl = find_program('perl', required : false)
575 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
576 mkdir_p = 'mkdir -p $DESTDIR/@0@'
577 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
578 splash_bmp = files('test/splash.bmp')
580 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
581 # /usr/sbin, /sbin, and fall back to the default from middle column.
582 progs = [['quotaon', '/usr/sbin/quotaon' ],
583 ['quotacheck', '/usr/sbin/quotacheck' ],
584 ['kmod', '/usr/bin/kmod' ],
585 ['kexec', '/usr/sbin/kexec' ],
586 ['sulogin', '/usr/sbin/sulogin' ],
587 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
588 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
589 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
590 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
591 ['nologin', '/usr/sbin/nologin', ],
594 path = get_option(prog[0] + '-path')
596 message('Using @1@ for @0@'.format(prog[0], path))
598 exe = find_program(prog[0],
599 '/usr/sbin/' + prog[0],
602 path = exe.found() ? exe.path() : prog[1]
604 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
605 conf.set_quoted(name, path)
606 substs.set(name, path)
609 conf.set_quoted('TELINIT', get_option('telinit-path'))
611 if run_command('ln', '--relative', '--help').returncode() != 0
612 error('ln does not support --relative (added in coreutils 8.16)')
615 ############################################################
617 gperf = find_program('gperf')
619 gperf_test_format = '''
621 const char * in_word_set(const char *, @0@);
624 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
625 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
626 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
627 if cc.compiles(gperf_test)
628 gperf_len_type = 'size_t'
630 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
631 if cc.compiles(gperf_test)
632 gperf_len_type = 'unsigned'
634 error('unable to determine gperf len type')
637 message('gperf len type is @0@'.format(gperf_len_type))
638 conf.set('GPERF_LEN_TYPE', gperf_len_type,
639 description : 'The type of gperf "len" parameter')
641 ############################################################
643 if not cc.has_header('sys/capability.h')
644 error('POSIX caps headers not found')
646 foreach header : ['crypt.h',
648 'linux/vm_sockets.h',
650 'valgrind/memcheck.h',
651 'valgrind/valgrind.h',
654 conf.set10('HAVE_' + header.underscorify().to_upper(),
655 cc.has_header(header))
658 ############################################################
660 fallback_hostname = get_option('fallback-hostname')
661 if fallback_hostname == '' or fallback_hostname[0] == '.' or fallback_hostname[0] == '-'
662 error('Invalid fallback-hostname configuration')
663 # A more extensive test is done in test-hostname-util. Let's catch
664 # the most obvious errors here so we don't fail with an assert later.
666 conf.set_quoted('FALLBACK_HOSTNAME', fallback_hostname)
668 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
669 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
671 default_hierarchy = get_option('default-hierarchy')
672 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
673 description : 'default cgroup hierarchy as string')
674 if default_hierarchy == 'legacy'
675 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
676 elif default_hierarchy == 'hybrid'
677 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
679 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
682 default_net_naming_scheme = get_option('default-net-naming-scheme')
683 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
685 time_epoch = get_option('time-epoch')
687 time_epoch = run_command('sh', ['-c', 'echo "$SOURCE_DATE_EPOCH"']).stdout().strip()
688 if time_epoch == '' and git.found() and run_command('test', '-e', '.git').returncode() == 0
689 # If we're in a git repository, use the creation time of the latest git tag.
690 latest_tag = run_command('git', 'describe', '--abbrev=0', '--tags').stdout().strip()
691 time_epoch = run_command('git', 'log', '-1', '--format=%at', latest_tag).stdout()
695 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout()
697 time_epoch = time_epoch.to_int()
699 conf.set('TIME_EPOCH', time_epoch)
701 foreach tuple : [['system-alloc-uid-min', 'SYS_UID_MIN', 1], # Also see login.defs(5).
702 ['system-uid-max', 'SYS_UID_MAX', 999],
703 ['system-alloc-gid-min', 'SYS_GID_MIN', 1],
704 ['system-gid-max', 'SYS_GID_MAX', 999]]
705 v = get_option(tuple[0])
709 '/^\s*@0@\s+/ { uid=$2 } END { print uid }'.format(tuple[1]),
710 '/etc/login.defs').stdout().strip()
717 conf.set(tuple[0].underscorify().to_upper(), v)
718 substs.set(tuple[0].underscorify().to_upper(), v)
720 if conf.get('SYSTEM_ALLOC_UID_MIN') >= conf.get('SYSTEM_UID_MAX')
721 error('Invalid uid allocation range')
723 if conf.get('SYSTEM_ALLOC_GID_MIN') >= conf.get('SYSTEM_GID_MAX')
724 error('Invalid gid allocation range')
727 dynamic_uid_min = get_option('dynamic-uid-min')
728 dynamic_uid_max = get_option('dynamic-uid-max')
729 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
730 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
731 substs.set('dynamicuidmin', dynamic_uid_min)
732 substs.set('dynamicuidmax', dynamic_uid_max)
734 container_uid_base_min = get_option('container-uid-base-min')
735 container_uid_base_max = get_option('container-uid-base-max')
736 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
737 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
738 substs.set('containeruidbasemin', container_uid_base_min)
739 substs.set('containeruidbasemax', container_uid_base_max)
741 nobody_user = get_option('nobody-user')
742 nobody_group = get_option('nobody-group')
744 if not meson.is_cross_build()
745 getent_result = run_command('getent', 'passwd', '65534')
746 if getent_result.returncode() == 0
747 name = getent_result.stdout().split(':')[0]
748 if name != nobody_user
750 '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) +
751 'Your build will result in an user table setup that is incompatible with the local system.')
754 id_result = run_command('id', '-u', nobody_user)
755 if id_result.returncode() == 0
756 id = id_result.stdout().to_int()
759 '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) +
760 'Your build will result in an user table setup that is incompatible with the local system.')
764 getent_result = run_command('getent', 'group', '65534')
765 if getent_result.returncode() == 0
766 name = getent_result.stdout().split(':')[0]
767 if name != nobody_group
769 '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) +
770 'Your build will result in an group table setup that is incompatible with the local system.')
773 id_result = run_command('id', '-g', nobody_group)
774 if id_result.returncode() == 0
775 id = id_result.stdout().to_int()
778 '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) +
779 'Your build will result in an group table setup that is incompatible with the local system.')
783 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
785 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
786 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
789 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
790 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
791 substs.set('NOBODY_USER_NAME', nobody_user)
792 substs.set('NOBODY_GROUP_NAME', nobody_group)
794 tty_gid = get_option('tty-gid')
795 conf.set('TTY_GID', tty_gid)
796 substs.set('TTY_GID', tty_gid)
798 # Ensure provided GID argument is numeric, otherwise fall back to default assignment
799 users_gid = get_option('users-gid')
800 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
802 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
803 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
805 dev_kvm_mode = get_option('dev-kvm-mode')
806 substs.set('DEV_KVM_MODE', dev_kvm_mode)
807 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
808 group_render_mode = get_option('group-render-mode')
809 substs.set('GROUP_RENDER_MODE', group_render_mode)
810 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
812 kill_user_processes = get_option('default-kill-user-processes')
813 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
814 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
815 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
817 dns_servers = get_option('dns-servers')
818 conf.set_quoted('DNS_SERVERS', dns_servers)
819 substs.set('DNS_SERVERS', dns_servers)
821 ntp_servers = get_option('ntp-servers')
822 conf.set_quoted('NTP_SERVERS', ntp_servers)
823 substs.set('NTP_SERVERS', ntp_servers)
825 default_locale = get_option('default-locale')
826 if default_locale == ''
827 if not meson.is_cross_build()
828 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
829 default_locale = run_command(choose_default_locale_sh).stdout().strip()
831 default_locale = 'C.UTF-8'
834 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
836 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
838 service_watchdog = get_option('service-watchdog')
839 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
840 substs.set('SERVICE_WATCHDOG', watchdog_value)
842 substs.set('SUSHELL', get_option('debug-shell'))
843 substs.set('DEBUGTTY', get_option('debug-tty'))
844 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
846 enable_debug_hashmap = false
847 enable_debug_mmap_cache = false
848 enable_debug_siphash = false
849 foreach name : get_option('debug-extra')
851 enable_debug_hashmap = true
852 elif name == 'mmap-cache'
853 enable_debug_mmap_cache = true
854 elif name == 'siphash'
855 enable_debug_siphash = true
857 message('unknown debug option "@0@", ignoring'.format(name))
860 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
861 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
862 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
864 conf.set10('VALGRIND', get_option('valgrind'))
865 conf.set10('LOG_TRACE', get_option('log-trace'))
867 default_user_path = get_option('user-path')
868 if default_user_path != ''
869 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
870 default_user_path_display = default_user_path
872 # meson 0.49 fails when ?: is used in .format()
873 default_user_path_display = '(same as system services)'
877 #####################################################################
879 threads = dependency('threads')
880 librt = cc.find_library('rt')
881 libm = cc.find_library('m')
882 libdl = cc.find_library('dl')
883 libcrypt = cc.find_library('crypt')
885 crypt_header = conf.get('HAVE_CRYPT_H') == 1 ? '''#include <crypt.h>''' : '''#include <unistd.h>'''
887 ['crypt_ra', crypt_header],
888 ['crypt_preferred_method', crypt_header],
889 ['crypt_gensalt_ra', crypt_header]]
891 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE',
892 dependencies : libcrypt)
893 conf.set10('HAVE_' + ident[0].to_upper(), have)
896 libcap = dependency('libcap', required : false)
897 if not libcap.found()
898 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
899 libcap = cc.find_library('cap')
902 libmount = dependency('mount',
903 version : fuzzer_build ? '>= 0' : '>= 2.30')
905 want_libfdisk = get_option('fdisk')
906 if want_libfdisk != 'false' and not skip_deps
907 libfdisk = dependency('fdisk',
909 required : want_libfdisk == 'true')
910 have = libfdisk.found()
915 conf.set10('HAVE_LIBFDISK', have)
917 want_pwquality = get_option('pwquality')
918 if want_pwquality != 'false' and not skip_deps
919 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
920 have = libpwquality.found()
925 conf.set10('HAVE_PWQUALITY', have)
927 want_seccomp = get_option('seccomp')
928 if want_seccomp != 'false' and not skip_deps
929 libseccomp = dependency('libseccomp',
930 version : '>= 2.3.1',
931 required : want_seccomp == 'true')
932 have = libseccomp.found()
937 conf.set10('HAVE_SECCOMP', have)
939 want_selinux = get_option('selinux')
940 if want_selinux != 'false' and not skip_deps
941 libselinux = dependency('libselinux',
942 version : '>= 2.1.9',
943 required : want_selinux == 'true')
944 have = libselinux.found()
949 conf.set10('HAVE_SELINUX', have)
951 want_apparmor = get_option('apparmor')
952 if want_apparmor != 'false' and not skip_deps
953 libapparmor = dependency('libapparmor',
955 required : want_apparmor == 'true')
956 have = libapparmor.found()
961 conf.set10('HAVE_APPARMOR', have)
963 smack_run_label = get_option('smack-run-label')
964 if smack_run_label != ''
965 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
968 want_polkit = get_option('polkit')
969 install_polkit = false
970 install_polkit_pkla = false
971 if want_polkit != 'false' and not skip_deps
972 install_polkit = true
974 libpolkit = dependency('polkit-gobject-1',
976 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
977 message('Old polkit detected, will install pkla files')
978 install_polkit_pkla = true
981 conf.set10('ENABLE_POLKIT', install_polkit)
983 want_acl = get_option('acl')
984 if want_acl != 'false' and not skip_deps
985 libacl = cc.find_library('acl', required : want_acl == 'true')
986 have = libacl.found()
991 conf.set10('HAVE_ACL', have)
993 want_audit = get_option('audit')
994 if want_audit != 'false' and not skip_deps
995 libaudit = dependency('audit', required : want_audit == 'true')
996 have = libaudit.found()
1001 conf.set10('HAVE_AUDIT', have)
1003 want_blkid = get_option('blkid')
1004 if want_blkid != 'false' and not skip_deps
1005 libblkid = dependency('blkid', required : want_blkid == 'true')
1006 have = libblkid.found()
1011 conf.set10('HAVE_BLKID', have)
1013 want_kmod = get_option('kmod')
1014 if want_kmod != 'false' and not skip_deps
1015 libkmod = dependency('libkmod',
1017 required : want_kmod == 'true')
1018 have = libkmod.found()
1023 conf.set10('HAVE_KMOD', have)
1025 want_pam = get_option('pam')
1026 if want_pam != 'false' and not skip_deps
1027 libpam = cc.find_library('pam', required : want_pam == 'true')
1028 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
1029 have = libpam.found() and libpam_misc.found()
1035 conf.set10('HAVE_PAM', have)
1037 want_microhttpd = get_option('microhttpd')
1038 if want_microhttpd != 'false' and not skip_deps
1039 libmicrohttpd = dependency('libmicrohttpd',
1040 version : '>= 0.9.33',
1041 required : want_microhttpd == 'true')
1042 have = libmicrohttpd.found()
1047 conf.set10('HAVE_MICROHTTPD', have)
1049 want_libcryptsetup = get_option('libcryptsetup')
1050 if want_libcryptsetup != 'false' and not skip_deps
1051 libcryptsetup = dependency('libcryptsetup',
1052 version : '>= 2.0.1',
1053 required : want_libcryptsetup == 'true')
1054 have = libcryptsetup.found()
1056 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1057 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
1058 conf.set10('HAVE_CRYPT_ACTIVATE_BY_SIGNED_KEY',
1059 have and cc.has_function('crypt_activate_by_signed_key', dependencies : libcryptsetup))
1064 conf.set10('HAVE_LIBCRYPTSETUP', have)
1066 want_libcurl = get_option('libcurl')
1067 if want_libcurl != 'false' and not skip_deps
1068 libcurl = dependency('libcurl',
1069 version : '>= 7.32.0',
1070 required : want_libcurl == 'true')
1071 have = libcurl.found()
1076 conf.set10('HAVE_LIBCURL', have)
1078 want_libidn = get_option('libidn')
1079 want_libidn2 = get_option('libidn2')
1080 if want_libidn == 'true' and want_libidn2 == 'true'
1081 error('libidn and libidn2 cannot be requested simultaneously')
1084 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1085 libidn = dependency('libidn2',
1086 required : want_libidn2 == 'true')
1087 have = libidn.found()
1092 conf.set10('HAVE_LIBIDN2', have)
1093 if not have and want_libidn != 'false' and not skip_deps
1094 # libidn is used for both libidn and libidn2 objects
1095 libidn = dependency('libidn',
1096 required : want_libidn == 'true')
1097 have = libidn.found()
1101 conf.set10('HAVE_LIBIDN', have)
1103 want_libiptc = get_option('libiptc')
1104 if want_libiptc != 'false' and not skip_deps
1105 libiptc = dependency('libiptc',
1106 required : want_libiptc == 'true')
1107 have = libiptc.found()
1112 conf.set10('HAVE_LIBIPTC', have)
1114 want_qrencode = get_option('qrencode')
1115 if want_qrencode != 'false' and not skip_deps
1116 libqrencode = dependency('libqrencode',
1117 required : want_qrencode == 'true')
1118 have = libqrencode.found()
1123 conf.set10('HAVE_QRENCODE', have)
1125 want_gcrypt = get_option('gcrypt')
1126 if want_gcrypt != 'false' and not skip_deps
1127 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1128 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1129 have = libgcrypt.found() and libgpg_error.found()
1134 # link to neither of the libs if one is not found
1138 conf.set10('HAVE_GCRYPT', have)
1140 want_gnutls = get_option('gnutls')
1141 if want_gnutls != 'false' and not skip_deps
1142 libgnutls = dependency('gnutls',
1143 version : '>= 3.1.4',
1144 required : want_gnutls == 'true')
1145 have = libgnutls.found()
1150 conf.set10('HAVE_GNUTLS', have)
1152 want_openssl = get_option('openssl')
1153 if want_openssl != 'false' and not skip_deps
1154 libopenssl = dependency('openssl',
1155 version : '>= 1.1.0',
1156 required : want_openssl == 'true')
1157 have = libopenssl.found()
1162 conf.set10('HAVE_OPENSSL', have)
1164 want_p11kit = get_option('p11kit')
1165 if want_p11kit != 'false' and not skip_deps
1166 libp11kit = dependency('p11-kit-1',
1167 version : '>= 0.23.3',
1168 required : want_p11kit == 'true')
1169 have = libp11kit.found()
1174 conf.set10('HAVE_P11KIT', have)
1176 want_libfido2 = get_option('libfido2')
1177 if want_libfido2 != 'false' and not skip_deps
1178 libfido2 = dependency('libfido2',
1179 required : want_libfido2 == 'true')
1180 have = libfido2.found()
1185 conf.set10('HAVE_LIBFIDO2', have)
1187 want_elfutils = get_option('elfutils')
1188 if want_elfutils != 'false' and not skip_deps
1189 libdw = dependency('libdw',
1190 required : want_elfutils == 'true')
1191 have = libdw.found()
1196 conf.set10('HAVE_ELFUTILS', have)
1198 want_zlib = get_option('zlib')
1199 if want_zlib != 'false' and not skip_deps
1200 libz = dependency('zlib',
1201 required : want_zlib == 'true')
1207 conf.set10('HAVE_ZLIB', have)
1209 want_bzip2 = get_option('bzip2')
1210 if want_bzip2 != 'false' and not skip_deps
1211 libbzip2 = cc.find_library('bz2',
1212 required : want_bzip2 == 'true')
1213 have = libbzip2.found()
1218 conf.set10('HAVE_BZIP2', have)
1220 want_xz = get_option('xz')
1221 if want_xz != 'false' and not skip_deps
1222 libxz = dependency('liblzma',
1223 required : want_xz == 'true')
1224 have_xz = libxz.found()
1229 conf.set10('HAVE_XZ', have_xz)
1231 want_lz4 = get_option('lz4')
1232 if want_lz4 != 'false' and not skip_deps
1233 liblz4 = dependency('liblz4',
1234 version : '>= 1.3.0',
1235 required : want_lz4 == 'true')
1236 have_lz4 = liblz4.found()
1241 conf.set10('HAVE_LZ4', have_lz4)
1243 want_zstd = get_option('zstd')
1244 if want_zstd != 'false' and not skip_deps
1245 libzstd = dependency('libzstd',
1246 required : want_zstd == 'true',
1247 version : '>= 1.4.0')
1248 have_zstd = libzstd.found()
1253 conf.set10('HAVE_ZSTD', have_zstd)
1255 conf.set10('HAVE_COMPRESSION', have_xz or have_lz4 or have_zstd)
1257 want_xkbcommon = get_option('xkbcommon')
1258 if want_xkbcommon != 'false' and not skip_deps
1259 libxkbcommon = dependency('xkbcommon',
1260 version : '>= 0.3.0',
1261 required : want_xkbcommon == 'true')
1262 have = libxkbcommon.found()
1267 conf.set10('HAVE_XKBCOMMON', have)
1269 want_pcre2 = get_option('pcre2')
1270 if want_pcre2 != 'false'
1271 libpcre2 = dependency('libpcre2-8',
1272 required : want_pcre2 == 'true')
1273 have = libpcre2.found()
1278 conf.set10('HAVE_PCRE2', have)
1280 want_glib = get_option('glib')
1281 if want_glib != 'false' and not skip_deps
1282 libglib = dependency('glib-2.0',
1283 version : '>= 2.22.0',
1284 required : want_glib == 'true')
1285 libgobject = dependency('gobject-2.0',
1286 version : '>= 2.22.0',
1287 required : want_glib == 'true')
1288 libgio = dependency('gio-2.0',
1289 required : want_glib == 'true')
1290 have = libglib.found() and libgobject.found() and libgio.found()
1297 conf.set10('HAVE_GLIB', have)
1299 want_dbus = get_option('dbus')
1300 if want_dbus != 'false' and not skip_deps
1301 libdbus = dependency('dbus-1',
1302 version : '>= 1.3.2',
1303 required : want_dbus == 'true')
1304 have = libdbus.found()
1309 conf.set10('HAVE_DBUS', have)
1311 default_dnssec = get_option('default-dnssec')
1313 default_dnssec = 'no'
1315 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1316 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1317 default_dnssec = 'no'
1319 conf.set('DEFAULT_DNSSEC_MODE',
1320 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1321 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1323 dns_over_tls = get_option('dns-over-tls')
1324 if dns_over_tls != 'false'
1325 if dns_over_tls == 'openssl'
1328 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1329 if dns_over_tls == 'gnutls' and not have_gnutls
1330 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1333 if dns_over_tls == 'gnutls' or have_gnutls
1334 have_openssl = false
1336 have_openssl = conf.get('HAVE_OPENSSL') == 1
1337 if dns_over_tls != 'auto' and not have_openssl
1338 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1339 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1342 have = have_gnutls or have_openssl
1346 have_openssl = false
1348 conf.set10('ENABLE_DNS_OVER_TLS', have)
1349 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1350 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1352 default_dns_over_tls = get_option('default-dns-over-tls')
1354 default_dns_over_tls = 'no'
1356 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1357 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.')
1358 default_dns_over_tls = 'no'
1360 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1361 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1362 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1364 default_mdns = get_option('default-mdns')
1365 conf.set('DEFAULT_MDNS_MODE',
1366 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
1367 substs.set('DEFAULT_MDNS_MODE', default_mdns)
1369 default_llmnr = get_option('default-llmnr')
1370 conf.set('DEFAULT_LLMNR_MODE',
1371 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
1372 substs.set('DEFAULT_LLMNR_MODE', default_llmnr)
1374 want_repart = get_option('repart')
1375 if want_repart != 'false'
1376 have = (conf.get('HAVE_OPENSSL') == 1 and
1377 conf.get('HAVE_LIBFDISK') == 1)
1378 if want_repart == 'true' and not have
1379 error('repart support was requested, but dependencies are not available')
1384 conf.set10('ENABLE_REPART', have)
1386 want_importd = get_option('importd')
1387 if want_importd != 'false'
1388 have = (conf.get('HAVE_LIBCURL') == 1 and
1389 conf.get('HAVE_ZLIB') == 1 and
1390 conf.get('HAVE_XZ') == 1 and
1391 conf.get('HAVE_GCRYPT') == 1)
1392 if want_importd == 'true' and not have
1393 error('importd support was requested, but dependencies are not available')
1398 conf.set10('ENABLE_IMPORTD', have)
1400 want_homed = get_option('homed')
1401 if want_homed != 'false'
1402 have = (conf.get('HAVE_OPENSSL') == 1 and
1403 conf.get('HAVE_LIBFDISK') == 1 and
1404 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1405 if want_homed == 'true' and not have
1406 error('homed support was requested, but dependencies are not available')
1411 conf.set10('ENABLE_HOMED', have)
1413 have = have and conf.get('HAVE_PAM') == 1
1414 conf.set10('ENABLE_PAM_HOME', have)
1416 have = get_option('oomd')
1418 have = get_option('mode') == 'developer'
1420 have = have == 'true'
1421 if have and get_option('mode') != 'developer'
1422 warning('oomd is not ready for release mode (yet)')
1425 conf.set10('ENABLE_OOMD', have)
1426 substs.set10('ENABLE_OOMD', have)
1428 want_remote = get_option('remote')
1429 if want_remote != 'false'
1430 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1431 conf.get('HAVE_LIBCURL') == 1]
1432 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1433 # it's possible to build one without the other. Complain only if
1434 # support was explicitly requested. The auxiliary files like sysusers
1435 # config should be installed when any of the programs are built.
1436 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1437 error('remote support was requested, but dependencies are not available')
1439 have = have_deps[0] or have_deps[1]
1443 conf.set10('ENABLE_REMOTE', have)
1445 foreach term : ['analyze',
1459 'compat-mutable-uid-boundaries',
1483 have = get_option(term)
1484 name = 'ENABLE_' + term.underscorify().to_upper()
1485 conf.set10(name, have)
1486 substs.set10(name, have)
1489 enable_sysusers = conf.get('ENABLE_SYSUSERS') == 1
1491 foreach tuple : [['nss-mymachines', 'machined'],
1492 ['nss-resolve', 'resolve']]
1493 want = get_option(tuple[0])
1495 have = get_option(tuple[1])
1496 if want == 'true' and not have
1497 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1502 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1503 conf.set10(name, have)
1507 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1508 'ENABLE_NSS_MYMACHINES',
1509 'ENABLE_NSS_RESOLVE',
1510 'ENABLE_NSS_SYSTEMD']
1511 if conf.get(term) == 1
1515 conf.set10('ENABLE_NSS', enable_nss)
1517 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1522 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1524 #####################################################################
1526 if get_option('efi')
1527 efi_arch = host_machine.cpu_family()
1529 if efi_arch == 'x86'
1530 EFI_MACHINE_TYPE_NAME = 'ia32'
1531 gnu_efi_arch = 'ia32'
1532 elif efi_arch == 'x86_64'
1533 EFI_MACHINE_TYPE_NAME = 'x64'
1534 gnu_efi_arch = 'x86_64'
1535 elif efi_arch == 'arm'
1536 EFI_MACHINE_TYPE_NAME = 'arm'
1537 gnu_efi_arch = 'arm'
1538 elif efi_arch == 'aarch64'
1539 EFI_MACHINE_TYPE_NAME = 'aa64'
1540 gnu_efi_arch = 'aarch64'
1542 EFI_MACHINE_TYPE_NAME = ''
1547 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1549 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1553 conf.set10('ENABLE_EFI', have)
1555 #####################################################################
1557 config_h = configure_file(
1558 output : 'config.h',
1559 configuration : conf)
1561 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1563 includes = include_directories('src/basic',
1568 'src/journal-remote',
1569 'src/libsystemd-network',
1570 'src/libsystemd/sd-bus',
1571 'src/libsystemd/sd-device',
1572 'src/libsystemd/sd-event',
1573 'src/libsystemd/sd-hwdb',
1574 'src/libsystemd/sd-id128',
1575 'src/libsystemd/sd-netlink',
1576 'src/libsystemd/sd-network',
1577 'src/libsystemd/sd-resolve',
1585 'src/time-wait-sync',
1588 'src/xdg-autostart-generator',
1591 add_project_arguments('-include', 'config.h', language : 'c')
1593 generate_gperfs = find_program('tools/generate-gperfs.py')
1597 subdir('src/systemd')
1599 subdir('src/libsystemd')
1600 subdir('src/libsystemd-network')
1601 subdir('src/journal')
1604 libjournal_core = static_library(
1606 libjournal_core_sources,
1608 include_directories : includes,
1611 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1612 libsystemd = shared_library(
1615 version : libsystemd_version,
1616 include_directories : includes,
1617 link_args : ['-shared',
1618 '-Wl,--version-script=' + libsystemd_sym_path],
1619 link_with : [libbasic,
1621 link_whole : [libsystemd_static,
1623 dependencies : [threads,
1628 link_depends : libsystemd_sym,
1630 install_dir : rootlibdir)
1632 static_libsystemd = get_option('static-libsystemd')
1633 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1635 install_libsystemd_static = static_library(
1638 journal_client_sources,
1640 basic_gcrypt_sources,
1642 include_directories : includes,
1643 build_by_default : static_libsystemd != 'false',
1644 install : static_libsystemd != 'false',
1645 install_dir : rootlibdir,
1646 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1647 dependencies : [threads,
1657 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1659 ############################################################
1661 autosuspend_update_sh = find_program('tools/autosuspend-update.sh')
1662 hwdb_update_sh = find_program('tools/hwdb-update.sh')
1663 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1664 make_directive_index_py = find_program('tools/make-directive-index.py')
1665 make_man_index_py = find_program('tools/make-man-index.py')
1666 syscall_names_update_sh = find_program('tools/syscall-names-update.sh')
1667 xml_helper_py = find_program('tools/xml_helper.py')
1668 update_dbus_docs_py = find_program('tools/update-dbus-docs.py')
1670 ############################################################
1672 # binaries that have --help and are intended for use by humans,
1673 # usually, but not always, installed in /bin.
1674 public_programs = []
1676 subdir('src/libudev')
1677 subdir('src/shared')
1679 subdir('src/shutdown')
1681 subdir('src/network')
1683 subdir('src/analyze')
1684 subdir('src/journal-remote')
1685 subdir('src/coredump')
1686 subdir('src/pstore')
1688 subdir('src/hostname')
1689 subdir('src/import')
1690 subdir('src/partition')
1691 subdir('src/kernel-install')
1692 subdir('src/locale')
1693 subdir('src/machine')
1694 subdir('src/portable')
1695 subdir('src/userdb')
1697 subdir('src/nspawn')
1698 subdir('src/resolve')
1699 subdir('src/timedate')
1700 subdir('src/timesync')
1701 subdir('src/tmpfiles')
1702 subdir('src/vconsole')
1703 subdir('src/boot/efi')
1710 ############################################################
1712 # only static linking apart from libdl, to make sure that the
1713 # module is linked to all libraries that it uses.
1714 test_dlopen = executable(
1718 include_directories : includes,
1719 link_with : [libbasic],
1720 dependencies : [libdl],
1721 build_by_default : want_tests != 'false')
1723 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1724 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h src/nss-systemd/nss-systemd.h'],
1725 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1726 ['resolve', 'ENABLE_NSS_RESOLVE']]
1728 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1732 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1733 version_script_arg = join_paths(project_source_root, sym)
1735 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1736 if tuple.length() > 2
1737 sources += tuple[2].split()
1740 nss = shared_library(
1745 include_directories : includes,
1746 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1747 link_args : ['-Wl,-z,nodelete',
1749 '-Wl,--version-script=' + version_script_arg],
1750 link_with : [libsystemd_static,
1753 dependencies : [threads,
1757 install_dir : rootlibdir)
1759 # We cannot use shared_module because it does not support version suffix.
1760 # Unfortunately shared_library insists on creating the symlink…
1761 meson.add_install_script('sh', '-c',
1762 'rm $DESTDIR@0@/libnss_@1@.so'
1763 .format(rootlibdir, module))
1765 if want_tests != 'false'
1766 test('dlopen-nss_' + module,
1768 # path to dlopen must include a slash
1769 args : nss.full_path())
1774 ############################################################
1779 include_directories : includes,
1780 link_with : [libcore,
1782 dependencies : [versiondep,
1789 install_rpath : rootlibexecdir,
1791 install_dir : rootlibexecdir)
1793 meson.add_install_script(meson_make_symlink,
1794 join_paths(rootlibexecdir, 'systemd'),
1795 join_paths(rootsbindir, 'init'))
1797 public_programs += executable(
1799 systemd_analyze_sources,
1800 include_directories : includes,
1801 link_with : [libcore,
1803 dependencies : [versiondep,
1810 install_rpath : rootlibexecdir,
1811 install : conf.get('ENABLE_ANALYZE'))
1815 systemd_journald_sources,
1816 include_directories : includes,
1817 link_with : [libjournal_core,
1819 dependencies : [threads,
1824 install_rpath : rootlibexecdir,
1826 install_dir : rootlibexecdir)
1828 public_programs += executable(
1830 systemd_cat_sources,
1831 include_directories : includes,
1832 link_with : [libjournal_core,
1834 dependencies : [threads],
1835 install_rpath : rootlibexecdir,
1838 public_programs += executable(
1841 include_directories : includes,
1842 link_with : [libshared],
1843 dependencies : [threads,
1849 install_rpath : rootlibexecdir,
1851 install_dir : rootbindir)
1854 'systemd-getty-generator',
1855 'src/getty-generator/getty-generator.c',
1856 include_directories : includes,
1857 link_with : [libshared],
1858 install_rpath : rootlibexecdir,
1860 install_dir : systemgeneratordir)
1863 'systemd-debug-generator',
1864 'src/debug-generator/debug-generator.c',
1865 include_directories : includes,
1866 link_with : [libshared],
1867 install_rpath : rootlibexecdir,
1869 install_dir : systemgeneratordir)
1872 'systemd-run-generator',
1873 'src/run-generator/run-generator.c',
1874 include_directories : includes,
1875 link_with : [libshared],
1876 install_rpath : rootlibexecdir,
1878 install_dir : systemgeneratordir)
1881 'systemd-fstab-generator',
1882 'src/fstab-generator/fstab-generator.c',
1883 include_directories : includes,
1884 link_with : [libcore_shared,
1886 install_rpath : rootlibexecdir,
1888 install_dir : systemgeneratordir)
1890 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1892 '30-systemd-environment-d-generator',
1893 'src/environment-d-generator/environment-d-generator.c',
1894 include_directories : includes,
1895 link_with : [libshared],
1896 install_rpath : rootlibexecdir,
1898 install_dir : userenvgeneratordir)
1900 meson.add_install_script(meson_make_symlink,
1901 join_paths(sysconfdir, 'environment'),
1902 join_paths(environmentdir, '99-environment.conf'))
1905 if conf.get('ENABLE_HIBERNATE') == 1
1907 'systemd-hibernate-resume-generator',
1908 'src/hibernate-resume/hibernate-resume-generator.c',
1909 include_directories : includes,
1910 link_with : [libshared],
1911 install_rpath : rootlibexecdir,
1913 install_dir : systemgeneratordir)
1916 'systemd-hibernate-resume',
1917 'src/hibernate-resume/hibernate-resume.c',
1918 include_directories : includes,
1919 link_with : [libshared],
1920 install_rpath : rootlibexecdir,
1922 install_dir : rootlibexecdir)
1925 if conf.get('HAVE_BLKID') == 1
1927 'systemd-gpt-auto-generator',
1928 'src/gpt-auto-generator/gpt-auto-generator.c',
1929 'src/shared/blkid-util.h',
1930 include_directories : includes,
1931 link_with : [libshared],
1932 dependencies : libblkid,
1933 install_rpath : rootlibexecdir,
1935 install_dir : systemgeneratordir)
1937 public_programs += executable(
1939 'src/dissect/dissect.c',
1940 include_directories : includes,
1941 link_with : [libshared],
1942 install_rpath : rootlibexecdir,
1946 if conf.get('ENABLE_RESOLVE') == 1
1949 systemd_resolved_sources,
1950 include_directories : includes,
1951 link_with : [libshared,
1953 libsystemd_resolve_core],
1954 dependencies : systemd_resolved_dependencies,
1955 install_rpath : rootlibexecdir,
1957 install_dir : rootlibexecdir)
1959 public_programs += executable(
1962 include_directories : includes,
1963 link_with : [libshared,
1965 libsystemd_resolve_core],
1966 dependencies : [threads,
1970 install_rpath : rootlibexecdir,
1973 meson.add_install_script(meson_make_symlink,
1974 join_paths(bindir, 'resolvectl'),
1975 join_paths(rootsbindir, 'resolvconf'))
1977 meson.add_install_script(meson_make_symlink,
1978 join_paths(bindir, 'resolvectl'),
1979 join_paths(bindir, 'systemd-resolve'))
1982 if conf.get('ENABLE_LOGIND') == 1
1985 systemd_logind_sources,
1986 include_directories : includes,
1987 link_with : [liblogind_core,
1989 dependencies : [threads,
1991 install_rpath : rootlibexecdir,
1993 install_dir : rootlibexecdir)
1995 public_programs += executable(
1998 include_directories : includes,
1999 link_with : [libshared],
2000 dependencies : [threads,
2004 install_rpath : rootlibexecdir,
2006 install_dir : rootbindir)
2008 public_programs += executable(
2010 'src/login/inhibit.c',
2011 include_directories : includes,
2012 link_with : [libshared],
2013 install_rpath : rootlibexecdir,
2015 install_dir : rootbindir)
2017 if conf.get('HAVE_PAM') == 1
2018 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
2019 pam_systemd = shared_library(
2023 include_directories : includes,
2024 link_args : ['-shared',
2025 '-Wl,--version-script=' + version_script_arg],
2026 link_with : [libsystemd_static,
2028 dependencies : [threads,
2031 link_depends : pam_systemd_sym,
2033 install_dir : pamlibdir)
2035 if want_tests != 'false'
2036 test('dlopen-pam_systemd',
2038 # path to dlopen must include a slash
2039 args : pam_systemd.full_path())
2044 'systemd-user-runtime-dir',
2045 user_runtime_dir_sources,
2046 include_directories : includes,
2047 link_with : [libshared],
2048 install_rpath : rootlibexecdir,
2050 install_dir : rootlibexecdir)
2053 if conf.get('HAVE_PAM') == 1
2055 'systemd-user-sessions',
2056 'src/user-sessions/user-sessions.c',
2057 include_directories : includes,
2058 link_with : [libshared],
2059 install_rpath : rootlibexecdir,
2061 install_dir : rootlibexecdir)
2064 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
2065 public_programs += executable(
2067 'src/boot/bootctl.c',
2068 include_directories : includes,
2069 link_with : [libshared],
2070 dependencies : [libblkid],
2071 install_rpath : rootlibexecdir,
2074 public_programs += executable(
2075 'systemd-bless-boot',
2076 'src/boot/bless-boot.c',
2077 include_directories : includes,
2078 link_with : [libshared],
2079 dependencies : [libblkid],
2080 install_rpath : rootlibexecdir,
2082 install_dir : rootlibexecdir)
2085 'systemd-bless-boot-generator',
2086 'src/boot/bless-boot-generator.c',
2087 include_directories : includes,
2088 link_with : [libshared],
2089 install_rpath : rootlibexecdir,
2091 install_dir : systemgeneratordir)
2095 'systemd-boot-check-no-failures',
2096 'src/boot/boot-check-no-failures.c',
2097 include_directories : includes,
2098 link_with : [libshared],
2099 dependencies : [libblkid],
2100 install_rpath : rootlibexecdir,
2102 install_dir : rootlibexecdir)
2104 public_programs += executable(
2105 'systemd-socket-activate',
2106 'src/activate/activate.c',
2107 include_directories : includes,
2108 link_with : [libshared],
2109 dependencies : [threads],
2110 install_rpath : rootlibexecdir,
2113 if get_option('link-systemctl-shared')
2114 systemctl_link_with = [libshared]
2116 systemctl_link_with = [libsystemd_static,
2122 public_programs += executable(
2124 'src/systemctl/systemctl-add-dependency.c',
2125 'src/systemctl/systemctl-add-dependency.h',
2126 'src/systemctl/systemctl-cancel-job.c',
2127 'src/systemctl/systemctl-cancel-job.h',
2128 'src/systemctl/systemctl-clean-or-freeze.c',
2129 'src/systemctl/systemctl-clean-or-freeze.h',
2130 'src/systemctl/systemctl-compat-halt.c',
2131 'src/systemctl/systemctl-compat-halt.h',
2132 'src/systemctl/systemctl-compat-runlevel.c',
2133 'src/systemctl/systemctl-compat-runlevel.h',
2134 'src/systemctl/systemctl-compat-shutdown.c',
2135 'src/systemctl/systemctl-compat-shutdown.h',
2136 'src/systemctl/systemctl-compat-telinit.c',
2137 'src/systemctl/systemctl-compat-telinit.h',
2138 'src/systemctl/systemctl-daemon-reload.c',
2139 'src/systemctl/systemctl-daemon-reload.h',
2140 'src/systemctl/systemctl-edit.c',
2141 'src/systemctl/systemctl-edit.h',
2142 'src/systemctl/systemctl-enable.c',
2143 'src/systemctl/systemctl-enable.h',
2144 'src/systemctl/systemctl-is-active.c',
2145 'src/systemctl/systemctl-is-active.h',
2146 'src/systemctl/systemctl-is-enabled.c',
2147 'src/systemctl/systemctl-is-enabled.h',
2148 'src/systemctl/systemctl-is-system-running.c',
2149 'src/systemctl/systemctl-is-system-running.h',
2150 'src/systemctl/systemctl-kill.c',
2151 'src/systemctl/systemctl-kill.h',
2152 'src/systemctl/systemctl-list-dependencies.c',
2153 'src/systemctl/systemctl-list-dependencies.h',
2154 'src/systemctl/systemctl-list-jobs.c',
2155 'src/systemctl/systemctl-list-jobs.h',
2156 'src/systemctl/systemctl-list-machines.c',
2157 'src/systemctl/systemctl-list-machines.h',
2158 'src/systemctl/systemctl-list-unit-files.c',
2159 'src/systemctl/systemctl-list-unit-files.h',
2160 'src/systemctl/systemctl-list-units.c',
2161 'src/systemctl/systemctl-list-units.h',
2162 'src/systemctl/systemctl-log-setting.c',
2163 'src/systemctl/systemctl-log-setting.h',
2164 'src/systemctl/systemctl-logind.c',
2165 'src/systemctl/systemctl-logind.h',
2166 'src/systemctl/systemctl-preset-all.c',
2167 'src/systemctl/systemctl-preset-all.h',
2168 'src/systemctl/systemctl-reset-failed.c',
2169 'src/systemctl/systemctl-reset-failed.h',
2170 'src/systemctl/systemctl-service-watchdogs.c',
2171 'src/systemctl/systemctl-service-watchdogs.h',
2172 'src/systemctl/systemctl-set-default.c',
2173 'src/systemctl/systemctl-set-default.h',
2174 'src/systemctl/systemctl-set-environment.c',
2175 'src/systemctl/systemctl-set-environment.h',
2176 'src/systemctl/systemctl-set-property.c',
2177 'src/systemctl/systemctl-set-property.h',
2178 'src/systemctl/systemctl-show.c',
2179 'src/systemctl/systemctl-show.h',
2180 'src/systemctl/systemctl-start-special.c',
2181 'src/systemctl/systemctl-start-special.h',
2182 'src/systemctl/systemctl-start-unit.c',
2183 'src/systemctl/systemctl-start-unit.h',
2184 'src/systemctl/systemctl-switch-root.c',
2185 'src/systemctl/systemctl-switch-root.h',
2186 'src/systemctl/systemctl-sysv-compat.c',
2187 'src/systemctl/systemctl-sysv-compat.h',
2188 'src/systemctl/systemctl-trivial-method.c',
2189 'src/systemctl/systemctl-trivial-method.h',
2190 'src/systemctl/systemctl-util.c',
2191 'src/systemctl/systemctl-util.c',
2192 'src/systemctl/systemctl-util.h',
2193 'src/systemctl/systemctl.c',
2194 'src/systemctl/systemctl.h',
2195 include_directories : includes,
2196 link_with : systemctl_link_with,
2197 dependencies : [threads,
2203 install_rpath : rootlibexecdir,
2205 install_dir : rootbindir)
2207 if conf.get('ENABLE_PORTABLED') == 1
2209 'systemd-portabled',
2210 systemd_portabled_sources,
2211 include_directories : includes,
2212 link_with : [libshared],
2213 dependencies : [threads],
2214 install_rpath : rootlibexecdir,
2216 install_dir : rootlibexecdir)
2218 public_programs += executable(
2220 'src/portable/portablectl.c',
2221 include_directories : includes,
2222 link_with : [libshared],
2223 dependencies : [threads],
2224 install_rpath : rootlibexecdir,
2226 install_dir : rootbindir)
2229 if conf.get('ENABLE_USERDB') == 1
2232 systemd_userwork_sources,
2233 include_directories : includes,
2234 link_with : [libshared],
2235 dependencies : [threads],
2236 install_rpath : rootlibexecdir,
2238 install_dir : rootlibexecdir)
2242 systemd_userdbd_sources,
2243 include_directories : includes,
2244 link_with : [libshared],
2245 dependencies : [threads],
2246 install_rpath : rootlibexecdir,
2248 install_dir : rootlibexecdir)
2250 public_programs += executable(
2253 include_directories : includes,
2254 link_with : [libshared],
2255 dependencies : [threads],
2256 install_rpath : rootlibexecdir,
2258 install_dir : rootbindir)
2261 if conf.get('ENABLE_HOMED') == 1
2264 systemd_homework_sources,
2265 include_directories : includes,
2266 link_with : [libshared],
2267 dependencies : [threads,
2275 install_rpath : rootlibexecdir,
2277 install_dir : rootlibexecdir)
2281 systemd_homed_sources,
2282 include_directories : includes,
2283 link_with : [libshared],
2284 dependencies : [threads,
2287 install_rpath : rootlibexecdir,
2289 install_dir : rootlibexecdir)
2291 public_programs += executable(
2294 include_directories : includes,
2295 link_with : [libshared],
2296 dependencies : [threads,
2302 install_rpath : rootlibexecdir,
2304 install_dir : rootbindir)
2306 if conf.get('HAVE_PAM') == 1
2307 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2308 pam_systemd = shared_library(
2312 include_directories : includes,
2313 link_args : ['-shared',
2314 '-Wl,--version-script=' + version_script_arg],
2315 link_with : [libsystemd_static,
2317 dependencies : [threads,
2321 link_depends : pam_systemd_home_sym,
2323 install_dir : pamlibdir)
2327 foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
2328 (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
2329 meson.add_install_script(meson_make_symlink,
2330 join_paths(rootbindir, 'systemctl'),
2331 join_paths(rootsbindir, alias))
2334 meson.add_install_script(meson_make_symlink,
2335 join_paths(rootbindir, 'udevadm'),
2336 join_paths(rootlibexecdir, 'systemd-udevd'))
2338 if conf.get('ENABLE_BACKLIGHT') == 1
2340 'systemd-backlight',
2341 'src/backlight/backlight.c',
2342 include_directories : includes,
2343 link_with : [libshared],
2344 install_rpath : rootlibexecdir,
2346 install_dir : rootlibexecdir)
2349 if conf.get('ENABLE_RFKILL') == 1
2352 'src/rfkill/rfkill.c',
2353 include_directories : includes,
2354 link_with : [libshared],
2355 install_rpath : rootlibexecdir,
2357 install_dir : rootlibexecdir)
2361 'systemd-system-update-generator',
2362 'src/system-update-generator/system-update-generator.c',
2363 include_directories : includes,
2364 link_with : [libshared],
2365 install_rpath : rootlibexecdir,
2367 install_dir : systemgeneratordir)
2369 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2370 systemd_cryptsetup_sources = files('''
2371 src/cryptsetup/cryptsetup-pkcs11.h
2372 src/cryptsetup/cryptsetup-keyfile.c
2373 src/cryptsetup/cryptsetup-keyfile.h
2374 src/cryptsetup/cryptsetup.c
2377 if conf.get('HAVE_P11KIT') == 1
2378 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2382 'systemd-cryptsetup',
2383 systemd_cryptsetup_sources,
2384 include_directories : includes,
2385 link_with : [libshared],
2386 dependencies : [libcryptsetup,
2388 install_rpath : rootlibexecdir,
2390 install_dir : rootlibexecdir)
2393 'systemd-cryptsetup-generator',
2394 'src/cryptsetup/cryptsetup-generator.c',
2395 include_directories : includes,
2396 link_with : [libshared],
2397 install_rpath : rootlibexecdir,
2399 install_dir : systemgeneratordir)
2402 'systemd-veritysetup',
2403 'src/veritysetup/veritysetup.c',
2404 include_directories : includes,
2405 link_with : [libshared],
2406 dependencies : [libcryptsetup],
2407 install_rpath : rootlibexecdir,
2409 install_dir : rootlibexecdir)
2412 'systemd-veritysetup-generator',
2413 'src/veritysetup/veritysetup-generator.c',
2414 include_directories : includes,
2415 link_with : [libshared],
2416 install_rpath : rootlibexecdir,
2418 install_dir : systemgeneratordir)
2421 if conf.get('HAVE_SYSV_COMPAT') == 1
2423 'systemd-sysv-generator',
2424 'src/sysv-generator/sysv-generator.c',
2425 include_directories : includes,
2426 link_with : [libshared],
2427 install_rpath : rootlibexecdir,
2429 install_dir : systemgeneratordir)
2432 'systemd-rc-local-generator',
2433 'src/rc-local-generator/rc-local-generator.c',
2434 include_directories : includes,
2435 link_with : [libshared],
2436 install_rpath : rootlibexecdir,
2438 install_dir : systemgeneratordir)
2441 if conf.get('ENABLE_XDG_AUTOSTART') == 1
2443 'systemd-xdg-autostart-generator',
2444 'src/xdg-autostart-generator/xdg-autostart-generator.c',
2445 'src/xdg-autostart-generator/xdg-autostart-service.c',
2446 include_directories : includes,
2447 link_with : [libshared],
2448 install_rpath : rootlibexecdir,
2450 install_dir : usergeneratordir)
2453 'systemd-xdg-autostart-condition',
2454 'src/xdg-autostart-generator/xdg-autostart-condition.c',
2455 include_directories : includes,
2456 link_with : [libshared],
2457 install_rpath : rootlibexecdir,
2459 install_dir : rootlibexecdir)
2462 if conf.get('ENABLE_HOSTNAMED') == 1
2464 'systemd-hostnamed',
2465 'src/hostname/hostnamed.c',
2466 include_directories : includes,
2467 link_with : [libshared],
2468 install_rpath : rootlibexecdir,
2470 install_dir : rootlibexecdir)
2472 public_programs += executable(
2474 'src/hostname/hostnamectl.c',
2475 include_directories : includes,
2476 link_with : [libshared],
2477 install_rpath : rootlibexecdir,
2481 if conf.get('ENABLE_LOCALED') == 1
2482 if conf.get('HAVE_XKBCOMMON') == 1
2483 # logind will load libxkbcommon.so dynamically on its own
2491 systemd_localed_sources,
2492 include_directories : includes,
2493 link_with : [libshared],
2494 dependencies : deps,
2495 install_rpath : rootlibexecdir,
2497 install_dir : rootlibexecdir)
2499 public_programs += executable(
2502 include_directories : includes,
2503 link_with : [libshared],
2504 install_rpath : rootlibexecdir,
2508 if conf.get('ENABLE_TIMEDATED') == 1
2510 'systemd-timedated',
2511 'src/timedate/timedated.c',
2512 include_directories : includes,
2513 link_with : [libshared],
2514 install_rpath : rootlibexecdir,
2516 install_dir : rootlibexecdir)
2519 if conf.get('ENABLE_TIMEDATECTL') == 1
2520 public_programs += executable(
2522 'src/timedate/timedatectl.c',
2523 include_directories : includes,
2524 install_rpath : rootlibexecdir,
2525 link_with : [libshared],
2526 dependencies : [libm],
2530 if conf.get('ENABLE_TIMESYNCD') == 1
2531 if get_option('link-timesyncd-shared')
2532 timesyncd_link_with = [libshared]
2534 timesyncd_link_with = [libsystemd_static,
2541 'systemd-timesyncd',
2542 systemd_timesyncd_sources,
2543 include_directories : includes,
2544 link_with : [timesyncd_link_with],
2545 dependencies : [threads,
2547 install_rpath : rootlibexecdir,
2549 install_dir : rootlibexecdir)
2552 'systemd-time-wait-sync',
2553 'src/time-wait-sync/time-wait-sync.c',
2554 include_directories : includes,
2555 link_with : [timesyncd_link_with],
2556 install_rpath : rootlibexecdir,
2558 install_dir : rootlibexecdir)
2561 if conf.get('ENABLE_MACHINED') == 1
2564 systemd_machined_sources,
2565 include_directories : includes,
2566 link_with : [libmachine_core,
2568 install_rpath : rootlibexecdir,
2570 install_dir : rootlibexecdir)
2572 public_programs += executable(
2574 'src/machine/machinectl.c',
2575 include_directories : includes,
2576 link_with : [libshared],
2577 dependencies : [threads,
2581 install_rpath : rootlibexecdir,
2583 install_dir : rootbindir)
2586 if conf.get('ENABLE_IMPORTD') == 1
2589 systemd_importd_sources,
2590 include_directories : includes,
2591 link_with : [libshared],
2592 dependencies : [threads],
2593 install_rpath : rootlibexecdir,
2595 install_dir : rootlibexecdir)
2597 systemd_pull = executable(
2599 systemd_pull_sources,
2600 include_directories : includes,
2601 link_with : [libshared],
2602 dependencies : [versiondep,
2608 install_rpath : rootlibexecdir,
2610 install_dir : rootlibexecdir)
2612 systemd_import = executable(
2614 systemd_import_sources,
2615 include_directories : includes,
2616 link_with : [libshared],
2617 dependencies : [libcurl,
2621 install_rpath : rootlibexecdir,
2623 install_dir : rootlibexecdir)
2625 systemd_import_fs = executable(
2626 'systemd-import-fs',
2627 systemd_import_fs_sources,
2628 include_directories : includes,
2629 link_with : [libshared],
2630 install_rpath : rootlibexecdir,
2632 install_dir : rootlibexecdir)
2634 systemd_export = executable(
2636 systemd_export_sources,
2637 include_directories : includes,
2638 link_with : [libshared],
2639 dependencies : [libcurl,
2643 install_rpath : rootlibexecdir,
2645 install_dir : rootlibexecdir)
2647 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2650 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2651 public_programs += executable(
2652 'systemd-journal-upload',
2653 systemd_journal_upload_sources,
2654 include_directories : includes,
2655 link_with : [libshared],
2656 dependencies : [versiondep,
2663 install_rpath : rootlibexecdir,
2665 install_dir : rootlibexecdir)
2668 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2669 public_programs += executable(
2670 'systemd-journal-remote',
2671 systemd_journal_remote_sources,
2672 include_directories : includes,
2673 link_with : [libshared,
2674 libsystemd_journal_remote],
2675 dependencies : [threads,
2681 install_rpath : rootlibexecdir,
2683 install_dir : rootlibexecdir)
2685 public_programs += executable(
2686 'systemd-journal-gatewayd',
2687 systemd_journal_gatewayd_sources,
2688 include_directories : includes,
2689 link_with : [libshared],
2690 dependencies : [threads,
2696 install_rpath : rootlibexecdir,
2698 install_dir : rootlibexecdir)
2701 if conf.get('ENABLE_COREDUMP') == 1
2704 systemd_coredump_sources,
2705 include_directories : includes,
2706 link_with : [libshared],
2707 dependencies : [threads,
2713 install_rpath : rootlibexecdir,
2715 install_dir : rootlibexecdir)
2717 public_programs += executable(
2719 coredumpctl_sources,
2720 include_directories : includes,
2721 link_with : [libshared],
2722 dependencies : [threads,
2726 install_rpath : rootlibexecdir,
2730 if conf.get('ENABLE_PSTORE') == 1
2733 systemd_pstore_sources,
2734 include_directories : includes,
2735 link_with : [libshared],
2736 dependencies : [threads,
2742 install_rpath : rootlibexecdir,
2744 install_dir : rootlibexecdir)
2747 if conf.get('ENABLE_OOMD') == 1
2748 executable('systemd-oomd',
2749 systemd_oomd_sources,
2750 include_directories : includes,
2751 link_with : [libshared],
2753 install_rpath : rootlibexecdir,
2755 install_dir : rootlibexecdir)
2757 public_programs += executable(
2760 include_directories : includes,
2761 link_with : [libshared],
2763 install_rpath : rootlibexecdir,
2765 install_dir : rootbindir)
2768 if conf.get('ENABLE_BINFMT') == 1
2769 public_programs += executable(
2771 'src/binfmt/binfmt.c',
2772 include_directories : includes,
2773 link_with : [libshared],
2774 install_rpath : rootlibexecdir,
2776 install_dir : rootlibexecdir)
2778 meson.add_install_script('sh', '-c',
2779 mkdir_p.format(binfmtdir))
2780 if install_sysconfdir
2781 meson.add_install_script('sh', '-c',
2782 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2786 if conf.get('ENABLE_REPART') == 1
2789 systemd_repart_sources,
2790 include_directories : includes,
2791 link_with : [libshared],
2792 dependencies : [threads,
2796 install_rpath : rootlibexecdir,
2798 install_dir : rootbindir)
2799 public_programs += exe
2801 if want_tests != 'false'
2804 args : exe.full_path())
2808 if conf.get('ENABLE_VCONSOLE') == 1
2810 'systemd-vconsole-setup',
2811 'src/vconsole/vconsole-setup.c',
2812 include_directories : includes,
2813 link_with : [libshared],
2814 install_rpath : rootlibexecdir,
2816 install_dir : rootlibexecdir)
2819 if conf.get('ENABLE_RANDOMSEED') == 1
2821 'systemd-random-seed',
2822 'src/random-seed/random-seed.c',
2823 include_directories : includes,
2824 link_with : [libshared],
2825 install_rpath : rootlibexecdir,
2827 install_dir : rootlibexecdir)
2830 if conf.get('ENABLE_FIRSTBOOT') == 1
2832 'systemd-firstboot',
2833 'src/firstboot/firstboot.c',
2834 include_directories : includes,
2835 link_with : [libshared],
2836 dependencies : [libcrypt],
2837 install_rpath : rootlibexecdir,
2839 install_dir : rootbindir)
2843 'systemd-remount-fs',
2844 'src/remount-fs/remount-fs.c',
2845 include_directories : includes,
2846 link_with : [libcore_shared,
2848 install_rpath : rootlibexecdir,
2850 install_dir : rootlibexecdir)
2853 'systemd-machine-id-setup',
2854 'src/machine-id-setup/machine-id-setup-main.c',
2855 include_directories : includes,
2856 link_with : [libcore_shared,
2858 install_rpath : rootlibexecdir,
2860 install_dir : rootbindir)
2865 include_directories : includes,
2866 link_with : [libshared],
2867 install_rpath : rootlibexecdir,
2869 install_dir : rootlibexecdir)
2871 executable('systemd-growfs',
2872 'src/partition/growfs.c',
2873 include_directories : includes,
2874 link_with : [libshared],
2875 install_rpath : rootlibexecdir,
2877 install_dir : rootlibexecdir)
2881 'src/partition/makefs.c',
2882 include_directories : includes,
2883 link_with : [libshared],
2884 install_rpath : rootlibexecdir,
2886 install_dir : rootlibexecdir)
2890 'src/sleep/sleep.c',
2891 include_directories : includes,
2892 link_with : [libshared],
2893 install_rpath : rootlibexecdir,
2895 install_dir : rootlibexecdir)
2897 if install_sysconfdir
2898 install_data('src/sleep/sleep.conf',
2899 install_dir : pkgsysconfdir)
2902 public_programs += executable(
2904 'src/sysctl/sysctl.c',
2905 include_directories : includes,
2906 link_with : [libshared],
2907 install_rpath : rootlibexecdir,
2909 install_dir : rootlibexecdir)
2913 'src/ac-power/ac-power.c',
2914 include_directories : includes,
2915 link_with : [libshared],
2916 install_rpath : rootlibexecdir,
2918 install_dir : rootlibexecdir)
2920 public_programs += executable(
2921 'systemd-detect-virt',
2922 'src/detect-virt/detect-virt.c',
2923 include_directories : includes,
2924 link_with : [libshared],
2925 install_rpath : rootlibexecdir,
2928 public_programs += executable(
2930 'src/delta/delta.c',
2931 include_directories : includes,
2932 link_with : [libshared],
2933 install_rpath : rootlibexecdir,
2936 public_programs += executable(
2938 'src/escape/escape.c',
2939 include_directories : includes,
2940 link_with : [libshared],
2941 install_rpath : rootlibexecdir,
2943 install_dir : rootbindir)
2945 public_programs += executable(
2947 'src/notify/notify.c',
2948 include_directories : includes,
2949 link_with : [libshared],
2950 install_rpath : rootlibexecdir,
2952 install_dir : rootbindir)
2955 'systemd-volatile-root',
2956 'src/volatile-root/volatile-root.c',
2957 include_directories : includes,
2958 link_with : [libshared],
2959 install_rpath : rootlibexecdir,
2960 install : conf.get('ENABLE_INITRD') == 1,
2961 install_dir : rootlibexecdir)
2964 'systemd-cgroups-agent',
2965 'src/cgroups-agent/cgroups-agent.c',
2966 include_directories : includes,
2967 link_with : [libshared],
2968 install_rpath : rootlibexecdir,
2970 install_dir : rootlibexecdir)
2972 public_programs += executable(
2974 'src/id128/id128.c',
2975 include_directories : includes,
2976 link_with : [libshared],
2977 install_rpath : rootlibexecdir,
2980 public_programs += executable(
2983 include_directories : includes,
2984 link_with : [libshared],
2985 install_rpath : rootlibexecdir,
2988 public_programs += executable(
2989 'systemd-ask-password',
2990 'src/ask-password/ask-password.c',
2991 include_directories : includes,
2992 link_with : [libshared],
2993 install_rpath : rootlibexecdir,
2995 install_dir : rootbindir)
2998 'systemd-reply-password',
2999 'src/reply-password/reply-password.c',
3000 include_directories : includes,
3001 link_with : [libshared],
3002 install_rpath : rootlibexecdir,
3004 install_dir : rootlibexecdir)
3006 public_programs += executable(
3007 'systemd-tty-ask-password-agent',
3008 'src/tty-ask-password-agent/tty-ask-password-agent.c',
3009 include_directories : includes,
3010 link_with : [libshared],
3011 install_rpath : rootlibexecdir,
3013 install_dir : rootbindir)
3015 public_programs += executable(
3018 include_directories : includes,
3019 link_with : [libshared],
3020 install_rpath : rootlibexecdir,
3023 public_programs += executable(
3025 'src/cgtop/cgtop.c',
3026 include_directories : includes,
3027 link_with : [libshared],
3028 install_rpath : rootlibexecdir,
3033 'src/initctl/initctl.c',
3034 include_directories : includes,
3035 link_with : [libshared],
3036 install_rpath : rootlibexecdir,
3037 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
3038 install_dir : rootlibexecdir)
3040 public_programs += executable(
3042 'src/mount/mount-tool.c',
3043 include_directories : includes,
3044 link_with : [libshared],
3045 dependencies: [libmount],
3046 install_rpath : rootlibexecdir,
3049 meson.add_install_script(meson_make_symlink,
3050 'systemd-mount', join_paths(bindir, 'systemd-umount'))
3052 public_programs += executable(
3055 include_directories : includes,
3056 link_with : [libshared],
3057 install_rpath : rootlibexecdir,
3060 public_programs += executable(
3061 'systemd-stdio-bridge',
3062 'src/stdio-bridge/stdio-bridge.c',
3063 include_directories : includes,
3064 link_with : [libshared],
3065 dependencies : [versiondep],
3066 install_rpath : rootlibexecdir,
3069 public_programs += executable(
3071 'src/busctl/busctl.c',
3072 'src/busctl/busctl-introspect.c',
3073 'src/busctl/busctl-introspect.h',
3074 include_directories : includes,
3075 link_with : [libshared],
3076 install_rpath : rootlibexecdir,
3082 'src/sysusers/sysusers.c',
3083 include_directories : includes,
3084 link_with : [libshared],
3085 install_rpath : rootlibexecdir,
3087 install_dir : rootbindir)
3088 public_programs += exe
3090 if want_tests != 'false'
3091 test('test-sysusers',
3093 # https://github.com/mesonbuild/meson/issues/2681
3094 args : exe.full_path())
3097 if have_standalone_binaries
3099 'systemd-sysusers.standalone',
3100 'src/sysusers/sysusers.c',
3101 include_directories : includes,
3102 c_args : '-DSTANDALONE',
3103 link_with : [libshared_static,
3109 install_dir : rootbindir)
3110 public_programs += exe
3112 if want_tests != 'false'
3113 test('test-sysusers.standalone',
3115 # https://github.com/mesonbuild/meson/issues/2681
3116 args : exe.full_path())
3121 if conf.get('ENABLE_TMPFILES') == 1
3124 systemd_tmpfiles_sources,
3125 include_directories : includes,
3126 link_with : [libshared],
3127 dependencies : [libacl],
3128 install_rpath : rootlibexecdir,
3130 install_dir : rootbindir)
3131 public_programs += exe
3133 if want_tests != 'false'
3134 test('test-systemd-tmpfiles',
3135 test_systemd_tmpfiles_py,
3136 # https://github.com/mesonbuild/meson/issues/2681
3137 args : exe.full_path())
3140 if have_standalone_binaries
3141 public_programs += executable(
3142 'systemd-tmpfiles.standalone',
3143 systemd_tmpfiles_sources,
3144 include_directories : includes,
3145 c_args : '-DSTANDALONE',
3146 link_with : [libshared_static,
3151 dependencies : [libacl],
3153 install_dir : rootbindir)
3157 if conf.get('ENABLE_HWDB') == 1
3158 public_programs += executable(
3161 'src/libsystemd/sd-hwdb/hwdb-internal.h',
3162 include_directories : includes,
3163 link_with : [libudev_static],
3164 install_rpath : udev_rpath,
3166 install_dir : rootbindir)
3169 if conf.get('ENABLE_QUOTACHECK') == 1
3171 'systemd-quotacheck',
3172 'src/quotacheck/quotacheck.c',
3173 include_directories : includes,
3174 link_with : [libshared],
3175 install_rpath : rootlibexecdir,
3177 install_dir : rootlibexecdir)
3180 public_programs += executable(
3181 'systemd-socket-proxyd',
3182 'src/socket-proxy/socket-proxyd.c',
3183 include_directories : includes,
3184 link_with : [libshared],
3185 dependencies : [threads],
3186 install_rpath : rootlibexecdir,
3188 install_dir : rootlibexecdir)
3190 public_programs += executable(
3193 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
3194 include_directories : includes,
3195 link_with : [libudev_core,
3198 dependencies : [versiondep,
3204 install_rpath : udev_rpath,
3206 install_dir : rootbindir)
3210 systemd_shutdown_sources,
3211 include_directories : includes,
3212 link_with : [libcore_shared,
3214 dependencies : [libmount],
3215 install_rpath : rootlibexecdir,
3217 install_dir : rootlibexecdir)
3220 'systemd-update-done',
3221 'src/update-done/update-done.c',
3222 include_directories : includes,
3223 link_with : [libshared],
3224 install_rpath : rootlibexecdir,
3226 install_dir : rootlibexecdir)
3229 'systemd-update-utmp',
3230 'src/update-utmp/update-utmp.c',
3231 include_directories : includes,
3232 link_with : [libshared],
3233 dependencies : [libaudit],
3234 install_rpath : rootlibexecdir,
3235 install : (conf.get('ENABLE_UTMP') == 1),
3236 install_dir : rootlibexecdir)
3238 if conf.get('HAVE_KMOD') == 1
3240 'systemd-modules-load',
3241 'src/modules-load/modules-load.c',
3242 include_directories : includes,
3243 link_with : [libshared],
3244 dependencies : [libkmod],
3245 install_rpath : rootlibexecdir,
3247 install_dir : rootlibexecdir)
3249 meson.add_install_script('sh', '-c',
3250 mkdir_p.format(modulesloaddir))
3251 if install_sysconfdir
3252 meson.add_install_script('sh', '-c',
3253 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
3257 public_programs += executable(
3259 systemd_nspawn_sources,
3260 include_directories : includes,
3261 link_with : [libcore_shared,
3264 dependencies : [libblkid,
3266 install_rpath : rootlibexecdir,
3269 if conf.get('ENABLE_NETWORKD') == 1
3272 systemd_networkd_sources,
3273 include_directories : network_include_dir,
3274 link_with : [libnetworkd_core,
3277 networkd_link_with],
3278 dependencies : [threads],
3279 install_rpath : rootlibexecdir,
3281 install_dir : rootlibexecdir)
3284 'systemd-networkd-wait-online',
3285 systemd_networkd_wait_online_sources,
3286 include_directories : includes,
3287 link_with : [libnetworkd_core,
3288 networkd_link_with],
3289 install_rpath : rootlibexecdir,
3291 install_dir : rootlibexecdir)
3293 public_programs += executable(
3296 include_directories : includes,
3297 link_with : [libsystemd_network,
3298 networkd_link_with],
3299 install_rpath : rootlibexecdir,
3301 install_dir : rootbindir)
3304 'systemd-network-generator',
3305 network_generator_sources,
3306 include_directories : includes,
3307 link_with : [networkd_link_with],
3308 install_rpath : rootlibexecdir,
3310 install_dir : rootlibexecdir)
3312 if want_tests != 'false'
3313 test('test-network-generator-conversion',
3314 test_network_generator_conversion_sh,
3315 # https://github.com/mesonbuild/meson/issues/2681
3316 args : exe.full_path())
3321 'systemd-sulogin-shell',
3322 ['src/sulogin-shell/sulogin-shell.c'],
3323 include_directories : includes,
3324 link_with : [libshared],
3325 install_rpath : rootlibexecdir,
3327 install_dir : rootlibexecdir)
3329 ############################################################
3332 'systemd-runtest.env',
3333 output : 'systemd-runtest.env',
3334 command : ['sh', '-c', '{ ' +
3335 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
3336 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
3338 build_by_default : true)
3340 foreach tuple : tests
3342 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3343 dependencies = tuple[2]
3344 condition = tuple.length() >= 4 ? tuple[3] : ''
3345 type = tuple.length() >= 5 ? tuple[4] : ''
3346 defs = tuple.length() >= 6 ? tuple[5] : []
3347 incs = tuple.length() >= 7 ? tuple[6] : includes
3348 parallel = tuple.length() >= 8 ? tuple[7] : true
3351 name = sources[0].split('/')[-1].split('.')[0]
3352 if type.startswith('timeout=')
3353 timeout = type.split('=')[1].to_int()
3357 if condition == '' or conf.get(condition) == 1
3361 include_directories : incs,
3362 link_with : link_with,
3363 dependencies : [versiondep,
3366 build_by_default : want_tests != 'false',
3367 install_rpath : rootlibexecdir,
3368 install : install_tests,
3369 install_dir : join_paths(testsdir, type))
3372 message('@0@ is a manual test'.format(name))
3373 elif type == 'unsafe' and want_tests != 'unsafe'
3374 message('@0@ is an unsafe test'.format(name))
3375 elif want_tests != 'false'
3381 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3386 'test-libsystemd-sym',
3387 test_libsystemd_sym_c,
3388 include_directories : includes,
3389 link_with : [libsystemd],
3390 build_by_default : want_tests != 'false',
3391 install : install_tests,
3392 install_dir : testsdir)
3393 if want_tests != 'false'
3394 test('test-libsystemd-sym', exe)
3398 'test-libsystemd-static-sym',
3399 test_libsystemd_sym_c,
3400 include_directories : includes,
3401 link_with : [install_libsystemd_static],
3402 dependencies : [threads], # threads is already included in dependencies on the library,
3403 # but does not seem to get propagated. Add here as a work-around.
3404 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3405 install : install_tests and static_libsystemd_pic,
3406 install_dir : testsdir)
3407 if want_tests != 'false' and static_libsystemd_pic
3408 test('test-libsystemd-static-sym', exe)
3414 include_directories : includes,
3415 c_args : '-Wno-deprecated-declarations',
3416 link_with : [libudev],
3417 build_by_default : want_tests != 'false',
3418 install : install_tests,
3419 install_dir : testsdir)
3420 if want_tests != 'false'
3421 test('test-libudev-sym', exe)
3425 'test-libudev-static-sym',
3427 include_directories : includes,
3428 c_args : '-Wno-deprecated-declarations',
3429 link_with : [install_libudev_static],
3430 build_by_default : want_tests != 'false' and static_libudev_pic,
3431 install : install_tests and static_libudev_pic,
3432 install_dir : testsdir)
3433 if want_tests != 'false' and static_libudev_pic
3434 test('test-libudev-static-sym', exe)
3437 ############################################################
3441 if get_option('tests') != 'false'
3442 foreach tuple : fuzzers
3444 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3445 dependencies = tuple[2]
3446 defs = tuple.length() >= 4 ? tuple[3] : []
3447 incs = tuple.length() >= 5 ? tuple[4] : includes
3451 dependencies += fuzzing_engine
3453 if fuzzing_engine.found()
3454 dependencies += fuzzing_engine
3456 link_args += ['-fsanitize=fuzzer']
3459 sources += 'src/fuzz/fuzz-main.c'
3462 name = sources[0].split('/')[-1].split('.')[0]
3464 fuzzer_exes += executable(
3467 include_directories : [incs, include_directories('src/fuzz')],
3468 link_with : link_with,
3469 dependencies : dependencies,
3471 link_args: link_args,
3478 depends : fuzzer_exes,
3481 ############################################################
3484 subdir('sysusers.d')
3485 subdir('tmpfiles.d')
3491 subdir('shell-completion/bash')
3492 subdir('shell-completion/zsh')
3493 subdir('docs/sysvinit')
3494 subdir('docs/var-log')
3496 install_subdir('factory/etc',
3497 install_dir : factorydir)
3499 if install_sysconfdir
3500 install_data('xorg/50-systemd-user.sh',
3501 install_dir : xinitrcdir)
3503 install_data('modprobe.d/systemd.conf',
3504 install_dir : modprobedir)
3505 install_data('LICENSE.GPL2',
3509 'docs/CODING_STYLE.md',
3510 'docs/DISTRO_PORTING.md',
3511 'docs/ENVIRONMENT.md',
3513 'docs/TRANSIENT-SETTINGS.md',
3514 'docs/TRANSLATORS.md',
3515 'docs/UIDS-GIDS.md',
3516 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3517 install_dir : docdir)
3519 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3520 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3522 ############################################################
3524 check_help = find_program('tools/check-help.sh')
3526 foreach exec : public_programs
3527 name = exec.full_path().split('/')[-1]
3528 if want_tests != 'false'
3529 test('check-help-' + name,
3531 args : exec.full_path())
3535 ############################################################
3537 check_directives_sh = find_program('tools/check-directives.sh')
3539 if want_tests != 'false'
3540 test('check-directives',
3541 check_directives_sh,
3542 args : project_source_root)
3545 ############################################################
3547 # Enable tests for all supported sanitizers
3548 foreach tuple : sanitizers
3549 sanitizer = tuple[0]
3552 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3554 foreach p : fuzz_regression_tests
3555 b = p.split('/')[-2]
3556 c = p.split('/')[-1]
3558 name = '@0@:@1@'.format(b, sanitizer)
3561 if want_tests == 'false'
3562 message('Not compiling @0@ because tests is set to false'.format(name))
3563 elif slow_tests or fuzz_tests
3564 exe = custom_target(
3568 command : [env, 'ln', '-fs',
3569 join_paths(build.full_path(), b),
3571 build_by_default : true)
3573 message('Not compiling @0@ because slow-tests/fuzz-tests is set to false'.format(name))
3578 if want_tests != 'false' and (slow_tests or fuzz_tests)
3579 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3581 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
3583 args : [exe.full_path(),
3584 join_paths(project_source_root, p)])
3591 ############################################################
3594 all_files = run_command(
3596 ['--git-dir=@0@/.git'.format(project_source_root),
3599 all_files = files(all_files.stdout().split())
3604 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3607 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3611 git_contrib_sh = find_program('tools/git-contrib.sh')
3614 command : [git_contrib_sh])
3618 git_head = run_command(
3620 ['--git-dir=@0@/.git'.format(project_source_root),
3621 'rev-parse', 'HEAD']).stdout().strip()
3622 git_head_short = run_command(
3624 ['--git-dir=@0@/.git'.format(project_source_root),
3625 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3629 command : ['git', 'archive',
3630 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3632 '--prefix', 'systemd-@0@/'.format(git_head),
3636 ############################################################
3638 check_api_docs_sh = find_program('tools/check-api-docs.sh')
3641 depends : [man, libsystemd, libudev],
3642 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3644 ############################################################
3645 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3648 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3650 'build mode: @0@'.format(get_option('mode')),
3651 'split /usr: @0@'.format(split_usr),
3652 'split bin-sbin: @0@'.format(split_bin),
3653 'prefix directory: @0@'.format(prefixdir),
3654 'rootprefix directory: @0@'.format(rootprefixdir),
3655 'sysconf directory: @0@'.format(sysconfdir),
3656 'include directory: @0@'.format(includedir),
3657 'lib directory: @0@'.format(libdir),
3658 'rootlib directory: @0@'.format(rootlibdir),
3659 'SysV init scripts: @0@'.format(sysvinit_path),
3660 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3661 'PAM modules directory: @0@'.format(pamlibdir),
3662 'PAM configuration directory: @0@'.format(pamconfdir),
3663 'RPM macros directory: @0@'.format(rpmmacrosdir),
3664 'modprobe.d directory: @0@'.format(modprobedir),
3665 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3666 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3667 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3668 'bash completions directory: @0@'.format(bashcompletiondir),
3669 'zsh completions directory: @0@'.format(zshcompletiondir),
3670 'extra start script: @0@'.format(get_option('rc-local')),
3671 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3672 get_option('debug-tty')),
3673 'TTY GID: @0@'.format(tty_gid),
3674 'users GID: @0@'.format(substs.get('USERS_GID')),
3675 'system UIDs: <=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_UID_MAX'),
3676 conf.get('SYSTEM_ALLOC_UID_MIN')),
3677 'system GIDs: <=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_GID_MAX'),
3678 conf.get('SYSTEM_ALLOC_GID_MIN')),
3679 'dynamic UIDs: @0@–@1@'.format(dynamic_uid_min, dynamic_uid_max),
3680 'container UID bases: @0@–@1@'.format(container_uid_base_min, container_uid_base_max),
3681 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3682 'render group access mode: @0@'.format(get_option('group-render-mode')),
3683 'certificate root directory: @0@'.format(get_option('certificate-root')),
3684 'support URL: @0@'.format(support_url),
3685 'nobody user name: @0@'.format(nobody_user),
3686 'nobody group name: @0@'.format(nobody_group),
3687 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3688 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3690 'default DNSSEC mode: @0@'.format(default_dnssec),
3691 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3692 'default mDNS mode: @0@'.format(default_mdns),
3693 'default LLMNR mode: @0@'.format(default_llmnr),
3694 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3695 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3696 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3697 'default locale: @0@'.format(default_locale),
3698 'default user $PATH: @0@'.format(default_user_path_display),
3699 'systemd service watchdog: @0@'.format(watchdog_opt)]
3701 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3702 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3704 'default DNS servers: @0@'.format(alt_dns_servers),
3705 'default NTP servers: @0@'.format(alt_ntp_servers)]
3707 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3708 '@@0@'.format(time_epoch)).stdout().strip()
3710 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3713 'static libsystemd: @0@'.format(static_libsystemd),
3714 'static libudev: @0@'.format(static_libudev)]
3717 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3718 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3719 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3721 if conf.get('ENABLE_EFI') == 1
3722 status += 'efi arch: @0@'.format(efi_arch)
3726 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3727 'EFI CC @0@'.format(' '.join(efi_cc)),
3728 'EFI lds: @0@'.format(efi_lds),
3729 'EFI crt0: @0@'.format(efi_crt0),
3730 'EFI include directory: @0@'.format(efi_incdir)]
3764 ['compat-mutable-uid-boundaries'],
3793 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3794 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3799 ['legacy pkla', install_polkit_pkla],
3801 ['gnu-efi', have_gnu_efi],
3814 ['man pages', want_man],
3815 ['html pages', want_html],
3816 ['man page indices', want_man and have_lxml],
3821 ['adm group', get_option('adm-group')],
3822 ['wheel group', get_option('wheel-group')],
3825 ['debug mmap cache'],
3827 ['valgrind', conf.get('VALGRIND') == 1],
3828 ['trace logging', conf.get('LOG_TRACE') == 1],
3829 ['install tests', install_tests],
3830 ['link-udev-shared', get_option('link-udev-shared')],
3831 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3832 ['link-networkd-shared', get_option('link-networkd-shared')],
3833 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3834 ['kernel-install', get_option('kernel-install')],
3835 ['systemd-analyze', conf.get('ENABLE_ANALYZE') == 1],
3838 if tuple.length() >= 2
3841 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3842 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3843 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3854 'enabled features: @0@'.format(', '.join(found)),
3856 'disabled features: @0@'.format(', '.join(missing)),
3858 message('\n '.join(status))
3860 if rootprefixdir != rootprefix_default
3862 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3863 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3864 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))