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)
1077 conf.set10('CURL_NO_OLDIES', get_option('mode') == 'developer')
1079 want_libidn = get_option('libidn')
1080 want_libidn2 = get_option('libidn2')
1081 if want_libidn == 'true' and want_libidn2 == 'true'
1082 error('libidn and libidn2 cannot be requested simultaneously')
1085 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1086 libidn = dependency('libidn2',
1087 required : want_libidn2 == 'true')
1088 have = libidn.found()
1093 conf.set10('HAVE_LIBIDN2', have)
1094 if not have and want_libidn != 'false' and not skip_deps
1095 # libidn is used for both libidn and libidn2 objects
1096 libidn = dependency('libidn',
1097 required : want_libidn == 'true')
1098 have = libidn.found()
1102 conf.set10('HAVE_LIBIDN', have)
1104 want_libiptc = get_option('libiptc')
1105 if want_libiptc != 'false' and not skip_deps
1106 libiptc = dependency('libiptc',
1107 required : want_libiptc == 'true')
1108 have = libiptc.found()
1113 conf.set10('HAVE_LIBIPTC', have)
1115 want_qrencode = get_option('qrencode')
1116 if want_qrencode != 'false' and not skip_deps
1117 libqrencode = dependency('libqrencode',
1118 required : want_qrencode == 'true')
1119 have = libqrencode.found()
1124 conf.set10('HAVE_QRENCODE', have)
1126 want_gcrypt = get_option('gcrypt')
1127 if want_gcrypt != 'false' and not skip_deps
1128 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1129 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1130 have = libgcrypt.found() and libgpg_error.found()
1135 # link to neither of the libs if one is not found
1139 conf.set10('HAVE_GCRYPT', have)
1141 want_gnutls = get_option('gnutls')
1142 if want_gnutls != 'false' and not skip_deps
1143 libgnutls = dependency('gnutls',
1144 version : '>= 3.1.4',
1145 required : want_gnutls == 'true')
1146 have = libgnutls.found()
1151 conf.set10('HAVE_GNUTLS', have)
1153 want_openssl = get_option('openssl')
1154 if want_openssl != 'false' and not skip_deps
1155 libopenssl = dependency('openssl',
1156 version : '>= 1.1.0',
1157 required : want_openssl == 'true')
1158 have = libopenssl.found()
1163 conf.set10('HAVE_OPENSSL', have)
1165 want_p11kit = get_option('p11kit')
1166 if want_p11kit != 'false' and not skip_deps
1167 libp11kit = dependency('p11-kit-1',
1168 version : '>= 0.23.3',
1169 required : want_p11kit == 'true')
1170 have = libp11kit.found()
1175 conf.set10('HAVE_P11KIT', have)
1177 want_libfido2 = get_option('libfido2')
1178 if want_libfido2 != 'false' and not skip_deps
1179 libfido2 = dependency('libfido2',
1180 required : want_libfido2 == 'true')
1181 have = libfido2.found()
1186 conf.set10('HAVE_LIBFIDO2', have)
1188 want_elfutils = get_option('elfutils')
1189 if want_elfutils != 'false' and not skip_deps
1190 libdw = dependency('libdw',
1191 required : want_elfutils == 'true')
1192 have = libdw.found()
1197 conf.set10('HAVE_ELFUTILS', have)
1199 want_zlib = get_option('zlib')
1200 if want_zlib != 'false' and not skip_deps
1201 libz = dependency('zlib',
1202 required : want_zlib == 'true')
1208 conf.set10('HAVE_ZLIB', have)
1210 want_bzip2 = get_option('bzip2')
1211 if want_bzip2 != 'false' and not skip_deps
1212 libbzip2 = cc.find_library('bz2',
1213 required : want_bzip2 == 'true')
1214 have = libbzip2.found()
1219 conf.set10('HAVE_BZIP2', have)
1221 want_xz = get_option('xz')
1222 if want_xz != 'false' and not skip_deps
1223 libxz = dependency('liblzma',
1224 required : want_xz == 'true')
1225 have_xz = libxz.found()
1230 conf.set10('HAVE_XZ', have_xz)
1232 want_lz4 = get_option('lz4')
1233 if want_lz4 != 'false' and not skip_deps
1234 liblz4 = dependency('liblz4',
1235 version : '>= 1.3.0',
1236 required : want_lz4 == 'true')
1237 have_lz4 = liblz4.found()
1242 conf.set10('HAVE_LZ4', have_lz4)
1244 want_zstd = get_option('zstd')
1245 if want_zstd != 'false' and not skip_deps
1246 libzstd = dependency('libzstd',
1247 required : want_zstd == 'true',
1248 version : '>= 1.4.0')
1249 have_zstd = libzstd.found()
1254 conf.set10('HAVE_ZSTD', have_zstd)
1256 conf.set10('HAVE_COMPRESSION', have_xz or have_lz4 or have_zstd)
1258 want_xkbcommon = get_option('xkbcommon')
1259 if want_xkbcommon != 'false' and not skip_deps
1260 libxkbcommon = dependency('xkbcommon',
1261 version : '>= 0.3.0',
1262 required : want_xkbcommon == 'true')
1263 have = libxkbcommon.found()
1268 conf.set10('HAVE_XKBCOMMON', have)
1270 want_pcre2 = get_option('pcre2')
1271 if want_pcre2 != 'false'
1272 libpcre2 = dependency('libpcre2-8',
1273 required : want_pcre2 == 'true')
1274 have = libpcre2.found()
1279 conf.set10('HAVE_PCRE2', have)
1281 want_glib = get_option('glib')
1282 if want_glib != 'false' and not skip_deps
1283 libglib = dependency('glib-2.0',
1284 version : '>= 2.22.0',
1285 required : want_glib == 'true')
1286 libgobject = dependency('gobject-2.0',
1287 version : '>= 2.22.0',
1288 required : want_glib == 'true')
1289 libgio = dependency('gio-2.0',
1290 required : want_glib == 'true')
1291 have = libglib.found() and libgobject.found() and libgio.found()
1298 conf.set10('HAVE_GLIB', have)
1300 want_dbus = get_option('dbus')
1301 if want_dbus != 'false' and not skip_deps
1302 libdbus = dependency('dbus-1',
1303 version : '>= 1.3.2',
1304 required : want_dbus == 'true')
1305 have = libdbus.found()
1310 conf.set10('HAVE_DBUS', have)
1312 default_dnssec = get_option('default-dnssec')
1314 default_dnssec = 'no'
1316 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1317 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1318 default_dnssec = 'no'
1320 conf.set('DEFAULT_DNSSEC_MODE',
1321 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1322 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1324 dns_over_tls = get_option('dns-over-tls')
1325 if dns_over_tls != 'false'
1326 if dns_over_tls == 'openssl'
1329 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1330 if dns_over_tls == 'gnutls' and not have_gnutls
1331 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1334 if dns_over_tls == 'gnutls' or have_gnutls
1335 have_openssl = false
1337 have_openssl = conf.get('HAVE_OPENSSL') == 1
1338 if dns_over_tls != 'auto' and not have_openssl
1339 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1340 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1343 have = have_gnutls or have_openssl
1347 have_openssl = false
1349 conf.set10('ENABLE_DNS_OVER_TLS', have)
1350 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1351 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1353 default_dns_over_tls = get_option('default-dns-over-tls')
1355 default_dns_over_tls = 'no'
1357 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1358 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.')
1359 default_dns_over_tls = 'no'
1361 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1362 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1363 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1365 default_mdns = get_option('default-mdns')
1366 conf.set('DEFAULT_MDNS_MODE',
1367 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
1368 substs.set('DEFAULT_MDNS_MODE', default_mdns)
1370 default_llmnr = get_option('default-llmnr')
1371 conf.set('DEFAULT_LLMNR_MODE',
1372 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
1373 substs.set('DEFAULT_LLMNR_MODE', default_llmnr)
1375 want_repart = get_option('repart')
1376 if want_repart != 'false'
1377 have = (conf.get('HAVE_OPENSSL') == 1 and
1378 conf.get('HAVE_LIBFDISK') == 1)
1379 if want_repart == 'true' and not have
1380 error('repart support was requested, but dependencies are not available')
1385 conf.set10('ENABLE_REPART', have)
1387 want_importd = get_option('importd')
1388 if want_importd != 'false'
1389 have = (conf.get('HAVE_LIBCURL') == 1 and
1390 conf.get('HAVE_ZLIB') == 1 and
1391 conf.get('HAVE_XZ') == 1 and
1392 conf.get('HAVE_GCRYPT') == 1)
1393 if want_importd == 'true' and not have
1394 error('importd support was requested, but dependencies are not available')
1399 conf.set10('ENABLE_IMPORTD', have)
1401 want_homed = get_option('homed')
1402 if want_homed != 'false'
1403 have = (conf.get('HAVE_OPENSSL') == 1 and
1404 conf.get('HAVE_LIBFDISK') == 1 and
1405 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1406 if want_homed == 'true' and not have
1407 error('homed support was requested, but dependencies are not available')
1412 conf.set10('ENABLE_HOMED', have)
1414 have = have and conf.get('HAVE_PAM') == 1
1415 conf.set10('ENABLE_PAM_HOME', have)
1417 have = get_option('oomd')
1419 have = get_option('mode') == 'developer'
1421 have = have == 'true'
1422 if have and get_option('mode') != 'developer'
1423 warning('oomd is not ready for release mode (yet)')
1426 conf.set10('ENABLE_OOMD', have)
1427 substs.set10('ENABLE_OOMD', have)
1429 want_remote = get_option('remote')
1430 if want_remote != 'false'
1431 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1432 conf.get('HAVE_LIBCURL') == 1]
1433 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1434 # it's possible to build one without the other. Complain only if
1435 # support was explicitly requested. The auxiliary files like sysusers
1436 # config should be installed when any of the programs are built.
1437 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1438 error('remote support was requested, but dependencies are not available')
1440 have = have_deps[0] or have_deps[1]
1444 conf.set10('ENABLE_REMOTE', have)
1446 foreach term : ['analyze',
1460 'compat-mutable-uid-boundaries',
1484 have = get_option(term)
1485 name = 'ENABLE_' + term.underscorify().to_upper()
1486 conf.set10(name, have)
1487 substs.set10(name, have)
1490 enable_sysusers = conf.get('ENABLE_SYSUSERS') == 1
1492 foreach tuple : [['nss-mymachines', 'machined'],
1493 ['nss-resolve', 'resolve']]
1494 want = get_option(tuple[0])
1496 have = get_option(tuple[1])
1497 if want == 'true' and not have
1498 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1503 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1504 conf.set10(name, have)
1508 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1509 'ENABLE_NSS_MYMACHINES',
1510 'ENABLE_NSS_RESOLVE',
1511 'ENABLE_NSS_SYSTEMD']
1512 if conf.get(term) == 1
1516 conf.set10('ENABLE_NSS', enable_nss)
1518 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1523 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1525 #####################################################################
1527 if get_option('efi')
1528 efi_arch = host_machine.cpu_family()
1530 if efi_arch == 'x86'
1531 EFI_MACHINE_TYPE_NAME = 'ia32'
1532 gnu_efi_arch = 'ia32'
1533 elif efi_arch == 'x86_64'
1534 EFI_MACHINE_TYPE_NAME = 'x64'
1535 gnu_efi_arch = 'x86_64'
1536 elif efi_arch == 'arm'
1537 EFI_MACHINE_TYPE_NAME = 'arm'
1538 gnu_efi_arch = 'arm'
1539 elif efi_arch == 'aarch64'
1540 EFI_MACHINE_TYPE_NAME = 'aa64'
1541 gnu_efi_arch = 'aarch64'
1543 EFI_MACHINE_TYPE_NAME = ''
1548 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1550 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1554 conf.set10('ENABLE_EFI', have)
1556 #####################################################################
1558 config_h = configure_file(
1559 output : 'config.h',
1560 configuration : conf)
1562 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1564 includes = include_directories('src/basic',
1569 'src/journal-remote',
1570 'src/libsystemd-network',
1571 'src/libsystemd/sd-bus',
1572 'src/libsystemd/sd-device',
1573 'src/libsystemd/sd-event',
1574 'src/libsystemd/sd-hwdb',
1575 'src/libsystemd/sd-id128',
1576 'src/libsystemd/sd-netlink',
1577 'src/libsystemd/sd-network',
1578 'src/libsystemd/sd-resolve',
1586 'src/time-wait-sync',
1589 'src/xdg-autostart-generator',
1592 add_project_arguments('-include', 'config.h', language : 'c')
1594 generate_gperfs = find_program('tools/generate-gperfs.py')
1598 subdir('src/libudev')
1599 subdir('src/systemd')
1601 subdir('src/libsystemd')
1602 subdir('src/libsystemd-network')
1603 subdir('src/journal')
1606 libjournal_core = static_library(
1608 libjournal_core_sources,
1610 include_directories : includes,
1613 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1614 libsystemd = shared_library(
1617 version : libsystemd_version,
1618 include_directories : includes,
1619 link_args : ['-shared',
1620 '-Wl,--version-script=' + libsystemd_sym_path],
1621 link_with : [libbasic,
1623 link_whole : [libsystemd_static,
1625 dependencies : [threads,
1630 link_depends : libsystemd_sym,
1632 install_dir : rootlibdir)
1634 static_libsystemd = get_option('static-libsystemd')
1635 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1637 install_libsystemd_static = static_library(
1640 journal_client_sources,
1642 basic_gcrypt_sources,
1644 include_directories : includes,
1645 build_by_default : static_libsystemd != 'false',
1646 install : static_libsystemd != 'false',
1647 install_dir : rootlibdir,
1648 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1649 dependencies : [threads,
1659 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1661 ############################################################
1663 autosuspend_update_sh = find_program('tools/autosuspend-update.sh')
1664 hwdb_update_sh = find_program('tools/hwdb-update.sh')
1665 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1666 make_directive_index_py = find_program('tools/make-directive-index.py')
1667 make_man_index_py = find_program('tools/make-man-index.py')
1668 syscall_names_update_sh = find_program('tools/syscall-names-update.sh')
1669 xml_helper_py = find_program('tools/xml_helper.py')
1670 update_dbus_docs_py = find_program('tools/update-dbus-docs.py')
1672 ############################################################
1674 # binaries that have --help and are intended for use by humans,
1675 # usually, but not always, installed in /bin.
1676 public_programs = []
1678 subdir('src/shared')
1680 subdir('src/shutdown')
1682 subdir('src/network')
1684 subdir('src/analyze')
1685 subdir('src/journal-remote')
1686 subdir('src/coredump')
1687 subdir('src/pstore')
1689 subdir('src/hostname')
1690 subdir('src/import')
1691 subdir('src/partition')
1692 subdir('src/kernel-install')
1693 subdir('src/locale')
1694 subdir('src/machine')
1695 subdir('src/portable')
1696 subdir('src/userdb')
1698 subdir('src/nspawn')
1699 subdir('src/resolve')
1700 subdir('src/timedate')
1701 subdir('src/timesync')
1702 subdir('src/tmpfiles')
1703 subdir('src/vconsole')
1704 subdir('src/boot/efi')
1711 ############################################################
1713 # only static linking apart from libdl, to make sure that the
1714 # module is linked to all libraries that it uses.
1715 test_dlopen = executable(
1719 include_directories : includes,
1720 link_with : [libbasic],
1721 dependencies : [libdl],
1722 build_by_default : want_tests != 'false')
1724 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1725 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h src/nss-systemd/nss-systemd.h'],
1726 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1727 ['resolve', 'ENABLE_NSS_RESOLVE']]
1729 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1733 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1734 version_script_arg = join_paths(project_source_root, sym)
1736 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1737 if tuple.length() > 2
1738 sources += tuple[2].split()
1741 nss = shared_library(
1746 include_directories : includes,
1747 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1748 link_args : ['-Wl,-z,nodelete',
1750 '-Wl,--version-script=' + version_script_arg],
1751 link_with : [libsystemd_static,
1754 dependencies : [threads,
1758 install_dir : rootlibdir)
1760 # We cannot use shared_module because it does not support version suffix.
1761 # Unfortunately shared_library insists on creating the symlink…
1762 meson.add_install_script('sh', '-c',
1763 'rm $DESTDIR@0@/libnss_@1@.so'
1764 .format(rootlibdir, module))
1766 if want_tests != 'false'
1767 test('dlopen-nss_' + module,
1769 # path to dlopen must include a slash
1770 args : nss.full_path())
1775 ############################################################
1780 include_directories : includes,
1781 link_with : [libcore,
1783 dependencies : [versiondep,
1790 install_rpath : rootlibexecdir,
1792 install_dir : rootlibexecdir)
1794 meson.add_install_script(meson_make_symlink,
1795 join_paths(rootlibexecdir, 'systemd'),
1796 join_paths(rootsbindir, 'init'))
1798 public_programs += executable(
1800 systemd_analyze_sources,
1801 include_directories : includes,
1802 link_with : [libcore,
1804 dependencies : [versiondep,
1811 install_rpath : rootlibexecdir,
1812 install : conf.get('ENABLE_ANALYZE'))
1816 systemd_journald_sources,
1817 include_directories : includes,
1818 link_with : [libjournal_core,
1820 dependencies : [threads,
1825 install_rpath : rootlibexecdir,
1827 install_dir : rootlibexecdir)
1829 public_programs += executable(
1831 systemd_cat_sources,
1832 include_directories : includes,
1833 link_with : [libjournal_core,
1835 dependencies : [threads],
1836 install_rpath : rootlibexecdir,
1839 public_programs += executable(
1842 include_directories : includes,
1843 link_with : [libshared],
1844 dependencies : [threads,
1850 install_rpath : rootlibexecdir,
1852 install_dir : rootbindir)
1855 'systemd-getty-generator',
1856 'src/getty-generator/getty-generator.c',
1857 include_directories : includes,
1858 link_with : [libshared],
1859 install_rpath : rootlibexecdir,
1861 install_dir : systemgeneratordir)
1864 'systemd-debug-generator',
1865 'src/debug-generator/debug-generator.c',
1866 include_directories : includes,
1867 link_with : [libshared],
1868 install_rpath : rootlibexecdir,
1870 install_dir : systemgeneratordir)
1873 'systemd-run-generator',
1874 'src/run-generator/run-generator.c',
1875 include_directories : includes,
1876 link_with : [libshared],
1877 install_rpath : rootlibexecdir,
1879 install_dir : systemgeneratordir)
1882 'systemd-fstab-generator',
1883 'src/fstab-generator/fstab-generator.c',
1884 include_directories : includes,
1885 link_with : [libcore_shared,
1887 install_rpath : rootlibexecdir,
1889 install_dir : systemgeneratordir)
1891 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1893 '30-systemd-environment-d-generator',
1894 'src/environment-d-generator/environment-d-generator.c',
1895 include_directories : includes,
1896 link_with : [libshared],
1897 install_rpath : rootlibexecdir,
1899 install_dir : userenvgeneratordir)
1901 meson.add_install_script(meson_make_symlink,
1902 join_paths(sysconfdir, 'environment'),
1903 join_paths(environmentdir, '99-environment.conf'))
1906 if conf.get('ENABLE_HIBERNATE') == 1
1908 'systemd-hibernate-resume-generator',
1909 'src/hibernate-resume/hibernate-resume-generator.c',
1910 include_directories : includes,
1911 link_with : [libshared],
1912 install_rpath : rootlibexecdir,
1914 install_dir : systemgeneratordir)
1917 'systemd-hibernate-resume',
1918 'src/hibernate-resume/hibernate-resume.c',
1919 include_directories : includes,
1920 link_with : [libshared],
1921 install_rpath : rootlibexecdir,
1923 install_dir : rootlibexecdir)
1926 if conf.get('HAVE_BLKID') == 1
1928 'systemd-gpt-auto-generator',
1929 'src/gpt-auto-generator/gpt-auto-generator.c',
1930 'src/shared/blkid-util.h',
1931 include_directories : includes,
1932 link_with : [libshared],
1933 dependencies : libblkid,
1934 install_rpath : rootlibexecdir,
1936 install_dir : systemgeneratordir)
1938 public_programs += executable(
1940 'src/dissect/dissect.c',
1941 include_directories : includes,
1942 link_with : [libshared],
1943 install_rpath : rootlibexecdir,
1947 if conf.get('ENABLE_RESOLVE') == 1
1950 systemd_resolved_sources,
1951 include_directories : includes,
1952 link_with : [libshared,
1954 libsystemd_resolve_core],
1955 dependencies : systemd_resolved_dependencies,
1956 install_rpath : rootlibexecdir,
1958 install_dir : rootlibexecdir)
1960 public_programs += executable(
1963 include_directories : includes,
1964 link_with : [libshared,
1966 libsystemd_resolve_core],
1967 dependencies : [threads,
1971 install_rpath : rootlibexecdir,
1974 meson.add_install_script(meson_make_symlink,
1975 join_paths(bindir, 'resolvectl'),
1976 join_paths(rootsbindir, 'resolvconf'))
1978 meson.add_install_script(meson_make_symlink,
1979 join_paths(bindir, 'resolvectl'),
1980 join_paths(bindir, 'systemd-resolve'))
1983 if conf.get('ENABLE_LOGIND') == 1
1986 systemd_logind_sources,
1987 include_directories : includes,
1988 link_with : [liblogind_core,
1990 dependencies : [threads,
1992 install_rpath : rootlibexecdir,
1994 install_dir : rootlibexecdir)
1996 public_programs += executable(
1999 include_directories : includes,
2000 link_with : [libshared],
2001 dependencies : [threads,
2005 install_rpath : rootlibexecdir,
2007 install_dir : rootbindir)
2009 public_programs += executable(
2011 'src/login/inhibit.c',
2012 include_directories : includes,
2013 link_with : [libshared],
2014 install_rpath : rootlibexecdir,
2016 install_dir : rootbindir)
2018 if conf.get('HAVE_PAM') == 1
2019 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
2020 pam_systemd = shared_library(
2024 include_directories : includes,
2025 link_args : ['-shared',
2026 '-Wl,--version-script=' + version_script_arg],
2027 link_with : [libsystemd_static,
2029 dependencies : [threads,
2032 link_depends : pam_systemd_sym,
2034 install_dir : pamlibdir)
2036 if want_tests != 'false'
2037 test('dlopen-pam_systemd',
2039 # path to dlopen must include a slash
2040 args : pam_systemd.full_path())
2045 'systemd-user-runtime-dir',
2046 user_runtime_dir_sources,
2047 include_directories : includes,
2048 link_with : [libshared],
2049 install_rpath : rootlibexecdir,
2051 install_dir : rootlibexecdir)
2054 if conf.get('HAVE_PAM') == 1
2056 'systemd-user-sessions',
2057 'src/user-sessions/user-sessions.c',
2058 include_directories : includes,
2059 link_with : [libshared],
2060 install_rpath : rootlibexecdir,
2062 install_dir : rootlibexecdir)
2065 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
2066 public_programs += executable(
2068 'src/boot/bootctl.c',
2069 include_directories : includes,
2070 link_with : [libshared],
2071 dependencies : [libblkid],
2072 install_rpath : rootlibexecdir,
2075 public_programs += executable(
2076 'systemd-bless-boot',
2077 'src/boot/bless-boot.c',
2078 include_directories : includes,
2079 link_with : [libshared],
2080 dependencies : [libblkid],
2081 install_rpath : rootlibexecdir,
2083 install_dir : rootlibexecdir)
2086 'systemd-bless-boot-generator',
2087 'src/boot/bless-boot-generator.c',
2088 include_directories : includes,
2089 link_with : [libshared],
2090 install_rpath : rootlibexecdir,
2092 install_dir : systemgeneratordir)
2096 'systemd-boot-check-no-failures',
2097 'src/boot/boot-check-no-failures.c',
2098 include_directories : includes,
2099 link_with : [libshared],
2100 dependencies : [libblkid],
2101 install_rpath : rootlibexecdir,
2103 install_dir : rootlibexecdir)
2105 public_programs += executable(
2106 'systemd-socket-activate',
2107 'src/activate/activate.c',
2108 include_directories : includes,
2109 link_with : [libshared],
2110 dependencies : [threads],
2111 install_rpath : rootlibexecdir,
2114 if get_option('link-systemctl-shared')
2115 systemctl_link_with = [libshared]
2117 systemctl_link_with = [libsystemd_static,
2123 public_programs += executable(
2125 'src/systemctl/systemctl-add-dependency.c',
2126 'src/systemctl/systemctl-add-dependency.h',
2127 'src/systemctl/systemctl-cancel-job.c',
2128 'src/systemctl/systemctl-cancel-job.h',
2129 'src/systemctl/systemctl-clean-or-freeze.c',
2130 'src/systemctl/systemctl-clean-or-freeze.h',
2131 'src/systemctl/systemctl-compat-halt.c',
2132 'src/systemctl/systemctl-compat-halt.h',
2133 'src/systemctl/systemctl-compat-runlevel.c',
2134 'src/systemctl/systemctl-compat-runlevel.h',
2135 'src/systemctl/systemctl-compat-shutdown.c',
2136 'src/systemctl/systemctl-compat-shutdown.h',
2137 'src/systemctl/systemctl-compat-telinit.c',
2138 'src/systemctl/systemctl-compat-telinit.h',
2139 'src/systemctl/systemctl-daemon-reload.c',
2140 'src/systemctl/systemctl-daemon-reload.h',
2141 'src/systemctl/systemctl-edit.c',
2142 'src/systemctl/systemctl-edit.h',
2143 'src/systemctl/systemctl-enable.c',
2144 'src/systemctl/systemctl-enable.h',
2145 'src/systemctl/systemctl-is-active.c',
2146 'src/systemctl/systemctl-is-active.h',
2147 'src/systemctl/systemctl-is-enabled.c',
2148 'src/systemctl/systemctl-is-enabled.h',
2149 'src/systemctl/systemctl-is-system-running.c',
2150 'src/systemctl/systemctl-is-system-running.h',
2151 'src/systemctl/systemctl-kill.c',
2152 'src/systemctl/systemctl-kill.h',
2153 'src/systemctl/systemctl-list-dependencies.c',
2154 'src/systemctl/systemctl-list-dependencies.h',
2155 'src/systemctl/systemctl-list-jobs.c',
2156 'src/systemctl/systemctl-list-jobs.h',
2157 'src/systemctl/systemctl-list-machines.c',
2158 'src/systemctl/systemctl-list-machines.h',
2159 'src/systemctl/systemctl-list-unit-files.c',
2160 'src/systemctl/systemctl-list-unit-files.h',
2161 'src/systemctl/systemctl-list-units.c',
2162 'src/systemctl/systemctl-list-units.h',
2163 'src/systemctl/systemctl-log-setting.c',
2164 'src/systemctl/systemctl-log-setting.h',
2165 'src/systemctl/systemctl-logind.c',
2166 'src/systemctl/systemctl-logind.h',
2167 'src/systemctl/systemctl-preset-all.c',
2168 'src/systemctl/systemctl-preset-all.h',
2169 'src/systemctl/systemctl-reset-failed.c',
2170 'src/systemctl/systemctl-reset-failed.h',
2171 'src/systemctl/systemctl-service-watchdogs.c',
2172 'src/systemctl/systemctl-service-watchdogs.h',
2173 'src/systemctl/systemctl-set-default.c',
2174 'src/systemctl/systemctl-set-default.h',
2175 'src/systemctl/systemctl-set-environment.c',
2176 'src/systemctl/systemctl-set-environment.h',
2177 'src/systemctl/systemctl-set-property.c',
2178 'src/systemctl/systemctl-set-property.h',
2179 'src/systemctl/systemctl-show.c',
2180 'src/systemctl/systemctl-show.h',
2181 'src/systemctl/systemctl-start-special.c',
2182 'src/systemctl/systemctl-start-special.h',
2183 'src/systemctl/systemctl-start-unit.c',
2184 'src/systemctl/systemctl-start-unit.h',
2185 'src/systemctl/systemctl-switch-root.c',
2186 'src/systemctl/systemctl-switch-root.h',
2187 'src/systemctl/systemctl-sysv-compat.c',
2188 'src/systemctl/systemctl-sysv-compat.h',
2189 'src/systemctl/systemctl-trivial-method.c',
2190 'src/systemctl/systemctl-trivial-method.h',
2191 'src/systemctl/systemctl-util.c',
2192 'src/systemctl/systemctl-util.c',
2193 'src/systemctl/systemctl-util.h',
2194 'src/systemctl/systemctl.c',
2195 'src/systemctl/systemctl.h',
2196 include_directories : includes,
2197 link_with : systemctl_link_with,
2198 dependencies : [threads,
2204 install_rpath : rootlibexecdir,
2206 install_dir : rootbindir)
2208 if conf.get('ENABLE_PORTABLED') == 1
2210 'systemd-portabled',
2211 systemd_portabled_sources,
2212 include_directories : includes,
2213 link_with : [libshared],
2214 dependencies : [threads],
2215 install_rpath : rootlibexecdir,
2217 install_dir : rootlibexecdir)
2219 public_programs += executable(
2221 'src/portable/portablectl.c',
2222 include_directories : includes,
2223 link_with : [libshared],
2224 dependencies : [threads],
2225 install_rpath : rootlibexecdir,
2227 install_dir : rootbindir)
2230 if conf.get('ENABLE_USERDB') == 1
2233 systemd_userwork_sources,
2234 include_directories : includes,
2235 link_with : [libshared],
2236 dependencies : [threads],
2237 install_rpath : rootlibexecdir,
2239 install_dir : rootlibexecdir)
2243 systemd_userdbd_sources,
2244 include_directories : includes,
2245 link_with : [libshared],
2246 dependencies : [threads],
2247 install_rpath : rootlibexecdir,
2249 install_dir : rootlibexecdir)
2251 public_programs += executable(
2254 include_directories : includes,
2255 link_with : [libshared],
2256 dependencies : [threads],
2257 install_rpath : rootlibexecdir,
2259 install_dir : rootbindir)
2262 if conf.get('ENABLE_HOMED') == 1
2265 systemd_homework_sources,
2266 include_directories : includes,
2267 link_with : [libshared],
2268 dependencies : [threads,
2276 install_rpath : rootlibexecdir,
2278 install_dir : rootlibexecdir)
2282 systemd_homed_sources,
2283 include_directories : includes,
2284 link_with : [libshared],
2285 dependencies : [threads,
2288 install_rpath : rootlibexecdir,
2290 install_dir : rootlibexecdir)
2292 public_programs += executable(
2295 include_directories : includes,
2296 link_with : [libshared],
2297 dependencies : [threads,
2303 install_rpath : rootlibexecdir,
2305 install_dir : rootbindir)
2307 if conf.get('HAVE_PAM') == 1
2308 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2309 pam_systemd = shared_library(
2313 include_directories : includes,
2314 link_args : ['-shared',
2315 '-Wl,--version-script=' + version_script_arg],
2316 link_with : [libsystemd_static,
2318 dependencies : [threads,
2322 link_depends : pam_systemd_home_sym,
2324 install_dir : pamlibdir)
2328 foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
2329 (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
2330 meson.add_install_script(meson_make_symlink,
2331 join_paths(rootbindir, 'systemctl'),
2332 join_paths(rootsbindir, alias))
2335 meson.add_install_script(meson_make_symlink,
2336 join_paths(rootbindir, 'udevadm'),
2337 join_paths(rootlibexecdir, 'systemd-udevd'))
2339 if conf.get('ENABLE_BACKLIGHT') == 1
2341 'systemd-backlight',
2342 'src/backlight/backlight.c',
2343 include_directories : includes,
2344 link_with : [libshared],
2345 install_rpath : rootlibexecdir,
2347 install_dir : rootlibexecdir)
2350 if conf.get('ENABLE_RFKILL') == 1
2353 'src/rfkill/rfkill.c',
2354 include_directories : includes,
2355 link_with : [libshared],
2356 install_rpath : rootlibexecdir,
2358 install_dir : rootlibexecdir)
2362 'systemd-system-update-generator',
2363 'src/system-update-generator/system-update-generator.c',
2364 include_directories : includes,
2365 link_with : [libshared],
2366 install_rpath : rootlibexecdir,
2368 install_dir : systemgeneratordir)
2370 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2371 systemd_cryptsetup_sources = files('''
2372 src/cryptsetup/cryptsetup-pkcs11.h
2373 src/cryptsetup/cryptsetup-keyfile.c
2374 src/cryptsetup/cryptsetup-keyfile.h
2375 src/cryptsetup/cryptsetup.c
2378 if conf.get('HAVE_P11KIT') == 1
2379 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2383 'systemd-cryptsetup',
2384 systemd_cryptsetup_sources,
2385 include_directories : includes,
2386 link_with : [libshared],
2387 dependencies : [libcryptsetup,
2389 install_rpath : rootlibexecdir,
2391 install_dir : rootlibexecdir)
2394 'systemd-cryptsetup-generator',
2395 'src/cryptsetup/cryptsetup-generator.c',
2396 include_directories : includes,
2397 link_with : [libshared],
2398 install_rpath : rootlibexecdir,
2400 install_dir : systemgeneratordir)
2403 'systemd-veritysetup',
2404 'src/veritysetup/veritysetup.c',
2405 include_directories : includes,
2406 link_with : [libshared],
2407 dependencies : [libcryptsetup],
2408 install_rpath : rootlibexecdir,
2410 install_dir : rootlibexecdir)
2413 'systemd-veritysetup-generator',
2414 'src/veritysetup/veritysetup-generator.c',
2415 include_directories : includes,
2416 link_with : [libshared],
2417 install_rpath : rootlibexecdir,
2419 install_dir : systemgeneratordir)
2422 if conf.get('HAVE_SYSV_COMPAT') == 1
2424 'systemd-sysv-generator',
2425 'src/sysv-generator/sysv-generator.c',
2426 include_directories : includes,
2427 link_with : [libshared],
2428 install_rpath : rootlibexecdir,
2430 install_dir : systemgeneratordir)
2433 'systemd-rc-local-generator',
2434 'src/rc-local-generator/rc-local-generator.c',
2435 include_directories : includes,
2436 link_with : [libshared],
2437 install_rpath : rootlibexecdir,
2439 install_dir : systemgeneratordir)
2442 if conf.get('ENABLE_XDG_AUTOSTART') == 1
2444 'systemd-xdg-autostart-generator',
2445 'src/xdg-autostart-generator/xdg-autostart-generator.c',
2446 'src/xdg-autostart-generator/xdg-autostart-service.c',
2447 include_directories : includes,
2448 link_with : [libshared],
2449 install_rpath : rootlibexecdir,
2451 install_dir : usergeneratordir)
2454 'systemd-xdg-autostart-condition',
2455 'src/xdg-autostart-generator/xdg-autostart-condition.c',
2456 include_directories : includes,
2457 link_with : [libshared],
2458 install_rpath : rootlibexecdir,
2460 install_dir : rootlibexecdir)
2463 if conf.get('ENABLE_HOSTNAMED') == 1
2465 'systemd-hostnamed',
2466 'src/hostname/hostnamed.c',
2467 include_directories : includes,
2468 link_with : [libshared],
2469 install_rpath : rootlibexecdir,
2471 install_dir : rootlibexecdir)
2473 public_programs += executable(
2475 'src/hostname/hostnamectl.c',
2476 include_directories : includes,
2477 link_with : [libshared],
2478 install_rpath : rootlibexecdir,
2482 if conf.get('ENABLE_LOCALED') == 1
2483 if conf.get('HAVE_XKBCOMMON') == 1
2484 # logind will load libxkbcommon.so dynamically on its own
2492 systemd_localed_sources,
2493 include_directories : includes,
2494 link_with : [libshared],
2495 dependencies : deps,
2496 install_rpath : rootlibexecdir,
2498 install_dir : rootlibexecdir)
2500 public_programs += executable(
2503 include_directories : includes,
2504 link_with : [libshared],
2505 install_rpath : rootlibexecdir,
2509 if conf.get('ENABLE_TIMEDATED') == 1
2511 'systemd-timedated',
2512 'src/timedate/timedated.c',
2513 include_directories : includes,
2514 link_with : [libshared],
2515 install_rpath : rootlibexecdir,
2517 install_dir : rootlibexecdir)
2520 if conf.get('ENABLE_TIMEDATECTL') == 1
2521 public_programs += executable(
2523 'src/timedate/timedatectl.c',
2524 include_directories : includes,
2525 install_rpath : rootlibexecdir,
2526 link_with : [libshared],
2527 dependencies : [libm],
2531 if conf.get('ENABLE_TIMESYNCD') == 1
2532 if get_option('link-timesyncd-shared')
2533 timesyncd_link_with = [libshared]
2535 timesyncd_link_with = [libsystemd_static,
2542 'systemd-timesyncd',
2543 systemd_timesyncd_sources,
2544 include_directories : includes,
2545 link_with : [timesyncd_link_with],
2546 dependencies : [threads,
2548 install_rpath : rootlibexecdir,
2550 install_dir : rootlibexecdir)
2553 'systemd-time-wait-sync',
2554 'src/time-wait-sync/time-wait-sync.c',
2555 include_directories : includes,
2556 link_with : [timesyncd_link_with],
2557 install_rpath : rootlibexecdir,
2559 install_dir : rootlibexecdir)
2562 if conf.get('ENABLE_MACHINED') == 1
2565 systemd_machined_sources,
2566 include_directories : includes,
2567 link_with : [libmachine_core,
2569 install_rpath : rootlibexecdir,
2571 install_dir : rootlibexecdir)
2573 public_programs += executable(
2575 'src/machine/machinectl.c',
2576 include_directories : includes,
2577 link_with : [libshared],
2578 dependencies : [threads,
2582 install_rpath : rootlibexecdir,
2584 install_dir : rootbindir)
2587 if conf.get('ENABLE_IMPORTD') == 1
2590 systemd_importd_sources,
2591 include_directories : includes,
2592 link_with : [libshared],
2593 dependencies : [threads],
2594 install_rpath : rootlibexecdir,
2596 install_dir : rootlibexecdir)
2598 systemd_pull = executable(
2600 systemd_pull_sources,
2601 include_directories : includes,
2602 link_with : [libshared],
2603 dependencies : [versiondep,
2609 install_rpath : rootlibexecdir,
2611 install_dir : rootlibexecdir)
2613 systemd_import = executable(
2615 systemd_import_sources,
2616 include_directories : includes,
2617 link_with : [libshared],
2618 dependencies : [libcurl,
2622 install_rpath : rootlibexecdir,
2624 install_dir : rootlibexecdir)
2626 systemd_import_fs = executable(
2627 'systemd-import-fs',
2628 systemd_import_fs_sources,
2629 include_directories : includes,
2630 link_with : [libshared],
2631 install_rpath : rootlibexecdir,
2633 install_dir : rootlibexecdir)
2635 systemd_export = executable(
2637 systemd_export_sources,
2638 include_directories : includes,
2639 link_with : [libshared],
2640 dependencies : [libcurl,
2644 install_rpath : rootlibexecdir,
2646 install_dir : rootlibexecdir)
2648 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2651 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2652 public_programs += executable(
2653 'systemd-journal-upload',
2654 systemd_journal_upload_sources,
2655 include_directories : includes,
2656 link_with : [libshared],
2657 dependencies : [versiondep,
2664 install_rpath : rootlibexecdir,
2666 install_dir : rootlibexecdir)
2669 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2670 public_programs += executable(
2671 'systemd-journal-remote',
2672 systemd_journal_remote_sources,
2673 include_directories : includes,
2674 link_with : [libshared,
2675 libsystemd_journal_remote],
2676 dependencies : [threads,
2682 install_rpath : rootlibexecdir,
2684 install_dir : rootlibexecdir)
2686 public_programs += executable(
2687 'systemd-journal-gatewayd',
2688 systemd_journal_gatewayd_sources,
2689 include_directories : includes,
2690 link_with : [libshared],
2691 dependencies : [threads,
2697 install_rpath : rootlibexecdir,
2699 install_dir : rootlibexecdir)
2702 if conf.get('ENABLE_COREDUMP') == 1
2705 systemd_coredump_sources,
2706 include_directories : includes,
2707 link_with : [libshared],
2708 dependencies : [threads,
2714 install_rpath : rootlibexecdir,
2716 install_dir : rootlibexecdir)
2718 public_programs += executable(
2720 coredumpctl_sources,
2721 include_directories : includes,
2722 link_with : [libshared],
2723 dependencies : [threads,
2727 install_rpath : rootlibexecdir,
2731 if conf.get('ENABLE_PSTORE') == 1
2734 systemd_pstore_sources,
2735 include_directories : includes,
2736 link_with : [libshared],
2737 dependencies : [threads,
2743 install_rpath : rootlibexecdir,
2745 install_dir : rootlibexecdir)
2748 if conf.get('ENABLE_OOMD') == 1
2749 executable('systemd-oomd',
2750 systemd_oomd_sources,
2751 include_directories : includes,
2752 link_with : [libshared],
2754 install_rpath : rootlibexecdir,
2756 install_dir : rootlibexecdir)
2758 public_programs += executable(
2761 include_directories : includes,
2762 link_with : [libshared],
2764 install_rpath : rootlibexecdir,
2766 install_dir : rootbindir)
2769 if conf.get('ENABLE_BINFMT') == 1
2770 public_programs += executable(
2772 'src/binfmt/binfmt.c',
2773 include_directories : includes,
2774 link_with : [libshared],
2775 install_rpath : rootlibexecdir,
2777 install_dir : rootlibexecdir)
2779 meson.add_install_script('sh', '-c',
2780 mkdir_p.format(binfmtdir))
2781 if install_sysconfdir
2782 meson.add_install_script('sh', '-c',
2783 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2787 if conf.get('ENABLE_REPART') == 1
2790 systemd_repart_sources,
2791 include_directories : includes,
2792 link_with : [libshared],
2793 dependencies : [threads,
2797 install_rpath : rootlibexecdir,
2799 install_dir : rootbindir)
2800 public_programs += exe
2802 if want_tests != 'false'
2805 args : exe.full_path())
2809 if conf.get('ENABLE_VCONSOLE') == 1
2811 'systemd-vconsole-setup',
2812 'src/vconsole/vconsole-setup.c',
2813 include_directories : includes,
2814 link_with : [libshared],
2815 install_rpath : rootlibexecdir,
2817 install_dir : rootlibexecdir)
2820 if conf.get('ENABLE_RANDOMSEED') == 1
2822 'systemd-random-seed',
2823 'src/random-seed/random-seed.c',
2824 include_directories : includes,
2825 link_with : [libshared],
2826 install_rpath : rootlibexecdir,
2828 install_dir : rootlibexecdir)
2831 if conf.get('ENABLE_FIRSTBOOT') == 1
2833 'systemd-firstboot',
2834 'src/firstboot/firstboot.c',
2835 include_directories : includes,
2836 link_with : [libshared],
2837 dependencies : [libcrypt],
2838 install_rpath : rootlibexecdir,
2840 install_dir : rootbindir)
2844 'systemd-remount-fs',
2845 'src/remount-fs/remount-fs.c',
2846 include_directories : includes,
2847 link_with : [libcore_shared,
2849 install_rpath : rootlibexecdir,
2851 install_dir : rootlibexecdir)
2854 'systemd-machine-id-setup',
2855 'src/machine-id-setup/machine-id-setup-main.c',
2856 include_directories : includes,
2857 link_with : [libcore_shared,
2859 install_rpath : rootlibexecdir,
2861 install_dir : rootbindir)
2866 include_directories : includes,
2867 link_with : [libshared],
2868 install_rpath : rootlibexecdir,
2870 install_dir : rootlibexecdir)
2872 executable('systemd-growfs',
2873 'src/partition/growfs.c',
2874 include_directories : includes,
2875 link_with : [libshared],
2876 install_rpath : rootlibexecdir,
2878 install_dir : rootlibexecdir)
2882 'src/partition/makefs.c',
2883 include_directories : includes,
2884 link_with : [libshared],
2885 install_rpath : rootlibexecdir,
2887 install_dir : rootlibexecdir)
2891 'src/sleep/sleep.c',
2892 include_directories : includes,
2893 link_with : [libshared],
2894 install_rpath : rootlibexecdir,
2896 install_dir : rootlibexecdir)
2898 if install_sysconfdir
2899 install_data('src/sleep/sleep.conf',
2900 install_dir : pkgsysconfdir)
2903 public_programs += executable(
2905 'src/sysctl/sysctl.c',
2906 include_directories : includes,
2907 link_with : [libshared],
2908 install_rpath : rootlibexecdir,
2910 install_dir : rootlibexecdir)
2914 'src/ac-power/ac-power.c',
2915 include_directories : includes,
2916 link_with : [libshared],
2917 install_rpath : rootlibexecdir,
2919 install_dir : rootlibexecdir)
2921 public_programs += executable(
2922 'systemd-detect-virt',
2923 'src/detect-virt/detect-virt.c',
2924 include_directories : includes,
2925 link_with : [libshared],
2926 install_rpath : rootlibexecdir,
2929 public_programs += executable(
2931 'src/delta/delta.c',
2932 include_directories : includes,
2933 link_with : [libshared],
2934 install_rpath : rootlibexecdir,
2937 public_programs += executable(
2939 'src/escape/escape.c',
2940 include_directories : includes,
2941 link_with : [libshared],
2942 install_rpath : rootlibexecdir,
2944 install_dir : rootbindir)
2946 public_programs += executable(
2948 'src/notify/notify.c',
2949 include_directories : includes,
2950 link_with : [libshared],
2951 install_rpath : rootlibexecdir,
2953 install_dir : rootbindir)
2956 'systemd-volatile-root',
2957 'src/volatile-root/volatile-root.c',
2958 include_directories : includes,
2959 link_with : [libshared],
2960 install_rpath : rootlibexecdir,
2961 install : conf.get('ENABLE_INITRD') == 1,
2962 install_dir : rootlibexecdir)
2965 'systemd-cgroups-agent',
2966 'src/cgroups-agent/cgroups-agent.c',
2967 include_directories : includes,
2968 link_with : [libshared],
2969 install_rpath : rootlibexecdir,
2971 install_dir : rootlibexecdir)
2973 public_programs += executable(
2975 'src/id128/id128.c',
2976 include_directories : includes,
2977 link_with : [libshared],
2978 install_rpath : rootlibexecdir,
2981 public_programs += executable(
2984 include_directories : includes,
2985 link_with : [libshared],
2986 install_rpath : rootlibexecdir,
2989 public_programs += executable(
2990 'systemd-ask-password',
2991 'src/ask-password/ask-password.c',
2992 include_directories : includes,
2993 link_with : [libshared],
2994 install_rpath : rootlibexecdir,
2996 install_dir : rootbindir)
2999 'systemd-reply-password',
3000 'src/reply-password/reply-password.c',
3001 include_directories : includes,
3002 link_with : [libshared],
3003 install_rpath : rootlibexecdir,
3005 install_dir : rootlibexecdir)
3007 public_programs += executable(
3008 'systemd-tty-ask-password-agent',
3009 'src/tty-ask-password-agent/tty-ask-password-agent.c',
3010 include_directories : includes,
3011 link_with : [libshared],
3012 install_rpath : rootlibexecdir,
3014 install_dir : rootbindir)
3016 public_programs += executable(
3019 include_directories : includes,
3020 link_with : [libshared],
3021 install_rpath : rootlibexecdir,
3024 public_programs += executable(
3026 'src/cgtop/cgtop.c',
3027 include_directories : includes,
3028 link_with : [libshared],
3029 install_rpath : rootlibexecdir,
3034 'src/initctl/initctl.c',
3035 include_directories : includes,
3036 link_with : [libshared],
3037 install_rpath : rootlibexecdir,
3038 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
3039 install_dir : rootlibexecdir)
3041 public_programs += executable(
3043 'src/mount/mount-tool.c',
3044 include_directories : includes,
3045 link_with : [libshared],
3046 dependencies: [libmount],
3047 install_rpath : rootlibexecdir,
3050 meson.add_install_script(meson_make_symlink,
3051 'systemd-mount', join_paths(bindir, 'systemd-umount'))
3053 public_programs += executable(
3056 include_directories : includes,
3057 link_with : [libshared],
3058 install_rpath : rootlibexecdir,
3061 public_programs += executable(
3062 'systemd-stdio-bridge',
3063 'src/stdio-bridge/stdio-bridge.c',
3064 include_directories : includes,
3065 link_with : [libshared],
3066 dependencies : [versiondep],
3067 install_rpath : rootlibexecdir,
3070 public_programs += executable(
3072 'src/busctl/busctl.c',
3073 'src/busctl/busctl-introspect.c',
3074 'src/busctl/busctl-introspect.h',
3075 include_directories : includes,
3076 link_with : [libshared],
3077 install_rpath : rootlibexecdir,
3083 'src/sysusers/sysusers.c',
3084 include_directories : includes,
3085 link_with : [libshared],
3086 install_rpath : rootlibexecdir,
3088 install_dir : rootbindir)
3089 public_programs += exe
3091 if want_tests != 'false'
3092 test('test-sysusers',
3094 # https://github.com/mesonbuild/meson/issues/2681
3095 args : exe.full_path())
3098 if have_standalone_binaries
3100 'systemd-sysusers.standalone',
3101 'src/sysusers/sysusers.c',
3102 include_directories : includes,
3103 c_args : '-DSTANDALONE',
3104 link_with : [libshared_static,
3110 install_dir : rootbindir)
3111 public_programs += exe
3113 if want_tests != 'false'
3114 test('test-sysusers.standalone',
3116 # https://github.com/mesonbuild/meson/issues/2681
3117 args : exe.full_path())
3122 if conf.get('ENABLE_TMPFILES') == 1
3125 systemd_tmpfiles_sources,
3126 include_directories : includes,
3127 link_with : [libshared],
3128 dependencies : [libacl],
3129 install_rpath : rootlibexecdir,
3131 install_dir : rootbindir)
3132 public_programs += exe
3134 if want_tests != 'false'
3135 test('test-systemd-tmpfiles',
3136 test_systemd_tmpfiles_py,
3137 # https://github.com/mesonbuild/meson/issues/2681
3138 args : exe.full_path())
3141 if have_standalone_binaries
3142 public_programs += executable(
3143 'systemd-tmpfiles.standalone',
3144 systemd_tmpfiles_sources,
3145 include_directories : includes,
3146 c_args : '-DSTANDALONE',
3147 link_with : [libshared_static,
3152 dependencies : [libacl],
3154 install_dir : rootbindir)
3158 if conf.get('ENABLE_HWDB') == 1
3159 public_programs += executable(
3162 'src/libsystemd/sd-hwdb/hwdb-internal.h',
3163 include_directories : includes,
3164 link_with : [libudev_static],
3165 install_rpath : udev_rpath,
3167 install_dir : rootbindir)
3170 if conf.get('ENABLE_QUOTACHECK') == 1
3172 'systemd-quotacheck',
3173 'src/quotacheck/quotacheck.c',
3174 include_directories : includes,
3175 link_with : [libshared],
3176 install_rpath : rootlibexecdir,
3178 install_dir : rootlibexecdir)
3181 public_programs += executable(
3182 'systemd-socket-proxyd',
3183 'src/socket-proxy/socket-proxyd.c',
3184 include_directories : includes,
3185 link_with : [libshared],
3186 dependencies : [threads],
3187 install_rpath : rootlibexecdir,
3189 install_dir : rootlibexecdir)
3191 public_programs += executable(
3194 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
3195 include_directories : includes,
3196 link_with : [libudev_core,
3199 dependencies : [versiondep,
3205 install_rpath : udev_rpath,
3207 install_dir : rootbindir)
3211 systemd_shutdown_sources,
3212 include_directories : includes,
3213 link_with : [libcore_shared,
3215 dependencies : [libmount],
3216 install_rpath : rootlibexecdir,
3218 install_dir : rootlibexecdir)
3221 'systemd-update-done',
3222 'src/update-done/update-done.c',
3223 include_directories : includes,
3224 link_with : [libshared],
3225 install_rpath : rootlibexecdir,
3227 install_dir : rootlibexecdir)
3230 'systemd-update-utmp',
3231 'src/update-utmp/update-utmp.c',
3232 include_directories : includes,
3233 link_with : [libshared],
3234 dependencies : [libaudit],
3235 install_rpath : rootlibexecdir,
3236 install : (conf.get('ENABLE_UTMP') == 1),
3237 install_dir : rootlibexecdir)
3239 if conf.get('HAVE_KMOD') == 1
3241 'systemd-modules-load',
3242 'src/modules-load/modules-load.c',
3243 include_directories : includes,
3244 link_with : [libshared],
3245 dependencies : [libkmod],
3246 install_rpath : rootlibexecdir,
3248 install_dir : rootlibexecdir)
3250 meson.add_install_script('sh', '-c',
3251 mkdir_p.format(modulesloaddir))
3252 if install_sysconfdir
3253 meson.add_install_script('sh', '-c',
3254 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
3258 public_programs += executable(
3260 systemd_nspawn_sources,
3261 include_directories : includes,
3262 link_with : [libcore_shared,
3265 dependencies : [libblkid,
3267 install_rpath : rootlibexecdir,
3270 if conf.get('ENABLE_NETWORKD') == 1
3273 systemd_networkd_sources,
3274 include_directories : network_include_dir,
3275 link_with : [libnetworkd_core,
3278 networkd_link_with],
3279 dependencies : [threads],
3280 install_rpath : rootlibexecdir,
3282 install_dir : rootlibexecdir)
3285 'systemd-networkd-wait-online',
3286 systemd_networkd_wait_online_sources,
3287 include_directories : includes,
3288 link_with : [libnetworkd_core,
3289 networkd_link_with],
3290 install_rpath : rootlibexecdir,
3292 install_dir : rootlibexecdir)
3294 public_programs += executable(
3297 include_directories : includes,
3298 link_with : [libsystemd_network,
3299 networkd_link_with],
3300 install_rpath : rootlibexecdir,
3302 install_dir : rootbindir)
3305 'systemd-network-generator',
3306 network_generator_sources,
3307 include_directories : includes,
3308 link_with : [networkd_link_with],
3309 install_rpath : rootlibexecdir,
3311 install_dir : rootlibexecdir)
3313 if want_tests != 'false'
3314 test('test-network-generator-conversion',
3315 test_network_generator_conversion_sh,
3316 # https://github.com/mesonbuild/meson/issues/2681
3317 args : exe.full_path())
3322 'systemd-sulogin-shell',
3323 ['src/sulogin-shell/sulogin-shell.c'],
3324 include_directories : includes,
3325 link_with : [libshared],
3326 install_rpath : rootlibexecdir,
3328 install_dir : rootlibexecdir)
3330 ############################################################
3333 'systemd-runtest.env',
3334 output : 'systemd-runtest.env',
3335 command : ['sh', '-c', '{ ' +
3336 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
3337 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
3339 build_by_default : true)
3341 foreach tuple : tests
3343 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3344 dependencies = tuple[2]
3345 condition = tuple.length() >= 4 ? tuple[3] : ''
3346 type = tuple.length() >= 5 ? tuple[4] : ''
3347 defs = tuple.length() >= 6 ? tuple[5] : []
3348 incs = tuple.length() >= 7 ? tuple[6] : includes
3349 parallel = tuple.length() >= 8 ? tuple[7] : true
3352 name = sources[0].split('/')[-1].split('.')[0]
3353 if type.startswith('timeout=')
3354 timeout = type.split('=')[1].to_int()
3358 if condition == '' or conf.get(condition) == 1
3362 include_directories : incs,
3363 link_with : link_with,
3364 dependencies : [versiondep,
3367 build_by_default : want_tests != 'false',
3368 install_rpath : rootlibexecdir,
3369 install : install_tests,
3370 install_dir : join_paths(testsdir, type))
3373 message('@0@ is a manual test'.format(name))
3374 elif type == 'unsafe' and want_tests != 'unsafe'
3375 message('@0@ is an unsafe test'.format(name))
3376 elif want_tests != 'false'
3382 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3387 'test-libsystemd-sym',
3388 test_libsystemd_sym_c,
3389 include_directories : includes,
3390 link_with : [libsystemd],
3391 build_by_default : want_tests != 'false',
3392 install : install_tests,
3393 install_dir : testsdir)
3394 if want_tests != 'false'
3395 test('test-libsystemd-sym', exe)
3399 'test-libsystemd-static-sym',
3400 test_libsystemd_sym_c,
3401 include_directories : includes,
3402 link_with : [install_libsystemd_static],
3403 dependencies : [threads], # threads is already included in dependencies on the library,
3404 # but does not seem to get propagated. Add here as a work-around.
3405 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3406 install : install_tests and static_libsystemd_pic,
3407 install_dir : testsdir)
3408 if want_tests != 'false' and static_libsystemd_pic
3409 test('test-libsystemd-static-sym', exe)
3415 include_directories : includes,
3416 c_args : '-Wno-deprecated-declarations',
3417 link_with : [libudev],
3418 build_by_default : want_tests != 'false',
3419 install : install_tests,
3420 install_dir : testsdir)
3421 if want_tests != 'false'
3422 test('test-libudev-sym', exe)
3426 'test-libudev-static-sym',
3428 include_directories : includes,
3429 c_args : '-Wno-deprecated-declarations',
3430 link_with : [install_libudev_static],
3431 build_by_default : want_tests != 'false' and static_libudev_pic,
3432 install : install_tests and static_libudev_pic,
3433 install_dir : testsdir)
3434 if want_tests != 'false' and static_libudev_pic
3435 test('test-libudev-static-sym', exe)
3438 ############################################################
3442 if fuzz_tests or fuzzer_build
3443 foreach tuple : fuzzers
3445 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3446 dependencies = tuple[2]
3447 defs = tuple.length() >= 4 ? tuple[3] : []
3448 incs = tuple.length() >= 5 ? tuple[4] : includes
3452 dependencies += fuzzing_engine
3454 if fuzzing_engine.found()
3455 dependencies += fuzzing_engine
3457 link_args += ['-fsanitize=fuzzer']
3460 sources += 'src/fuzz/fuzz-main.c'
3463 name = sources[0].split('/')[-1].split('.')[0]
3465 fuzzer_exes += executable(
3468 include_directories : [incs, include_directories('src/fuzz')],
3469 link_with : link_with,
3470 dependencies : dependencies,
3472 link_args: link_args,
3479 depends : fuzzer_exes,
3482 ############################################################
3485 subdir('sysusers.d')
3486 subdir('tmpfiles.d')
3492 subdir('shell-completion/bash')
3493 subdir('shell-completion/zsh')
3494 subdir('docs/sysvinit')
3495 subdir('docs/var-log')
3497 install_subdir('factory/etc',
3498 install_dir : factorydir)
3500 if install_sysconfdir
3501 install_data('xorg/50-systemd-user.sh',
3502 install_dir : xinitrcdir)
3504 install_data('modprobe.d/systemd.conf',
3505 install_dir : modprobedir)
3506 install_data('LICENSE.GPL2',
3510 'docs/CODING_STYLE.md',
3511 'docs/DISTRO_PORTING.md',
3512 'docs/ENVIRONMENT.md',
3514 'docs/TRANSIENT-SETTINGS.md',
3515 'docs/TRANSLATORS.md',
3516 'docs/UIDS-GIDS.md',
3517 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3518 install_dir : docdir)
3520 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3521 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3523 ############################################################
3525 check_help = find_program('tools/check-help.sh')
3527 foreach exec : public_programs
3528 name = exec.full_path().split('/')[-1]
3529 if want_tests != 'false'
3530 test('check-help-' + name,
3532 args : exec.full_path())
3536 ############################################################
3538 check_directives_sh = find_program('tools/check-directives.sh')
3540 if want_tests != 'false'
3541 test('check-directives',
3542 check_directives_sh,
3543 args : project_source_root)
3546 ############################################################
3548 # Enable tests for all supported sanitizers
3549 foreach tuple : sanitizers
3550 sanitizer = tuple[0]
3553 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3555 foreach p : fuzz_regression_tests
3556 b = p.split('/')[-2]
3557 c = p.split('/')[-1]
3559 name = '@0@:@1@'.format(b, sanitizer)
3562 if want_tests == 'false'
3563 message('Not compiling @0@ because tests is set to false'.format(name))
3565 exe = custom_target(
3569 command : [env, 'ln', '-fs',
3570 join_paths(build.full_path(), b),
3572 build_by_default : true)
3574 message('Not compiling @0@ because fuzz-tests is set to false'.format(name))
3580 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3582 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
3584 args : [exe.full_path(),
3585 join_paths(project_source_root, p)])
3592 ############################################################
3595 all_files = run_command(
3597 ['--git-dir=@0@/.git'.format(project_source_root),
3600 all_files = files(all_files.stdout().split())
3605 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3608 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3612 git_contrib_sh = find_program('tools/git-contrib.sh')
3615 command : [git_contrib_sh])
3619 git_head = run_command(
3621 ['--git-dir=@0@/.git'.format(project_source_root),
3622 'rev-parse', 'HEAD']).stdout().strip()
3623 git_head_short = run_command(
3625 ['--git-dir=@0@/.git'.format(project_source_root),
3626 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3630 command : ['git', 'archive',
3631 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3633 '--prefix', 'systemd-@0@/'.format(git_head),
3637 ############################################################
3639 check_api_docs_sh = find_program('tools/check-api-docs.sh')
3642 depends : [man, libsystemd, libudev],
3643 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3645 ############################################################
3646 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3649 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3651 'build mode: @0@'.format(get_option('mode')),
3652 'split /usr: @0@'.format(split_usr),
3653 'split bin-sbin: @0@'.format(split_bin),
3654 'prefix directory: @0@'.format(prefixdir),
3655 'rootprefix directory: @0@'.format(rootprefixdir),
3656 'sysconf directory: @0@'.format(sysconfdir),
3657 'include directory: @0@'.format(includedir),
3658 'lib directory: @0@'.format(libdir),
3659 'rootlib directory: @0@'.format(rootlibdir),
3660 'SysV init scripts: @0@'.format(sysvinit_path),
3661 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3662 'PAM modules directory: @0@'.format(pamlibdir),
3663 'PAM configuration directory: @0@'.format(pamconfdir),
3664 'RPM macros directory: @0@'.format(rpmmacrosdir),
3665 'modprobe.d directory: @0@'.format(modprobedir),
3666 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3667 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3668 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3669 'bash completions directory: @0@'.format(bashcompletiondir),
3670 'zsh completions directory: @0@'.format(zshcompletiondir),
3671 'extra start script: @0@'.format(get_option('rc-local')),
3672 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3673 get_option('debug-tty')),
3674 'TTY GID: @0@'.format(tty_gid),
3675 'users GID: @0@'.format(substs.get('USERS_GID')),
3676 'system UIDs: <=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_UID_MAX'),
3677 conf.get('SYSTEM_ALLOC_UID_MIN')),
3678 'system GIDs: <=@0@ (alloc >=@1@)'.format(conf.get('SYSTEM_GID_MAX'),
3679 conf.get('SYSTEM_ALLOC_GID_MIN')),
3680 'dynamic UIDs: @0@–@1@'.format(dynamic_uid_min, dynamic_uid_max),
3681 'container UID bases: @0@–@1@'.format(container_uid_base_min, container_uid_base_max),
3682 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3683 'render group access mode: @0@'.format(get_option('group-render-mode')),
3684 'certificate root directory: @0@'.format(get_option('certificate-root')),
3685 'support URL: @0@'.format(support_url),
3686 'nobody user name: @0@'.format(nobody_user),
3687 'nobody group name: @0@'.format(nobody_group),
3688 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3689 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3691 'default DNSSEC mode: @0@'.format(default_dnssec),
3692 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3693 'default mDNS mode: @0@'.format(default_mdns),
3694 'default LLMNR mode: @0@'.format(default_llmnr),
3695 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3696 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3697 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3698 'default locale: @0@'.format(default_locale),
3699 'default user $PATH: @0@'.format(default_user_path_display),
3700 'systemd service watchdog: @0@'.format(watchdog_opt)]
3702 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3703 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3705 'default DNS servers: @0@'.format(alt_dns_servers),
3706 'default NTP servers: @0@'.format(alt_ntp_servers)]
3708 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3709 '@@0@'.format(time_epoch)).stdout().strip()
3711 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3714 'static libsystemd: @0@'.format(static_libsystemd),
3715 'static libudev: @0@'.format(static_libudev)]
3718 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3719 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3720 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3722 if conf.get('ENABLE_EFI') == 1
3723 status += 'efi arch: @0@'.format(efi_arch)
3727 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3728 'EFI CC @0@'.format(' '.join(efi_cc)),
3729 'EFI lds: @0@'.format(efi_lds),
3730 'EFI crt0: @0@'.format(efi_crt0),
3731 'EFI include directory: @0@'.format(efi_incdir)]
3765 ['compat-mutable-uid-boundaries'],
3794 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3795 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3800 ['legacy pkla', install_polkit_pkla],
3802 ['gnu-efi', have_gnu_efi],
3815 ['man pages', want_man],
3816 ['html pages', want_html],
3817 ['man page indices', want_man and have_lxml],
3822 ['adm group', get_option('adm-group')],
3823 ['wheel group', get_option('wheel-group')],
3826 ['debug mmap cache'],
3828 ['valgrind', conf.get('VALGRIND') == 1],
3829 ['trace logging', conf.get('LOG_TRACE') == 1],
3830 ['install tests', install_tests],
3831 ['link-udev-shared', get_option('link-udev-shared')],
3832 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3833 ['link-networkd-shared', get_option('link-networkd-shared')],
3834 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3835 ['kernel-install', get_option('kernel-install')],
3836 ['systemd-analyze', conf.get('ENABLE_ANALYZE') == 1],
3839 if tuple.length() >= 2
3842 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3843 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3844 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3855 'enabled features: @0@'.format(', '.join(found)),
3857 'disabled features: @0@'.format(', '.join(missing)),
3859 message('\n '.join(status))
3861 if rootprefixdir != rootprefix_default
3863 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3864 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3865 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))