1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
13 meson_version : '>= 0.46',
16 libsystemd_version = '0.28.0'
17 libudev_version = '1.6.17'
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 want_ossfuzz = get_option('oss-fuzz')
42 want_libfuzzer = get_option('llvm-fuzz')
43 if want_ossfuzz + want_libfuzzer > 1
44 error('only one of oss-fuzz or llvm-fuzz can be specified')
47 skip_deps = want_ossfuzz or want_libfuzzer
48 fuzzer_build = want_ossfuzz or want_libfuzzer
50 #####################################################################
52 # Try to install the git pre-commit hook
53 add_git_hook_sh = find_program('tools/add-git-hook.sh', required : false)
54 if add_git_hook_sh.found()
55 git_hook = run_command(add_git_hook_sh)
56 if git_hook.returncode() == 0
57 message(git_hook.stdout().strip())
61 #####################################################################
63 if get_option('split-usr') == 'auto'
64 split_usr = run_command('test', '-L', '/bin').returncode() != 0
66 split_usr = get_option('split-usr') == 'true'
68 conf.set10('HAVE_SPLIT_USR', split_usr,
69 description : '/usr/bin and /bin directories are separate')
71 if get_option('split-bin') == 'auto'
72 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
74 split_bin = get_option('split-bin') == 'true'
76 conf.set10('HAVE_SPLIT_BIN', split_bin,
77 description : 'bin and sbin directories are separate')
79 rootprefixdir = get_option('rootprefix')
80 # Unusual rootprefixdir values are used by some distros
81 # (see https://github.com/systemd/systemd/pull/7461).
82 rootprefix_default = split_usr ? '/' : '/usr'
83 if rootprefixdir == ''
84 rootprefixdir = rootprefix_default
86 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
88 have_standalone_binaries = get_option('standalone-binaries')
90 sysvinit_path = get_option('sysvinit-path')
91 sysvrcnd_path = get_option('sysvrcnd-path')
92 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
93 description : 'SysV init scripts and rcN.d links are supported')
95 if get_option('hibernate') and not get_option('initrd')
96 error('hibernate depends on initrd')
99 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
100 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
101 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
103 # join_paths ignores the preceding arguments if an absolute component is
104 # encountered, so this should canonicalize various paths when they are
105 # absolute or relative.
106 prefixdir = get_option('prefix')
107 if not prefixdir.startswith('/')
108 error('Prefix is not absolute: "@0@"'.format(prefixdir))
110 bindir = join_paths(prefixdir, get_option('bindir'))
111 libdir = join_paths(prefixdir, get_option('libdir'))
112 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
113 includedir = join_paths(prefixdir, get_option('includedir'))
114 datadir = join_paths(prefixdir, get_option('datadir'))
115 localstatedir = join_paths('/', get_option('localstatedir'))
117 rootbindir = join_paths(rootprefixdir, 'bin')
118 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
119 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
121 rootlibdir = get_option('rootlibdir')
123 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
126 # Dirs of external packages
127 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
128 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
129 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
130 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
131 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
132 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
133 rpmmacrosdir = get_option('rpmmacrosdir')
134 if rpmmacrosdir != 'no'
135 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
137 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
140 pkgdatadir = join_paths(datadir, 'systemd')
141 environmentdir = join_paths(prefixdir, 'lib/environment.d')
142 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
143 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
144 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
145 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
146 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
147 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
148 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
149 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
150 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
151 pkgincludedir = join_paths(includedir, 'systemd')
152 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
153 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
154 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
155 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
156 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
157 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
158 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
159 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
160 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
161 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
162 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
163 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
164 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
165 factorydir = join_paths(datadir, 'factory')
166 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
167 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
168 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
169 catalogstatedir = join_paths(systemdstatedir, 'catalog')
170 randomseeddir = join_paths(localstatedir, 'lib/systemd')
171 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
172 ntpservicelistdir = join_paths(rootprefixdir, 'lib/systemd/ntp-units.d')
174 docdir = get_option('docdir')
176 docdir = join_paths(datadir, 'doc/systemd')
179 dbuspolicydir = get_option('dbuspolicydir')
180 if dbuspolicydir == ''
181 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
184 dbussessionservicedir = get_option('dbussessionservicedir')
185 if dbussessionservicedir == ''
186 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
189 dbussystemservicedir = get_option('dbussystemservicedir')
190 if dbussystemservicedir == ''
191 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
194 pamlibdir = get_option('pamlibdir')
196 pamlibdir = join_paths(rootlibdir, 'security')
199 pamconfdir = get_option('pamconfdir')
201 pamconfdir = join_paths(sysconfdir, 'pam.d')
204 memory_accounting_default = get_option('memory-accounting-default')
205 status_unit_format_default = get_option('status-unit-format-default')
207 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
208 conf.set_quoted('SYSTEM_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'system'))
209 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
210 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
211 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
212 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
214 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
216 conf.set_quoted('USER_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'user'))
217 conf.set_quoted('USER_DATA_UNIT_DIR', userunitdir)
218 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
219 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
220 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
221 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
222 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
223 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
224 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
225 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
226 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
227 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
228 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
229 conf.set_quoted('ROOTPREFIX', rootprefixdir)
230 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
231 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
232 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
233 conf.set_quoted('SYSTEM_GENERATOR_DIR', systemgeneratordir)
234 conf.set_quoted('USER_GENERATOR_DIR', usergeneratordir)
235 conf.set_quoted('SYSTEM_ENV_GENERATOR_DIR', systemenvgeneratordir)
236 conf.set_quoted('USER_ENV_GENERATOR_DIR', userenvgeneratordir)
237 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
238 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
239 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
240 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
241 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
242 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
243 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
244 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
245 conf.set_quoted('LIBDIR', libdir)
246 conf.set_quoted('ROOTLIBDIR', rootlibdir)
247 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
248 conf.set_quoted('BOOTLIBDIR', bootlibdir)
249 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
250 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
251 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
252 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
253 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
254 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
255 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
256 conf.set_quoted('SYSTEMD_HOMEWORK_PATH', join_paths(rootlibexecdir, 'systemd-homework'))
257 conf.set_quoted('SYSTEMD_USERWORK_PATH', join_paths(rootlibexecdir, 'systemd-userwork'))
258 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
259 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
260 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
262 substs.set('prefix', prefixdir)
263 substs.set('rootprefix', rootprefixdir)
264 substs.set('rootprefix_noslash', rootprefixdir_noslash)
265 substs.set('exec_prefix', prefixdir)
266 substs.set('libdir', libdir)
267 substs.set('rootlibdir', rootlibdir)
268 substs.set('includedir', includedir)
269 substs.set('sysconfdir', sysconfdir)
270 substs.set('bindir', bindir)
271 substs.set('rootbindir', rootbindir)
272 substs.set('rootlibexecdir', rootlibexecdir)
273 substs.set('systemunitdir', systemunitdir)
274 substs.set('userunitdir', userunitdir)
275 substs.set('systempresetdir', systempresetdir)
276 substs.set('userpresetdir', userpresetdir)
277 substs.set('udevhwdbdir', udevhwdbdir)
278 substs.set('udevrulesdir', udevrulesdir)
279 substs.set('udevlibexecdir', udevlibexecdir)
280 substs.set('environmentdir', environmentdir)
281 substs.set('catalogdir', catalogdir)
282 substs.set('tmpfilesdir', tmpfilesdir)
283 substs.set('sysusersdir', sysusersdir)
284 substs.set('sysctldir', sysctldir)
285 substs.set('binfmtdir', binfmtdir)
286 substs.set('modulesloaddir', modulesloaddir)
287 substs.set('modprobedir', modprobedir)
288 substs.set('systemgeneratordir', systemgeneratordir)
289 substs.set('usergeneratordir', usergeneratordir)
290 substs.set('systemenvgeneratordir', systemenvgeneratordir)
291 substs.set('userenvgeneratordir', userenvgeneratordir)
292 substs.set('systemshutdowndir', systemshutdowndir)
293 substs.set('systemsleepdir', systemsleepdir)
294 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
295 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
296 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
297 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
298 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
299 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
300 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
301 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
302 substs.set('BUILD_ROOT', project_build_root)
304 #####################################################################
306 cc = meson.get_compiler('c')
307 pkgconfig = import('pkgconfig')
308 check_compilation_sh = find_program('tools/check-compilation.sh')
309 meson_build_sh = find_program('tools/meson-build.sh')
311 want_tests = get_option('tests')
312 slow_tests = want_tests != 'false' and get_option('slow-tests')
313 fuzz_tests = want_tests != 'false' and get_option('fuzz-tests')
314 install_tests = get_option('install-tests')
316 if add_languages('cpp', required : fuzzer_build)
317 # Used only for tests
318 cxx = meson.get_compiler('cpp')
319 cxx_cmd = ' '.join(cxx.cmd_array())
325 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
326 if fuzzing_engine.found()
327 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
328 elif cc.has_argument('-fsanitize=fuzzer-no-link')
329 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
331 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
334 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
337 # Those generate many false positives, and we do not want to change the code to
339 basic_disabled_warnings = [
340 '-Wno-unused-parameter',
341 '-Wno-missing-field-initializers',
342 '-Wno-unused-result',
343 '-Wno-format-signedness',
346 possible_cc_flags = [
349 '-Wmissing-include-dirs',
350 '-Wold-style-definition',
354 '-Wsuggest-attribute=noreturn',
355 '-Werror=missing-prototypes',
356 '-Werror=implicit-function-declaration',
357 '-Werror=missing-declarations',
358 '-Werror=return-type',
359 '-Werror=incompatible-pointer-types',
361 '-Wstrict-prototypes',
363 '-Wmissing-noreturn',
364 '-Wimplicit-fallthrough=5',
367 '-Wstrict-aliasing=2',
370 '-Werror=shift-count-overflow',
371 '-Werror=shift-overflow=2',
375 # negative arguments are correctly detected starting with meson 0.46.
376 '-Wno-error=#warnings', # clang
377 '-Wno-string-plus-int', # clang
379 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
380 # optimizations enabled, producing essentially false positives.
381 '-Wno-maybe-uninitialized',
385 '-fdiagnostics-show-option',
386 '-fno-strict-aliasing',
387 '-fvisibility=hidden',
389 '-fstack-protector-strong',
390 '--param=ssp-buffer-size=4',
393 # --as-needed and --no-undefined are provided by meson by default,
394 # run mesonconf to see what is enabled
395 possible_link_flags = [
401 if cc.get_id() == 'clang'
402 possible_cc_flags += [
403 '-Wno-typedef-redefinition',
404 '-Wno-gnu-variable-sized-type-not-at-end',
408 if get_option('buildtype') != 'debug'
409 possible_cc_flags += [
410 '-ffunction-sections',
414 possible_link_flags += '-Wl,--gc-sections'
417 add_project_arguments(cc.get_supported_arguments(basic_disabled_warnings), language : 'c')
418 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
419 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
421 have = cc.has_argument('-Wzero-length-bounds')
422 conf.set10('HAVE_ZERO_LENGTH_BOUNDS', have)
426 #include <inttypes.h>
427 typedef uint64_t usec_t;
428 usec_t now(clockid_t clock);
433 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
434 add_project_arguments('-Werror=shadow', language : 'c')
438 add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp')
441 cpp = ' '.join(cc.cmd_array()) + ' -E'
443 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
445 #####################################################################
446 # compilation result tests
448 conf.set('_GNU_SOURCE', true)
449 conf.set('__SANE_USERSPACE_TYPES__', true)
450 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
452 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
453 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
454 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
455 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
459 #include <sys/stat.h>
462 foreach decl : ['char16_t',
467 # We get -1 if the size cannot be determined
468 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
470 if decl == 'struct statx'
472 want_linux_stat_h = false
474 have = cc.sizeof(decl,
475 prefix : decl_headers + '#include <linux/stat.h>',
476 args : '-D_GNU_SOURCE') > 0
477 want_linux_stat_h = have
481 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
484 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
486 foreach ident : ['secure_getenv', '__secure_getenv']
487 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
491 ['memfd_create', '''#include <sys/mman.h>'''],
492 ['gettid', '''#include <sys/types.h>
493 #include <unistd.h>'''],
494 ['pivot_root', '''#include <stdlib.h>
495 #include <unistd.h>'''], # no known header declares pivot_root
496 ['name_to_handle_at', '''#include <sys/types.h>
497 #include <sys/stat.h>
498 #include <fcntl.h>'''],
499 ['setns', '''#include <sched.h>'''],
500 ['renameat2', '''#include <stdio.h>
501 #include <fcntl.h>'''],
502 ['kcmp', '''#include <linux/kcmp.h>'''],
503 ['keyctl', '''#include <sys/types.h>
504 #include <keyutils.h>'''],
505 ['copy_file_range', '''#include <sys/syscall.h>
506 #include <unistd.h>'''],
507 ['bpf', '''#include <sys/syscall.h>
508 #include <unistd.h>'''],
509 ['statx', '''#include <sys/types.h>
510 #include <sys/stat.h>
511 #include <unistd.h>'''],
512 ['explicit_bzero' , '''#include <string.h>'''],
513 ['reallocarray', '''#include <malloc.h>'''],
514 ['set_mempolicy', '''#include <stdlib.h>
515 #include <unistd.h>'''],
516 ['get_mempolicy', '''#include <stdlib.h>
517 #include <unistd.h>'''],
518 ['pidfd_send_signal', '''#include <stdlib.h>
521 #include <sys/wait.h>'''],
522 ['pidfd_open', '''#include <stdlib.h>
525 #include <sys/wait.h>'''],
526 ['rt_sigqueueinfo', '''#include <stdlib.h>
529 #include <sys/wait.h>'''],
532 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
533 conf.set10('HAVE_' + ident[0].to_upper(), have)
536 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
537 conf.set10('USE_SYS_RANDOM_H', true)
538 conf.set10('HAVE_GETRANDOM', true)
540 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
541 conf.set10('USE_SYS_RANDOM_H', false)
542 conf.set10('HAVE_GETRANDOM', have)
545 #####################################################################
547 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
549 get_option('version-tag'),
550 meson.project_version()]
553 input : 'src/version/version.h.in',
554 output : 'version.h',
557 versiondep = declare_dependency(sources: version_h)
559 sed = find_program('sed')
560 awk = find_program('awk')
561 m4 = find_program('m4')
562 stat = find_program('stat')
563 git = find_program('git', required : false)
564 env = find_program('env')
565 perl = find_program('perl', required : false)
567 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
568 mkdir_p = 'mkdir -p $DESTDIR/@0@'
569 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
570 splash_bmp = files('test/splash.bmp')
572 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
573 # /usr/sbin, /sbin, and fall back to the default from middle column.
574 progs = [['quotaon', '/usr/sbin/quotaon' ],
575 ['quotacheck', '/usr/sbin/quotacheck' ],
576 ['kmod', '/usr/bin/kmod' ],
577 ['kexec', '/usr/sbin/kexec' ],
578 ['sulogin', '/usr/sbin/sulogin' ],
579 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
580 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
581 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
582 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
583 ['nologin', '/usr/sbin/nologin', ],
586 path = get_option(prog[0] + '-path')
588 message('Using @1@ for @0@'.format(prog[0], path))
590 exe = find_program(prog[0],
591 '/usr/sbin/' + prog[0],
594 path = exe.found() ? exe.path() : prog[1]
596 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
597 conf.set_quoted(name, path)
598 substs.set(name, path)
601 conf.set_quoted('TELINIT', get_option('telinit-path'))
603 if run_command('ln', '--relative', '--help').returncode() != 0
604 error('ln does not support --relative (added in coreutils 8.16)')
607 ############################################################
609 gperf = find_program('gperf')
611 gperf_test_format = '''
613 const char * in_word_set(const char *, @0@);
616 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
617 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
618 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
619 if cc.compiles(gperf_test)
620 gperf_len_type = 'size_t'
622 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
623 if cc.compiles(gperf_test)
624 gperf_len_type = 'unsigned'
626 error('unable to determine gperf len type')
629 message('gperf len type is @0@'.format(gperf_len_type))
630 conf.set('GPERF_LEN_TYPE', gperf_len_type,
631 description : 'The type of gperf "len" parameter')
633 ############################################################
635 if not cc.has_header('sys/capability.h')
636 error('POSIX caps headers not found')
638 foreach header : ['crypt.h',
640 'linux/vm_sockets.h',
642 'valgrind/memcheck.h',
643 'valgrind/valgrind.h',
646 conf.set10('HAVE_' + header.underscorify().to_upper(),
647 cc.has_header(header))
650 ############################################################
652 fallback_hostname = get_option('fallback-hostname')
653 if fallback_hostname == '' or fallback_hostname[0] == '.' or fallback_hostname[0] == '-'
654 error('Invalid fallback-hostname configuration')
655 # A more extensive test is done in test-hostname-util. Let's catch
656 # the most obvious errors here so we don't fail with an assert later.
658 conf.set_quoted('FALLBACK_HOSTNAME', fallback_hostname)
660 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
661 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
663 default_hierarchy = get_option('default-hierarchy')
664 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
665 description : 'default cgroup hierarchy as string')
666 if default_hierarchy == 'legacy'
667 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
668 elif default_hierarchy == 'hybrid'
669 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
671 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
674 default_net_naming_scheme = get_option('default-net-naming-scheme')
675 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
677 time_epoch = get_option('time-epoch')
679 source_date_epoch = run_command('sh', ['-c', 'echo "$SOURCE_DATE_EPOCH"']).stdout().strip()
680 if source_date_epoch != ''
681 time_epoch = source_date_epoch.to_int()
684 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
687 conf.set('TIME_EPOCH', time_epoch)
689 system_uid_max = get_option('system-uid-max')
690 if system_uid_max == -1
691 system_uid_max = run_command(
693 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
694 '/etc/login.defs').stdout().strip()
695 if system_uid_max == ''
698 system_uid_max = system_uid_max.to_int()
701 conf.set('SYSTEM_UID_MAX', system_uid_max)
702 substs.set('systemuidmax', system_uid_max)
704 system_gid_max = get_option('system-gid-max')
705 if system_gid_max == -1
706 system_gid_max = run_command(
708 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
709 '/etc/login.defs').stdout().strip()
710 if system_gid_max == ''
713 system_gid_max = system_gid_max.to_int()
716 conf.set('SYSTEM_GID_MAX', system_gid_max)
717 substs.set('systemgidmax', system_gid_max)
719 dynamic_uid_min = get_option('dynamic-uid-min')
720 dynamic_uid_max = get_option('dynamic-uid-max')
721 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
722 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
723 substs.set('dynamicuidmin', dynamic_uid_min)
724 substs.set('dynamicuidmax', dynamic_uid_max)
726 container_uid_base_min = get_option('container-uid-base-min')
727 container_uid_base_max = get_option('container-uid-base-max')
728 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
729 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
730 substs.set('containeruidbasemin', container_uid_base_min)
731 substs.set('containeruidbasemax', container_uid_base_max)
733 nobody_user = get_option('nobody-user')
734 nobody_group = get_option('nobody-group')
736 if not meson.is_cross_build()
737 getent_result = run_command('getent', 'passwd', '65534')
738 if getent_result.returncode() == 0
739 name = getent_result.stdout().split(':')[0]
740 if name != nobody_user
742 '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) +
743 'Your build will result in an user table setup that is incompatible with the local system.')
746 id_result = run_command('id', '-u', nobody_user)
747 if id_result.returncode() == 0
748 id = id_result.stdout().to_int()
751 '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) +
752 'Your build will result in an user table setup that is incompatible with the local system.')
756 getent_result = run_command('getent', 'group', '65534')
757 if getent_result.returncode() == 0
758 name = getent_result.stdout().split(':')[0]
759 if name != nobody_group
761 '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) +
762 'Your build will result in an group table setup that is incompatible with the local system.')
765 id_result = run_command('id', '-g', nobody_group)
766 if id_result.returncode() == 0
767 id = id_result.stdout().to_int()
770 '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) +
771 'Your build will result in an group table setup that is incompatible with the local system.')
775 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
777 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
778 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
781 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
782 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
783 substs.set('NOBODY_USER_NAME', nobody_user)
784 substs.set('NOBODY_GROUP_NAME', nobody_group)
786 tty_gid = get_option('tty-gid')
787 conf.set('TTY_GID', tty_gid)
788 substs.set('TTY_GID', tty_gid)
790 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
791 users_gid = get_option('users-gid')
792 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
794 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
795 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
797 dev_kvm_mode = get_option('dev-kvm-mode')
798 substs.set('DEV_KVM_MODE', dev_kvm_mode)
799 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
800 group_render_mode = get_option('group-render-mode')
801 substs.set('GROUP_RENDER_MODE', group_render_mode)
802 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
804 kill_user_processes = get_option('default-kill-user-processes')
805 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
806 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
807 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
809 dns_servers = get_option('dns-servers')
810 conf.set_quoted('DNS_SERVERS', dns_servers)
811 substs.set('DNS_SERVERS', dns_servers)
813 ntp_servers = get_option('ntp-servers')
814 conf.set_quoted('NTP_SERVERS', ntp_servers)
815 substs.set('NTP_SERVERS', ntp_servers)
817 default_locale = get_option('default-locale')
818 if default_locale == ''
819 if not meson.is_cross_build()
820 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
821 default_locale = run_command(choose_default_locale_sh).stdout().strip()
823 default_locale = 'C.UTF-8'
826 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
828 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
830 service_watchdog = get_option('service-watchdog')
831 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
832 substs.set('SERVICE_WATCHDOG', watchdog_value)
834 substs.set('SUSHELL', get_option('debug-shell'))
835 substs.set('DEBUGTTY', get_option('debug-tty'))
836 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
838 enable_debug_hashmap = false
839 enable_debug_mmap_cache = false
840 enable_debug_siphash = false
841 foreach name : get_option('debug-extra')
843 enable_debug_hashmap = true
844 elif name == 'mmap-cache'
845 enable_debug_mmap_cache = true
846 elif name == 'siphash'
847 enable_debug_siphash = true
849 message('unknown debug option "@0@", ignoring'.format(name))
852 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
853 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
854 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
856 conf.set10('VALGRIND', get_option('valgrind'))
857 conf.set10('LOG_TRACE', get_option('log-trace'))
859 default_user_path = get_option('user-path')
860 if default_user_path != ''
861 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
862 default_user_path_display = default_user_path
864 # meson 0.49 fails when ?: is used in .format()
865 default_user_path_display = '(same as system services)'
869 #####################################################################
871 threads = dependency('threads')
872 librt = cc.find_library('rt')
873 libm = cc.find_library('m')
874 libdl = cc.find_library('dl')
875 libcrypt = cc.find_library('crypt')
877 libcap = dependency('libcap', required : false)
878 if not libcap.found()
879 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
880 libcap = cc.find_library('cap')
883 libmount = dependency('mount',
884 version : fuzzer_build ? '>= 0' : '>= 2.30')
886 want_libfdisk = get_option('fdisk')
887 if want_libfdisk != 'false' and not skip_deps
888 libfdisk = dependency('fdisk',
889 required : want_libfdisk == 'true')
890 have = libfdisk.found()
895 conf.set10('HAVE_LIBFDISK', have)
897 want_pwquality = get_option('pwquality')
898 if want_pwquality != 'false' and not skip_deps
899 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
900 have = libpwquality.found()
905 conf.set10('HAVE_PWQUALITY', have)
907 want_seccomp = get_option('seccomp')
908 if want_seccomp != 'false' and not skip_deps
909 libseccomp = dependency('libseccomp',
910 version : '>= 2.3.1',
911 required : want_seccomp == 'true')
912 have = libseccomp.found()
917 conf.set10('HAVE_SECCOMP', have)
919 want_selinux = get_option('selinux')
920 if want_selinux != 'false' and not skip_deps
921 libselinux = dependency('libselinux',
922 version : '>= 2.1.9',
923 required : want_selinux == 'true')
924 have = libselinux.found()
929 conf.set10('HAVE_SELINUX', have)
931 want_apparmor = get_option('apparmor')
932 if want_apparmor != 'false' and not skip_deps
933 libapparmor = dependency('libapparmor',
935 required : want_apparmor == 'true')
936 have = libapparmor.found()
941 conf.set10('HAVE_APPARMOR', have)
943 smack_run_label = get_option('smack-run-label')
944 if smack_run_label != ''
945 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
948 want_polkit = get_option('polkit')
949 install_polkit = false
950 install_polkit_pkla = false
951 if want_polkit != 'false' and not skip_deps
952 install_polkit = true
954 libpolkit = dependency('polkit-gobject-1',
956 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
957 message('Old polkit detected, will install pkla files')
958 install_polkit_pkla = true
961 conf.set10('ENABLE_POLKIT', install_polkit)
963 want_acl = get_option('acl')
964 if want_acl != 'false' and not skip_deps
965 libacl = cc.find_library('acl', required : want_acl == 'true')
966 have = libacl.found()
971 conf.set10('HAVE_ACL', have)
973 want_audit = get_option('audit')
974 if want_audit != 'false' and not skip_deps
975 libaudit = dependency('audit', required : want_audit == 'true')
976 have = libaudit.found()
981 conf.set10('HAVE_AUDIT', have)
983 want_blkid = get_option('blkid')
984 if want_blkid != 'false' and not skip_deps
985 libblkid = dependency('blkid', required : want_blkid == 'true')
986 have = libblkid.found()
991 conf.set10('HAVE_BLKID', have)
993 want_kmod = get_option('kmod')
994 if want_kmod != 'false' and not skip_deps
995 libkmod = dependency('libkmod',
997 required : want_kmod == 'true')
998 have = libkmod.found()
1003 conf.set10('HAVE_KMOD', have)
1005 want_pam = get_option('pam')
1006 if want_pam != 'false' and not skip_deps
1007 libpam = cc.find_library('pam', required : want_pam == 'true')
1008 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
1009 have = libpam.found() and libpam_misc.found()
1015 conf.set10('HAVE_PAM', have)
1017 want_microhttpd = get_option('microhttpd')
1018 if want_microhttpd != 'false' and not skip_deps
1019 libmicrohttpd = dependency('libmicrohttpd',
1020 version : '>= 0.9.33',
1021 required : want_microhttpd == 'true')
1022 have = libmicrohttpd.found()
1027 conf.set10('HAVE_MICROHTTPD', have)
1029 want_libcryptsetup = get_option('libcryptsetup')
1030 if want_libcryptsetup != 'false' and not skip_deps
1031 libcryptsetup = dependency('libcryptsetup',
1032 version : '>= 2.0.1',
1033 required : want_libcryptsetup == 'true')
1034 have = libcryptsetup.found()
1036 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1037 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
1038 conf.set10('HAVE_CRYPT_ACTIVATE_BY_SIGNED_KEY',
1039 have and cc.has_function('crypt_activate_by_signed_key', dependencies : libcryptsetup))
1044 conf.set10('HAVE_LIBCRYPTSETUP', have)
1046 want_libcurl = get_option('libcurl')
1047 if want_libcurl != 'false' and not skip_deps
1048 libcurl = dependency('libcurl',
1049 version : '>= 7.32.0',
1050 required : want_libcurl == 'true')
1051 have = libcurl.found()
1056 conf.set10('HAVE_LIBCURL', have)
1058 want_libidn = get_option('libidn')
1059 want_libidn2 = get_option('libidn2')
1060 if want_libidn == 'true' and want_libidn2 == 'true'
1061 error('libidn and libidn2 cannot be requested simultaneously')
1064 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1065 libidn = dependency('libidn2',
1066 required : want_libidn2 == 'true')
1067 have = libidn.found()
1072 conf.set10('HAVE_LIBIDN2', have)
1073 if not have and want_libidn != 'false' and not skip_deps
1074 # libidn is used for both libidn and libidn2 objects
1075 libidn = dependency('libidn',
1076 required : want_libidn == 'true')
1077 have = libidn.found()
1081 conf.set10('HAVE_LIBIDN', have)
1083 want_libiptc = get_option('libiptc')
1084 if want_libiptc != 'false' and not skip_deps
1085 libiptc = dependency('libiptc',
1086 required : want_libiptc == 'true')
1087 have = libiptc.found()
1092 conf.set10('HAVE_LIBIPTC', have)
1094 want_qrencode = get_option('qrencode')
1095 if want_qrencode != 'false' and not skip_deps
1096 libqrencode = dependency('libqrencode',
1097 required : want_qrencode == 'true')
1098 have = libqrencode.found()
1103 conf.set10('HAVE_QRENCODE', have)
1105 want_gcrypt = get_option('gcrypt')
1106 if want_gcrypt != 'false' and not skip_deps
1107 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1108 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1109 have = libgcrypt.found() and libgpg_error.found()
1114 # link to neither of the libs if one is not found
1118 conf.set10('HAVE_GCRYPT', have)
1120 want_gnutls = get_option('gnutls')
1121 if want_gnutls != 'false' and not skip_deps
1122 libgnutls = dependency('gnutls',
1123 version : '>= 3.1.4',
1124 required : want_gnutls == 'true')
1125 have = libgnutls.found()
1130 conf.set10('HAVE_GNUTLS', have)
1132 want_openssl = get_option('openssl')
1133 if want_openssl != 'false' and not skip_deps
1134 libopenssl = dependency('openssl',
1135 version : '>= 1.1.0',
1136 required : want_openssl == 'true')
1137 have = libopenssl.found()
1142 conf.set10('HAVE_OPENSSL', have)
1144 want_p11kit = get_option('p11kit')
1145 if want_p11kit != 'false' and not skip_deps
1146 libp11kit = dependency('p11-kit-1',
1147 version : '>= 0.23.3',
1148 required : want_p11kit == 'true')
1149 have = libp11kit.found()
1154 conf.set10('HAVE_P11KIT', have)
1156 want_libfido2 = get_option('libfido2')
1157 if want_libfido2 != 'false' and not skip_deps
1158 libfido2 = dependency('libfido2',
1159 required : want_libfido2 == 'true')
1160 have = libfido2.found()
1165 conf.set10('HAVE_LIBFIDO2', have)
1167 want_elfutils = get_option('elfutils')
1168 if want_elfutils != 'false' and not skip_deps
1169 libdw = dependency('libdw',
1170 required : want_elfutils == 'true')
1171 have = libdw.found()
1176 conf.set10('HAVE_ELFUTILS', have)
1178 want_zlib = get_option('zlib')
1179 if want_zlib != 'false' and not skip_deps
1180 libz = dependency('zlib',
1181 required : want_zlib == 'true')
1187 conf.set10('HAVE_ZLIB', have)
1189 want_bzip2 = get_option('bzip2')
1190 if want_bzip2 != 'false' and not skip_deps
1191 libbzip2 = cc.find_library('bz2',
1192 required : want_bzip2 == 'true')
1193 have = libbzip2.found()
1198 conf.set10('HAVE_BZIP2', have)
1200 want_xz = get_option('xz')
1201 if want_xz != 'false' and not skip_deps
1202 libxz = dependency('liblzma',
1203 required : want_xz == 'true')
1204 have_xz = libxz.found()
1209 conf.set10('HAVE_XZ', have_xz)
1211 want_lz4 = get_option('lz4')
1212 if want_lz4 != 'false' and not skip_deps
1213 liblz4 = dependency('liblz4',
1214 version : '>= 1.3.0',
1215 required : want_lz4 == 'true')
1216 have_lz4 = liblz4.found()
1221 conf.set10('HAVE_LZ4', have_lz4)
1223 want_zstd = get_option('zstd')
1224 if want_zstd != 'false' and not skip_deps
1225 libzstd = dependency('libzstd',
1226 required : want_zstd == 'true',
1227 version : '>= 1.4.0')
1228 have_zstd = libzstd.found()
1233 conf.set10('HAVE_ZSTD', have_zstd)
1235 conf.set10('HAVE_COMPRESSION', have_xz or have_lz4 or have_zstd)
1237 want_xkbcommon = get_option('xkbcommon')
1238 if want_xkbcommon != 'false' and not skip_deps
1239 libxkbcommon = dependency('xkbcommon',
1240 version : '>= 0.3.0',
1241 required : want_xkbcommon == 'true')
1242 have = libxkbcommon.found()
1247 conf.set10('HAVE_XKBCOMMON', have)
1249 want_pcre2 = get_option('pcre2')
1250 if want_pcre2 != 'false'
1251 libpcre2 = dependency('libpcre2-8',
1252 required : want_pcre2 == 'true')
1253 have = libpcre2.found()
1258 conf.set10('HAVE_PCRE2', have)
1260 want_glib = get_option('glib')
1261 if want_glib != 'false' and not skip_deps
1262 libglib = dependency('glib-2.0',
1263 version : '>= 2.22.0',
1264 required : want_glib == 'true')
1265 libgobject = dependency('gobject-2.0',
1266 version : '>= 2.22.0',
1267 required : want_glib == 'true')
1268 libgio = dependency('gio-2.0',
1269 required : want_glib == 'true')
1270 have = libglib.found() and libgobject.found() and libgio.found()
1277 conf.set10('HAVE_GLIB', have)
1279 want_dbus = get_option('dbus')
1280 if want_dbus != 'false' and not skip_deps
1281 libdbus = dependency('dbus-1',
1282 version : '>= 1.3.2',
1283 required : want_dbus == 'true')
1284 have = libdbus.found()
1289 conf.set10('HAVE_DBUS', have)
1291 default_dnssec = get_option('default-dnssec')
1293 default_dnssec = 'no'
1295 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1296 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1297 default_dnssec = 'no'
1299 conf.set('DEFAULT_DNSSEC_MODE',
1300 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1301 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1303 dns_over_tls = get_option('dns-over-tls')
1304 if dns_over_tls != 'false'
1305 if dns_over_tls == 'openssl'
1308 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1309 if dns_over_tls == 'gnutls' and not have_gnutls
1310 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1313 if dns_over_tls == 'gnutls' or have_gnutls
1314 have_openssl = false
1316 have_openssl = conf.get('HAVE_OPENSSL') == 1
1317 if dns_over_tls != 'auto' and not have_openssl
1318 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1319 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1322 have = have_gnutls or have_openssl
1326 have_openssl = false
1328 conf.set10('ENABLE_DNS_OVER_TLS', have)
1329 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1330 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1332 default_dns_over_tls = get_option('default-dns-over-tls')
1334 default_dns_over_tls = 'no'
1336 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1337 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.')
1338 default_dns_over_tls = 'no'
1340 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1341 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1342 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1344 default_mdns = get_option('default-mdns')
1345 conf.set('DEFAULT_MDNS_MODE',
1346 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
1347 substs.set('DEFAULT_MDNS_MODE', default_mdns)
1349 default_llmnr = get_option('default-llmnr')
1350 conf.set('DEFAULT_LLMNR_MODE',
1351 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
1352 substs.set('DEFAULT_LLMNR_MODE', default_llmnr)
1354 want_repart = get_option('repart')
1355 if want_repart != 'false'
1356 have = (conf.get('HAVE_OPENSSL') == 1 and
1357 conf.get('HAVE_LIBFDISK') == 1)
1358 if want_repart == 'true' and not have
1359 error('repart support was requested, but dependencies are not available')
1364 conf.set10('ENABLE_REPART', have)
1366 want_importd = get_option('importd')
1367 if want_importd != 'false'
1368 have = (conf.get('HAVE_LIBCURL') == 1 and
1369 conf.get('HAVE_ZLIB') == 1 and
1370 conf.get('HAVE_XZ') == 1 and
1371 conf.get('HAVE_GCRYPT') == 1)
1372 if want_importd == 'true' and not have
1373 error('importd support was requested, but dependencies are not available')
1378 conf.set10('ENABLE_IMPORTD', have)
1380 want_homed = get_option('homed')
1381 if want_homed != 'false'
1382 have = (conf.get('HAVE_OPENSSL') == 1 and
1383 conf.get('HAVE_LIBFDISK') == 1 and
1384 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1385 if want_homed == 'true' and not have
1386 error('homed support was requested, but dependencies are not available')
1391 conf.set10('ENABLE_HOMED', have)
1393 have = have and conf.get('HAVE_PAM') == 1
1394 conf.set10('ENABLE_PAM_HOME', have)
1396 want_remote = get_option('remote')
1397 if want_remote != 'false'
1398 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1399 conf.get('HAVE_LIBCURL') == 1]
1400 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1401 # it's possible to build one without the other. Complain only if
1402 # support was explicitly requested. The auxiliary files like sysusers
1403 # config should be installed when any of the programs are built.
1404 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1405 error('remote support was requested, but dependencies are not available')
1407 have = have_deps[0] or have_deps[1]
1411 conf.set10('ENABLE_REMOTE', have)
1413 foreach term : ['utmp',
1449 have = get_option(term)
1450 name = 'ENABLE_' + term.underscorify().to_upper()
1451 conf.set10(name, have)
1454 foreach tuple : [['nss-mymachines', 'machined'],
1455 ['nss-resolve', 'resolve']]
1456 want = get_option(tuple[0])
1458 have = get_option(tuple[1])
1459 if want == 'true' and not have
1460 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1465 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1466 conf.set10(name, have)
1470 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1471 'ENABLE_NSS_MYMACHINES',
1472 'ENABLE_NSS_RESOLVE',
1473 'ENABLE_NSS_SYSTEMD']
1474 if conf.get(term) == 1
1478 conf.set10('ENABLE_NSS', enable_nss)
1480 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1485 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1487 #####################################################################
1489 if get_option('efi')
1490 efi_arch = host_machine.cpu_family()
1492 if efi_arch == 'x86'
1493 EFI_MACHINE_TYPE_NAME = 'ia32'
1494 gnu_efi_arch = 'ia32'
1495 elif efi_arch == 'x86_64'
1496 EFI_MACHINE_TYPE_NAME = 'x64'
1497 gnu_efi_arch = 'x86_64'
1498 elif efi_arch == 'arm'
1499 EFI_MACHINE_TYPE_NAME = 'arm'
1500 gnu_efi_arch = 'arm'
1501 elif efi_arch == 'aarch64'
1502 EFI_MACHINE_TYPE_NAME = 'aa64'
1503 gnu_efi_arch = 'aarch64'
1505 EFI_MACHINE_TYPE_NAME = ''
1510 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1512 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1516 conf.set10('ENABLE_EFI', have)
1518 #####################################################################
1520 config_h = configure_file(
1521 output : 'config.h',
1522 configuration : conf)
1524 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1526 includes = include_directories('src/basic',
1532 'src/journal-remote',
1536 'src/time-wait-sync',
1542 'src/xdg-autostart-generator',
1543 'src/libsystemd/sd-bus',
1544 'src/libsystemd/sd-device',
1545 'src/libsystemd/sd-event',
1546 'src/libsystemd/sd-hwdb',
1547 'src/libsystemd/sd-id128',
1548 'src/libsystemd/sd-netlink',
1549 'src/libsystemd/sd-network',
1550 'src/libsystemd/sd-resolve',
1551 'src/libsystemd-network',
1554 add_project_arguments('-include', 'config.h', language : 'c')
1556 generate_gperfs = find_program('tools/generate-gperfs.py')
1560 subdir('src/systemd')
1562 subdir('src/libsystemd')
1563 subdir('src/libsystemd-network')
1564 subdir('src/journal')
1567 libjournal_core = static_library(
1569 libjournal_core_sources,
1571 include_directories : includes,
1574 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1575 libsystemd = shared_library(
1578 version : libsystemd_version,
1579 include_directories : includes,
1580 link_args : ['-shared',
1581 '-Wl,--version-script=' + libsystemd_sym_path],
1582 link_with : [libbasic,
1584 link_whole : [libsystemd_static,
1586 dependencies : [threads,
1591 link_depends : libsystemd_sym,
1593 install_dir : rootlibdir)
1595 static_libsystemd = get_option('static-libsystemd')
1596 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1598 install_libsystemd_static = static_library(
1601 journal_client_sources,
1603 basic_gcrypt_sources,
1605 include_directories : includes,
1606 build_by_default : static_libsystemd != 'false',
1607 install : static_libsystemd != 'false',
1608 install_dir : rootlibdir,
1609 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1610 dependencies : [threads,
1620 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1622 # Generate autosuspend rules
1623 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1625 ############################################################
1627 # binaries that have --help and are intended for use by humans,
1628 # usually, but not always, installed in /bin.
1629 public_programs = []
1631 subdir('src/libudev')
1632 subdir('src/shared')
1634 subdir('src/shutdown')
1636 subdir('src/network')
1638 subdir('src/analyze')
1639 subdir('src/journal-remote')
1640 subdir('src/coredump')
1641 subdir('src/pstore')
1642 subdir('src/hostname')
1643 subdir('src/import')
1644 subdir('src/partition')
1645 subdir('src/kernel-install')
1646 subdir('src/locale')
1647 subdir('src/machine')
1648 subdir('src/portable')
1649 subdir('src/userdb')
1651 subdir('src/nspawn')
1652 subdir('src/resolve')
1653 subdir('src/timedate')
1654 subdir('src/timesync')
1655 subdir('src/tmpfiles')
1656 subdir('src/vconsole')
1657 subdir('src/boot/efi')
1664 ############################################################
1666 # only static linking apart from libdl, to make sure that the
1667 # module is linked to all libraries that it uses.
1668 test_dlopen = executable(
1672 include_directories : includes,
1673 link_with : [libbasic],
1674 dependencies : [libdl],
1675 build_by_default : want_tests != 'false')
1677 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1678 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h src/nss-systemd/nss-systemd.h'],
1679 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1680 ['resolve', 'ENABLE_NSS_RESOLVE']]
1682 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1686 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1687 version_script_arg = join_paths(project_source_root, sym)
1689 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1690 if tuple.length() > 2
1691 sources += tuple[2].split()
1694 nss = shared_library(
1699 include_directories : includes,
1700 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1701 link_args : ['-Wl,-z,nodelete',
1703 '-Wl,--version-script=' + version_script_arg],
1704 link_with : [libsystemd_static,
1707 dependencies : [threads,
1711 install_dir : rootlibdir)
1713 # We cannot use shared_module because it does not support version suffix.
1714 # Unfortunately shared_library insists on creating the symlink…
1715 meson.add_install_script('sh', '-c',
1716 'rm $DESTDIR@0@/libnss_@1@.so'
1717 .format(rootlibdir, module))
1719 if want_tests != 'false'
1720 test('dlopen-nss_' + module,
1722 # path to dlopen must include a slash
1723 args : nss.full_path())
1728 ############################################################
1733 include_directories : includes,
1734 link_with : [libcore,
1736 dependencies : [versiondep,
1743 install_rpath : rootlibexecdir,
1745 install_dir : rootlibexecdir)
1747 meson.add_install_script(meson_make_symlink,
1748 join_paths(rootlibexecdir, 'systemd'),
1749 join_paths(rootsbindir, 'init'))
1751 public_programs += executable(
1753 systemd_analyze_sources,
1754 include_directories : includes,
1755 link_with : [libcore,
1757 dependencies : [versiondep,
1764 install_rpath : rootlibexecdir,
1765 install : get_option('analyze'))
1769 systemd_journald_sources,
1770 include_directories : includes,
1771 link_with : [libjournal_core,
1773 dependencies : [threads,
1778 install_rpath : rootlibexecdir,
1780 install_dir : rootlibexecdir)
1782 public_programs += executable(
1784 systemd_cat_sources,
1785 include_directories : includes,
1786 link_with : [libjournal_core,
1788 dependencies : [threads],
1789 install_rpath : rootlibexecdir,
1792 public_programs += executable(
1795 include_directories : includes,
1796 link_with : [libshared],
1797 dependencies : [threads,
1803 install_rpath : rootlibexecdir,
1805 install_dir : rootbindir)
1808 'systemd-getty-generator',
1809 'src/getty-generator/getty-generator.c',
1810 include_directories : includes,
1811 link_with : [libshared],
1812 install_rpath : rootlibexecdir,
1814 install_dir : systemgeneratordir)
1817 'systemd-debug-generator',
1818 'src/debug-generator/debug-generator.c',
1819 include_directories : includes,
1820 link_with : [libshared],
1821 install_rpath : rootlibexecdir,
1823 install_dir : systemgeneratordir)
1826 'systemd-run-generator',
1827 'src/run-generator/run-generator.c',
1828 include_directories : includes,
1829 link_with : [libshared],
1830 install_rpath : rootlibexecdir,
1832 install_dir : systemgeneratordir)
1835 'systemd-fstab-generator',
1836 'src/fstab-generator/fstab-generator.c',
1837 include_directories : includes,
1838 link_with : [libcore_shared,
1840 install_rpath : rootlibexecdir,
1842 install_dir : systemgeneratordir)
1844 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1846 '30-systemd-environment-d-generator',
1847 'src/environment-d-generator/environment-d-generator.c',
1848 include_directories : includes,
1849 link_with : [libshared],
1850 install_rpath : rootlibexecdir,
1852 install_dir : userenvgeneratordir)
1854 meson.add_install_script(meson_make_symlink,
1855 join_paths(sysconfdir, 'environment'),
1856 join_paths(environmentdir, '99-environment.conf'))
1859 if conf.get('ENABLE_HIBERNATE') == 1
1861 'systemd-hibernate-resume-generator',
1862 'src/hibernate-resume/hibernate-resume-generator.c',
1863 include_directories : includes,
1864 link_with : [libshared],
1865 install_rpath : rootlibexecdir,
1867 install_dir : systemgeneratordir)
1870 'systemd-hibernate-resume',
1871 'src/hibernate-resume/hibernate-resume.c',
1872 include_directories : includes,
1873 link_with : [libshared],
1874 install_rpath : rootlibexecdir,
1876 install_dir : rootlibexecdir)
1879 if conf.get('HAVE_BLKID') == 1
1881 'systemd-gpt-auto-generator',
1882 'src/gpt-auto-generator/gpt-auto-generator.c',
1883 'src/shared/blkid-util.h',
1884 include_directories : includes,
1885 link_with : [libshared],
1886 dependencies : libblkid,
1887 install_rpath : rootlibexecdir,
1889 install_dir : systemgeneratordir)
1891 public_programs += executable(
1893 'src/dissect/dissect.c',
1894 include_directories : includes,
1895 link_with : [libshared],
1896 install_rpath : rootlibexecdir,
1898 install_dir : rootlibexecdir)
1901 if conf.get('ENABLE_RESOLVE') == 1
1904 systemd_resolved_sources,
1905 include_directories : includes,
1906 link_with : [libshared,
1908 libsystemd_resolve_core],
1909 dependencies : systemd_resolved_dependencies,
1910 install_rpath : rootlibexecdir,
1912 install_dir : rootlibexecdir)
1914 public_programs += executable(
1917 include_directories : includes,
1918 link_with : [libshared,
1920 libsystemd_resolve_core],
1921 dependencies : [threads,
1925 install_rpath : rootlibexecdir,
1928 meson.add_install_script(meson_make_symlink,
1929 join_paths(bindir, 'resolvectl'),
1930 join_paths(rootsbindir, 'resolvconf'))
1932 meson.add_install_script(meson_make_symlink,
1933 join_paths(bindir, 'resolvectl'),
1934 join_paths(bindir, 'systemd-resolve'))
1937 if conf.get('ENABLE_LOGIND') == 1
1940 systemd_logind_sources,
1941 include_directories : includes,
1942 link_with : [liblogind_core,
1944 dependencies : [threads,
1946 install_rpath : rootlibexecdir,
1948 install_dir : rootlibexecdir)
1950 public_programs += executable(
1953 include_directories : includes,
1954 link_with : [libshared],
1955 dependencies : [threads,
1959 install_rpath : rootlibexecdir,
1961 install_dir : rootbindir)
1963 public_programs += executable(
1965 'src/login/inhibit.c',
1966 include_directories : includes,
1967 link_with : [libshared],
1968 install_rpath : rootlibexecdir,
1970 install_dir : rootbindir)
1972 if conf.get('HAVE_PAM') == 1
1973 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1974 pam_systemd = shared_library(
1978 include_directories : includes,
1979 link_args : ['-shared',
1980 '-Wl,--version-script=' + version_script_arg],
1981 link_with : [libsystemd_static,
1983 dependencies : [threads,
1986 link_depends : pam_systemd_sym,
1988 install_dir : pamlibdir)
1990 if want_tests != 'false'
1991 test('dlopen-pam_systemd',
1993 # path to dlopen must include a slash
1994 args : pam_systemd.full_path())
1999 'systemd-user-runtime-dir',
2000 user_runtime_dir_sources,
2001 include_directories : includes,
2002 link_with : [libshared],
2003 install_rpath : rootlibexecdir,
2005 install_dir : rootlibexecdir)
2008 if conf.get('HAVE_PAM') == 1
2010 'systemd-user-sessions',
2011 'src/user-sessions/user-sessions.c',
2012 include_directories : includes,
2013 link_with : [libshared],
2014 install_rpath : rootlibexecdir,
2016 install_dir : rootlibexecdir)
2019 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
2020 public_programs += executable(
2022 'src/boot/bootctl.c',
2023 include_directories : includes,
2024 link_with : [libshared],
2025 dependencies : [libblkid],
2026 install_rpath : rootlibexecdir,
2029 public_programs += executable(
2030 'systemd-bless-boot',
2031 'src/boot/bless-boot.c',
2032 include_directories : includes,
2033 link_with : [libshared],
2034 dependencies : [libblkid],
2035 install_rpath : rootlibexecdir,
2037 install_dir : rootlibexecdir)
2040 'systemd-bless-boot-generator',
2041 'src/boot/bless-boot-generator.c',
2042 include_directories : includes,
2043 link_with : [libshared],
2044 install_rpath : rootlibexecdir,
2046 install_dir : systemgeneratordir)
2050 'systemd-boot-check-no-failures',
2051 'src/boot/boot-check-no-failures.c',
2052 include_directories : includes,
2053 link_with : [libshared],
2054 dependencies : [libblkid],
2055 install_rpath : rootlibexecdir,
2057 install_dir : rootlibexecdir)
2059 public_programs += executable(
2060 'systemd-socket-activate',
2061 'src/activate/activate.c',
2062 include_directories : includes,
2063 link_with : [libshared],
2064 dependencies : [threads],
2065 install_rpath : rootlibexecdir,
2068 if get_option('link-systemctl-shared')
2069 systemctl_link_with = [libshared]
2071 systemctl_link_with = [libsystemd_static,
2077 public_programs += executable(
2079 'src/systemctl/systemctl.c',
2080 'src/systemctl/sysv-compat.h',
2081 'src/systemctl/sysv-compat.c',
2082 include_directories : includes,
2083 link_with : systemctl_link_with,
2084 dependencies : [threads,
2090 install_rpath : rootlibexecdir,
2092 install_dir : rootbindir)
2094 if conf.get('ENABLE_PORTABLED') == 1
2096 'systemd-portabled',
2097 systemd_portabled_sources,
2098 include_directories : includes,
2099 link_with : [libshared],
2100 dependencies : [threads],
2101 install_rpath : rootlibexecdir,
2103 install_dir : rootlibexecdir)
2105 public_programs += executable(
2107 'src/portable/portablectl.c',
2108 include_directories : includes,
2109 link_with : [libshared],
2110 dependencies : [threads],
2111 install_rpath : rootlibexecdir,
2113 install_dir : rootbindir)
2116 if conf.get('ENABLE_USERDB') == 1
2119 systemd_userwork_sources,
2120 include_directories : includes,
2121 link_with : [libshared],
2122 dependencies : [threads],
2123 install_rpath : rootlibexecdir,
2125 install_dir : rootlibexecdir)
2129 systemd_userdbd_sources,
2130 include_directories : includes,
2131 link_with : [libshared],
2132 dependencies : [threads],
2133 install_rpath : rootlibexecdir,
2135 install_dir : rootlibexecdir)
2137 public_programs += executable(
2140 include_directories : includes,
2141 link_with : [libshared],
2142 dependencies : [threads],
2143 install_rpath : rootlibexecdir,
2145 install_dir : rootbindir)
2148 if conf.get('ENABLE_HOMED') == 1
2151 systemd_homework_sources,
2152 include_directories : includes,
2153 link_with : [libshared],
2154 dependencies : [threads,
2161 install_rpath : rootlibexecdir,
2163 install_dir : rootlibexecdir)
2167 systemd_homed_sources,
2168 include_directories : includes,
2169 link_with : [libshared],
2170 dependencies : [threads,
2174 install_rpath : rootlibexecdir,
2176 install_dir : rootlibexecdir)
2178 public_programs += executable(
2181 include_directories : includes,
2182 link_with : [libshared],
2183 dependencies : [threads,
2188 install_rpath : rootlibexecdir,
2190 install_dir : rootbindir)
2192 if conf.get('HAVE_PAM') == 1
2193 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2194 pam_systemd = shared_library(
2198 include_directories : includes,
2199 link_args : ['-shared',
2200 '-Wl,--version-script=' + version_script_arg],
2201 link_with : [libsystemd_static,
2203 dependencies : [threads,
2207 link_depends : pam_systemd_home_sym,
2209 install_dir : pamlibdir)
2213 foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
2214 (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
2215 meson.add_install_script(meson_make_symlink,
2216 join_paths(rootbindir, 'systemctl'),
2217 join_paths(rootsbindir, alias))
2220 meson.add_install_script(meson_make_symlink,
2221 join_paths(rootbindir, 'udevadm'),
2222 join_paths(rootlibexecdir, 'systemd-udevd'))
2224 if conf.get('ENABLE_BACKLIGHT') == 1
2226 'systemd-backlight',
2227 'src/backlight/backlight.c',
2228 include_directories : includes,
2229 link_with : [libshared],
2230 install_rpath : rootlibexecdir,
2232 install_dir : rootlibexecdir)
2235 if conf.get('ENABLE_RFKILL') == 1
2238 'src/rfkill/rfkill.c',
2239 include_directories : includes,
2240 link_with : [libshared],
2241 install_rpath : rootlibexecdir,
2243 install_dir : rootlibexecdir)
2247 'systemd-system-update-generator',
2248 'src/system-update-generator/system-update-generator.c',
2249 include_directories : includes,
2250 link_with : [libshared],
2251 install_rpath : rootlibexecdir,
2253 install_dir : systemgeneratordir)
2255 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2256 systemd_cryptsetup_sources = files('''
2257 src/cryptsetup/cryptsetup-pkcs11.h
2258 src/cryptsetup/cryptsetup-util.c
2259 src/cryptsetup/cryptsetup-util.h
2260 src/cryptsetup/cryptsetup.c
2263 if conf.get('HAVE_P11KIT') == 1
2264 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2268 'systemd-cryptsetup',
2269 systemd_cryptsetup_sources,
2270 include_directories : includes,
2271 link_with : [libshared],
2272 dependencies : [libcryptsetup,
2274 install_rpath : rootlibexecdir,
2276 install_dir : rootlibexecdir)
2279 'systemd-cryptsetup-generator',
2280 'src/cryptsetup/cryptsetup-generator.c',
2281 include_directories : includes,
2282 link_with : [libshared],
2283 dependencies : [libcryptsetup],
2284 install_rpath : rootlibexecdir,
2286 install_dir : systemgeneratordir)
2289 'systemd-veritysetup',
2290 'src/veritysetup/veritysetup.c',
2291 include_directories : includes,
2292 link_with : [libshared],
2293 dependencies : [libcryptsetup],
2294 install_rpath : rootlibexecdir,
2296 install_dir : rootlibexecdir)
2299 'systemd-veritysetup-generator',
2300 'src/veritysetup/veritysetup-generator.c',
2301 include_directories : includes,
2302 link_with : [libshared],
2303 dependencies : [libcryptsetup],
2304 install_rpath : rootlibexecdir,
2306 install_dir : systemgeneratordir)
2309 if conf.get('HAVE_SYSV_COMPAT') == 1
2311 'systemd-sysv-generator',
2312 'src/sysv-generator/sysv-generator.c',
2313 include_directories : includes,
2314 link_with : [libshared],
2315 install_rpath : rootlibexecdir,
2317 install_dir : systemgeneratordir)
2320 'systemd-rc-local-generator',
2321 'src/rc-local-generator/rc-local-generator.c',
2322 include_directories : includes,
2323 link_with : [libshared],
2324 install_rpath : rootlibexecdir,
2326 install_dir : systemgeneratordir)
2329 if conf.get('ENABLE_XDG_AUTOSTART') == 1
2331 'systemd-xdg-autostart-generator',
2332 'src/xdg-autostart-generator/xdg-autostart-generator.c',
2333 'src/xdg-autostart-generator/xdg-autostart-service.c',
2334 include_directories : includes,
2335 link_with : [libshared],
2336 install_rpath : rootlibexecdir,
2338 install_dir : usergeneratordir)
2341 'systemd-xdg-autostart-condition',
2342 'src/xdg-autostart-generator/xdg-autostart-condition.c',
2343 include_directories : includes,
2344 link_with : [libshared],
2345 install_rpath : rootlibexecdir,
2347 install_dir : rootlibexecdir)
2350 if conf.get('ENABLE_HOSTNAMED') == 1
2352 'systemd-hostnamed',
2353 'src/hostname/hostnamed.c',
2354 include_directories : includes,
2355 link_with : [libshared],
2356 install_rpath : rootlibexecdir,
2358 install_dir : rootlibexecdir)
2360 public_programs += executable(
2362 'src/hostname/hostnamectl.c',
2363 include_directories : includes,
2364 link_with : [libshared],
2365 install_rpath : rootlibexecdir,
2369 if conf.get('ENABLE_LOCALED') == 1
2370 if conf.get('HAVE_XKBCOMMON') == 1
2371 # logind will load libxkbcommon.so dynamically on its own
2379 systemd_localed_sources,
2380 include_directories : includes,
2381 link_with : [libshared],
2382 dependencies : deps,
2383 install_rpath : rootlibexecdir,
2385 install_dir : rootlibexecdir)
2387 public_programs += executable(
2390 include_directories : includes,
2391 link_with : [libshared],
2392 install_rpath : rootlibexecdir,
2396 if conf.get('ENABLE_TIMEDATED') == 1
2398 'systemd-timedated',
2399 'src/timedate/timedated.c',
2400 include_directories : includes,
2401 link_with : [libshared],
2402 install_rpath : rootlibexecdir,
2404 install_dir : rootlibexecdir)
2407 if conf.get('ENABLE_TIMEDATECTL') == 1
2408 public_programs += executable(
2410 'src/timedate/timedatectl.c',
2411 include_directories : includes,
2412 install_rpath : rootlibexecdir,
2413 link_with : [libshared],
2414 dependencies : [libm],
2418 if conf.get('ENABLE_TIMESYNCD') == 1
2419 if get_option('link-timesyncd-shared')
2420 timesyncd_link_with = [libshared]
2422 timesyncd_link_with = [libsystemd_static,
2429 'systemd-timesyncd',
2430 systemd_timesyncd_sources,
2431 include_directories : includes,
2432 link_with : [timesyncd_link_with],
2433 dependencies : [threads,
2435 install_rpath : rootlibexecdir,
2437 install_dir : rootlibexecdir)
2440 'systemd-time-wait-sync',
2441 'src/time-wait-sync/time-wait-sync.c',
2442 include_directories : includes,
2443 link_with : [timesyncd_link_with],
2444 install_rpath : rootlibexecdir,
2446 install_dir : rootlibexecdir)
2449 if conf.get('ENABLE_MACHINED') == 1
2452 systemd_machined_sources,
2453 include_directories : includes,
2454 link_with : [libmachine_core,
2456 install_rpath : rootlibexecdir,
2458 install_dir : rootlibexecdir)
2460 public_programs += executable(
2462 'src/machine/machinectl.c',
2463 include_directories : includes,
2464 link_with : [libshared],
2465 dependencies : [threads,
2469 install_rpath : rootlibexecdir,
2471 install_dir : rootbindir)
2474 if conf.get('ENABLE_IMPORTD') == 1
2477 systemd_importd_sources,
2478 include_directories : includes,
2479 link_with : [libshared],
2480 dependencies : [threads],
2481 install_rpath : rootlibexecdir,
2483 install_dir : rootlibexecdir)
2485 systemd_pull = executable(
2487 systemd_pull_sources,
2488 include_directories : includes,
2489 link_with : [libshared],
2490 dependencies : [versiondep,
2496 install_rpath : rootlibexecdir,
2498 install_dir : rootlibexecdir)
2500 systemd_import = executable(
2502 systemd_import_sources,
2503 include_directories : includes,
2504 link_with : [libshared],
2505 dependencies : [libcurl,
2509 install_rpath : rootlibexecdir,
2511 install_dir : rootlibexecdir)
2513 systemd_import_fs = executable(
2514 'systemd-import-fs',
2515 systemd_import_fs_sources,
2516 include_directories : includes,
2517 link_with : [libshared],
2518 install_rpath : rootlibexecdir,
2520 install_dir : rootlibexecdir)
2522 systemd_export = executable(
2524 systemd_export_sources,
2525 include_directories : includes,
2526 link_with : [libshared],
2527 dependencies : [libcurl,
2531 install_rpath : rootlibexecdir,
2533 install_dir : rootlibexecdir)
2535 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2538 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2539 public_programs += executable(
2540 'systemd-journal-upload',
2541 systemd_journal_upload_sources,
2542 include_directories : includes,
2543 link_with : [libshared],
2544 dependencies : [versiondep,
2551 install_rpath : rootlibexecdir,
2553 install_dir : rootlibexecdir)
2556 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2557 public_programs += executable(
2558 'systemd-journal-remote',
2559 systemd_journal_remote_sources,
2560 include_directories : includes,
2561 link_with : [libshared,
2562 libsystemd_journal_remote],
2563 dependencies : [threads,
2569 install_rpath : rootlibexecdir,
2571 install_dir : rootlibexecdir)
2573 public_programs += executable(
2574 'systemd-journal-gatewayd',
2575 systemd_journal_gatewayd_sources,
2576 include_directories : includes,
2577 link_with : [libshared],
2578 dependencies : [threads,
2584 install_rpath : rootlibexecdir,
2586 install_dir : rootlibexecdir)
2589 if conf.get('ENABLE_COREDUMP') == 1
2592 systemd_coredump_sources,
2593 include_directories : includes,
2594 link_with : [libshared],
2595 dependencies : [threads,
2601 install_rpath : rootlibexecdir,
2603 install_dir : rootlibexecdir)
2605 public_programs += executable(
2607 coredumpctl_sources,
2608 include_directories : includes,
2609 link_with : [libshared],
2610 dependencies : [threads,
2614 install_rpath : rootlibexecdir,
2618 if conf.get('ENABLE_PSTORE') == 1
2621 systemd_pstore_sources,
2622 include_directories : includes,
2623 link_with : [libshared],
2624 dependencies : [threads,
2630 install_rpath : rootlibexecdir,
2632 install_dir : rootlibexecdir)
2635 if conf.get('ENABLE_BINFMT') == 1
2636 public_programs += executable(
2638 'src/binfmt/binfmt.c',
2639 include_directories : includes,
2640 link_with : [libshared],
2641 install_rpath : rootlibexecdir,
2643 install_dir : rootlibexecdir)
2645 meson.add_install_script('sh', '-c',
2646 mkdir_p.format(binfmtdir))
2647 meson.add_install_script('sh', '-c',
2648 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2651 if conf.get('ENABLE_REPART') == 1
2654 systemd_repart_sources,
2655 include_directories : includes,
2656 link_with : [libshared],
2657 dependencies : [threads,
2662 install_rpath : rootlibexecdir,
2664 install_dir : rootbindir)
2666 if want_tests != 'false'
2669 args : exe.full_path())
2673 if conf.get('ENABLE_VCONSOLE') == 1
2675 'systemd-vconsole-setup',
2676 'src/vconsole/vconsole-setup.c',
2677 include_directories : includes,
2678 link_with : [libshared],
2679 install_rpath : rootlibexecdir,
2681 install_dir : rootlibexecdir)
2684 if conf.get('ENABLE_RANDOMSEED') == 1
2686 'systemd-random-seed',
2687 'src/random-seed/random-seed.c',
2688 include_directories : includes,
2689 link_with : [libshared],
2690 install_rpath : rootlibexecdir,
2692 install_dir : rootlibexecdir)
2695 if conf.get('ENABLE_FIRSTBOOT') == 1
2697 'systemd-firstboot',
2698 'src/firstboot/firstboot.c',
2699 include_directories : includes,
2700 link_with : [libshared],
2701 dependencies : [libcrypt],
2702 install_rpath : rootlibexecdir,
2704 install_dir : rootbindir)
2708 'systemd-remount-fs',
2709 'src/remount-fs/remount-fs.c',
2710 include_directories : includes,
2711 link_with : [libcore_shared,
2713 install_rpath : rootlibexecdir,
2715 install_dir : rootlibexecdir)
2718 'systemd-machine-id-setup',
2719 'src/machine-id-setup/machine-id-setup-main.c',
2720 include_directories : includes,
2721 link_with : [libcore_shared,
2723 install_rpath : rootlibexecdir,
2725 install_dir : rootbindir)
2730 include_directories : includes,
2731 link_with : [libshared],
2732 install_rpath : rootlibexecdir,
2734 install_dir : rootlibexecdir)
2736 executable('systemd-growfs',
2737 'src/partition/growfs.c',
2738 include_directories : includes,
2739 link_with : [libshared],
2740 dependencies : [libcryptsetup],
2741 install_rpath : rootlibexecdir,
2743 install_dir : rootlibexecdir)
2747 'src/partition/makefs.c',
2748 include_directories : includes,
2749 link_with : [libshared],
2750 install_rpath : rootlibexecdir,
2752 install_dir : rootlibexecdir)
2756 'src/sleep/sleep.c',
2757 include_directories : includes,
2758 link_with : [libshared],
2759 install_rpath : rootlibexecdir,
2761 install_dir : rootlibexecdir)
2763 install_data('src/sleep/sleep.conf',
2764 install_dir : pkgsysconfdir)
2766 public_programs += executable(
2768 'src/sysctl/sysctl.c',
2769 include_directories : includes,
2770 link_with : [libshared],
2771 install_rpath : rootlibexecdir,
2773 install_dir : rootlibexecdir)
2777 'src/ac-power/ac-power.c',
2778 include_directories : includes,
2779 link_with : [libshared],
2780 install_rpath : rootlibexecdir,
2782 install_dir : rootlibexecdir)
2784 public_programs += executable(
2785 'systemd-detect-virt',
2786 'src/detect-virt/detect-virt.c',
2787 include_directories : includes,
2788 link_with : [libshared],
2789 install_rpath : rootlibexecdir,
2792 public_programs += executable(
2794 'src/delta/delta.c',
2795 include_directories : includes,
2796 link_with : [libshared],
2797 install_rpath : rootlibexecdir,
2800 public_programs += executable(
2802 'src/escape/escape.c',
2803 include_directories : includes,
2804 link_with : [libshared],
2805 install_rpath : rootlibexecdir,
2807 install_dir : rootbindir)
2809 public_programs += executable(
2811 'src/notify/notify.c',
2812 include_directories : includes,
2813 link_with : [libshared],
2814 install_rpath : rootlibexecdir,
2816 install_dir : rootbindir)
2819 'systemd-volatile-root',
2820 'src/volatile-root/volatile-root.c',
2821 include_directories : includes,
2822 link_with : [libshared],
2823 install_rpath : rootlibexecdir,
2824 install : conf.get('ENABLE_INITRD') == 1,
2825 install_dir : rootlibexecdir)
2828 'systemd-cgroups-agent',
2829 'src/cgroups-agent/cgroups-agent.c',
2830 include_directories : includes,
2831 link_with : [libshared],
2832 install_rpath : rootlibexecdir,
2834 install_dir : rootlibexecdir)
2836 public_programs += executable(
2838 'src/id128/id128.c',
2839 include_directories : includes,
2840 link_with : [libshared],
2841 install_rpath : rootlibexecdir,
2844 public_programs += executable(
2847 include_directories : includes,
2848 link_with : [libshared],
2849 install_rpath : rootlibexecdir,
2852 public_programs += executable(
2853 'systemd-ask-password',
2854 'src/ask-password/ask-password.c',
2855 include_directories : includes,
2856 link_with : [libshared],
2857 install_rpath : rootlibexecdir,
2859 install_dir : rootbindir)
2862 'systemd-reply-password',
2863 'src/reply-password/reply-password.c',
2864 include_directories : includes,
2865 link_with : [libshared],
2866 install_rpath : rootlibexecdir,
2868 install_dir : rootlibexecdir)
2870 public_programs += executable(
2871 'systemd-tty-ask-password-agent',
2872 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2873 include_directories : includes,
2874 link_with : [libshared],
2875 install_rpath : rootlibexecdir,
2877 install_dir : rootbindir)
2879 public_programs += executable(
2882 include_directories : includes,
2883 link_with : [libshared],
2884 install_rpath : rootlibexecdir,
2887 public_programs += executable(
2889 'src/cgtop/cgtop.c',
2890 include_directories : includes,
2891 link_with : [libshared],
2892 install_rpath : rootlibexecdir,
2897 'src/initctl/initctl.c',
2898 include_directories : includes,
2899 link_with : [libshared],
2900 install_rpath : rootlibexecdir,
2901 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
2902 install_dir : rootlibexecdir)
2904 public_programs += executable(
2906 'src/mount/mount-tool.c',
2907 include_directories : includes,
2908 link_with : [libshared],
2909 dependencies: [libmount],
2910 install_rpath : rootlibexecdir,
2913 meson.add_install_script(meson_make_symlink,
2914 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2916 public_programs += executable(
2919 include_directories : includes,
2920 link_with : [libshared],
2921 install_rpath : rootlibexecdir,
2924 public_programs += executable(
2925 'systemd-stdio-bridge',
2926 'src/stdio-bridge/stdio-bridge.c',
2927 include_directories : includes,
2928 link_with : [libshared],
2929 dependencies : [versiondep],
2930 install_rpath : rootlibexecdir,
2933 public_programs += executable(
2935 'src/busctl/busctl.c',
2936 'src/busctl/busctl-introspect.c',
2937 'src/busctl/busctl-introspect.h',
2938 include_directories : includes,
2939 link_with : [libshared],
2940 install_rpath : rootlibexecdir,
2943 if conf.get('ENABLE_SYSUSERS') == 1
2944 public_programs += executable(
2946 'src/sysusers/sysusers.c',
2947 include_directories : includes,
2948 link_with : [libshared],
2949 install_rpath : rootlibexecdir,
2951 install_dir : rootbindir)
2953 if have_standalone_binaries
2954 public_programs += executable(
2955 'systemd-sysusers.standalone',
2956 'src/sysusers/sysusers.c',
2957 include_directories : includes,
2958 link_with : [libshared_static,
2964 install_dir : rootbindir)
2968 if conf.get('ENABLE_TMPFILES') == 1
2971 systemd_tmpfiles_sources,
2972 include_directories : includes,
2973 link_with : [libshared],
2974 dependencies : [libacl],
2975 install_rpath : rootlibexecdir,
2977 install_dir : rootbindir)
2978 public_programs += exe
2980 if want_tests != 'false'
2981 test('test-systemd-tmpfiles',
2982 test_systemd_tmpfiles_py,
2983 # https://github.com/mesonbuild/meson/issues/2681
2984 args : exe.full_path())
2987 if have_standalone_binaries
2988 public_programs += executable(
2989 'systemd-tmpfiles.standalone',
2990 systemd_tmpfiles_sources,
2991 include_directories : includes,
2992 link_with : [libshared_static,
2997 dependencies : [libacl],
2999 install_dir : rootbindir)
3003 if conf.get('ENABLE_HWDB') == 1
3004 public_programs += executable(
3007 'src/libsystemd/sd-hwdb/hwdb-internal.h',
3008 include_directories : includes,
3009 link_with : [libudev_static],
3010 install_rpath : udev_rpath,
3012 install_dir : rootbindir)
3015 if conf.get('ENABLE_QUOTACHECK') == 1
3017 'systemd-quotacheck',
3018 'src/quotacheck/quotacheck.c',
3019 include_directories : includes,
3020 link_with : [libshared],
3021 install_rpath : rootlibexecdir,
3023 install_dir : rootlibexecdir)
3026 public_programs += executable(
3027 'systemd-socket-proxyd',
3028 'src/socket-proxy/socket-proxyd.c',
3029 include_directories : includes,
3030 link_with : [libshared],
3031 dependencies : [threads],
3032 install_rpath : rootlibexecdir,
3034 install_dir : rootlibexecdir)
3036 public_programs += executable(
3039 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
3040 include_directories : includes,
3041 link_with : [libudev_core,
3044 dependencies : [versiondep,
3050 install_rpath : udev_rpath,
3052 install_dir : rootbindir)
3056 systemd_shutdown_sources,
3057 include_directories : includes,
3058 link_with : [libcore_shared,
3060 dependencies : [libmount],
3061 install_rpath : rootlibexecdir,
3063 install_dir : rootlibexecdir)
3066 'systemd-update-done',
3067 'src/update-done/update-done.c',
3068 include_directories : includes,
3069 link_with : [libshared],
3070 install_rpath : rootlibexecdir,
3072 install_dir : rootlibexecdir)
3075 'systemd-update-utmp',
3076 'src/update-utmp/update-utmp.c',
3077 include_directories : includes,
3078 link_with : [libshared],
3079 dependencies : [libaudit],
3080 install_rpath : rootlibexecdir,
3082 install_dir : rootlibexecdir)
3084 if conf.get('HAVE_KMOD') == 1
3086 'systemd-modules-load',
3087 'src/modules-load/modules-load.c',
3088 include_directories : includes,
3089 link_with : [libshared],
3090 dependencies : [libkmod],
3091 install_rpath : rootlibexecdir,
3093 install_dir : rootlibexecdir)
3095 meson.add_install_script('sh', '-c',
3096 mkdir_p.format(modulesloaddir))
3097 meson.add_install_script('sh', '-c',
3098 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
3101 public_programs += executable(
3103 systemd_nspawn_sources,
3104 include_directories : includes,
3105 link_with : [libcore_shared,
3108 dependencies : [libblkid,
3110 install_rpath : rootlibexecdir,
3113 if conf.get('ENABLE_NETWORKD') == 1
3116 systemd_networkd_sources,
3117 include_directories : network_include_dir,
3118 link_with : [libnetworkd_core,
3121 networkd_link_with],
3122 dependencies : [threads],
3123 install_rpath : rootlibexecdir,
3125 install_dir : rootlibexecdir)
3128 'systemd-networkd-wait-online',
3129 systemd_networkd_wait_online_sources,
3130 include_directories : includes,
3131 link_with : [libnetworkd_core,
3132 networkd_link_with],
3133 install_rpath : rootlibexecdir,
3135 install_dir : rootlibexecdir)
3137 public_programs += executable(
3140 include_directories : includes,
3141 link_with : [libsystemd_network,
3142 networkd_link_with],
3143 install_rpath : rootlibexecdir,
3145 install_dir : rootbindir)
3148 'systemd-network-generator',
3149 network_generator_sources,
3150 include_directories : includes,
3151 link_with : [networkd_link_with],
3152 install_rpath : rootlibexecdir,
3154 install_dir : rootlibexecdir)
3156 if want_tests != 'false'
3157 test('test-network-generator-conversion',
3158 test_network_generator_conversion_sh,
3159 # https://github.com/mesonbuild/meson/issues/2681
3160 args : exe.full_path())
3165 'systemd-sulogin-shell',
3166 ['src/sulogin-shell/sulogin-shell.c'],
3167 include_directories : includes,
3168 link_with : [libshared],
3169 install_rpath : rootlibexecdir,
3171 install_dir : rootlibexecdir)
3173 ############################################################
3176 'systemd-runtest.env',
3177 output : 'systemd-runtest.env',
3178 command : ['sh', '-c', '{ ' +
3179 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
3180 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
3182 build_by_default : true)
3184 foreach tuple : tests
3186 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3187 dependencies = tuple[2]
3188 condition = tuple.length() >= 4 ? tuple[3] : ''
3189 type = tuple.length() >= 5 ? tuple[4] : ''
3190 defs = tuple.length() >= 6 ? tuple[5] : []
3191 incs = tuple.length() >= 7 ? tuple[6] : includes
3194 name = sources[0].split('/')[-1].split('.')[0]
3195 if type.startswith('timeout=')
3196 timeout = type.split('=')[1].to_int()
3200 if condition == '' or conf.get(condition) == 1
3204 include_directories : incs,
3205 link_with : link_with,
3206 dependencies : [versiondep,
3209 build_by_default : want_tests != 'false',
3210 install_rpath : rootlibexecdir,
3211 install : install_tests,
3212 install_dir : join_paths(testsdir, type))
3215 message('@0@ is a manual test'.format(name))
3216 elif type == 'unsafe' and want_tests != 'unsafe'
3217 message('@0@ is an unsafe test'.format(name))
3218 elif want_tests != 'false'
3224 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3229 'test-libsystemd-sym',
3230 test_libsystemd_sym_c,
3231 include_directories : includes,
3232 link_with : [libsystemd],
3233 build_by_default : want_tests != 'false',
3234 install : install_tests,
3235 install_dir : testsdir)
3236 if want_tests != 'false'
3237 test('test-libsystemd-sym', exe)
3241 'test-libsystemd-static-sym',
3242 test_libsystemd_sym_c,
3243 include_directories : includes,
3244 link_with : [install_libsystemd_static],
3245 dependencies : [threads], # threads is already included in dependencies on the library,
3246 # but does not seem to get propagated. Add here as a work-around.
3247 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3248 install : install_tests and static_libsystemd_pic,
3249 install_dir : testsdir)
3250 if want_tests != 'false' and static_libsystemd_pic
3251 test('test-libsystemd-static-sym', exe)
3257 include_directories : includes,
3258 c_args : '-Wno-deprecated-declarations',
3259 link_with : [libudev],
3260 build_by_default : want_tests != 'false',
3261 install : install_tests,
3262 install_dir : testsdir)
3263 if want_tests != 'false'
3264 test('test-libudev-sym', exe)
3268 'test-libudev-static-sym',
3270 include_directories : includes,
3271 c_args : '-Wno-deprecated-declarations',
3272 link_with : [install_libudev_static],
3273 build_by_default : want_tests != 'false' and static_libudev_pic,
3274 install : install_tests and static_libudev_pic,
3275 install_dir : testsdir)
3276 if want_tests != 'false' and static_libudev_pic
3277 test('test-libudev-static-sym', exe)
3280 ############################################################
3284 if get_option('tests') != 'false'
3285 foreach tuple : fuzzers
3287 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3288 dependencies = tuple[2]
3289 defs = tuple.length() >= 4 ? tuple[3] : []
3290 incs = tuple.length() >= 5 ? tuple[4] : includes
3294 dependencies += fuzzing_engine
3296 if fuzzing_engine.found()
3297 dependencies += fuzzing_engine
3299 link_args += ['-fsanitize=fuzzer']
3302 sources += 'src/fuzz/fuzz-main.c'
3305 name = sources[0].split('/')[-1].split('.')[0]
3307 fuzzer_exes += executable(
3310 include_directories : [incs, include_directories('src/fuzz')],
3311 link_with : link_with,
3312 dependencies : dependencies,
3314 link_args: link_args,
3321 depends : fuzzer_exes,
3324 ############################################################
3326 make_directive_index_py = find_program('tools/make-directive-index.py')
3327 make_man_index_py = find_program('tools/make-man-index.py')
3328 xml_helper_py = find_program('tools/xml_helper.py')
3329 hwdb_update_sh = find_program('tools/hwdb-update.sh')
3330 autosuspend_update_sh = find_program('tools/autosuspend-update.sh')
3333 subdir('sysusers.d')
3334 subdir('tmpfiles.d')
3340 subdir('shell-completion/bash')
3341 subdir('shell-completion/zsh')
3342 subdir('docs/sysvinit')
3343 subdir('docs/var-log')
3345 install_subdir('factory/etc',
3346 install_dir : factorydir)
3348 install_data('xorg/50-systemd-user.sh',
3349 install_dir : xinitrcdir)
3350 install_data('modprobe.d/systemd.conf',
3351 install_dir : modprobedir)
3352 install_data('LICENSE.GPL2',
3356 'docs/CODING_STYLE.md',
3357 'docs/DISTRO_PORTING.md',
3358 'docs/ENVIRONMENT.md',
3360 'docs/TRANSIENT-SETTINGS.md',
3361 'docs/TRANSLATORS.md',
3362 'docs/UIDS-GIDS.md',
3363 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3364 install_dir : docdir)
3366 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3367 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3369 ############################################################
3371 check_help = find_program('tools/check-help.sh')
3373 foreach exec : public_programs
3374 name = exec.full_path().split('/')[-1]
3375 if want_tests != 'false'
3376 test('check-help-' + name,
3378 args : exec.full_path())
3382 ############################################################
3384 check_directives_sh = find_program('tools/check-directives.sh')
3386 if want_tests != 'false'
3387 test('check-directives',
3388 check_directives_sh,
3389 args : project_source_root)
3392 ############################################################
3394 # Enable tests for all supported sanitizers
3395 foreach tuple : sanitizers
3396 sanitizer = tuple[0]
3399 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3401 foreach p : fuzz_regression_tests
3402 b = p.split('/')[-2]
3403 c = p.split('/')[-1]
3405 name = '@0@:@1@'.format(b, sanitizer)
3408 if want_tests == 'false'
3409 message('Not compiling @0@ because tests is set to false'.format(name))
3410 elif slow_tests or fuzz_tests
3411 exe = custom_target(
3415 command : [env, 'ln', '-fs',
3416 join_paths(build.full_path(), b),
3418 build_by_default : true)
3420 message('Not compiling @0@ because slow-tests/fuzz-tests is set to false'.format(name))
3425 if want_tests != 'false' and (slow_tests or fuzz_tests)
3426 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3428 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
3430 args : [exe.full_path(),
3431 join_paths(project_source_root, p)])
3438 ############################################################
3441 all_files = run_command(
3443 ['--git-dir=@0@/.git'.format(project_source_root),
3446 all_files = files(all_files.stdout().split())
3451 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3454 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3458 git_contrib_sh = find_program('tools/git-contrib.sh')
3461 command : [git_contrib_sh])
3465 git_head = run_command(
3467 ['--git-dir=@0@/.git'.format(project_source_root),
3468 'rev-parse', 'HEAD']).stdout().strip()
3469 git_head_short = run_command(
3471 ['--git-dir=@0@/.git'.format(project_source_root),
3472 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3476 command : ['git', 'archive',
3477 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3479 '--prefix', 'systemd-@0@/'.format(git_head),
3483 ############################################################
3485 check_api_docs_sh = find_program('tools/check-api-docs.sh')
3488 depends : [man, libsystemd, libudev],
3489 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3491 ############################################################
3492 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3495 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3497 'split /usr: @0@'.format(split_usr),
3498 'split bin-sbin: @0@'.format(split_bin),
3499 'prefix directory: @0@'.format(prefixdir),
3500 'rootprefix directory: @0@'.format(rootprefixdir),
3501 'sysconf directory: @0@'.format(sysconfdir),
3502 'include directory: @0@'.format(includedir),
3503 'lib directory: @0@'.format(libdir),
3504 'rootlib directory: @0@'.format(rootlibdir),
3505 'SysV init scripts: @0@'.format(sysvinit_path),
3506 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3507 'PAM modules directory: @0@'.format(pamlibdir),
3508 'PAM configuration directory: @0@'.format(pamconfdir),
3509 'RPM macros directory: @0@'.format(rpmmacrosdir),
3510 'modprobe.d directory: @0@'.format(modprobedir),
3511 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3512 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3513 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3514 'bash completions directory: @0@'.format(bashcompletiondir),
3515 'zsh completions directory: @0@'.format(zshcompletiondir),
3516 'extra start script: @0@'.format(get_option('rc-local')),
3517 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3518 get_option('debug-tty')),
3519 'TTY GID: @0@'.format(tty_gid),
3520 'users GID: @0@'.format(substs.get('USERS_GID')),
3521 'maximum system UID: @0@'.format(system_uid_max),
3522 'maximum system GID: @0@'.format(system_gid_max),
3523 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3524 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3525 'minimum container UID base: @0@'.format(container_uid_base_min),
3526 'maximum container UID base: @0@'.format(container_uid_base_max),
3527 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3528 'render group access mode: @0@'.format(get_option('group-render-mode')),
3529 'certificate root directory: @0@'.format(get_option('certificate-root')),
3530 'support URL: @0@'.format(support_url),
3531 'nobody user name: @0@'.format(nobody_user),
3532 'nobody group name: @0@'.format(nobody_group),
3533 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3534 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3536 'default DNSSEC mode: @0@'.format(default_dnssec),
3537 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3538 'default mDNS mode: @0@'.format(default_mdns),
3539 'default LLMNR mode: @0@'.format(default_llmnr),
3540 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3541 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3542 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3543 'default locale: @0@'.format(default_locale),
3544 'default user $PATH: @0@'.format(default_user_path_display),
3545 'systemd service watchdog: @0@'.format(watchdog_opt)]
3547 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3548 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3550 'default DNS servers: @0@'.format(alt_dns_servers),
3551 'default NTP servers: @0@'.format(alt_ntp_servers)]
3553 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3554 '@@0@'.format(time_epoch)).stdout().strip()
3556 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3559 'static libsystemd: @0@'.format(static_libsystemd),
3560 'static libudev: @0@'.format(static_libudev)]
3563 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3564 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3565 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3567 if conf.get('ENABLE_EFI') == 1
3568 status += 'efi arch: @0@'.format(efi_arch)
3572 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3573 'EFI CC @0@'.format(' '.join(efi_cc)),
3574 'EFI lds: @0@'.format(efi_lds),
3575 'EFI crt0: @0@'.format(efi_crt0),
3576 'EFI include directory: @0@'.format(efi_incdir)]
3638 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3639 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3643 ['legacy pkla', install_polkit_pkla],
3645 ['gnu-efi', have_gnu_efi],
3658 ['man pages', want_man],
3659 ['html pages', want_html],
3660 ['man page indices', want_man and have_lxml],
3665 ['adm group', get_option('adm-group')],
3666 ['wheel group', get_option('wheel-group')],
3669 ['debug mmap cache'],
3671 ['valgrind', conf.get('VALGRIND') == 1],
3672 ['trace logging', conf.get('LOG_TRACE') == 1],
3673 ['install tests', install_tests],
3674 ['link-udev-shared', get_option('link-udev-shared')],
3675 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3676 ['link-networkd-shared', get_option('link-networkd-shared')],
3677 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3678 ['kernel-install', get_option('kernel-install')],
3679 ['systemd-analyze', get_option('analyze')],
3682 if tuple.length() >= 2
3685 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3686 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3687 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3698 'enabled features: @0@'.format(', '.join(found)),
3700 'disabled features: @0@'.format(', '.join(missing)),
3702 message('\n '.join(status))
3704 if rootprefixdir != rootprefix_default
3706 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3707 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3708 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))