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 default_mdns = get_option('default-mdns')
1306 conf.set('DEFAULT_MDNS_MODE',
1307 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
1308 substs.set('DEFAULT_MDNS_MODE', default_mdns)
1310 default_llmnr = get_option('default-llmnr')
1311 conf.set('DEFAULT_LLMNR_MODE',
1312 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
1313 substs.set('DEFAULT_LLMNR_MODE', default_llmnr)
1315 want_repart = get_option('repart')
1316 if want_repart != 'false'
1317 have = (conf.get('HAVE_OPENSSL') == 1 and
1318 conf.get('HAVE_LIBFDISK') == 1)
1319 if want_repart == 'true' and not have
1320 error('repart support was requested, but dependencies are not available')
1325 conf.set10('ENABLE_REPART', have)
1327 want_importd = get_option('importd')
1328 if want_importd != 'false'
1329 have = (conf.get('HAVE_LIBCURL') == 1 and
1330 conf.get('HAVE_ZLIB') == 1 and
1331 conf.get('HAVE_XZ') == 1 and
1332 conf.get('HAVE_GCRYPT') == 1)
1333 if want_importd == 'true' and not have
1334 error('importd support was requested, but dependencies are not available')
1339 conf.set10('ENABLE_IMPORTD', have)
1341 want_homed = get_option('homed')
1342 if want_homed != 'false'
1343 have = (conf.get('HAVE_OPENSSL') == 1 and
1344 conf.get('HAVE_LIBFDISK') == 1 and
1345 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1346 if want_homed == 'true' and not have
1347 error('homed support was requested, but dependencies are not available')
1352 conf.set10('ENABLE_HOMED', have)
1354 have = have and conf.get('HAVE_PAM') == 1
1355 conf.set10('ENABLE_PAM_HOME', have)
1357 want_remote = get_option('remote')
1358 if want_remote != 'false'
1359 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1360 conf.get('HAVE_LIBCURL') == 1]
1361 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1362 # it's possible to build one without the other. Complain only if
1363 # support was explicitly requested. The auxiliary files like sysusers
1364 # config should be installed when any of the programs are built.
1365 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1366 error('remote support was requested, but dependencies are not available')
1368 have = have_deps[0] or have_deps[1]
1372 conf.set10('ENABLE_REMOTE', have)
1374 foreach term : ['utmp',
1408 have = get_option(term)
1409 name = 'ENABLE_' + term.underscorify().to_upper()
1410 conf.set10(name, have)
1413 foreach tuple : [['nss-mymachines', 'machined'],
1414 ['nss-resolve', 'resolve']]
1415 want = get_option(tuple[0])
1417 have = get_option(tuple[1])
1418 if want == 'true' and not have
1419 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1424 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1425 conf.set10(name, have)
1429 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1430 'ENABLE_NSS_MYMACHINES',
1431 'ENABLE_NSS_RESOLVE',
1432 'ENABLE_NSS_SYSTEMD']
1433 if conf.get(term) == 1
1437 conf.set10('ENABLE_NSS', enable_nss)
1439 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1444 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1446 #####################################################################
1448 if get_option('efi')
1449 efi_arch = host_machine.cpu_family()
1451 if efi_arch == 'x86'
1452 EFI_MACHINE_TYPE_NAME = 'ia32'
1453 gnu_efi_arch = 'ia32'
1454 elif efi_arch == 'x86_64'
1455 EFI_MACHINE_TYPE_NAME = 'x64'
1456 gnu_efi_arch = 'x86_64'
1457 elif efi_arch == 'arm'
1458 EFI_MACHINE_TYPE_NAME = 'arm'
1459 gnu_efi_arch = 'arm'
1460 elif efi_arch == 'aarch64'
1461 EFI_MACHINE_TYPE_NAME = 'aa64'
1462 gnu_efi_arch = 'aarch64'
1464 EFI_MACHINE_TYPE_NAME = ''
1469 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1471 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1475 conf.set10('ENABLE_EFI', have)
1477 #####################################################################
1479 config_h = configure_file(
1480 output : 'config.h',
1481 configuration : conf)
1483 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1485 includes = include_directories('src/basic',
1490 'src/journal-remote',
1494 'src/time-wait-sync',
1500 'src/libsystemd/sd-bus',
1501 'src/libsystemd/sd-device',
1502 'src/libsystemd/sd-event',
1503 'src/libsystemd/sd-hwdb',
1504 'src/libsystemd/sd-id128',
1505 'src/libsystemd/sd-netlink',
1506 'src/libsystemd/sd-network',
1507 'src/libsystemd/sd-resolve',
1508 'src/libsystemd-network',
1511 add_project_arguments('-include', 'config.h', language : 'c')
1513 generate_gperfs = find_program('tools/generate-gperfs.py')
1517 subdir('src/systemd')
1519 subdir('src/libsystemd')
1520 subdir('src/libsystemd-network')
1521 subdir('src/journal')
1524 libjournal_core = static_library(
1526 libjournal_core_sources,
1528 include_directories : includes,
1531 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1532 libsystemd = shared_library(
1535 version : libsystemd_version,
1536 include_directories : includes,
1537 link_args : ['-shared',
1538 '-Wl,--version-script=' + libsystemd_sym_path],
1539 link_with : [libbasic,
1541 link_whole : [libsystemd_static,
1543 dependencies : [threads,
1547 link_depends : libsystemd_sym,
1549 install_dir : rootlibdir)
1551 static_libsystemd = get_option('static-libsystemd')
1552 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1554 install_libsystemd_static = static_library(
1557 journal_client_sources,
1559 basic_gcrypt_sources,
1561 include_directories : includes,
1562 build_by_default : static_libsystemd != 'false',
1563 install : static_libsystemd != 'false',
1564 install_dir : rootlibdir,
1565 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1566 dependencies : [threads,
1575 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1577 # Generate autosuspend rules
1578 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1580 ############################################################
1582 # binaries that have --help and are intended for use by humans,
1583 # usually, but not always, installed in /bin.
1584 public_programs = []
1586 subdir('src/libudev')
1587 subdir('src/shared')
1589 subdir('src/shutdown')
1591 subdir('src/network')
1593 subdir('src/analyze')
1594 subdir('src/journal-remote')
1595 subdir('src/coredump')
1596 subdir('src/pstore')
1597 subdir('src/hostname')
1598 subdir('src/import')
1599 subdir('src/partition')
1600 subdir('src/kernel-install')
1601 subdir('src/locale')
1602 subdir('src/machine')
1603 subdir('src/portable')
1604 subdir('src/userdb')
1606 subdir('src/nspawn')
1607 subdir('src/resolve')
1608 subdir('src/timedate')
1609 subdir('src/timesync')
1610 subdir('src/vconsole')
1611 subdir('src/boot/efi')
1618 ############################################################
1620 # only static linking apart from libdl, to make sure that the
1621 # module is linked to all libraries that it uses.
1622 test_dlopen = executable(
1626 include_directories : includes,
1627 link_with : [libbasic],
1628 dependencies : [libdl],
1629 build_by_default : want_tests != 'false')
1631 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1632 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h'],
1633 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1634 ['resolve', 'ENABLE_NSS_RESOLVE']]
1636 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1640 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1641 version_script_arg = join_paths(project_source_root, sym)
1643 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1644 if tuple.length() > 2
1645 sources += tuple[2].split()
1648 nss = shared_library(
1653 include_directories : includes,
1654 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1655 link_args : ['-Wl,-z,nodelete',
1657 '-Wl,--version-script=' + version_script_arg],
1658 link_with : [libsystemd_static,
1661 dependencies : [threads,
1665 install_dir : rootlibdir)
1667 # We cannot use shared_module because it does not support version suffix.
1668 # Unfortunately shared_library insists on creating the symlink…
1669 meson.add_install_script('sh', '-c',
1670 'rm $DESTDIR@0@/libnss_@1@.so'
1671 .format(rootlibdir, module))
1673 if want_tests != 'false'
1674 test('dlopen-nss_' + module,
1676 # path to dlopen must include a slash
1677 args : nss.full_path())
1682 ############################################################
1687 include_directories : includes,
1688 link_with : [libcore,
1690 dependencies : [versiondep,
1697 install_rpath : rootlibexecdir,
1699 install_dir : rootlibexecdir)
1701 meson.add_install_script(meson_make_symlink,
1702 join_paths(rootlibexecdir, 'systemd'),
1703 join_paths(rootsbindir, 'init'))
1705 public_programs += executable(
1707 systemd_analyze_sources,
1708 include_directories : includes,
1709 link_with : [libcore,
1711 dependencies : [versiondep,
1718 install_rpath : rootlibexecdir,
1719 install : get_option('analyze'))
1723 systemd_journald_sources,
1724 include_directories : includes,
1725 link_with : [libjournal_core,
1727 dependencies : [threads,
1731 install_rpath : rootlibexecdir,
1733 install_dir : rootlibexecdir)
1735 public_programs += executable(
1737 systemd_cat_sources,
1738 include_directories : includes,
1739 link_with : [libjournal_core,
1741 dependencies : [threads],
1742 install_rpath : rootlibexecdir,
1745 public_programs += executable(
1748 include_directories : includes,
1749 link_with : [libshared],
1750 dependencies : [threads,
1755 install_rpath : rootlibexecdir,
1757 install_dir : rootbindir)
1760 'systemd-getty-generator',
1761 'src/getty-generator/getty-generator.c',
1762 include_directories : includes,
1763 link_with : [libshared],
1764 install_rpath : rootlibexecdir,
1766 install_dir : systemgeneratordir)
1769 'systemd-debug-generator',
1770 'src/debug-generator/debug-generator.c',
1771 include_directories : includes,
1772 link_with : [libshared],
1773 install_rpath : rootlibexecdir,
1775 install_dir : systemgeneratordir)
1778 'systemd-run-generator',
1779 'src/run-generator/run-generator.c',
1780 include_directories : includes,
1781 link_with : [libshared],
1782 install_rpath : rootlibexecdir,
1784 install_dir : systemgeneratordir)
1787 'systemd-fstab-generator',
1788 'src/fstab-generator/fstab-generator.c',
1789 include_directories : includes,
1790 link_with : [libcore_shared,
1792 install_rpath : rootlibexecdir,
1794 install_dir : systemgeneratordir)
1796 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1798 '30-systemd-environment-d-generator',
1799 'src/environment-d-generator/environment-d-generator.c',
1800 include_directories : includes,
1801 link_with : [libshared],
1802 install_rpath : rootlibexecdir,
1804 install_dir : userenvgeneratordir)
1806 meson.add_install_script(meson_make_symlink,
1807 join_paths(sysconfdir, 'environment'),
1808 join_paths(environmentdir, '99-environment.conf'))
1811 if conf.get('ENABLE_HIBERNATE') == 1
1813 'systemd-hibernate-resume-generator',
1814 'src/hibernate-resume/hibernate-resume-generator.c',
1815 include_directories : includes,
1816 link_with : [libshared],
1817 install_rpath : rootlibexecdir,
1819 install_dir : systemgeneratordir)
1822 'systemd-hibernate-resume',
1823 'src/hibernate-resume/hibernate-resume.c',
1824 include_directories : includes,
1825 link_with : [libshared],
1826 install_rpath : rootlibexecdir,
1828 install_dir : rootlibexecdir)
1831 if conf.get('HAVE_BLKID') == 1
1833 'systemd-gpt-auto-generator',
1834 'src/gpt-auto-generator/gpt-auto-generator.c',
1835 'src/shared/blkid-util.h',
1836 include_directories : includes,
1837 link_with : [libshared],
1838 dependencies : libblkid,
1839 install_rpath : rootlibexecdir,
1841 install_dir : systemgeneratordir)
1843 public_programs += executable(
1845 'src/dissect/dissect.c',
1846 include_directories : includes,
1847 link_with : [libshared],
1848 install_rpath : rootlibexecdir,
1850 install_dir : rootlibexecdir)
1853 if conf.get('ENABLE_RESOLVE') == 1
1856 systemd_resolved_sources,
1857 include_directories : includes,
1858 link_with : [libshared,
1860 libsystemd_resolve_core],
1861 dependencies : systemd_resolved_dependencies,
1862 install_rpath : rootlibexecdir,
1864 install_dir : rootlibexecdir)
1866 public_programs += executable(
1869 include_directories : includes,
1870 link_with : [libshared,
1872 libsystemd_resolve_core],
1873 dependencies : [threads,
1877 install_rpath : rootlibexecdir,
1880 meson.add_install_script(meson_make_symlink,
1881 join_paths(bindir, 'resolvectl'),
1882 join_paths(rootsbindir, 'resolvconf'))
1884 meson.add_install_script(meson_make_symlink,
1885 join_paths(bindir, 'resolvectl'),
1886 join_paths(bindir, 'systemd-resolve'))
1889 if conf.get('ENABLE_LOGIND') == 1
1892 systemd_logind_sources,
1893 include_directories : includes,
1894 link_with : [liblogind_core,
1896 dependencies : [threads,
1898 install_rpath : rootlibexecdir,
1900 install_dir : rootlibexecdir)
1902 public_programs += executable(
1905 include_directories : includes,
1906 link_with : [libshared],
1907 dependencies : [threads,
1910 install_rpath : rootlibexecdir,
1912 install_dir : rootbindir)
1914 public_programs += executable(
1916 'src/login/inhibit.c',
1917 include_directories : includes,
1918 link_with : [libshared],
1919 install_rpath : rootlibexecdir,
1921 install_dir : rootbindir)
1923 if conf.get('HAVE_PAM') == 1
1924 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1925 pam_systemd = shared_library(
1929 include_directories : includes,
1930 link_args : ['-shared',
1931 '-Wl,--version-script=' + version_script_arg],
1932 link_with : [libsystemd_static,
1934 dependencies : [threads,
1937 link_depends : pam_systemd_sym,
1939 install_dir : pamlibdir)
1941 if want_tests != 'false'
1942 test('dlopen-pam_systemd',
1944 # path to dlopen must include a slash
1945 args : pam_systemd.full_path())
1950 'systemd-user-runtime-dir',
1951 user_runtime_dir_sources,
1952 include_directories : includes,
1953 link_with : [libshared],
1954 install_rpath : rootlibexecdir,
1956 install_dir : rootlibexecdir)
1959 if conf.get('HAVE_PAM') == 1
1961 'systemd-user-sessions',
1962 'src/user-sessions/user-sessions.c',
1963 include_directories : includes,
1964 link_with : [libshared],
1965 install_rpath : rootlibexecdir,
1967 install_dir : rootlibexecdir)
1970 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1971 public_programs += executable(
1973 'src/boot/bootctl.c',
1974 include_directories : includes,
1975 link_with : [libshared],
1976 dependencies : [libblkid],
1977 install_rpath : rootlibexecdir,
1980 public_programs += executable(
1981 'systemd-bless-boot',
1982 'src/boot/bless-boot.c',
1983 include_directories : includes,
1984 link_with : [libshared],
1985 dependencies : [libblkid],
1986 install_rpath : rootlibexecdir,
1988 install_dir : rootlibexecdir)
1991 'systemd-bless-boot-generator',
1992 'src/boot/bless-boot-generator.c',
1993 include_directories : includes,
1994 link_with : [libshared],
1995 install_rpath : rootlibexecdir,
1997 install_dir : systemgeneratordir)
2001 'systemd-boot-check-no-failures',
2002 'src/boot/boot-check-no-failures.c',
2003 include_directories : includes,
2004 link_with : [libshared],
2005 dependencies : [libblkid],
2006 install_rpath : rootlibexecdir,
2008 install_dir : rootlibexecdir)
2010 public_programs += executable(
2011 'systemd-socket-activate',
2012 'src/activate/activate.c',
2013 include_directories : includes,
2014 link_with : [libshared],
2015 dependencies : [threads],
2016 install_rpath : rootlibexecdir,
2019 if get_option('link-systemctl-shared')
2020 systemctl_link_with = [libshared]
2022 systemctl_link_with = [libsystemd_static,
2028 public_programs += executable(
2030 'src/systemctl/systemctl.c',
2031 'src/systemctl/sysv-compat.h',
2032 'src/systemctl/sysv-compat.c',
2033 include_directories : includes,
2034 link_with : systemctl_link_with,
2035 dependencies : [threads,
2040 install_rpath : rootlibexecdir,
2042 install_dir : rootbindir)
2044 if conf.get('ENABLE_PORTABLED') == 1
2046 'systemd-portabled',
2047 systemd_portabled_sources,
2048 include_directories : includes,
2049 link_with : [libshared],
2050 dependencies : [threads],
2051 install_rpath : rootlibexecdir,
2053 install_dir : rootlibexecdir)
2055 public_programs += executable(
2057 'src/portable/portablectl.c',
2058 include_directories : includes,
2059 link_with : [libshared],
2060 dependencies : [threads],
2061 install_rpath : rootlibexecdir,
2063 install_dir : rootbindir)
2066 if conf.get('ENABLE_USERDB') == 1
2069 systemd_userwork_sources,
2070 include_directories : includes,
2071 link_with : [libshared],
2072 dependencies : [threads],
2073 install_rpath : rootlibexecdir,
2075 install_dir : rootlibexecdir)
2079 systemd_userdbd_sources,
2080 include_directories : includes,
2081 link_with : [libshared],
2082 dependencies : [threads],
2083 install_rpath : rootlibexecdir,
2085 install_dir : rootlibexecdir)
2087 public_programs += executable(
2090 include_directories : includes,
2091 link_with : [libshared],
2092 dependencies : [threads],
2093 install_rpath : rootlibexecdir,
2095 install_dir : rootbindir)
2098 if conf.get('ENABLE_HOMED') == 1
2101 systemd_homework_sources,
2102 include_directories : includes,
2103 link_with : [libshared],
2104 dependencies : [threads,
2111 install_rpath : rootlibexecdir,
2113 install_dir : rootlibexecdir)
2117 systemd_homed_sources,
2118 include_directories : includes,
2119 link_with : [libshared],
2120 dependencies : [threads,
2124 install_rpath : rootlibexecdir,
2126 install_dir : rootlibexecdir)
2128 public_programs += executable(
2131 include_directories : includes,
2132 link_with : [libshared],
2133 dependencies : [threads,
2138 install_rpath : rootlibexecdir,
2140 install_dir : rootbindir)
2142 if conf.get('HAVE_PAM') == 1
2143 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2144 pam_systemd = shared_library(
2148 include_directories : includes,
2149 link_args : ['-shared',
2150 '-Wl,--version-script=' + version_script_arg],
2151 link_with : [libsystemd_static,
2153 dependencies : [threads,
2157 link_depends : pam_systemd_home_sym,
2159 install_dir : pamlibdir)
2163 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
2164 meson.add_install_script(meson_make_symlink,
2165 join_paths(rootbindir, 'systemctl'),
2166 join_paths(rootsbindir, alias))
2169 if conf.get('ENABLE_BACKLIGHT') == 1
2171 'systemd-backlight',
2172 'src/backlight/backlight.c',
2173 include_directories : includes,
2174 link_with : [libshared],
2175 install_rpath : rootlibexecdir,
2177 install_dir : rootlibexecdir)
2180 if conf.get('ENABLE_RFKILL') == 1
2183 'src/rfkill/rfkill.c',
2184 include_directories : includes,
2185 link_with : [libshared],
2186 install_rpath : rootlibexecdir,
2188 install_dir : rootlibexecdir)
2192 'systemd-system-update-generator',
2193 'src/system-update-generator/system-update-generator.c',
2194 include_directories : includes,
2195 link_with : [libshared],
2196 install_rpath : rootlibexecdir,
2198 install_dir : systemgeneratordir)
2200 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2201 systemd_cryptsetup_sources = files('''
2202 src/cryptsetup/cryptsetup.c
2203 src/cryptsetup/cryptsetup-pkcs11.h
2206 if conf.get('HAVE_P11KIT') == 1
2207 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2211 'systemd-cryptsetup',
2212 systemd_cryptsetup_sources,
2213 include_directories : includes,
2214 link_with : [libshared],
2215 dependencies : [libcryptsetup,
2217 install_rpath : rootlibexecdir,
2219 install_dir : rootlibexecdir)
2222 'systemd-cryptsetup-generator',
2223 'src/cryptsetup/cryptsetup-generator.c',
2224 include_directories : includes,
2225 link_with : [libshared],
2226 dependencies : [libcryptsetup],
2227 install_rpath : rootlibexecdir,
2229 install_dir : systemgeneratordir)
2232 'systemd-veritysetup',
2233 'src/veritysetup/veritysetup.c',
2234 include_directories : includes,
2235 link_with : [libshared],
2236 dependencies : [libcryptsetup],
2237 install_rpath : rootlibexecdir,
2239 install_dir : rootlibexecdir)
2242 'systemd-veritysetup-generator',
2243 'src/veritysetup/veritysetup-generator.c',
2244 include_directories : includes,
2245 link_with : [libshared],
2246 dependencies : [libcryptsetup],
2247 install_rpath : rootlibexecdir,
2249 install_dir : systemgeneratordir)
2252 if conf.get('HAVE_SYSV_COMPAT') == 1
2254 'systemd-sysv-generator',
2255 'src/sysv-generator/sysv-generator.c',
2256 include_directories : includes,
2257 link_with : [libshared],
2258 install_rpath : rootlibexecdir,
2260 install_dir : systemgeneratordir)
2263 'systemd-rc-local-generator',
2264 'src/rc-local-generator/rc-local-generator.c',
2265 include_directories : includes,
2266 link_with : [libshared],
2267 install_rpath : rootlibexecdir,
2269 install_dir : systemgeneratordir)
2272 if conf.get('ENABLE_HOSTNAMED') == 1
2274 'systemd-hostnamed',
2275 'src/hostname/hostnamed.c',
2276 include_directories : includes,
2277 link_with : [libshared],
2278 install_rpath : rootlibexecdir,
2280 install_dir : rootlibexecdir)
2282 public_programs += executable(
2284 'src/hostname/hostnamectl.c',
2285 include_directories : includes,
2286 link_with : [libshared],
2287 install_rpath : rootlibexecdir,
2291 if conf.get('ENABLE_LOCALED') == 1
2292 if conf.get('HAVE_XKBCOMMON') == 1
2293 # logind will load libxkbcommon.so dynamically on its own
2301 systemd_localed_sources,
2302 include_directories : includes,
2303 link_with : [libshared],
2304 dependencies : deps,
2305 install_rpath : rootlibexecdir,
2307 install_dir : rootlibexecdir)
2309 public_programs += executable(
2312 include_directories : includes,
2313 link_with : [libshared],
2314 install_rpath : rootlibexecdir,
2318 if conf.get('ENABLE_TIMEDATED') == 1
2320 'systemd-timedated',
2321 'src/timedate/timedated.c',
2322 include_directories : includes,
2323 link_with : [libshared],
2324 install_rpath : rootlibexecdir,
2326 install_dir : rootlibexecdir)
2329 if conf.get('ENABLE_TIMEDATECTL') == 1
2330 public_programs += executable(
2332 'src/timedate/timedatectl.c',
2333 include_directories : includes,
2334 install_rpath : rootlibexecdir,
2335 link_with : [libshared],
2336 dependencies : [libm],
2340 if conf.get('ENABLE_TIMESYNCD') == 1
2341 if get_option('link-timesyncd-shared')
2342 timesyncd_link_with = [libshared]
2344 timesyncd_link_with = [libsystemd_static,
2351 'systemd-timesyncd',
2352 systemd_timesyncd_sources,
2353 include_directories : includes,
2354 link_with : [timesyncd_link_with],
2355 dependencies : [threads,
2357 install_rpath : rootlibexecdir,
2359 install_dir : rootlibexecdir)
2362 'systemd-time-wait-sync',
2363 'src/time-wait-sync/time-wait-sync.c',
2364 include_directories : includes,
2365 link_with : [timesyncd_link_with],
2366 install_rpath : rootlibexecdir,
2368 install_dir : rootlibexecdir)
2371 if conf.get('ENABLE_MACHINED') == 1
2374 systemd_machined_sources,
2375 include_directories : includes,
2376 link_with : [libmachine_core,
2378 install_rpath : rootlibexecdir,
2380 install_dir : rootlibexecdir)
2382 public_programs += executable(
2384 'src/machine/machinectl.c',
2385 include_directories : includes,
2386 link_with : [libshared],
2387 dependencies : [threads,
2390 install_rpath : rootlibexecdir,
2392 install_dir : rootbindir)
2395 if conf.get('ENABLE_IMPORTD') == 1
2398 systemd_importd_sources,
2399 include_directories : includes,
2400 link_with : [libshared],
2401 dependencies : [threads],
2402 install_rpath : rootlibexecdir,
2404 install_dir : rootlibexecdir)
2406 systemd_pull = executable(
2408 systemd_pull_sources,
2409 include_directories : includes,
2410 link_with : [libshared],
2411 dependencies : [versiondep,
2417 install_rpath : rootlibexecdir,
2419 install_dir : rootlibexecdir)
2421 systemd_import = executable(
2423 systemd_import_sources,
2424 include_directories : includes,
2425 link_with : [libshared],
2426 dependencies : [libcurl,
2430 install_rpath : rootlibexecdir,
2432 install_dir : rootlibexecdir)
2434 systemd_import_fs = executable(
2435 'systemd-import-fs',
2436 systemd_import_fs_sources,
2437 include_directories : includes,
2438 link_with : [libshared],
2439 install_rpath : rootlibexecdir,
2441 install_dir : rootlibexecdir)
2443 systemd_export = executable(
2445 systemd_export_sources,
2446 include_directories : includes,
2447 link_with : [libshared],
2448 dependencies : [libcurl,
2452 install_rpath : rootlibexecdir,
2454 install_dir : rootlibexecdir)
2456 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2459 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2460 public_programs += executable(
2461 'systemd-journal-upload',
2462 systemd_journal_upload_sources,
2463 include_directories : includes,
2464 link_with : [libshared],
2465 dependencies : [versiondep,
2471 install_rpath : rootlibexecdir,
2473 install_dir : rootlibexecdir)
2476 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2477 public_programs += executable(
2478 'systemd-journal-remote',
2479 systemd_journal_remote_sources,
2480 include_directories : includes,
2481 link_with : [libshared,
2482 libsystemd_journal_remote],
2483 dependencies : [threads,
2488 install_rpath : rootlibexecdir,
2490 install_dir : rootlibexecdir)
2492 public_programs += executable(
2493 'systemd-journal-gatewayd',
2494 systemd_journal_gatewayd_sources,
2495 include_directories : includes,
2496 link_with : [libshared],
2497 dependencies : [threads,
2502 install_rpath : rootlibexecdir,
2504 install_dir : rootlibexecdir)
2507 if conf.get('ENABLE_COREDUMP') == 1
2510 systemd_coredump_sources,
2511 include_directories : includes,
2512 link_with : [libshared],
2513 dependencies : [threads,
2518 install_rpath : rootlibexecdir,
2520 install_dir : rootlibexecdir)
2522 public_programs += executable(
2524 coredumpctl_sources,
2525 include_directories : includes,
2526 link_with : [libshared],
2527 dependencies : [threads,
2530 install_rpath : rootlibexecdir,
2534 if conf.get('ENABLE_PSTORE') == 1
2537 systemd_pstore_sources,
2538 include_directories : includes,
2539 link_with : [libshared],
2540 dependencies : [threads,
2545 install_rpath : rootlibexecdir,
2547 install_dir : rootlibexecdir)
2550 if conf.get('ENABLE_BINFMT') == 1
2551 public_programs += executable(
2553 'src/binfmt/binfmt.c',
2554 include_directories : includes,
2555 link_with : [libshared],
2556 install_rpath : rootlibexecdir,
2558 install_dir : rootlibexecdir)
2560 meson.add_install_script('sh', '-c',
2561 mkdir_p.format(binfmtdir))
2562 meson.add_install_script('sh', '-c',
2563 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2566 if conf.get('ENABLE_REPART') == 1
2569 systemd_repart_sources,
2570 include_directories : includes,
2571 link_with : [libshared],
2572 dependencies : [threads,
2577 install_rpath : rootlibexecdir,
2579 install_dir : rootbindir)
2581 if want_tests != 'false'
2584 args : exe.full_path())
2588 if conf.get('ENABLE_VCONSOLE') == 1
2590 'systemd-vconsole-setup',
2591 'src/vconsole/vconsole-setup.c',
2592 include_directories : includes,
2593 link_with : [libshared],
2594 install_rpath : rootlibexecdir,
2596 install_dir : rootlibexecdir)
2599 if conf.get('ENABLE_RANDOMSEED') == 1
2601 'systemd-random-seed',
2602 'src/random-seed/random-seed.c',
2603 include_directories : includes,
2604 link_with : [libshared],
2605 install_rpath : rootlibexecdir,
2607 install_dir : rootlibexecdir)
2610 if conf.get('ENABLE_FIRSTBOOT') == 1
2612 'systemd-firstboot',
2613 'src/firstboot/firstboot.c',
2614 include_directories : includes,
2615 link_with : [libshared],
2616 dependencies : [libcrypt],
2617 install_rpath : rootlibexecdir,
2619 install_dir : rootbindir)
2623 'systemd-remount-fs',
2624 'src/remount-fs/remount-fs.c',
2625 include_directories : includes,
2626 link_with : [libcore_shared,
2628 install_rpath : rootlibexecdir,
2630 install_dir : rootlibexecdir)
2633 'systemd-machine-id-setup',
2634 'src/machine-id-setup/machine-id-setup-main.c',
2635 include_directories : includes,
2636 link_with : [libcore_shared,
2638 install_rpath : rootlibexecdir,
2640 install_dir : rootbindir)
2645 include_directories : includes,
2646 link_with : [libshared],
2647 install_rpath : rootlibexecdir,
2649 install_dir : rootlibexecdir)
2651 executable('systemd-growfs',
2652 'src/partition/growfs.c',
2653 include_directories : includes,
2654 link_with : [libshared],
2655 dependencies : [libcryptsetup],
2656 install_rpath : rootlibexecdir,
2658 install_dir : rootlibexecdir)
2662 'src/partition/makefs.c',
2663 include_directories : includes,
2664 link_with : [libshared],
2665 install_rpath : rootlibexecdir,
2667 install_dir : rootlibexecdir)
2671 'src/sleep/sleep.c',
2672 include_directories : includes,
2673 link_with : [libshared],
2674 install_rpath : rootlibexecdir,
2676 install_dir : rootlibexecdir)
2678 install_data('src/sleep/sleep.conf',
2679 install_dir : pkgsysconfdir)
2681 public_programs += executable(
2683 'src/sysctl/sysctl.c',
2684 include_directories : includes,
2685 link_with : [libshared],
2686 install_rpath : rootlibexecdir,
2688 install_dir : rootlibexecdir)
2692 'src/ac-power/ac-power.c',
2693 include_directories : includes,
2694 link_with : [libshared],
2695 install_rpath : rootlibexecdir,
2697 install_dir : rootlibexecdir)
2699 public_programs += executable(
2700 'systemd-detect-virt',
2701 'src/detect-virt/detect-virt.c',
2702 include_directories : includes,
2703 link_with : [libshared],
2704 install_rpath : rootlibexecdir,
2707 public_programs += executable(
2709 'src/delta/delta.c',
2710 include_directories : includes,
2711 link_with : [libshared],
2712 install_rpath : rootlibexecdir,
2715 public_programs += executable(
2717 'src/escape/escape.c',
2718 include_directories : includes,
2719 link_with : [libshared],
2720 install_rpath : rootlibexecdir,
2722 install_dir : rootbindir)
2724 public_programs += executable(
2726 'src/notify/notify.c',
2727 include_directories : includes,
2728 link_with : [libshared],
2729 install_rpath : rootlibexecdir,
2731 install_dir : rootbindir)
2734 'systemd-volatile-root',
2735 'src/volatile-root/volatile-root.c',
2736 include_directories : includes,
2737 link_with : [libshared],
2738 install_rpath : rootlibexecdir,
2740 install_dir : rootlibexecdir)
2743 'systemd-cgroups-agent',
2744 'src/cgroups-agent/cgroups-agent.c',
2745 include_directories : includes,
2746 link_with : [libshared],
2747 install_rpath : rootlibexecdir,
2749 install_dir : rootlibexecdir)
2751 public_programs += executable(
2753 'src/id128/id128.c',
2754 include_directories : includes,
2755 link_with : [libshared],
2756 install_rpath : rootlibexecdir,
2759 public_programs += executable(
2762 include_directories : includes,
2763 link_with : [libshared],
2764 install_rpath : rootlibexecdir,
2767 public_programs += executable(
2768 'systemd-ask-password',
2769 'src/ask-password/ask-password.c',
2770 include_directories : includes,
2771 link_with : [libshared],
2772 install_rpath : rootlibexecdir,
2774 install_dir : rootbindir)
2777 'systemd-reply-password',
2778 'src/reply-password/reply-password.c',
2779 include_directories : includes,
2780 link_with : [libshared],
2781 install_rpath : rootlibexecdir,
2783 install_dir : rootlibexecdir)
2785 public_programs += executable(
2786 'systemd-tty-ask-password-agent',
2787 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2788 include_directories : includes,
2789 link_with : [libshared],
2790 install_rpath : rootlibexecdir,
2792 install_dir : rootbindir)
2794 public_programs += executable(
2797 include_directories : includes,
2798 link_with : [libshared],
2799 install_rpath : rootlibexecdir,
2802 public_programs += executable(
2804 'src/cgtop/cgtop.c',
2805 include_directories : includes,
2806 link_with : [libshared],
2807 install_rpath : rootlibexecdir,
2812 'src/initctl/initctl.c',
2813 include_directories : includes,
2814 link_with : [libshared],
2815 install_rpath : rootlibexecdir,
2817 install_dir : rootlibexecdir)
2819 public_programs += executable(
2821 'src/mount/mount-tool.c',
2822 include_directories : includes,
2823 link_with : [libshared],
2824 dependencies: [libmount],
2825 install_rpath : rootlibexecdir,
2828 meson.add_install_script(meson_make_symlink,
2829 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2831 public_programs += executable(
2834 include_directories : includes,
2835 link_with : [libshared],
2836 install_rpath : rootlibexecdir,
2839 public_programs += executable(
2840 'systemd-stdio-bridge',
2841 'src/stdio-bridge/stdio-bridge.c',
2842 include_directories : includes,
2843 link_with : [libshared],
2844 dependencies : [versiondep],
2845 install_rpath : rootlibexecdir,
2848 public_programs += executable(
2850 'src/busctl/busctl.c',
2851 'src/busctl/busctl-introspect.c',
2852 'src/busctl/busctl-introspect.h',
2853 include_directories : includes,
2854 link_with : [libshared],
2855 install_rpath : rootlibexecdir,
2858 if conf.get('ENABLE_SYSUSERS') == 1
2859 public_programs += executable(
2861 'src/sysusers/sysusers.c',
2862 include_directories : includes,
2863 link_with : [libshared],
2864 install_rpath : rootlibexecdir,
2866 install_dir : rootbindir)
2869 if conf.get('ENABLE_TMPFILES') == 1
2872 'src/tmpfiles/tmpfiles.c',
2873 include_directories : includes,
2874 link_with : [libshared],
2875 dependencies : [libacl],
2876 install_rpath : rootlibexecdir,
2878 install_dir : rootbindir)
2879 public_programs += exe
2881 if want_tests != 'false'
2882 test('test-systemd-tmpfiles',
2883 test_systemd_tmpfiles_py,
2884 # https://github.com/mesonbuild/meson/issues/2681
2885 args : exe.full_path())
2889 if conf.get('ENABLE_HWDB') == 1
2890 public_programs += executable(
2893 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2894 include_directories : includes,
2895 link_with : [libudev_static],
2896 install_rpath : udev_rpath,
2898 install_dir : rootbindir)
2901 if conf.get('ENABLE_QUOTACHECK') == 1
2903 'systemd-quotacheck',
2904 'src/quotacheck/quotacheck.c',
2905 include_directories : includes,
2906 link_with : [libshared],
2907 install_rpath : rootlibexecdir,
2909 install_dir : rootlibexecdir)
2912 public_programs += executable(
2913 'systemd-socket-proxyd',
2914 'src/socket-proxy/socket-proxyd.c',
2915 include_directories : includes,
2916 link_with : [libshared],
2917 dependencies : [threads],
2918 install_rpath : rootlibexecdir,
2920 install_dir : rootlibexecdir)
2922 public_programs += executable(
2924 systemd_udevd_sources,
2925 include_directories : includes,
2926 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2927 link_with : [libudev_core,
2930 dependencies : [versiondep,
2936 install_rpath : udev_rpath,
2938 install_dir : rootlibexecdir)
2940 public_programs += executable(
2943 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2944 include_directories : includes,
2945 link_with : [libudev_core,
2948 dependencies : [versiondep,
2954 install_rpath : udev_rpath,
2956 install_dir : rootbindir)
2960 systemd_shutdown_sources,
2961 include_directories : includes,
2962 link_with : [libcore_shared,
2964 dependencies : [libmount],
2965 install_rpath : rootlibexecdir,
2967 install_dir : rootlibexecdir)
2970 'systemd-update-done',
2971 'src/update-done/update-done.c',
2972 include_directories : includes,
2973 link_with : [libshared],
2974 install_rpath : rootlibexecdir,
2976 install_dir : rootlibexecdir)
2979 'systemd-update-utmp',
2980 'src/update-utmp/update-utmp.c',
2981 include_directories : includes,
2982 link_with : [libshared],
2983 dependencies : [libaudit],
2984 install_rpath : rootlibexecdir,
2986 install_dir : rootlibexecdir)
2988 if conf.get('HAVE_KMOD') == 1
2990 'systemd-modules-load',
2991 'src/modules-load/modules-load.c',
2992 include_directories : includes,
2993 link_with : [libshared],
2994 dependencies : [libkmod],
2995 install_rpath : rootlibexecdir,
2997 install_dir : rootlibexecdir)
2999 meson.add_install_script('sh', '-c',
3000 mkdir_p.format(modulesloaddir))
3001 meson.add_install_script('sh', '-c',
3002 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
3005 public_programs += executable(
3007 systemd_nspawn_sources,
3008 include_directories : includes,
3009 link_with : [libcore_shared,
3012 dependencies : [libblkid,
3014 install_rpath : rootlibexecdir,
3017 if conf.get('ENABLE_NETWORKD') == 1
3020 systemd_networkd_sources,
3021 include_directories : network_include_dir,
3022 link_with : [libnetworkd_core,
3025 networkd_link_with],
3026 dependencies : [threads],
3027 install_rpath : rootlibexecdir,
3029 install_dir : rootlibexecdir)
3032 'systemd-networkd-wait-online',
3033 systemd_networkd_wait_online_sources,
3034 include_directories : includes,
3035 link_with : [libnetworkd_core,
3036 networkd_link_with],
3037 install_rpath : rootlibexecdir,
3039 install_dir : rootlibexecdir)
3041 public_programs += executable(
3044 include_directories : includes,
3045 link_with : [libsystemd_network,
3046 networkd_link_with],
3047 install_rpath : rootlibexecdir,
3049 install_dir : rootbindir)
3052 'systemd-network-generator',
3053 network_generator_sources,
3054 include_directories : includes,
3055 link_with : [networkd_link_with],
3056 install_rpath : rootlibexecdir,
3058 install_dir : rootlibexecdir)
3060 if want_tests != 'false'
3061 test('test-network-generator-conversion',
3062 test_network_generator_conversion_sh,
3063 # https://github.com/mesonbuild/meson/issues/2681
3064 args : exe.full_path())
3069 'systemd-sulogin-shell',
3070 ['src/sulogin-shell/sulogin-shell.c'],
3071 include_directories : includes,
3072 link_with : [libshared],
3073 install_rpath : rootlibexecdir,
3075 install_dir : rootlibexecdir)
3077 ############################################################
3080 'systemd-runtest.env',
3081 output : 'systemd-runtest.env',
3082 command : ['sh', '-c', '{ ' +
3083 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
3084 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
3086 build_by_default : true)
3088 foreach tuple : tests
3090 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3091 dependencies = tuple[2]
3092 condition = tuple.length() >= 4 ? tuple[3] : ''
3093 type = tuple.length() >= 5 ? tuple[4] : ''
3094 defs = tuple.length() >= 6 ? tuple[5] : []
3095 incs = tuple.length() >= 7 ? tuple[6] : includes
3098 name = sources[0].split('/')[-1].split('.')[0]
3099 if type.startswith('timeout=')
3100 timeout = type.split('=')[1].to_int()
3104 if condition == '' or conf.get(condition) == 1
3108 include_directories : incs,
3109 link_with : link_with,
3110 dependencies : [versiondep,
3113 build_by_default : want_tests != 'false',
3114 install_rpath : rootlibexecdir,
3115 install : install_tests,
3116 install_dir : join_paths(testsdir, type))
3119 message('@0@ is a manual test'.format(name))
3120 elif type == 'unsafe' and want_tests != 'unsafe'
3121 message('@0@ is an unsafe test'.format(name))
3122 elif want_tests != 'false'
3128 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3133 'test-libsystemd-sym',
3134 test_libsystemd_sym_c,
3135 include_directories : includes,
3136 link_with : [libsystemd],
3137 build_by_default : want_tests != 'false',
3138 install : install_tests,
3139 install_dir : testsdir)
3140 if want_tests != 'false'
3141 test('test-libsystemd-sym', exe)
3145 'test-libsystemd-static-sym',
3146 test_libsystemd_sym_c,
3147 include_directories : includes,
3148 link_with : [install_libsystemd_static],
3149 dependencies : [threads], # threads is already included in dependencies on the library,
3150 # but does not seem to get propagated. Add here as a work-around.
3151 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3152 install : install_tests and static_libsystemd_pic,
3153 install_dir : testsdir)
3154 if want_tests != 'false' and static_libsystemd_pic
3155 test('test-libsystemd-static-sym', exe)
3161 include_directories : includes,
3162 c_args : '-Wno-deprecated-declarations',
3163 link_with : [libudev],
3164 build_by_default : want_tests != 'false',
3165 install : install_tests,
3166 install_dir : testsdir)
3167 if want_tests != 'false'
3168 test('test-libudev-sym', exe)
3172 'test-libudev-static-sym',
3174 include_directories : includes,
3175 c_args : '-Wno-deprecated-declarations',
3176 link_with : [install_libudev_static],
3177 build_by_default : want_tests != 'false' and static_libudev_pic,
3178 install : install_tests and static_libudev_pic,
3179 install_dir : testsdir)
3180 if want_tests != 'false' and static_libudev_pic
3181 test('test-libudev-static-sym', exe)
3184 ############################################################
3188 if get_option('tests') != 'false'
3189 foreach tuple : fuzzers
3191 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3192 dependencies = tuple[2]
3193 defs = tuple.length() >= 4 ? tuple[3] : []
3194 incs = tuple.length() >= 5 ? tuple[4] : includes
3198 dependencies += fuzzing_engine
3200 if fuzzing_engine.found()
3201 dependencies += fuzzing_engine
3203 link_args += ['-fsanitize=fuzzer']
3206 sources += 'src/fuzz/fuzz-main.c'
3209 name = sources[0].split('/')[-1].split('.')[0]
3211 fuzzer_exes += executable(
3214 include_directories : [incs, include_directories('src/fuzz')],
3215 link_with : link_with,
3216 dependencies : dependencies,
3218 link_args: link_args,
3225 depends : fuzzer_exes,
3228 ############################################################
3230 make_directive_index_py = find_program('tools/make-directive-index.py')
3231 make_man_index_py = find_program('tools/make-man-index.py')
3232 xml_helper_py = find_program('tools/xml_helper.py')
3233 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
3234 autosuspend_update_sh = find_program('tools/meson-autosuspend-update.sh')
3237 subdir('sysusers.d')
3238 subdir('tmpfiles.d')
3244 subdir('shell-completion/bash')
3245 subdir('shell-completion/zsh')
3246 subdir('docs/sysvinit')
3247 subdir('docs/var-log')
3249 install_subdir('factory/etc',
3250 install_dir : factorydir)
3252 install_data('xorg/50-systemd-user.sh',
3253 install_dir : xinitrcdir)
3254 install_data('modprobe.d/systemd.conf',
3255 install_dir : modprobedir)
3256 install_data('LICENSE.GPL2',
3260 'docs/CODING_STYLE.md',
3261 'docs/DISTRO_PORTING.md',
3262 'docs/ENVIRONMENT.md',
3264 'docs/TRANSIENT-SETTINGS.md',
3265 'docs/TRANSLATORS.md',
3266 'docs/UIDS-GIDS.md',
3267 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3268 install_dir : docdir)
3270 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3271 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3273 ############################################################
3275 meson_check_help = find_program('tools/meson-check-help.sh')
3277 foreach exec : public_programs
3278 name = exec.full_path().split('/')[-1]
3279 if want_tests != 'false'
3280 test('check-help-' + name,
3282 args : exec.full_path())
3286 ############################################################
3288 check_directives_sh = find_program('tools/check-directives.sh')
3290 if want_tests != 'false'
3291 test('check-directives',
3292 check_directives_sh,
3293 args : project_source_root)
3296 ############################################################
3298 # Enable tests for all supported sanitizers
3299 foreach tuple : sanitizers
3300 sanitizer = tuple[0]
3303 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3305 foreach p : fuzz_regression_tests
3306 b = p.split('/')[-2]
3307 c = p.split('/')[-1]
3309 name = '@0@:@1@'.format(b, sanitizer)
3312 if want_tests == 'false'
3313 message('Not compiling @0@ because tests is set to false'.format(name))
3315 exe = custom_target(
3319 command : [env, 'ln', '-fs',
3320 join_paths(build.full_path(), b),
3322 build_by_default : true)
3324 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3329 if want_tests != 'false' and slow_tests
3330 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3332 args : [exe.full_path(),
3333 join_paths(project_source_root, p)])
3340 ############################################################
3343 all_files = run_command(
3345 ['--git-dir=@0@/.git'.format(project_source_root),
3348 all_files = files(all_files.stdout().split())
3353 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3356 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3360 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3363 command : [meson_git_contrib_sh])
3367 git_head = run_command(
3369 ['--git-dir=@0@/.git'.format(project_source_root),
3370 'rev-parse', 'HEAD']).stdout().strip()
3371 git_head_short = run_command(
3373 ['--git-dir=@0@/.git'.format(project_source_root),
3374 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3378 command : ['git', 'archive',
3379 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3381 '--prefix', 'systemd-@0@/'.format(git_head),
3385 ############################################################
3387 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3390 depends : [man, libsystemd, libudev],
3391 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3393 ############################################################
3394 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3397 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3399 'split /usr: @0@'.format(split_usr),
3400 'split bin-sbin: @0@'.format(split_bin),
3401 'prefix directory: @0@'.format(prefixdir),
3402 'rootprefix directory: @0@'.format(rootprefixdir),
3403 'sysconf directory: @0@'.format(sysconfdir),
3404 'include directory: @0@'.format(includedir),
3405 'lib directory: @0@'.format(libdir),
3406 'rootlib directory: @0@'.format(rootlibdir),
3407 'SysV init scripts: @0@'.format(sysvinit_path),
3408 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3409 'PAM modules directory: @0@'.format(pamlibdir),
3410 'PAM configuration directory: @0@'.format(pamconfdir),
3411 'RPM macros directory: @0@'.format(rpmmacrosdir),
3412 'modprobe.d directory: @0@'.format(modprobedir),
3413 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3414 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3415 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3416 'bash completions directory: @0@'.format(bashcompletiondir),
3417 'zsh completions directory: @0@'.format(zshcompletiondir),
3418 'extra start script: @0@'.format(get_option('rc-local')),
3419 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3420 get_option('debug-tty')),
3421 'TTY GID: @0@'.format(tty_gid),
3422 'users GID: @0@'.format(substs.get('USERS_GID')),
3423 'maximum system UID: @0@'.format(system_uid_max),
3424 'maximum system GID: @0@'.format(system_gid_max),
3425 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3426 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3427 'minimum container UID base: @0@'.format(container_uid_base_min),
3428 'maximum container UID base: @0@'.format(container_uid_base_max),
3429 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3430 'render group access mode: @0@'.format(get_option('group-render-mode')),
3431 'certificate root directory: @0@'.format(get_option('certificate-root')),
3432 'support URL: @0@'.format(support_url),
3433 'nobody user name: @0@'.format(nobody_user),
3434 'nobody group name: @0@'.format(nobody_group),
3435 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3436 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3438 'default DNSSEC mode: @0@'.format(default_dnssec),
3439 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3440 'default mDNS mode: @0@'.format(default_mdns),
3441 'default LLMNR mode: @0@'.format(default_llmnr),
3442 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3443 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3444 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3445 'default locale: @0@'.format(default_locale),
3446 'default user $PATH: @0@'.format(default_user_path_display),
3447 'systemd service watchdog: @0@'.format(watchdog_opt)]
3449 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3450 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3452 'default DNS servers: @0@'.format(alt_dns_servers),
3453 'default NTP servers: @0@'.format(alt_ntp_servers)]
3455 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3456 '@@0@'.format(time_epoch)).stdout().strip()
3458 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3461 'static libsystemd: @0@'.format(static_libsystemd),
3462 'static libudev: @0@'.format(static_libudev)]
3465 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3466 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3467 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3469 if conf.get('ENABLE_EFI') == 1
3470 status += 'efi arch: @0@'.format(efi_arch)
3474 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3475 'EFI CC @0@'.format(' '.join(efi_cc)),
3476 'EFI lds: @0@'.format(efi_lds),
3477 'EFI crt0: @0@'.format(efi_crt0),
3478 'EFI include directory: @0@'.format(efi_incdir)]
3536 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3537 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3541 ['legacy pkla', install_polkit_pkla],
3543 ['gnu-efi', have_gnu_efi],
3556 ['man pages', want_man],
3557 ['html pages', want_html],
3558 ['man page indices', want_man and have_lxml],
3563 ['adm group', get_option('adm-group')],
3564 ['wheel group', get_option('wheel-group')],
3567 ['debug mmap cache'],
3569 ['valgrind', conf.get('VALGRIND') == 1],
3570 ['trace logging', conf.get('LOG_TRACE') == 1],
3571 ['install tests', install_tests],
3572 ['link-udev-shared', get_option('link-udev-shared')],
3573 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3574 ['link-networkd-shared', get_option('link-networkd-shared')],
3575 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3576 ['kernel-install', get_option('kernel-install')],
3577 ['systemd-analyze', get_option('analyze')],
3580 if tuple.length() >= 2
3583 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3584 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3585 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3596 'enabled features: @0@'.format(', '.join(found)),
3598 'disabled features: @0@'.format(', '.join(missing)),
3600 message('\n '.join(status))
3602 if rootprefixdir != rootprefix_default
3604 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3605 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3606 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))