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 relative_source_path = run_command('realpath',
36 '--relative-to=@0@'.format(meson.current_build_dir()),
37 project_source_root).stdout().strip()
38 conf.set_quoted('RELATIVE_SOURCE_PATH', relative_source_path)
40 want_ossfuzz = get_option('oss-fuzz')
41 want_libfuzzer = get_option('llvm-fuzz')
42 if want_ossfuzz + want_libfuzzer > 1
43 error('only one of oss-fuzz or llvm-fuzz can be specified')
46 skip_deps = want_ossfuzz or want_libfuzzer
47 fuzzer_build = want_ossfuzz or want_libfuzzer
49 #####################################################################
51 # Try to install the git pre-commit hook
52 add_git_hook_sh = find_program('tools/add-git-hook.sh', required : false)
53 if add_git_hook_sh.found()
54 git_hook = run_command(add_git_hook_sh)
55 if git_hook.returncode() == 0
56 message(git_hook.stdout().strip())
60 #####################################################################
62 if get_option('split-usr') == 'auto'
63 split_usr = run_command('test', '-L', '/bin').returncode() != 0
65 split_usr = get_option('split-usr') == 'true'
67 conf.set10('HAVE_SPLIT_USR', split_usr,
68 description : '/usr/bin and /bin directories are separate')
70 if get_option('split-bin') == 'auto'
71 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
73 split_bin = get_option('split-bin') == 'true'
75 conf.set10('HAVE_SPLIT_BIN', split_bin,
76 description : 'bin and sbin directories are separate')
78 rootprefixdir = get_option('rootprefix')
79 # Unusual rootprefixdir values are used by some distros
80 # (see https://github.com/systemd/systemd/pull/7461).
81 rootprefix_default = split_usr ? '/' : '/usr'
82 if rootprefixdir == ''
83 rootprefixdir = rootprefix_default
85 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
87 sysvinit_path = get_option('sysvinit-path')
88 sysvrcnd_path = get_option('sysvrcnd-path')
89 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
90 description : 'SysV init scripts and rcN.d links are supported')
92 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
93 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
94 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
96 # join_paths ignores the preceding arguments if an absolute component is
97 # encountered, so this should canonicalize various paths when they are
98 # absolute or relative.
99 prefixdir = get_option('prefix')
100 if not prefixdir.startswith('/')
101 error('Prefix is not absolute: "@0@"'.format(prefixdir))
103 bindir = join_paths(prefixdir, get_option('bindir'))
104 libdir = join_paths(prefixdir, get_option('libdir'))
105 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
106 includedir = join_paths(prefixdir, get_option('includedir'))
107 datadir = join_paths(prefixdir, get_option('datadir'))
108 localstatedir = join_paths('/', get_option('localstatedir'))
110 rootbindir = join_paths(rootprefixdir, 'bin')
111 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
112 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
114 rootlibdir = get_option('rootlibdir')
116 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
119 # Dirs of external packages
120 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
121 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
122 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
123 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
124 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
125 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
126 rpmmacrosdir = get_option('rpmmacrosdir')
127 if rpmmacrosdir != 'no'
128 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
130 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
133 pkgdatadir = join_paths(datadir, 'systemd')
134 environmentdir = join_paths(prefixdir, 'lib/environment.d')
135 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
136 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
137 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
138 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
139 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
140 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
141 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
142 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
143 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
144 pkgincludedir = join_paths(includedir, 'systemd')
145 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
146 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
147 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
148 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
149 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
150 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
151 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
152 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
153 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
154 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
155 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
156 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
157 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
158 factorydir = join_paths(datadir, 'factory')
159 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
160 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
161 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
162 catalogstatedir = join_paths(systemdstatedir, 'catalog')
163 randomseeddir = join_paths(localstatedir, 'lib/systemd')
164 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
165 ntpservicelistdir = join_paths(rootprefixdir, 'lib/systemd/ntp-units.d')
167 docdir = get_option('docdir')
169 docdir = join_paths(datadir, 'doc/systemd')
172 dbuspolicydir = get_option('dbuspolicydir')
173 if dbuspolicydir == ''
174 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
177 dbussessionservicedir = get_option('dbussessionservicedir')
178 if dbussessionservicedir == ''
179 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
182 dbussystemservicedir = get_option('dbussystemservicedir')
183 if dbussystemservicedir == ''
184 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
187 pamlibdir = get_option('pamlibdir')
189 pamlibdir = join_paths(rootlibdir, 'security')
192 pamconfdir = get_option('pamconfdir')
194 pamconfdir = join_paths(sysconfdir, 'pam.d')
197 memory_accounting_default = get_option('memory-accounting-default')
198 status_unit_format_default = get_option('status-unit-format-default')
200 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
201 conf.set_quoted('SYSTEM_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'system'))
202 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
203 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
204 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
205 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
207 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
209 conf.set_quoted('USER_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'user'))
210 conf.set_quoted('USER_DATA_UNIT_DIR', userunitdir)
211 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
212 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
213 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
214 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
215 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
216 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
217 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
218 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
219 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
220 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
221 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
222 conf.set_quoted('ROOTPREFIX', rootprefixdir)
223 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
224 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
225 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
226 conf.set_quoted('SYSTEM_GENERATOR_DIR', systemgeneratordir)
227 conf.set_quoted('USER_GENERATOR_DIR', usergeneratordir)
228 conf.set_quoted('SYSTEM_ENV_GENERATOR_DIR', systemenvgeneratordir)
229 conf.set_quoted('USER_ENV_GENERATOR_DIR', userenvgeneratordir)
230 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
231 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
232 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
233 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
234 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
235 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
236 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
237 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
238 conf.set_quoted('LIBDIR', libdir)
239 conf.set_quoted('ROOTLIBDIR', rootlibdir)
240 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
241 conf.set_quoted('BOOTLIBDIR', bootlibdir)
242 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
243 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
244 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
245 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
246 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
247 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
248 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
249 conf.set_quoted('SYSTEMD_HOMEWORK_PATH', join_paths(rootlibexecdir, 'systemd-homework'))
250 conf.set_quoted('SYSTEMD_USERWORK_PATH', join_paths(rootlibexecdir, 'systemd-userwork'))
251 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
252 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
253 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
255 substs.set('prefix', prefixdir)
256 substs.set('rootprefix', rootprefixdir)
257 substs.set('rootprefix_noslash', rootprefixdir_noslash)
258 substs.set('exec_prefix', prefixdir)
259 substs.set('libdir', libdir)
260 substs.set('rootlibdir', rootlibdir)
261 substs.set('includedir', includedir)
262 substs.set('sysconfdir', sysconfdir)
263 substs.set('bindir', bindir)
264 substs.set('rootbindir', rootbindir)
265 substs.set('rootlibexecdir', rootlibexecdir)
266 substs.set('systemunitdir', systemunitdir)
267 substs.set('userunitdir', userunitdir)
268 substs.set('systempresetdir', systempresetdir)
269 substs.set('userpresetdir', userpresetdir)
270 substs.set('udevhwdbdir', udevhwdbdir)
271 substs.set('udevrulesdir', udevrulesdir)
272 substs.set('udevlibexecdir', udevlibexecdir)
273 substs.set('environmentdir', environmentdir)
274 substs.set('catalogdir', catalogdir)
275 substs.set('tmpfilesdir', tmpfilesdir)
276 substs.set('sysusersdir', sysusersdir)
277 substs.set('sysctldir', sysctldir)
278 substs.set('binfmtdir', binfmtdir)
279 substs.set('modulesloaddir', modulesloaddir)
280 substs.set('modprobedir', modprobedir)
281 substs.set('systemgeneratordir', systemgeneratordir)
282 substs.set('usergeneratordir', usergeneratordir)
283 substs.set('systemenvgeneratordir', systemenvgeneratordir)
284 substs.set('userenvgeneratordir', userenvgeneratordir)
285 substs.set('systemshutdowndir', systemshutdowndir)
286 substs.set('systemsleepdir', systemsleepdir)
287 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
288 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
289 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
290 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
291 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
292 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
293 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
294 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
295 substs.set('BUILD_ROOT', meson.current_build_dir())
297 #####################################################################
299 cc = meson.get_compiler('c')
300 pkgconfig = import('pkgconfig')
301 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
302 meson_build_sh = find_program('tools/meson-build.sh')
304 want_tests = get_option('tests')
305 slow_tests = want_tests != 'false' and get_option('slow-tests')
306 install_tests = get_option('install-tests')
308 if add_languages('cpp', required : fuzzer_build)
309 # Used only for tests
310 cxx = meson.get_compiler('cpp')
311 cxx_cmd = ' '.join(cxx.cmd_array())
317 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
318 if fuzzing_engine.found()
319 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
320 elif cc.has_argument('-fsanitize=fuzzer-no-link')
321 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
323 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
326 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
329 # Those generate many false positives, and we do not want to change the code to
331 basic_disabled_warnings = [
332 '-Wno-unused-parameter',
333 '-Wno-missing-field-initializers',
334 '-Wno-unused-result',
335 '-Wno-format-signedness',
337 if get_option('b_ndebug') == 'true'
338 # With asserts disabled with get a bunch of warnings about variables which
339 # are used only in the asserts. This is not useful at all, so let's just silence
341 basic_disabled_warnings += [
342 '-Wno-unused-variable',
343 '-Wno-unused-but-set-variable',
347 possible_cc_flags = [
350 '-Wmissing-include-dirs',
351 '-Wold-style-definition',
355 '-Wsuggest-attribute=noreturn',
356 '-Werror=missing-prototypes',
357 '-Werror=implicit-function-declaration',
358 '-Werror=missing-declarations',
359 '-Werror=return-type',
360 '-Werror=incompatible-pointer-types',
362 '-Wstrict-prototypes',
364 '-Wmissing-noreturn',
365 '-Wimplicit-fallthrough=5',
368 '-Wstrict-aliasing=2',
371 '-Werror=shift-count-overflow',
372 '-Werror=shift-overflow=2',
376 # negative arguments are correctly detected starting with meson 0.46.
377 '-Wno-error=#warnings', # clang
378 '-Wno-string-plus-int', # clang
380 # work-around for gcc 7.1 turning this on on its own.
381 '-Wno-error=nonnull',
383 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
384 # optimizations enabled, producing essentially false positives.
385 '-Wno-maybe-uninitialized',
389 '-fdiagnostics-show-option',
390 '-fno-strict-aliasing',
391 '-fvisibility=hidden',
393 '-fstack-protector-strong',
394 '--param=ssp-buffer-size=4',
397 # --as-needed and --no-undefined are provided by meson by default,
398 # run mesonconf to see what is enabled
399 possible_link_flags = [
405 if cc.get_id() == 'clang'
406 possible_cc_flags += [
407 '-Wno-typedef-redefinition',
408 '-Wno-gnu-variable-sized-type-not-at-end',
412 if get_option('buildtype') != 'debug'
413 possible_cc_flags += [
414 '-ffunction-sections',
418 possible_link_flags += '-Wl,--gc-sections'
421 add_project_arguments(cc.get_supported_arguments(basic_disabled_warnings), language : 'c')
422 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
423 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
427 #include <inttypes.h>
428 typedef uint64_t usec_t;
429 usec_t now(clockid_t clock);
434 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
435 add_project_arguments('-Werror=shadow', language : 'c')
439 add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp')
442 cpp = ' '.join(cc.cmd_array()) + ' -E'
444 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
446 #####################################################################
447 # compilation result tests
449 conf.set('_GNU_SOURCE', true)
450 conf.set('__SANE_USERSPACE_TYPES__', true)
451 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
453 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
454 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
455 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
456 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
460 #include <sys/stat.h>
463 foreach decl : ['char16_t',
468 # We get -1 if the size cannot be determined
469 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
471 if decl == 'struct statx'
473 want_linux_stat_h = false
475 have = cc.sizeof(decl,
476 prefix : decl_headers + '#include <linux/stat.h>',
477 args : '-D_GNU_SOURCE') > 0
478 want_linux_stat_h = have
482 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
485 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
487 foreach ident : ['secure_getenv', '__secure_getenv']
488 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
492 ['memfd_create', '''#include <sys/mman.h>'''],
493 ['gettid', '''#include <sys/types.h>
494 #include <unistd.h>'''],
495 ['pivot_root', '''#include <stdlib.h>
496 #include <unistd.h>'''], # no known header declares pivot_root
497 ['name_to_handle_at', '''#include <sys/types.h>
498 #include <sys/stat.h>
499 #include <fcntl.h>'''],
500 ['setns', '''#include <sched.h>'''],
501 ['renameat2', '''#include <stdio.h>
502 #include <fcntl.h>'''],
503 ['kcmp', '''#include <linux/kcmp.h>'''],
504 ['keyctl', '''#include <sys/types.h>
505 #include <keyutils.h>'''],
506 ['copy_file_range', '''#include <sys/syscall.h>
507 #include <unistd.h>'''],
508 ['bpf', '''#include <sys/syscall.h>
509 #include <unistd.h>'''],
510 ['statx', '''#include <sys/types.h>
511 #include <sys/stat.h>
512 #include <unistd.h>'''],
513 ['explicit_bzero' , '''#include <string.h>'''],
514 ['reallocarray', '''#include <malloc.h>'''],
515 ['set_mempolicy', '''#include <stdlib.h>
516 #include <unistd.h>'''],
517 ['get_mempolicy', '''#include <stdlib.h>
518 #include <unistd.h>'''],
519 ['pidfd_send_signal', '''#include <stdlib.h>
522 #include <sys/wait.h>'''],
523 ['pidfd_open', '''#include <stdlib.h>
526 #include <sys/wait.h>'''],
527 ['rt_sigqueueinfo', '''#include <stdlib.h>
530 #include <sys/wait.h>'''],
533 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
534 conf.set10('HAVE_' + ident[0].to_upper(), have)
537 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
538 conf.set10('USE_SYS_RANDOM_H', true)
539 conf.set10('HAVE_GETRANDOM', true)
541 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
542 conf.set10('USE_SYS_RANDOM_H', false)
543 conf.set10('HAVE_GETRANDOM', have)
546 #####################################################################
548 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
550 get_option('version-tag'),
551 meson.project_version()]
554 input : 'src/version/version.h.in',
555 output : 'version.h',
558 versiondep = declare_dependency(sources: version_h)
560 sed = find_program('sed')
561 awk = find_program('awk')
562 m4 = find_program('m4')
563 stat = find_program('stat')
564 git = find_program('git', required : false)
565 env = find_program('env')
566 perl = find_program('perl', required : false)
568 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
569 mkdir_p = 'mkdir -p $DESTDIR/@0@'
570 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
571 splash_bmp = files('test/splash.bmp')
573 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
574 # /usr/sbin, /sbin, and fall back to the default from middle column.
575 progs = [['quotaon', '/usr/sbin/quotaon' ],
576 ['quotacheck', '/usr/sbin/quotacheck' ],
577 ['kmod', '/usr/bin/kmod' ],
578 ['kexec', '/usr/sbin/kexec' ],
579 ['sulogin', '/usr/sbin/sulogin' ],
580 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
581 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
582 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
583 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
584 ['nologin', '/usr/sbin/nologin', ],
587 path = get_option(prog[0] + '-path')
589 message('Using @1@ for @0@'.format(prog[0], path))
591 exe = find_program(prog[0],
592 '/usr/sbin/' + prog[0],
595 path = exe.found() ? exe.path() : prog[1]
597 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
598 conf.set_quoted(name, path)
599 substs.set(name, path)
602 conf.set_quoted('TELINIT', get_option('telinit-path'))
604 if run_command('ln', '--relative', '--help').returncode() != 0
605 error('ln does not support --relative (added in coreutils 8.16)')
608 ############################################################
610 gperf = find_program('gperf')
612 gperf_test_format = '''
614 const char * in_word_set(const char *, @0@);
617 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
618 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
619 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
620 if cc.compiles(gperf_test)
621 gperf_len_type = 'size_t'
623 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
624 if cc.compiles(gperf_test)
625 gperf_len_type = 'unsigned'
627 error('unable to determine gperf len type')
630 message('gperf len type is @0@'.format(gperf_len_type))
631 conf.set('GPERF_LEN_TYPE', gperf_len_type,
632 description : 'The type of gperf "len" parameter')
634 ############################################################
636 if not cc.has_header('sys/capability.h')
637 error('POSIX caps headers not found')
639 foreach header : ['crypt.h',
641 'linux/vm_sockets.h',
643 'valgrind/memcheck.h',
644 'valgrind/valgrind.h',
647 conf.set10('HAVE_' + header.underscorify().to_upper(),
648 cc.has_header(header))
651 ############################################################
653 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
654 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
655 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
657 default_hierarchy = get_option('default-hierarchy')
658 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
659 description : 'default cgroup hierarchy as string')
660 if default_hierarchy == 'legacy'
661 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
662 elif default_hierarchy == 'hybrid'
663 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
665 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
668 default_net_naming_scheme = get_option('default-net-naming-scheme')
669 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
671 time_epoch = get_option('time-epoch')
674 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
676 conf.set('TIME_EPOCH', time_epoch)
678 system_uid_max = get_option('system-uid-max')
679 if system_uid_max == -1
680 system_uid_max = run_command(
682 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
683 '/etc/login.defs').stdout().strip()
684 if system_uid_max == ''
687 system_uid_max = system_uid_max.to_int()
690 conf.set('SYSTEM_UID_MAX', system_uid_max)
691 substs.set('systemuidmax', system_uid_max)
693 system_gid_max = get_option('system-gid-max')
694 if system_gid_max == -1
695 system_gid_max = run_command(
697 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
698 '/etc/login.defs').stdout().strip()
699 if system_gid_max == ''
702 system_gid_max = system_gid_max.to_int()
705 conf.set('SYSTEM_GID_MAX', system_gid_max)
706 substs.set('systemgidmax', system_gid_max)
708 dynamic_uid_min = get_option('dynamic-uid-min')
709 dynamic_uid_max = get_option('dynamic-uid-max')
710 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
711 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
712 substs.set('dynamicuidmin', dynamic_uid_min)
713 substs.set('dynamicuidmax', dynamic_uid_max)
715 container_uid_base_min = get_option('container-uid-base-min')
716 container_uid_base_max = get_option('container-uid-base-max')
717 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
718 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
719 substs.set('containeruidbasemin', container_uid_base_min)
720 substs.set('containeruidbasemax', container_uid_base_max)
722 nobody_user = get_option('nobody-user')
723 nobody_group = get_option('nobody-group')
725 if not meson.is_cross_build()
726 getent_result = run_command('getent', 'passwd', '65534')
727 if getent_result.returncode() == 0
728 name = getent_result.stdout().split(':')[0]
729 if name != nobody_user
731 '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) +
732 'Your build will result in an user table setup that is incompatible with the local system.')
735 id_result = run_command('id', '-u', nobody_user)
736 if id_result.returncode() == 0
737 id = id_result.stdout().to_int()
740 '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) +
741 'Your build will result in an user table setup that is incompatible with the local system.')
745 getent_result = run_command('getent', 'group', '65534')
746 if getent_result.returncode() == 0
747 name = getent_result.stdout().split(':')[0]
748 if name != nobody_group
750 '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) +
751 'Your build will result in an group table setup that is incompatible with the local system.')
754 id_result = run_command('id', '-g', nobody_group)
755 if id_result.returncode() == 0
756 id = id_result.stdout().to_int()
759 '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) +
760 'Your build will result in an group table setup that is incompatible with the local system.')
764 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
766 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
767 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
770 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
771 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
772 substs.set('NOBODY_USER_NAME', nobody_user)
773 substs.set('NOBODY_GROUP_NAME', nobody_group)
775 tty_gid = get_option('tty-gid')
776 conf.set('TTY_GID', tty_gid)
777 substs.set('TTY_GID', tty_gid)
779 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
780 users_gid = get_option('users-gid')
781 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
783 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
784 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
786 dev_kvm_mode = get_option('dev-kvm-mode')
787 substs.set('DEV_KVM_MODE', dev_kvm_mode)
788 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
789 group_render_mode = get_option('group-render-mode')
790 substs.set('GROUP_RENDER_MODE', group_render_mode)
791 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
793 kill_user_processes = get_option('default-kill-user-processes')
794 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
795 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
796 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
798 dns_servers = get_option('dns-servers')
799 conf.set_quoted('DNS_SERVERS', dns_servers)
800 substs.set('DNS_SERVERS', dns_servers)
802 ntp_servers = get_option('ntp-servers')
803 conf.set_quoted('NTP_SERVERS', ntp_servers)
804 substs.set('NTP_SERVERS', ntp_servers)
806 default_locale = get_option('default-locale')
807 if default_locale == ''
808 if not meson.is_cross_build()
809 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
810 default_locale = run_command(choose_default_locale_sh).stdout().strip()
812 default_locale = 'C.UTF-8'
815 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
817 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
819 service_watchdog = get_option('service-watchdog')
820 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
821 substs.set('SERVICE_WATCHDOG', watchdog_value)
823 substs.set('SUSHELL', get_option('debug-shell'))
824 substs.set('DEBUGTTY', get_option('debug-tty'))
825 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
827 enable_debug_hashmap = false
828 enable_debug_mmap_cache = false
829 enable_debug_siphash = false
830 foreach name : get_option('debug-extra')
832 enable_debug_hashmap = true
833 elif name == 'mmap-cache'
834 enable_debug_mmap_cache = true
835 elif name == 'siphash'
836 enable_debug_siphash = true
838 message('unknown debug option "@0@", ignoring'.format(name))
841 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
842 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
843 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
845 conf.set10('VALGRIND', get_option('valgrind'))
846 conf.set10('LOG_TRACE', get_option('log-trace'))
848 default_user_path = get_option('user-path')
849 if default_user_path != ''
850 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
851 default_user_path_display = default_user_path
853 # meson 0.49 fails when ?: is used in .format()
854 default_user_path_display = '(same as system services)'
858 #####################################################################
860 threads = dependency('threads')
861 librt = cc.find_library('rt')
862 libm = cc.find_library('m')
863 libdl = cc.find_library('dl')
864 libcrypt = cc.find_library('crypt')
866 libcap = dependency('libcap', required : false)
867 if not libcap.found()
868 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
869 libcap = cc.find_library('cap')
872 libmount = dependency('mount',
873 version : fuzzer_build ? '>= 0' : '>= 2.30')
875 want_libfdisk = get_option('fdisk')
876 if want_libfdisk != 'false' and not skip_deps
877 libfdisk = dependency('fdisk',
878 required : want_libfdisk == 'true')
879 have = libfdisk.found()
884 conf.set10('HAVE_LIBFDISK', have)
886 want_pwquality = get_option('pwquality')
887 if want_pwquality != 'false' and not skip_deps
888 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
889 have = libpwquality.found()
894 conf.set10('HAVE_PWQUALITY', have)
896 want_seccomp = get_option('seccomp')
897 if want_seccomp != 'false' and not skip_deps
898 libseccomp = dependency('libseccomp',
899 version : '>= 2.3.1',
900 required : want_seccomp == 'true')
901 have = libseccomp.found()
906 conf.set10('HAVE_SECCOMP', have)
908 want_selinux = get_option('selinux')
909 if want_selinux != 'false' and not skip_deps
910 libselinux = dependency('libselinux',
911 version : '>= 2.1.9',
912 required : want_selinux == 'true')
913 have = libselinux.found()
918 conf.set10('HAVE_SELINUX', have)
920 want_apparmor = get_option('apparmor')
921 if want_apparmor != 'false' and not skip_deps
922 libapparmor = dependency('libapparmor',
923 required : want_apparmor == 'true')
924 have = libapparmor.found()
929 conf.set10('HAVE_APPARMOR', have)
931 smack_run_label = get_option('smack-run-label')
932 if smack_run_label != ''
933 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
936 want_polkit = get_option('polkit')
937 install_polkit = false
938 install_polkit_pkla = false
939 if want_polkit != 'false' and not skip_deps
940 install_polkit = true
942 libpolkit = dependency('polkit-gobject-1',
944 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
945 message('Old polkit detected, will install pkla files')
946 install_polkit_pkla = true
949 conf.set10('ENABLE_POLKIT', install_polkit)
951 want_acl = get_option('acl')
952 if want_acl != 'false' and not skip_deps
953 libacl = cc.find_library('acl', required : want_acl == 'true')
954 have = libacl.found()
959 conf.set10('HAVE_ACL', have)
961 want_audit = get_option('audit')
962 if want_audit != 'false' and not skip_deps
963 libaudit = dependency('audit', required : want_audit == 'true')
964 have = libaudit.found()
969 conf.set10('HAVE_AUDIT', have)
971 want_blkid = get_option('blkid')
972 if want_blkid != 'false' and not skip_deps
973 libblkid = dependency('blkid', required : want_blkid == 'true')
974 have = libblkid.found()
979 conf.set10('HAVE_BLKID', have)
981 want_kmod = get_option('kmod')
982 if want_kmod != 'false' and not skip_deps
983 libkmod = dependency('libkmod',
985 required : want_kmod == 'true')
986 have = libkmod.found()
991 conf.set10('HAVE_KMOD', have)
993 want_pam = get_option('pam')
994 if want_pam != 'false' and not skip_deps
995 libpam = cc.find_library('pam', required : want_pam == 'true')
996 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
997 have = libpam.found() and libpam_misc.found()
1003 conf.set10('HAVE_PAM', have)
1005 want_microhttpd = get_option('microhttpd')
1006 if want_microhttpd != 'false' and not skip_deps
1007 libmicrohttpd = dependency('libmicrohttpd',
1008 version : '>= 0.9.33',
1009 required : want_microhttpd == 'true')
1010 have = libmicrohttpd.found()
1015 conf.set10('HAVE_MICROHTTPD', have)
1017 want_libcryptsetup = get_option('libcryptsetup')
1018 if want_libcryptsetup != 'false' and not skip_deps
1019 libcryptsetup = dependency('libcryptsetup',
1020 version : '>= 2.0.1',
1021 required : want_libcryptsetup == 'true')
1022 have = libcryptsetup.found()
1024 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1025 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
1030 conf.set10('HAVE_LIBCRYPTSETUP', have)
1032 want_libcurl = get_option('libcurl')
1033 if want_libcurl != 'false' and not skip_deps
1034 libcurl = dependency('libcurl',
1035 version : '>= 7.32.0',
1036 required : want_libcurl == 'true')
1037 have = libcurl.found()
1042 conf.set10('HAVE_LIBCURL', have)
1044 want_libidn = get_option('libidn')
1045 want_libidn2 = get_option('libidn2')
1046 if want_libidn == 'true' and want_libidn2 == 'true'
1047 error('libidn and libidn2 cannot be requested simultaneously')
1050 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1051 libidn = dependency('libidn2',
1052 required : want_libidn2 == 'true')
1053 have = libidn.found()
1058 conf.set10('HAVE_LIBIDN2', have)
1059 if not have and want_libidn != 'false' and not skip_deps
1060 # libidn is used for both libidn and libidn2 objects
1061 libidn = dependency('libidn',
1062 required : want_libidn == 'true')
1063 have = libidn.found()
1067 conf.set10('HAVE_LIBIDN', have)
1069 want_libiptc = get_option('libiptc')
1070 if want_libiptc != 'false' and not skip_deps
1071 libiptc = dependency('libiptc',
1072 required : want_libiptc == 'true')
1073 have = libiptc.found()
1078 conf.set10('HAVE_LIBIPTC', have)
1080 want_qrencode = get_option('qrencode')
1081 if want_qrencode != 'false' and not skip_deps
1082 libqrencode = dependency('libqrencode',
1083 required : want_qrencode == 'true')
1084 have = libqrencode.found()
1089 conf.set10('HAVE_QRENCODE', have)
1091 want_gcrypt = get_option('gcrypt')
1092 if want_gcrypt != 'false' and not skip_deps
1093 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1094 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1095 have = libgcrypt.found() and libgpg_error.found()
1100 # link to neither of the libs if one is not found
1104 conf.set10('HAVE_GCRYPT', have)
1106 want_gnutls = get_option('gnutls')
1107 if want_gnutls != 'false' and not skip_deps
1108 libgnutls = dependency('gnutls',
1109 version : '>= 3.1.4',
1110 required : want_gnutls == 'true')
1111 have = libgnutls.found()
1116 conf.set10('HAVE_GNUTLS', have)
1118 want_openssl = get_option('openssl')
1119 if want_openssl != 'false' and not skip_deps
1120 libopenssl = dependency('openssl',
1121 version : '>= 1.1.0',
1122 required : want_openssl == 'true')
1123 have = libopenssl.found()
1128 conf.set10('HAVE_OPENSSL', have)
1130 want_p11kit = get_option('p11kit')
1131 if want_p11kit != 'false' and not skip_deps
1132 libp11kit = dependency('p11-kit-1',
1133 version : '>= 0.23.3',
1134 required : want_p11kit == 'true')
1135 have = libp11kit.found()
1140 conf.set10('HAVE_P11KIT', have)
1142 want_elfutils = get_option('elfutils')
1143 if want_elfutils != 'false' and not skip_deps
1144 libdw = dependency('libdw',
1145 required : want_elfutils == 'true')
1146 have = libdw.found()
1151 conf.set10('HAVE_ELFUTILS', have)
1153 want_zlib = get_option('zlib')
1154 if want_zlib != 'false' and not skip_deps
1155 libz = dependency('zlib',
1156 required : want_zlib == 'true')
1162 conf.set10('HAVE_ZLIB', have)
1164 want_bzip2 = get_option('bzip2')
1165 if want_bzip2 != 'false' and not skip_deps
1166 libbzip2 = cc.find_library('bz2',
1167 required : want_bzip2 == 'true')
1168 have = libbzip2.found()
1173 conf.set10('HAVE_BZIP2', have)
1175 want_xz = get_option('xz')
1176 if want_xz != 'false' and not skip_deps
1177 libxz = dependency('liblzma',
1178 required : want_xz == 'true')
1179 have = libxz.found()
1184 conf.set10('HAVE_XZ', have)
1186 want_lz4 = get_option('lz4')
1187 if want_lz4 != 'false' and not skip_deps
1188 liblz4 = dependency('liblz4',
1189 version : '>= 1.3.0',
1190 required : want_lz4 == 'true')
1191 have = liblz4.found()
1196 conf.set10('HAVE_LZ4', have)
1198 want_xkbcommon = get_option('xkbcommon')
1199 if want_xkbcommon != 'false' and not skip_deps
1200 libxkbcommon = dependency('xkbcommon',
1201 version : '>= 0.3.0',
1202 required : want_xkbcommon == 'true')
1203 have = libxkbcommon.found()
1208 conf.set10('HAVE_XKBCOMMON', have)
1210 want_pcre2 = get_option('pcre2')
1211 if want_pcre2 != 'false'
1212 libpcre2 = dependency('libpcre2-8',
1213 required : want_pcre2 == 'true')
1214 have = libpcre2.found()
1219 conf.set10('HAVE_PCRE2', have)
1221 want_glib = get_option('glib')
1222 if want_glib != 'false' and not skip_deps
1223 libglib = dependency('glib-2.0',
1224 version : '>= 2.22.0',
1225 required : want_glib == 'true')
1226 libgobject = dependency('gobject-2.0',
1227 version : '>= 2.22.0',
1228 required : want_glib == 'true')
1229 libgio = dependency('gio-2.0',
1230 required : want_glib == 'true')
1231 have = libglib.found() and libgobject.found() and libgio.found()
1238 conf.set10('HAVE_GLIB', have)
1240 want_dbus = get_option('dbus')
1241 if want_dbus != 'false' and not skip_deps
1242 libdbus = dependency('dbus-1',
1243 version : '>= 1.3.2',
1244 required : want_dbus == 'true')
1245 have = libdbus.found()
1250 conf.set10('HAVE_DBUS', have)
1252 default_dnssec = get_option('default-dnssec')
1254 default_dnssec = 'no'
1256 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1257 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1258 default_dnssec = 'no'
1260 conf.set('DEFAULT_DNSSEC_MODE',
1261 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1262 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1264 dns_over_tls = get_option('dns-over-tls')
1265 if dns_over_tls != 'false'
1266 if dns_over_tls == 'openssl'
1269 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1270 if dns_over_tls == 'gnutls' and not have_gnutls
1271 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1274 if dns_over_tls == 'gnutls' or have_gnutls
1275 have_openssl = false
1277 have_openssl = conf.get('HAVE_OPENSSL') == 1
1278 if dns_over_tls != 'auto' and not have_openssl
1279 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1280 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1283 have = have_gnutls or have_openssl
1287 have_openssl = false
1289 conf.set10('ENABLE_DNS_OVER_TLS', have)
1290 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1291 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1293 default_dns_over_tls = get_option('default-dns-over-tls')
1295 default_dns_over_tls = 'no'
1297 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1298 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.')
1299 default_dns_over_tls = 'no'
1301 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1302 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1303 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1305 want_repart = get_option('repart')
1306 if want_repart != 'false'
1307 have = (conf.get('HAVE_OPENSSL') == 1 and
1308 conf.get('HAVE_LIBFDISK') == 1)
1309 if want_repart == 'true' and not have
1310 error('repart support was requested, but dependencies are not available')
1315 conf.set10('ENABLE_REPART', have)
1317 want_importd = get_option('importd')
1318 if want_importd != 'false'
1319 have = (conf.get('HAVE_LIBCURL') == 1 and
1320 conf.get('HAVE_ZLIB') == 1 and
1321 conf.get('HAVE_XZ') == 1 and
1322 conf.get('HAVE_GCRYPT') == 1)
1323 if want_importd == 'true' and not have
1324 error('importd support was requested, but dependencies are not available')
1329 conf.set10('ENABLE_IMPORTD', have)
1331 want_homed = get_option('homed')
1332 if want_homed != 'false'
1333 have = (conf.get('HAVE_OPENSSL') == 1 and
1334 conf.get('HAVE_LIBFDISK') == 1 and
1335 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1336 if want_homed == 'true' and not have
1337 error('homed support was requested, but dependencies are not available')
1342 conf.set10('ENABLE_HOMED', have)
1344 have = have and conf.get('HAVE_PAM') == 1
1345 conf.set10('ENABLE_PAM_HOME', have)
1347 want_remote = get_option('remote')
1348 if want_remote != 'false'
1349 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1350 conf.get('HAVE_LIBCURL') == 1]
1351 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1352 # it's possible to build one without the other. Complain only if
1353 # support was explicitly requested. The auxiliary files like sysusers
1354 # config should be installed when any of the programs are built.
1355 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1356 error('remote support was requested, but dependencies are not available')
1358 have = have_deps[0] or have_deps[1]
1362 conf.set10('ENABLE_REMOTE', have)
1364 foreach term : ['utmp',
1398 have = get_option(term)
1399 name = 'ENABLE_' + term.underscorify().to_upper()
1400 conf.set10(name, have)
1403 foreach tuple : [['nss-mymachines', 'machined'],
1404 ['nss-resolve', 'resolve']]
1405 want = get_option(tuple[0])
1407 have = get_option(tuple[1])
1408 if want == 'true' and not have
1409 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1414 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1415 conf.set10(name, have)
1419 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1420 'ENABLE_NSS_MYMACHINES',
1421 'ENABLE_NSS_RESOLVE',
1422 'ENABLE_NSS_SYSTEMD']
1423 if conf.get(term) == 1
1427 conf.set10('ENABLE_NSS', enable_nss)
1429 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1434 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1436 #####################################################################
1438 if get_option('efi')
1439 efi_arch = host_machine.cpu_family()
1441 if efi_arch == 'x86'
1442 EFI_MACHINE_TYPE_NAME = 'ia32'
1443 gnu_efi_arch = 'ia32'
1444 elif efi_arch == 'x86_64'
1445 EFI_MACHINE_TYPE_NAME = 'x64'
1446 gnu_efi_arch = 'x86_64'
1447 elif efi_arch == 'arm'
1448 EFI_MACHINE_TYPE_NAME = 'arm'
1449 gnu_efi_arch = 'arm'
1450 elif efi_arch == 'aarch64'
1451 EFI_MACHINE_TYPE_NAME = 'aa64'
1452 gnu_efi_arch = 'aarch64'
1454 EFI_MACHINE_TYPE_NAME = ''
1459 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1461 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1465 conf.set10('ENABLE_EFI', have)
1467 #####################################################################
1469 config_h = configure_file(
1470 output : 'config.h',
1471 configuration : conf)
1473 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1475 includes = include_directories('src/basic',
1480 'src/journal-remote',
1484 'src/time-wait-sync',
1490 'src/libsystemd/sd-bus',
1491 'src/libsystemd/sd-device',
1492 'src/libsystemd/sd-event',
1493 'src/libsystemd/sd-hwdb',
1494 'src/libsystemd/sd-id128',
1495 'src/libsystemd/sd-netlink',
1496 'src/libsystemd/sd-network',
1497 'src/libsystemd/sd-resolve',
1498 'src/libsystemd-network',
1501 add_project_arguments('-include', 'config.h', language : 'c')
1503 generate_gperfs = find_program('tools/generate-gperfs.py')
1507 subdir('src/systemd')
1509 subdir('src/libsystemd')
1510 subdir('src/libsystemd-network')
1511 subdir('src/journal')
1514 libjournal_core = static_library(
1516 libjournal_core_sources,
1518 include_directories : includes,
1521 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1522 libsystemd = shared_library(
1525 version : libsystemd_version,
1526 include_directories : includes,
1527 link_args : ['-shared',
1528 '-Wl,--version-script=' + libsystemd_sym_path],
1529 link_with : [libbasic,
1531 link_whole : [libsystemd_static,
1533 dependencies : [threads,
1537 link_depends : libsystemd_sym,
1539 install_dir : rootlibdir)
1541 static_libsystemd = get_option('static-libsystemd')
1542 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1544 install_libsystemd_static = static_library(
1547 journal_client_sources,
1549 basic_gcrypt_sources,
1551 include_directories : includes,
1552 build_by_default : static_libsystemd != 'false',
1553 install : static_libsystemd != 'false',
1554 install_dir : rootlibdir,
1555 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1556 dependencies : [threads,
1565 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1567 #Generate autosuspend rules
1568 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1570 ############################################################
1572 # binaries that have --help and are intended for use by humans,
1573 # usually, but not always, installed in /bin.
1574 public_programs = []
1576 subdir('src/libudev')
1577 subdir('src/shared')
1579 subdir('src/shutdown')
1581 subdir('src/network')
1583 subdir('src/analyze')
1584 subdir('src/journal-remote')
1585 subdir('src/coredump')
1586 subdir('src/pstore')
1587 subdir('src/hostname')
1588 subdir('src/import')
1589 subdir('src/partition')
1590 subdir('src/kernel-install')
1591 subdir('src/locale')
1592 subdir('src/machine')
1593 subdir('src/portable')
1594 subdir('src/userdb')
1596 subdir('src/nspawn')
1597 subdir('src/resolve')
1598 subdir('src/timedate')
1599 subdir('src/timesync')
1600 subdir('src/vconsole')
1601 subdir('src/boot/efi')
1608 ############################################################
1610 # only static linking apart from libdl, to make sure that the
1611 # module is linked to all libraries that it uses.
1612 test_dlopen = executable(
1616 include_directories : includes,
1617 link_with : [libbasic],
1618 dependencies : [libdl],
1619 build_by_default : want_tests != 'false')
1621 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1622 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h'],
1623 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1624 ['resolve', 'ENABLE_NSS_RESOLVE']]
1626 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1630 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1631 version_script_arg = join_paths(project_source_root, sym)
1633 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1634 if tuple.length() > 2
1635 sources += tuple[2].split()
1638 nss = shared_library(
1643 include_directories : includes,
1644 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1645 link_args : ['-Wl,-z,nodelete',
1647 '-Wl,--version-script=' + version_script_arg],
1648 link_with : [libsystemd_static,
1651 dependencies : [threads,
1655 install_dir : rootlibdir)
1657 # We cannot use shared_module because it does not support version suffix.
1658 # Unfortunately shared_library insists on creating the symlink…
1659 meson.add_install_script('sh', '-c',
1660 'rm $DESTDIR@0@/libnss_@1@.so'
1661 .format(rootlibdir, module))
1663 if want_tests != 'false'
1664 test('dlopen-nss_' + module,
1666 # path to dlopen must include a slash
1667 args : nss.full_path())
1672 ############################################################
1674 executable('systemd',
1676 include_directories : includes,
1677 link_with : [libcore,
1679 dependencies : [versiondep,
1686 install_rpath : rootlibexecdir,
1688 install_dir : rootlibexecdir)
1690 meson.add_install_script(meson_make_symlink,
1691 join_paths(rootlibexecdir, 'systemd'),
1692 join_paths(rootsbindir, 'init'))
1694 exe = executable('systemd-analyze',
1695 systemd_analyze_sources,
1696 include_directories : includes,
1697 link_with : [libcore,
1699 dependencies : [versiondep,
1706 install_rpath : rootlibexecdir,
1708 public_programs += exe
1710 executable('systemd-journald',
1711 systemd_journald_sources,
1712 include_directories : includes,
1713 link_with : [libjournal_core,
1715 dependencies : [threads,
1719 install_rpath : rootlibexecdir,
1721 install_dir : rootlibexecdir)
1723 exe = executable('systemd-cat',
1724 systemd_cat_sources,
1725 include_directories : includes,
1726 link_with : [libjournal_core,
1728 dependencies : [threads],
1729 install_rpath : rootlibexecdir,
1731 public_programs += exe
1733 exe = executable('journalctl',
1735 include_directories : includes,
1736 link_with : [libshared],
1737 dependencies : [threads,
1742 install_rpath : rootlibexecdir,
1744 install_dir : rootbindir)
1745 public_programs += exe
1747 executable('systemd-getty-generator',
1748 'src/getty-generator/getty-generator.c',
1749 include_directories : includes,
1750 link_with : [libshared],
1751 install_rpath : rootlibexecdir,
1753 install_dir : systemgeneratordir)
1755 executable('systemd-debug-generator',
1756 'src/debug-generator/debug-generator.c',
1757 include_directories : includes,
1758 link_with : [libshared],
1759 install_rpath : rootlibexecdir,
1761 install_dir : systemgeneratordir)
1763 executable('systemd-run-generator',
1764 'src/run-generator/run-generator.c',
1765 include_directories : includes,
1766 link_with : [libshared],
1767 install_rpath : rootlibexecdir,
1769 install_dir : systemgeneratordir)
1771 executable('systemd-fstab-generator',
1772 'src/fstab-generator/fstab-generator.c',
1773 include_directories : includes,
1774 link_with : [libcore_shared,
1776 install_rpath : rootlibexecdir,
1778 install_dir : systemgeneratordir)
1780 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1781 executable('30-systemd-environment-d-generator',
1782 'src/environment-d-generator/environment-d-generator.c',
1783 include_directories : includes,
1784 link_with : [libshared],
1785 install_rpath : rootlibexecdir,
1787 install_dir : userenvgeneratordir)
1789 meson.add_install_script(meson_make_symlink,
1790 join_paths(sysconfdir, 'environment'),
1791 join_paths(environmentdir, '99-environment.conf'))
1794 if conf.get('ENABLE_HIBERNATE') == 1
1795 executable('systemd-hibernate-resume-generator',
1796 'src/hibernate-resume/hibernate-resume-generator.c',
1797 include_directories : includes,
1798 link_with : [libshared],
1799 install_rpath : rootlibexecdir,
1801 install_dir : systemgeneratordir)
1803 executable('systemd-hibernate-resume',
1804 'src/hibernate-resume/hibernate-resume.c',
1805 include_directories : includes,
1806 link_with : [libshared],
1807 install_rpath : rootlibexecdir,
1809 install_dir : rootlibexecdir)
1812 if conf.get('HAVE_BLKID') == 1
1813 executable('systemd-gpt-auto-generator',
1814 'src/gpt-auto-generator/gpt-auto-generator.c',
1815 'src/shared/blkid-util.h',
1816 include_directories : includes,
1817 link_with : [libshared],
1818 dependencies : libblkid,
1819 install_rpath : rootlibexecdir,
1821 install_dir : systemgeneratordir)
1823 exe = executable('systemd-dissect',
1824 'src/dissect/dissect.c',
1825 include_directories : includes,
1826 link_with : [libshared],
1827 install_rpath : rootlibexecdir,
1829 install_dir : rootlibexecdir)
1830 public_programs += exe
1833 if conf.get('ENABLE_RESOLVE') == 1
1834 executable('systemd-resolved',
1835 systemd_resolved_sources,
1836 include_directories : includes,
1837 link_with : [libshared,
1839 libsystemd_resolve_core],
1840 dependencies : systemd_resolved_dependencies,
1841 install_rpath : rootlibexecdir,
1843 install_dir : rootlibexecdir)
1845 exe = executable('resolvectl',
1847 include_directories : includes,
1848 link_with : [libshared,
1850 libsystemd_resolve_core],
1851 dependencies : [threads,
1855 install_rpath : rootlibexecdir,
1857 public_programs += exe
1859 meson.add_install_script(meson_make_symlink,
1860 join_paths(bindir, 'resolvectl'),
1861 join_paths(rootsbindir, 'resolvconf'))
1863 meson.add_install_script(meson_make_symlink,
1864 join_paths(bindir, 'resolvectl'),
1865 join_paths(bindir, 'systemd-resolve'))
1868 if conf.get('ENABLE_LOGIND') == 1
1869 executable('systemd-logind',
1870 systemd_logind_sources,
1871 include_directories : includes,
1872 link_with : [liblogind_core,
1874 dependencies : [threads,
1876 install_rpath : rootlibexecdir,
1878 install_dir : rootlibexecdir)
1880 exe = executable('loginctl',
1882 include_directories : includes,
1883 link_with : [libshared],
1884 dependencies : [threads,
1887 install_rpath : rootlibexecdir,
1889 install_dir : rootbindir)
1890 public_programs += exe
1892 exe = executable('systemd-inhibit',
1893 'src/login/inhibit.c',
1894 include_directories : includes,
1895 link_with : [libshared],
1896 install_rpath : rootlibexecdir,
1898 install_dir : rootbindir)
1899 public_programs += exe
1901 if conf.get('HAVE_PAM') == 1
1902 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1903 pam_systemd = shared_library(
1907 include_directories : includes,
1908 link_args : ['-shared',
1909 '-Wl,--version-script=' + version_script_arg],
1910 link_with : [libsystemd_static,
1912 dependencies : [threads,
1915 link_depends : pam_systemd_sym,
1917 install_dir : pamlibdir)
1919 if want_tests != 'false'
1920 test('dlopen-pam_systemd',
1922 # path to dlopen must include a slash
1923 args : pam_systemd.full_path())
1927 executable('systemd-user-runtime-dir',
1928 user_runtime_dir_sources,
1929 include_directories : includes,
1930 link_with : [libshared],
1931 install_rpath : rootlibexecdir,
1933 install_dir : rootlibexecdir)
1936 if conf.get('HAVE_PAM') == 1
1937 executable('systemd-user-sessions',
1938 'src/user-sessions/user-sessions.c',
1939 include_directories : includes,
1940 link_with : [libshared],
1941 install_rpath : rootlibexecdir,
1943 install_dir : rootlibexecdir)
1946 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1947 exe = executable('bootctl',
1948 'src/boot/bootctl.c',
1949 include_directories : includes,
1950 link_with : [libshared],
1951 dependencies : [libblkid],
1952 install_rpath : rootlibexecdir,
1954 public_programs += exe
1956 executable('systemd-bless-boot',
1957 'src/boot/bless-boot.c',
1958 include_directories : includes,
1959 link_with : [libshared],
1960 dependencies : [libblkid],
1961 install_rpath : rootlibexecdir,
1963 install_dir : rootlibexecdir)
1965 executable('systemd-bless-boot-generator',
1966 'src/boot/bless-boot-generator.c',
1967 include_directories : includes,
1968 link_with : [libshared],
1969 install_rpath : rootlibexecdir,
1971 install_dir : systemgeneratordir)
1974 executable('systemd-boot-check-no-failures',
1975 'src/boot/boot-check-no-failures.c',
1976 include_directories : includes,
1977 link_with : [libshared],
1978 dependencies : [libblkid],
1979 install_rpath : rootlibexecdir,
1981 install_dir : rootlibexecdir)
1983 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1984 include_directories : includes,
1985 link_with : [libshared],
1986 dependencies : [threads],
1987 install_rpath : rootlibexecdir,
1989 public_programs += exe
1992 if get_option('link-systemctl-shared')
1993 systemctl_link_with = [libshared]
1995 systemctl_link_with = [libsystemd_static,
2001 exe = executable('systemctl',
2002 'src/systemctl/systemctl.c',
2003 'src/systemctl/sysv-compat.h',
2004 'src/systemctl/sysv-compat.c',
2005 include_directories : includes,
2006 link_with : systemctl_link_with,
2007 dependencies : [threads,
2012 install_rpath : rootlibexecdir,
2014 install_dir : rootbindir)
2015 public_programs += exe
2017 if conf.get('ENABLE_PORTABLED') == 1
2018 executable('systemd-portabled',
2019 systemd_portabled_sources,
2020 include_directories : includes,
2021 link_with : [libshared],
2022 dependencies : [threads],
2023 install_rpath : rootlibexecdir,
2025 install_dir : rootlibexecdir)
2027 exe = executable('portablectl', 'src/portable/portablectl.c',
2028 include_directories : includes,
2029 link_with : [libshared],
2030 dependencies : [threads],
2031 install_rpath : rootlibexecdir,
2033 install_dir : rootbindir)
2034 public_programs += exe
2037 if conf.get('ENABLE_USERDB') == 1
2038 executable('systemd-userwork',
2039 systemd_userwork_sources,
2040 include_directories : includes,
2041 link_with : [libshared],
2042 dependencies : [threads],
2043 install_rpath : rootlibexecdir,
2045 install_dir : rootlibexecdir)
2047 executable('systemd-userdbd',
2048 systemd_userdbd_sources,
2049 include_directories : includes,
2050 link_with : [libshared],
2051 dependencies : [threads],
2052 install_rpath : rootlibexecdir,
2054 install_dir : rootlibexecdir)
2056 executable('userdbctl',
2058 include_directories : includes,
2059 link_with : [libshared],
2060 dependencies : [threads],
2061 install_rpath : rootlibexecdir,
2063 install_dir : rootbindir)
2066 if conf.get('ENABLE_HOMED') == 1
2067 executable('systemd-homework',
2068 systemd_homework_sources,
2069 include_directories : includes,
2070 link_with : [libshared],
2071 dependencies : [threads,
2078 install_rpath : rootlibexecdir,
2080 install_dir : rootlibexecdir)
2082 executable('systemd-homed',
2083 systemd_homed_sources,
2084 include_directories : includes,
2085 link_with : [libshared],
2086 dependencies : [threads,
2090 install_rpath : rootlibexecdir,
2092 install_dir : rootlibexecdir)
2094 executable('homectl',
2096 include_directories : includes,
2097 link_with : [libshared],
2098 dependencies : [threads,
2103 install_rpath : rootlibexecdir,
2105 install_dir : rootbindir)
2107 if conf.get('HAVE_PAM') == 1
2108 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2109 pam_systemd = shared_library(
2113 include_directories : includes,
2114 link_args : ['-shared',
2115 '-Wl,--version-script=' + version_script_arg],
2116 link_with : [libsystemd_static,
2118 dependencies : [threads,
2122 link_depends : pam_systemd_home_sym,
2124 install_dir : pamlibdir)
2128 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
2129 meson.add_install_script(meson_make_symlink,
2130 join_paths(rootbindir, 'systemctl'),
2131 join_paths(rootsbindir, alias))
2134 if conf.get('ENABLE_BACKLIGHT') == 1
2135 executable('systemd-backlight',
2136 'src/backlight/backlight.c',
2137 include_directories : includes,
2138 link_with : [libshared],
2139 install_rpath : rootlibexecdir,
2141 install_dir : rootlibexecdir)
2144 if conf.get('ENABLE_RFKILL') == 1
2145 executable('systemd-rfkill',
2146 'src/rfkill/rfkill.c',
2147 include_directories : includes,
2148 link_with : [libshared],
2149 install_rpath : rootlibexecdir,
2151 install_dir : rootlibexecdir)
2154 executable('systemd-system-update-generator',
2155 'src/system-update-generator/system-update-generator.c',
2156 include_directories : includes,
2157 link_with : [libshared],
2158 install_rpath : rootlibexecdir,
2160 install_dir : systemgeneratordir)
2162 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2163 systemd_cryptsetup_sources = files('''
2164 src/cryptsetup/cryptsetup.c
2165 src/cryptsetup/cryptsetup-pkcs11.h
2168 if conf.get('HAVE_P11KIT') == 1
2169 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2172 executable('systemd-cryptsetup',
2173 systemd_cryptsetup_sources,
2174 include_directories : includes,
2175 link_with : [libshared],
2176 dependencies : [libcryptsetup,
2178 install_rpath : rootlibexecdir,
2180 install_dir : rootlibexecdir)
2182 executable('systemd-cryptsetup-generator',
2183 'src/cryptsetup/cryptsetup-generator.c',
2184 include_directories : includes,
2185 link_with : [libshared],
2186 dependencies : [libcryptsetup],
2187 install_rpath : rootlibexecdir,
2189 install_dir : systemgeneratordir)
2191 executable('systemd-veritysetup',
2192 'src/veritysetup/veritysetup.c',
2193 include_directories : includes,
2194 link_with : [libshared],
2195 dependencies : [libcryptsetup],
2196 install_rpath : rootlibexecdir,
2198 install_dir : rootlibexecdir)
2200 executable('systemd-veritysetup-generator',
2201 'src/veritysetup/veritysetup-generator.c',
2202 include_directories : includes,
2203 link_with : [libshared],
2204 dependencies : [libcryptsetup],
2205 install_rpath : rootlibexecdir,
2207 install_dir : systemgeneratordir)
2210 if conf.get('HAVE_SYSV_COMPAT') == 1
2211 executable('systemd-sysv-generator',
2212 'src/sysv-generator/sysv-generator.c',
2213 include_directories : includes,
2214 link_with : [libshared],
2215 install_rpath : rootlibexecdir,
2217 install_dir : systemgeneratordir)
2219 executable('systemd-rc-local-generator',
2220 'src/rc-local-generator/rc-local-generator.c',
2221 include_directories : includes,
2222 link_with : [libshared],
2223 install_rpath : rootlibexecdir,
2225 install_dir : systemgeneratordir)
2228 if conf.get('ENABLE_HOSTNAMED') == 1
2229 executable('systemd-hostnamed',
2230 'src/hostname/hostnamed.c',
2231 include_directories : includes,
2232 link_with : [libshared],
2233 install_rpath : rootlibexecdir,
2235 install_dir : rootlibexecdir)
2237 exe = executable('hostnamectl',
2238 'src/hostname/hostnamectl.c',
2239 include_directories : includes,
2240 link_with : [libshared],
2241 install_rpath : rootlibexecdir,
2243 public_programs += exe
2246 if conf.get('ENABLE_LOCALED') == 1
2247 if conf.get('HAVE_XKBCOMMON') == 1
2248 # logind will load libxkbcommon.so dynamically on its own
2254 executable('systemd-localed',
2255 systemd_localed_sources,
2256 include_directories : includes,
2257 link_with : [libshared],
2258 dependencies : deps,
2259 install_rpath : rootlibexecdir,
2261 install_dir : rootlibexecdir)
2263 exe = executable('localectl',
2265 include_directories : includes,
2266 link_with : [libshared],
2267 install_rpath : rootlibexecdir,
2269 public_programs += exe
2272 if conf.get('ENABLE_TIMEDATED') == 1
2273 executable('systemd-timedated',
2274 'src/timedate/timedated.c',
2275 include_directories : includes,
2276 link_with : [libshared],
2277 install_rpath : rootlibexecdir,
2279 install_dir : rootlibexecdir)
2282 if conf.get('ENABLE_TIMEDATECTL') == 1
2283 exe = executable('timedatectl',
2284 'src/timedate/timedatectl.c',
2285 include_directories : includes,
2286 install_rpath : rootlibexecdir,
2287 link_with : [libshared],
2288 dependencies : [libm],
2290 public_programs += exe
2293 if conf.get('ENABLE_TIMESYNCD') == 1
2294 if get_option('link-timesyncd-shared')
2295 timesyncd_link_with = [libshared]
2297 timesyncd_link_with = [libsystemd_static,
2303 executable('systemd-timesyncd',
2304 systemd_timesyncd_sources,
2305 include_directories : includes,
2306 link_with : [timesyncd_link_with],
2307 dependencies : [threads,
2309 install_rpath : rootlibexecdir,
2311 install_dir : rootlibexecdir)
2313 executable('systemd-time-wait-sync',
2314 'src/time-wait-sync/time-wait-sync.c',
2315 include_directories : includes,
2316 link_with : [timesyncd_link_with],
2317 install_rpath : rootlibexecdir,
2319 install_dir : rootlibexecdir)
2322 if conf.get('ENABLE_MACHINED') == 1
2323 executable('systemd-machined',
2324 systemd_machined_sources,
2325 include_directories : includes,
2326 link_with : [libmachine_core,
2328 install_rpath : rootlibexecdir,
2330 install_dir : rootlibexecdir)
2332 exe = executable('machinectl',
2333 'src/machine/machinectl.c',
2334 include_directories : includes,
2335 link_with : [libshared],
2336 dependencies : [threads,
2339 install_rpath : rootlibexecdir,
2341 install_dir : rootbindir)
2342 public_programs += exe
2345 if conf.get('ENABLE_IMPORTD') == 1
2346 executable('systemd-importd',
2347 systemd_importd_sources,
2348 include_directories : includes,
2349 link_with : [libshared],
2350 dependencies : [threads],
2351 install_rpath : rootlibexecdir,
2353 install_dir : rootlibexecdir)
2355 systemd_pull = executable('systemd-pull',
2356 systemd_pull_sources,
2357 include_directories : includes,
2358 link_with : [libshared],
2359 dependencies : [versiondep,
2365 install_rpath : rootlibexecdir,
2367 install_dir : rootlibexecdir)
2369 systemd_import = executable('systemd-import',
2370 systemd_import_sources,
2371 include_directories : includes,
2372 link_with : [libshared],
2373 dependencies : [libcurl,
2377 install_rpath : rootlibexecdir,
2379 install_dir : rootlibexecdir)
2381 systemd_import_fs = executable('systemd-import-fs',
2382 systemd_import_fs_sources,
2383 include_directories : includes,
2384 link_with : [libshared],
2385 install_rpath : rootlibexecdir,
2387 install_dir : rootlibexecdir)
2389 systemd_export = executable('systemd-export',
2390 systemd_export_sources,
2391 include_directories : includes,
2392 link_with : [libshared],
2393 dependencies : [libcurl,
2397 install_rpath : rootlibexecdir,
2399 install_dir : rootlibexecdir)
2401 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2404 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2405 exe = executable('systemd-journal-upload',
2406 systemd_journal_upload_sources,
2407 include_directories : includes,
2408 link_with : [libshared],
2409 dependencies : [versiondep,
2415 install_rpath : rootlibexecdir,
2417 install_dir : rootlibexecdir)
2418 public_programs += exe
2421 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2422 s_j_remote = executable('systemd-journal-remote',
2423 systemd_journal_remote_sources,
2424 include_directories : includes,
2425 link_with : [libshared,
2426 libsystemd_journal_remote],
2427 dependencies : [threads,
2432 install_rpath : rootlibexecdir,
2434 install_dir : rootlibexecdir)
2436 s_j_gatewayd = executable('systemd-journal-gatewayd',
2437 systemd_journal_gatewayd_sources,
2438 include_directories : includes,
2439 link_with : [libshared],
2440 dependencies : [threads,
2445 install_rpath : rootlibexecdir,
2447 install_dir : rootlibexecdir)
2448 public_programs += [s_j_remote, s_j_gatewayd]
2451 if conf.get('ENABLE_COREDUMP') == 1
2452 executable('systemd-coredump',
2453 systemd_coredump_sources,
2454 include_directories : includes,
2455 link_with : [libshared],
2456 dependencies : [threads,
2461 install_rpath : rootlibexecdir,
2463 install_dir : rootlibexecdir)
2465 exe = executable('coredumpctl',
2466 coredumpctl_sources,
2467 include_directories : includes,
2468 link_with : [libshared],
2469 dependencies : [threads,
2472 install_rpath : rootlibexecdir,
2474 public_programs += exe
2477 if conf.get('ENABLE_PSTORE') == 1
2478 executable('systemd-pstore',
2479 systemd_pstore_sources,
2480 include_directories : includes,
2481 link_with : [libshared],
2482 dependencies : [threads,
2487 install_rpath : rootlibexecdir,
2489 install_dir : rootlibexecdir)
2492 if conf.get('ENABLE_BINFMT') == 1
2493 exe = executable('systemd-binfmt',
2494 'src/binfmt/binfmt.c',
2495 include_directories : includes,
2496 link_with : [libshared],
2497 install_rpath : rootlibexecdir,
2499 install_dir : rootlibexecdir)
2500 public_programs += exe
2502 meson.add_install_script('sh', '-c',
2503 mkdir_p.format(binfmtdir))
2504 meson.add_install_script('sh', '-c',
2505 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2508 if conf.get('ENABLE_REPART') == 1
2509 exe = executable('systemd-repart',
2510 systemd_repart_sources,
2511 include_directories : includes,
2512 link_with : [libshared],
2513 dependencies : [threads,
2518 install_rpath : rootlibexecdir,
2520 install_dir : rootbindir)
2522 if want_tests != 'false'
2525 args : exe.full_path())
2529 if conf.get('ENABLE_VCONSOLE') == 1
2530 executable('systemd-vconsole-setup',
2531 'src/vconsole/vconsole-setup.c',
2532 include_directories : includes,
2533 link_with : [libshared],
2534 install_rpath : rootlibexecdir,
2536 install_dir : rootlibexecdir)
2539 if conf.get('ENABLE_RANDOMSEED') == 1
2540 executable('systemd-random-seed',
2541 'src/random-seed/random-seed.c',
2542 include_directories : includes,
2543 link_with : [libshared],
2544 install_rpath : rootlibexecdir,
2546 install_dir : rootlibexecdir)
2549 if conf.get('ENABLE_FIRSTBOOT') == 1
2550 executable('systemd-firstboot',
2551 'src/firstboot/firstboot.c',
2552 include_directories : includes,
2553 link_with : [libshared],
2554 dependencies : [libcrypt],
2555 install_rpath : rootlibexecdir,
2557 install_dir : rootbindir)
2560 executable('systemd-remount-fs',
2561 'src/remount-fs/remount-fs.c',
2562 include_directories : includes,
2563 link_with : [libcore_shared,
2565 install_rpath : rootlibexecdir,
2567 install_dir : rootlibexecdir)
2569 executable('systemd-machine-id-setup',
2570 'src/machine-id-setup/machine-id-setup-main.c',
2571 include_directories : includes,
2572 link_with : [libcore_shared,
2574 install_rpath : rootlibexecdir,
2576 install_dir : rootbindir)
2578 executable('systemd-fsck',
2580 include_directories : includes,
2581 link_with : [libshared],
2582 install_rpath : rootlibexecdir,
2584 install_dir : rootlibexecdir)
2586 executable('systemd-growfs',
2587 'src/partition/growfs.c',
2588 include_directories : includes,
2589 link_with : [libshared],
2590 dependencies : [libcryptsetup],
2591 install_rpath : rootlibexecdir,
2593 install_dir : rootlibexecdir)
2595 executable('systemd-makefs',
2596 'src/partition/makefs.c',
2597 include_directories : includes,
2598 link_with : [libshared],
2599 install_rpath : rootlibexecdir,
2601 install_dir : rootlibexecdir)
2603 executable('systemd-sleep',
2604 'src/sleep/sleep.c',
2605 include_directories : includes,
2606 link_with : [libshared],
2607 install_rpath : rootlibexecdir,
2609 install_dir : rootlibexecdir)
2611 install_data('src/sleep/sleep.conf',
2612 install_dir : pkgsysconfdir)
2614 exe = executable('systemd-sysctl',
2615 'src/sysctl/sysctl.c',
2616 include_directories : includes,
2617 link_with : [libshared],
2618 install_rpath : rootlibexecdir,
2620 install_dir : rootlibexecdir)
2621 public_programs += exe
2623 executable('systemd-ac-power',
2624 'src/ac-power/ac-power.c',
2625 include_directories : includes,
2626 link_with : [libshared],
2627 install_rpath : rootlibexecdir,
2629 install_dir : rootlibexecdir)
2631 exe = executable('systemd-detect-virt',
2632 'src/detect-virt/detect-virt.c',
2633 include_directories : includes,
2634 link_with : [libshared],
2635 install_rpath : rootlibexecdir,
2637 public_programs += exe
2639 exe = executable('systemd-delta',
2640 'src/delta/delta.c',
2641 include_directories : includes,
2642 link_with : [libshared],
2643 install_rpath : rootlibexecdir,
2645 public_programs += exe
2647 exe = executable('systemd-escape',
2648 'src/escape/escape.c',
2649 include_directories : includes,
2650 link_with : [libshared],
2651 install_rpath : rootlibexecdir,
2653 install_dir : rootbindir)
2654 public_programs += exe
2656 exe = executable('systemd-notify',
2657 'src/notify/notify.c',
2658 include_directories : includes,
2659 link_with : [libshared],
2660 install_rpath : rootlibexecdir,
2662 install_dir : rootbindir)
2663 public_programs += exe
2665 executable('systemd-volatile-root',
2666 'src/volatile-root/volatile-root.c',
2667 include_directories : includes,
2668 link_with : [libshared],
2669 install_rpath : rootlibexecdir,
2671 install_dir : rootlibexecdir)
2673 executable('systemd-cgroups-agent',
2674 'src/cgroups-agent/cgroups-agent.c',
2675 include_directories : includes,
2676 link_with : [libshared],
2677 install_rpath : rootlibexecdir,
2679 install_dir : rootlibexecdir)
2681 exe = executable('systemd-id128',
2682 'src/id128/id128.c',
2683 include_directories : includes,
2684 link_with : [libshared],
2685 install_rpath : rootlibexecdir,
2687 public_programs += exe
2689 exe = executable('systemd-path',
2691 include_directories : includes,
2692 link_with : [libshared],
2693 install_rpath : rootlibexecdir,
2695 public_programs += exe
2697 exe = executable('systemd-ask-password',
2698 'src/ask-password/ask-password.c',
2699 include_directories : includes,
2700 link_with : [libshared],
2701 install_rpath : rootlibexecdir,
2703 install_dir : rootbindir)
2704 public_programs += exe
2706 executable('systemd-reply-password',
2707 'src/reply-password/reply-password.c',
2708 include_directories : includes,
2709 link_with : [libshared],
2710 install_rpath : rootlibexecdir,
2712 install_dir : rootlibexecdir)
2714 exe = executable('systemd-tty-ask-password-agent',
2715 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2716 include_directories : includes,
2717 link_with : [libshared],
2718 install_rpath : rootlibexecdir,
2720 install_dir : rootbindir)
2721 public_programs += exe
2723 exe = executable('systemd-cgls',
2725 include_directories : includes,
2726 link_with : [libshared],
2727 install_rpath : rootlibexecdir,
2729 public_programs += exe
2731 exe = executable('systemd-cgtop',
2732 'src/cgtop/cgtop.c',
2733 include_directories : includes,
2734 link_with : [libshared],
2735 install_rpath : rootlibexecdir,
2737 public_programs += exe
2739 executable('systemd-initctl',
2740 'src/initctl/initctl.c',
2741 include_directories : includes,
2742 link_with : [libshared],
2743 install_rpath : rootlibexecdir,
2745 install_dir : rootlibexecdir)
2747 exe = executable('systemd-mount',
2748 'src/mount/mount-tool.c',
2749 include_directories : includes,
2750 link_with : [libshared],
2751 dependencies: [libmount],
2752 install_rpath : rootlibexecdir,
2754 public_programs += exe
2756 meson.add_install_script(meson_make_symlink,
2757 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2759 exe = executable('systemd-run',
2761 include_directories : includes,
2762 link_with : [libshared],
2763 install_rpath : rootlibexecdir,
2765 public_programs += exe
2767 exe = executable('systemd-stdio-bridge',
2768 'src/stdio-bridge/stdio-bridge.c',
2769 include_directories : includes,
2770 link_with : [libshared],
2771 dependencies : [versiondep],
2772 install_rpath : rootlibexecdir,
2774 public_programs += exe
2776 exe = executable('busctl',
2777 'src/busctl/busctl.c',
2778 'src/busctl/busctl-introspect.c',
2779 'src/busctl/busctl-introspect.h',
2780 include_directories : includes,
2781 link_with : [libshared],
2782 install_rpath : rootlibexecdir,
2784 public_programs += exe
2786 if conf.get('ENABLE_SYSUSERS') == 1
2787 exe = executable('systemd-sysusers',
2788 'src/sysusers/sysusers.c',
2789 include_directories : includes,
2790 link_with : [libshared],
2791 install_rpath : rootlibexecdir,
2793 install_dir : rootbindir)
2794 public_programs += exe
2797 if conf.get('ENABLE_TMPFILES') == 1
2798 exe = executable('systemd-tmpfiles',
2799 'src/tmpfiles/tmpfiles.c',
2800 include_directories : includes,
2801 link_with : [libshared],
2802 dependencies : [libacl],
2803 install_rpath : rootlibexecdir,
2805 install_dir : rootbindir)
2806 public_programs += exe
2808 if want_tests != 'false'
2809 test('test-systemd-tmpfiles',
2810 test_systemd_tmpfiles_py,
2811 # https://github.com/mesonbuild/meson/issues/2681
2812 args : exe.full_path())
2816 if conf.get('ENABLE_HWDB') == 1
2817 exe = executable('systemd-hwdb',
2819 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2820 include_directories : includes,
2821 link_with : [libudev_static],
2822 install_rpath : udev_rpath,
2824 install_dir : rootbindir)
2825 public_programs += exe
2828 if conf.get('ENABLE_QUOTACHECK') == 1
2829 executable('systemd-quotacheck',
2830 'src/quotacheck/quotacheck.c',
2831 include_directories : includes,
2832 link_with : [libshared],
2833 install_rpath : rootlibexecdir,
2835 install_dir : rootlibexecdir)
2838 exe = executable('systemd-socket-proxyd',
2839 'src/socket-proxy/socket-proxyd.c',
2840 include_directories : includes,
2841 link_with : [libshared],
2842 dependencies : [threads],
2843 install_rpath : rootlibexecdir,
2845 install_dir : rootlibexecdir)
2846 public_programs += exe
2848 exe = executable('systemd-udevd',
2849 systemd_udevd_sources,
2850 include_directories : includes,
2851 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2852 link_with : [libudev_core,
2855 dependencies : [versiondep,
2861 install_rpath : udev_rpath,
2863 install_dir : rootlibexecdir)
2864 public_programs += exe
2866 exe = executable('udevadm',
2868 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2869 include_directories : includes,
2870 link_with : [libudev_core,
2873 dependencies : [versiondep,
2879 install_rpath : udev_rpath,
2881 install_dir : rootbindir)
2882 public_programs += exe
2884 executable('systemd-shutdown',
2885 systemd_shutdown_sources,
2886 include_directories : includes,
2887 link_with : [libcore_shared,
2889 dependencies : [libmount],
2890 install_rpath : rootlibexecdir,
2892 install_dir : rootlibexecdir)
2894 executable('systemd-update-done',
2895 'src/update-done/update-done.c',
2896 include_directories : includes,
2897 link_with : [libshared],
2898 install_rpath : rootlibexecdir,
2900 install_dir : rootlibexecdir)
2902 executable('systemd-update-utmp',
2903 'src/update-utmp/update-utmp.c',
2904 include_directories : includes,
2905 link_with : [libshared],
2906 dependencies : [libaudit],
2907 install_rpath : rootlibexecdir,
2909 install_dir : rootlibexecdir)
2911 if conf.get('HAVE_KMOD') == 1
2912 executable('systemd-modules-load',
2913 'src/modules-load/modules-load.c',
2914 include_directories : includes,
2915 link_with : [libshared],
2916 dependencies : [libkmod],
2917 install_rpath : rootlibexecdir,
2919 install_dir : rootlibexecdir)
2921 meson.add_install_script('sh', '-c',
2922 mkdir_p.format(modulesloaddir))
2923 meson.add_install_script('sh', '-c',
2924 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2927 exe = executable('systemd-nspawn',
2928 systemd_nspawn_sources,
2929 include_directories : includes,
2930 link_with : [libcore_shared,
2933 dependencies : [libblkid,
2935 install_rpath : rootlibexecdir,
2937 public_programs += exe
2939 if conf.get('ENABLE_NETWORKD') == 1
2940 executable('systemd-networkd',
2941 systemd_networkd_sources,
2942 include_directories : network_include_dir,
2943 link_with : [libnetworkd_core,
2946 networkd_link_with],
2947 dependencies : [threads],
2948 install_rpath : rootlibexecdir,
2950 install_dir : rootlibexecdir)
2952 executable('systemd-networkd-wait-online',
2953 systemd_networkd_wait_online_sources,
2954 include_directories : includes,
2955 link_with : [libnetworkd_core,
2956 networkd_link_with],
2957 install_rpath : rootlibexecdir,
2959 install_dir : rootlibexecdir)
2961 exe = executable('networkctl',
2963 include_directories : includes,
2964 link_with : [libsystemd_network,
2965 networkd_link_with],
2966 install_rpath : rootlibexecdir,
2968 install_dir : rootbindir)
2969 public_programs += exe
2971 exe = executable('systemd-network-generator',
2972 network_generator_sources,
2973 include_directories : includes,
2974 link_with : [networkd_link_with],
2975 install_rpath : rootlibexecdir,
2977 install_dir : rootlibexecdir)
2979 if want_tests != 'false'
2980 test('test-network-generator-conversion',
2981 test_network_generator_conversion_sh,
2982 # https://github.com/mesonbuild/meson/issues/2681
2983 args : exe.full_path())
2987 executable('systemd-sulogin-shell',
2988 ['src/sulogin-shell/sulogin-shell.c'],
2989 include_directories : includes,
2990 link_with : [libshared],
2991 install_rpath : rootlibexecdir,
2993 install_dir : rootlibexecdir)
2995 ############################################################
2998 'systemd-runtest.env',
2999 output : 'systemd-runtest.env',
3000 command : ['sh', '-c', '{ ' +
3001 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
3002 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
3004 build_by_default : true)
3006 foreach tuple : tests
3008 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3009 dependencies = tuple[2]
3010 condition = tuple.length() >= 4 ? tuple[3] : ''
3011 type = tuple.length() >= 5 ? tuple[4] : ''
3012 defs = tuple.length() >= 6 ? tuple[5] : []
3013 incs = tuple.length() >= 7 ? tuple[6] : includes
3016 name = sources[0].split('/')[-1].split('.')[0]
3017 if type.startswith('timeout=')
3018 timeout = type.split('=')[1].to_int()
3022 if condition == '' or conf.get(condition) == 1
3026 include_directories : incs,
3027 link_with : link_with,
3028 dependencies : [versiondep,
3031 build_by_default : want_tests != 'false',
3032 install_rpath : rootlibexecdir,
3033 install : install_tests,
3034 install_dir : join_paths(testsdir, type))
3037 message('@0@ is a manual test'.format(name))
3038 elif type == 'unsafe' and want_tests != 'unsafe'
3039 message('@0@ is an unsafe test'.format(name))
3040 elif want_tests != 'false'
3046 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3051 'test-libsystemd-sym',
3052 test_libsystemd_sym_c,
3053 include_directories : includes,
3054 link_with : [libsystemd],
3055 build_by_default : want_tests != 'false',
3056 install : install_tests,
3057 install_dir : testsdir)
3058 if want_tests != 'false'
3059 test('test-libsystemd-sym', exe)
3063 'test-libsystemd-static-sym',
3064 test_libsystemd_sym_c,
3065 include_directories : includes,
3066 link_with : [install_libsystemd_static],
3067 dependencies : [threads], # threads is already included in dependencies on the library,
3068 # but does not seem to get propagated. Add here as a work-around.
3069 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3070 install : install_tests and static_libsystemd_pic,
3071 install_dir : testsdir)
3072 if want_tests != 'false' and static_libsystemd_pic
3073 test('test-libsystemd-static-sym', exe)
3079 include_directories : includes,
3080 c_args : '-Wno-deprecated-declarations',
3081 link_with : [libudev],
3082 build_by_default : want_tests != 'false',
3083 install : install_tests,
3084 install_dir : testsdir)
3085 if want_tests != 'false'
3086 test('test-libudev-sym', exe)
3090 'test-libudev-static-sym',
3092 include_directories : includes,
3093 c_args : '-Wno-deprecated-declarations',
3094 link_with : [install_libudev_static],
3095 build_by_default : want_tests != 'false' and static_libudev_pic,
3096 install : install_tests and static_libudev_pic,
3097 install_dir : testsdir)
3098 if want_tests != 'false' and static_libudev_pic
3099 test('test-libudev-static-sym', exe)
3102 ############################################################
3106 if get_option('tests') != 'false'
3107 foreach tuple : fuzzers
3109 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3110 dependencies = tuple[2]
3111 defs = tuple.length() >= 4 ? tuple[3] : []
3112 incs = tuple.length() >= 5 ? tuple[4] : includes
3116 dependencies += fuzzing_engine
3118 if fuzzing_engine.found()
3119 dependencies += fuzzing_engine
3121 link_args += ['-fsanitize=fuzzer']
3124 sources += 'src/fuzz/fuzz-main.c'
3127 name = sources[0].split('/')[-1].split('.')[0]
3129 fuzzer_exes += executable(
3132 include_directories : [incs, include_directories('src/fuzz')],
3133 link_with : link_with,
3134 dependencies : dependencies,
3136 link_args: link_args,
3141 run_target('fuzzers',
3142 depends : fuzzer_exes,
3145 ############################################################
3147 make_directive_index_py = find_program('tools/make-directive-index.py')
3148 make_man_index_py = find_program('tools/make-man-index.py')
3149 xml_helper_py = find_program('tools/xml_helper.py')
3150 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
3151 autosuspend_update_sh = find_program('tools/meson-autosuspend-update.sh')
3154 subdir('sysusers.d')
3155 subdir('tmpfiles.d')
3161 subdir('shell-completion/bash')
3162 subdir('shell-completion/zsh')
3163 subdir('docs/sysvinit')
3164 subdir('docs/var-log')
3166 install_subdir('factory/etc',
3167 install_dir : factorydir)
3169 install_data('xorg/50-systemd-user.sh',
3170 install_dir : xinitrcdir)
3171 install_data('modprobe.d/systemd.conf',
3172 install_dir : modprobedir)
3173 install_data('LICENSE.GPL2',
3177 'docs/CODING_STYLE.md',
3178 'docs/DISTRO_PORTING.md',
3179 'docs/ENVIRONMENT.md',
3181 'docs/TRANSIENT-SETTINGS.md',
3182 'docs/TRANSLATORS.md',
3183 'docs/UIDS-GIDS.md',
3184 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3185 install_dir : docdir)
3187 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3188 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3190 ############################################################
3192 meson_check_help = find_program('tools/meson-check-help.sh')
3194 foreach exec : public_programs
3195 name = exec.full_path().split('/')[-1]
3196 if want_tests != 'false'
3197 test('check-help-' + name,
3199 args : exec.full_path())
3203 ############################################################
3205 check_directives_sh = find_program('tools/check-directives.sh')
3207 if want_tests != 'false'
3208 test('check-directives',
3209 check_directives_sh,
3210 args : project_source_root)
3213 ############################################################
3215 # Enable tests for all supported sanitizers
3216 foreach tuple : sanitizers
3217 sanitizer = tuple[0]
3220 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3222 foreach p : fuzz_regression_tests
3223 b = p.split('/')[-2]
3224 c = p.split('/')[-1]
3226 name = '@0@:@1@'.format(b, sanitizer)
3229 if want_tests == 'false'
3230 message('Not compiling @0@ because tests is set to false'.format(name))
3232 exe = custom_target(
3236 command : [env, 'ln', '-fs',
3237 join_paths(build.full_path(), b),
3239 build_by_default : true)
3241 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3246 if want_tests != 'false' and slow_tests
3247 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3249 args : [exe.full_path(),
3250 join_paths(project_source_root, p)])
3257 ############################################################
3260 all_files = run_command(
3262 ['--git-dir=@0@/.git'.format(project_source_root),
3265 all_files = files(all_files.stdout().split())
3270 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3273 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3277 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3280 command : [meson_git_contrib_sh])
3284 git_head = run_command(
3286 ['--git-dir=@0@/.git'.format(project_source_root),
3287 'rev-parse', 'HEAD']).stdout().strip()
3288 git_head_short = run_command(
3290 ['--git-dir=@0@/.git'.format(project_source_root),
3291 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3295 command : ['git', 'archive',
3296 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3298 '--prefix', 'systemd-@0@/'.format(git_head),
3302 ############################################################
3304 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3307 depends : [man, libsystemd, libudev],
3308 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3310 ############################################################
3311 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3314 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3316 'split /usr: @0@'.format(split_usr),
3317 'split bin-sbin: @0@'.format(split_bin),
3318 'prefix directory: @0@'.format(prefixdir),
3319 'rootprefix directory: @0@'.format(rootprefixdir),
3320 'sysconf directory: @0@'.format(sysconfdir),
3321 'include directory: @0@'.format(includedir),
3322 'lib directory: @0@'.format(libdir),
3323 'rootlib directory: @0@'.format(rootlibdir),
3324 'SysV init scripts: @0@'.format(sysvinit_path),
3325 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3326 'PAM modules directory: @0@'.format(pamlibdir),
3327 'PAM configuration directory: @0@'.format(pamconfdir),
3328 'RPM macros directory: @0@'.format(rpmmacrosdir),
3329 'modprobe.d directory: @0@'.format(modprobedir),
3330 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3331 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3332 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3333 'bash completions directory: @0@'.format(bashcompletiondir),
3334 'zsh completions directory: @0@'.format(zshcompletiondir),
3335 'extra start script: @0@'.format(get_option('rc-local')),
3336 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3337 get_option('debug-tty')),
3338 'TTY GID: @0@'.format(tty_gid),
3339 'users GID: @0@'.format(substs.get('USERS_GID')),
3340 'maximum system UID: @0@'.format(system_uid_max),
3341 'maximum system GID: @0@'.format(system_gid_max),
3342 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3343 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3344 'minimum container UID base: @0@'.format(container_uid_base_min),
3345 'maximum container UID base: @0@'.format(container_uid_base_max),
3346 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3347 'render group access mode: @0@'.format(get_option('group-render-mode')),
3348 'certificate root directory: @0@'.format(get_option('certificate-root')),
3349 'support URL: @0@'.format(support_url),
3350 'nobody user name: @0@'.format(nobody_user),
3351 'nobody group name: @0@'.format(nobody_group),
3352 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3353 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3355 'default DNSSEC mode: @0@'.format(default_dnssec),
3356 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3357 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3358 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3359 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3360 'default locale: @0@'.format(default_locale),
3361 'default user $PATH: @0@'.format(default_user_path_display),
3362 'systemd service watchdog: @0@'.format(watchdog_opt)]
3364 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3365 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3367 'default DNS servers: @0@'.format(alt_dns_servers),
3368 'default NTP servers: @0@'.format(alt_ntp_servers)]
3370 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3371 '@@0@'.format(time_epoch)).stdout().strip()
3373 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3376 'static libsystemd: @0@'.format(static_libsystemd),
3377 'static libudev: @0@'.format(static_libudev)]
3380 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3381 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3382 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3384 if conf.get('ENABLE_EFI') == 1
3385 status += 'efi arch: @0@'.format(efi_arch)
3389 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3390 'EFI CC @0@'.format(' '.join(efi_cc)),
3391 'EFI lds: @0@'.format(efi_lds),
3392 'EFI crt0: @0@'.format(efi_crt0),
3393 'EFI include directory: @0@'.format(efi_incdir)]
3451 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3452 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3456 ['legacy pkla', install_polkit_pkla],
3458 ['gnu-efi', have_gnu_efi],
3471 ['man pages', want_man],
3472 ['html pages', want_html],
3473 ['man page indices', want_man and have_lxml],
3478 ['adm group', get_option('adm-group')],
3479 ['wheel group', get_option('wheel-group')],
3482 ['debug mmap cache'],
3484 ['valgrind', conf.get('VALGRIND') == 1],
3485 ['trace logging', conf.get('LOG_TRACE') == 1],
3486 ['install tests', install_tests],
3487 ['link-udev-shared', get_option('link-udev-shared')],
3488 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3489 ['link-networkd-shared', get_option('link-networkd-shared')],
3490 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3493 if tuple.length() >= 2
3496 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3497 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3498 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3509 'enabled features: @0@'.format(', '.join(found)),
3511 'disabled features: @0@'.format(', '.join(missing)),
3513 message('\n '.join(status))
3515 if rootprefixdir != rootprefix_default
3517 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3518 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3519 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))