1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
13 meson_version : '>= 0.46',
16 libsystemd_version = '0.27.1'
17 libudev_version = '1.6.16'
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())
26 substs = configuration_data()
27 substs.set('PROJECT_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
28 substs.set('PROJECT_VERSION', meson.project_version())
30 # This is to be used instead of meson.source_root(), as the latter will return
31 # the wrong result when systemd is being built as a meson subproject
32 project_source_root = meson.current_source_dir()
33 relative_source_path = run_command('realpath',
34 '--relative-to=@0@'.format(meson.current_build_dir()),
35 project_source_root).stdout().strip()
36 conf.set_quoted('RELATIVE_SOURCE_PATH', relative_source_path)
38 want_ossfuzz = get_option('oss-fuzz')
39 want_libfuzzer = get_option('llvm-fuzz')
40 want_fuzzbuzz = get_option('fuzzbuzz')
41 if want_ossfuzz + want_libfuzzer + want_fuzzbuzz > 1
42 error('only one of oss-fuzz, llvm-fuzz or fuzzbuzz can be specified')
45 skip_deps = want_ossfuzz or want_libfuzzer
46 fuzzer_build = want_ossfuzz or want_libfuzzer or want_fuzzbuzz
48 #####################################################################
50 # Try to install the git pre-commit hook
51 git_hook = run_command(join_paths(project_source_root, 'tools/add-git-hook.sh'))
52 if git_hook.returncode() == 0
53 message(git_hook.stdout().strip())
56 #####################################################################
58 if get_option('split-usr') == 'auto'
59 split_usr = run_command('test', '-L', '/bin').returncode() != 0
61 split_usr = get_option('split-usr') == 'true'
63 conf.set10('HAVE_SPLIT_USR', split_usr,
64 description : '/usr/bin and /bin directories are separate')
66 if get_option('split-bin') == 'auto'
67 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
69 split_bin = get_option('split-bin') == 'true'
71 conf.set10('HAVE_SPLIT_BIN', split_bin,
72 description : 'bin and sbin directories are separate')
74 rootprefixdir = get_option('rootprefix')
75 # Unusual rootprefixdir values are used by some distros
76 # (see https://github.com/systemd/systemd/pull/7461).
77 rootprefix_default = split_usr ? '/' : '/usr'
78 if rootprefixdir == ''
79 rootprefixdir = rootprefix_default
81 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
83 sysvinit_path = get_option('sysvinit-path')
84 sysvrcnd_path = get_option('sysvrcnd-path')
85 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
86 description : 'SysV init scripts and rcN.d links are supported')
88 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
89 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
90 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
92 # join_paths ignores the preceding arguments if an absolute component is
93 # encountered, so this should canonicalize various paths when they are
94 # absolute or relative.
95 prefixdir = get_option('prefix')
96 if not prefixdir.startswith('/')
97 error('Prefix is not absolute: "@0@"'.format(prefixdir))
99 bindir = join_paths(prefixdir, get_option('bindir'))
100 libdir = join_paths(prefixdir, get_option('libdir'))
101 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
102 includedir = join_paths(prefixdir, get_option('includedir'))
103 datadir = join_paths(prefixdir, get_option('datadir'))
104 localstatedir = join_paths('/', get_option('localstatedir'))
106 rootbindir = join_paths(rootprefixdir, 'bin')
107 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
108 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
110 rootlibdir = get_option('rootlibdir')
112 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
115 # Dirs of external packages
116 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
117 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
118 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
119 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
120 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
121 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
122 rpmmacrosdir = get_option('rpmmacrosdir')
123 if rpmmacrosdir != 'no'
124 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
126 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
129 pkgdatadir = join_paths(datadir, 'systemd')
130 environmentdir = join_paths(prefixdir, 'lib/environment.d')
131 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
132 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
133 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
134 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
135 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
136 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
137 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
138 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
139 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
140 pkgincludedir = join_paths(includedir, 'systemd')
141 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
142 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
143 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
144 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
145 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
146 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
147 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
148 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
149 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
150 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
151 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
152 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
153 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
154 factorydir = join_paths(datadir, 'factory')
155 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
156 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
157 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
158 catalogstatedir = join_paths(systemdstatedir, 'catalog')
159 randomseeddir = join_paths(localstatedir, 'lib/systemd')
160 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
161 ntpservicelistdir = join_paths(rootprefixdir, 'lib/systemd/ntp-units.d')
163 docdir = get_option('docdir')
165 docdir = join_paths(datadir, 'doc/systemd')
168 dbuspolicydir = get_option('dbuspolicydir')
169 if dbuspolicydir == ''
170 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
173 dbussessionservicedir = get_option('dbussessionservicedir')
174 if dbussessionservicedir == ''
175 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
178 dbussystemservicedir = get_option('dbussystemservicedir')
179 if dbussystemservicedir == ''
180 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
183 pamlibdir = get_option('pamlibdir')
185 pamlibdir = join_paths(rootlibdir, 'security')
188 pamconfdir = get_option('pamconfdir')
190 pamconfdir = join_paths(sysconfdir, 'pam.d')
193 memory_accounting_default = get_option('memory-accounting-default')
194 status_unit_format_default = get_option('status-unit-format-default')
196 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
197 conf.set_quoted('SYSTEM_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'system'))
198 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
199 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
200 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
201 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
203 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
205 conf.set_quoted('USER_CONFIG_UNIT_PATH', join_paths(pkgsysconfdir, 'user'))
206 conf.set_quoted('USER_DATA_UNIT_PATH', userunitdir)
207 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
208 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
209 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
210 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
211 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
212 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
213 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
214 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
215 conf.set_quoted('SYSTEMD_SLEEP_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-sleep'))
216 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
217 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
218 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
219 conf.set_quoted('ROOTPREFIX', rootprefixdir)
220 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
221 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
222 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
223 conf.set_quoted('SYSTEM_GENERATOR_PATH', systemgeneratordir)
224 conf.set_quoted('USER_GENERATOR_PATH', usergeneratordir)
225 conf.set_quoted('SYSTEM_ENV_GENERATOR_PATH', systemenvgeneratordir)
226 conf.set_quoted('USER_ENV_GENERATOR_PATH', userenvgeneratordir)
227 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
228 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
229 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
230 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
231 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
232 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
233 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
234 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
235 conf.set_quoted('LIBDIR', libdir)
236 conf.set_quoted('ROOTLIBDIR', rootlibdir)
237 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
238 conf.set_quoted('BOOTLIBDIR', bootlibdir)
239 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
240 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
241 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
242 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
243 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
244 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
245 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
246 conf.set_quoted('SYSTEMD_USERWORK_PATH', join_paths(rootlibexecdir, 'systemd-userwork'))
247 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
248 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
249 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
251 substs.set('prefix', prefixdir)
252 substs.set('rootprefix', rootprefixdir)
253 substs.set('rootprefix_noslash', rootprefixdir_noslash)
254 substs.set('exec_prefix', prefixdir)
255 substs.set('libdir', libdir)
256 substs.set('rootlibdir', rootlibdir)
257 substs.set('includedir', includedir)
258 substs.set('sysconfdir', sysconfdir)
259 substs.set('bindir', bindir)
260 substs.set('rootbindir', rootbindir)
261 substs.set('rootlibexecdir', rootlibexecdir)
262 substs.set('systemunitdir', systemunitdir)
263 substs.set('userunitdir', userunitdir)
264 substs.set('systempresetdir', systempresetdir)
265 substs.set('userpresetdir', userpresetdir)
266 substs.set('udevhwdbdir', udevhwdbdir)
267 substs.set('udevrulesdir', udevrulesdir)
268 substs.set('udevlibexecdir', udevlibexecdir)
269 substs.set('environmentdir', environmentdir)
270 substs.set('catalogdir', catalogdir)
271 substs.set('tmpfilesdir', tmpfilesdir)
272 substs.set('sysusersdir', sysusersdir)
273 substs.set('sysctldir', sysctldir)
274 substs.set('binfmtdir', binfmtdir)
275 substs.set('modulesloaddir', modulesloaddir)
276 substs.set('modprobedir', modprobedir)
277 substs.set('systemgeneratordir', systemgeneratordir)
278 substs.set('usergeneratordir', usergeneratordir)
279 substs.set('systemenvgeneratordir', systemenvgeneratordir)
280 substs.set('userenvgeneratordir', userenvgeneratordir)
281 substs.set('systemshutdowndir', systemshutdowndir)
282 substs.set('systemsleepdir', systemsleepdir)
283 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
284 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
285 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
286 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
287 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
288 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
289 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
290 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
291 substs.set('BUILD_ROOT', meson.current_build_dir())
293 #####################################################################
295 cc = meson.get_compiler('c')
296 pkgconfig = import('pkgconfig')
297 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
298 meson_build_sh = find_program('tools/meson-build.sh')
300 want_tests = get_option('tests')
301 slow_tests = want_tests != 'false' and get_option('slow-tests')
302 install_tests = get_option('install-tests')
304 if add_languages('cpp', required : fuzzer_build)
305 # Used only for tests
306 cxx = meson.get_compiler('cpp')
307 cxx_cmd = ' '.join(cxx.cmd_array())
313 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
314 if fuzzing_engine.found()
315 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
316 elif cc.has_argument('-fsanitize=fuzzer-no-link')
317 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
319 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
322 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
324 fuzzing_engine = meson.get_compiler('cpp').find_library(get_option('fuzzbuzz-engine'), dirs: get_option('fuzzbuzz-engine-dir'))
327 # Those generate many false positives, and we do not want to change the code to
329 basic_disabled_warnings = [
330 '-Wno-unused-parameter',
331 '-Wno-missing-field-initializers',
332 '-Wno-unused-result',
333 '-Wno-format-signedness',
335 if get_option('b_ndebug') == 'true'
336 # With asserts disabled with get a bunch of warnings about variables which
337 # are used only in the asserts. This is not useful at all, so let's just silence
339 basic_disabled_warnings += [
340 '-Wno-unused-variable',
341 '-Wno-unused-but-set-variable',
345 possible_cc_flags = [
348 '-Wmissing-include-dirs',
349 '-Wold-style-definition',
353 '-Wsuggest-attribute=noreturn',
354 '-Werror=missing-prototypes',
355 '-Werror=implicit-function-declaration',
356 '-Werror=missing-declarations',
357 '-Werror=return-type',
358 '-Werror=incompatible-pointer-types',
360 '-Wstrict-prototypes',
362 '-Wmissing-noreturn',
363 '-Wimplicit-fallthrough=5',
366 '-Wstrict-aliasing=2',
369 '-Werror=shift-count-overflow',
370 '-Werror=shift-overflow=2',
374 # negative arguments are correctly detected starting with meson 0.46.
375 '-Wno-error=#warnings', # clang
376 '-Wno-string-plus-int', # clang
378 # work-around for gcc 7.1 turning this on on its own.
379 '-Wno-error=nonnull',
381 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
382 # optimizations enabled, producing essentially false positives.
383 '-Wno-maybe-uninitialized',
387 '-fdiagnostics-show-option',
388 '-fno-strict-aliasing',
389 '-fvisibility=hidden',
391 '-fstack-protector-strong',
392 '--param=ssp-buffer-size=4',
395 # --as-needed and --no-undefined are provided by meson by default,
396 # run mesonconf to see what is enabled
397 possible_link_flags = [
403 if cc.get_id() == 'clang'
404 possible_cc_flags += [
405 '-Wno-typedef-redefinition',
406 '-Wno-gnu-variable-sized-type-not-at-end',
410 if get_option('buildtype') != 'debug'
411 possible_cc_flags += [
412 '-ffunction-sections',
416 possible_link_flags += '-Wl,--gc-sections'
419 add_project_arguments(cc.get_supported_arguments(basic_disabled_warnings), language : 'c')
420 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
421 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
425 #include <inttypes.h>
426 typedef uint64_t usec_t;
427 usec_t now(clockid_t clock);
432 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
433 add_project_arguments('-Werror=shadow', language : 'c')
437 add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp')
440 cpp = ' '.join(cc.cmd_array()) + ' -E'
442 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
444 #####################################################################
445 # compilation result tests
447 conf.set('_GNU_SOURCE', true)
448 conf.set('__SANE_USERSPACE_TYPES__', true)
449 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
451 conf.set('SIZEOF_PID_T', cc.sizeof('pid_t', prefix : '#include <sys/types.h>'))
452 conf.set('SIZEOF_UID_T', cc.sizeof('uid_t', prefix : '#include <sys/types.h>'))
453 conf.set('SIZEOF_GID_T', cc.sizeof('gid_t', prefix : '#include <sys/types.h>'))
454 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
455 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
456 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
457 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
461 #include <sys/stat.h>
464 foreach decl : ['char16_t',
469 # We get -1 if the size cannot be determined
470 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
472 if decl == 'struct statx'
474 want_linux_stat_h = false
476 have = cc.sizeof(decl,
477 prefix : decl_headers + '#include <linux/stat.h>',
478 args : '-D_GNU_SOURCE') > 0
479 want_linux_stat_h = have
483 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
486 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
488 foreach ident : ['secure_getenv', '__secure_getenv']
489 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
493 ['memfd_create', '''#include <sys/mman.h>'''],
494 ['gettid', '''#include <sys/types.h>
495 #include <unistd.h>'''],
496 ['pivot_root', '''#include <stdlib.h>
497 #include <unistd.h>'''], # no known header declares pivot_root
498 ['name_to_handle_at', '''#include <sys/types.h>
499 #include <sys/stat.h>
500 #include <fcntl.h>'''],
501 ['setns', '''#include <sched.h>'''],
502 ['renameat2', '''#include <stdio.h>
503 #include <fcntl.h>'''],
504 ['kcmp', '''#include <linux/kcmp.h>'''],
505 ['keyctl', '''#include <sys/types.h>
506 #include <keyutils.h>'''],
507 ['copy_file_range', '''#include <sys/syscall.h>
508 #include <unistd.h>'''],
509 ['bpf', '''#include <sys/syscall.h>
510 #include <unistd.h>'''],
511 ['statx', '''#include <sys/types.h>
512 #include <sys/stat.h>
513 #include <unistd.h>'''],
514 ['explicit_bzero' , '''#include <string.h>'''],
515 ['reallocarray', '''#include <malloc.h>'''],
516 ['set_mempolicy', '''#include <stdlib.h>
517 #include <unistd.h>'''],
518 ['get_mempolicy', '''#include <stdlib.h>
519 #include <unistd.h>'''],
520 ['pidfd_send_signal', '''#include <stdlib.h>
523 #include <sys/wait.h>'''],
524 ['pidfd_open', '''#include <stdlib.h>
527 #include <sys/wait.h>'''],
528 ['rt_sigqueueinfo', '''#include <stdlib.h>
531 #include <sys/wait.h>'''],
534 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
535 conf.set10('HAVE_' + ident[0].to_upper(), have)
538 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
539 conf.set10('USE_SYS_RANDOM_H', true)
540 conf.set10('HAVE_GETRANDOM', true)
542 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
543 conf.set10('USE_SYS_RANDOM_H', false)
544 conf.set10('HAVE_GETRANDOM', have)
547 #####################################################################
549 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
551 get_option('version-tag'),
552 meson.project_version()]
555 input : 'src/version/version.h.in',
556 output : 'version.h',
559 versiondep = declare_dependency(sources: version_h)
561 sed = find_program('sed')
562 awk = find_program('awk')
563 m4 = find_program('m4')
564 stat = find_program('stat')
565 git = find_program('git', required : false)
566 env = find_program('env')
567 perl = find_program('perl', required : false)
569 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
570 mkdir_p = 'mkdir -p $DESTDIR/@0@'
571 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
572 splash_bmp = files('test/splash.bmp')
574 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
575 # /usr/sbin, /sbin, and fall back to the default from middle column.
576 progs = [['quotaon', '/usr/sbin/quotaon' ],
577 ['quotacheck', '/usr/sbin/quotacheck' ],
578 ['kmod', '/usr/bin/kmod' ],
579 ['kexec', '/usr/sbin/kexec' ],
580 ['sulogin', '/usr/sbin/sulogin' ],
581 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
582 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
583 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
584 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
585 ['nologin', '/usr/sbin/nologin', ],
588 path = get_option(prog[0] + '-path')
590 message('Using @1@ for @0@'.format(prog[0], path))
592 exe = find_program(prog[0],
593 '/usr/sbin/' + prog[0],
596 path = exe.found() ? exe.path() : prog[1]
598 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
599 conf.set_quoted(name, path)
600 substs.set(name, path)
603 conf.set_quoted('TELINIT', get_option('telinit-path'))
605 if run_command('ln', '--relative', '--help').returncode() != 0
606 error('ln does not support --relative (added in coreutils 8.16)')
609 ############################################################
611 gperf = find_program('gperf')
613 gperf_test_format = '''
615 const char * in_word_set(const char *, @0@);
618 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
619 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
620 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
621 if cc.compiles(gperf_test)
622 gperf_len_type = 'size_t'
624 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
625 if cc.compiles(gperf_test)
626 gperf_len_type = 'unsigned'
628 error('unable to determine gperf len type')
631 message('gperf len type is @0@'.format(gperf_len_type))
632 conf.set('GPERF_LEN_TYPE', gperf_len_type,
633 description : 'The type of gperf "len" parameter')
635 ############################################################
637 if not cc.has_header('sys/capability.h')
638 error('POSIX caps headers not found')
640 foreach header : ['crypt.h',
642 'linux/vm_sockets.h',
644 'valgrind/memcheck.h',
645 'valgrind/valgrind.h',
648 conf.set10('HAVE_' + header.underscorify().to_upper(),
649 cc.has_header(header))
652 ############################################################
654 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
655 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
656 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
658 default_hierarchy = get_option('default-hierarchy')
659 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
660 description : 'default cgroup hierarchy as string')
661 if default_hierarchy == 'legacy'
662 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
663 elif default_hierarchy == 'hybrid'
664 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
666 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
669 default_net_naming_scheme = get_option('default-net-naming-scheme')
670 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
672 time_epoch = get_option('time-epoch')
675 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
677 conf.set('TIME_EPOCH', time_epoch)
679 system_uid_max = get_option('system-uid-max')
680 if system_uid_max == -1
681 system_uid_max = run_command(
683 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
684 '/etc/login.defs').stdout().strip()
685 if system_uid_max == ''
688 system_uid_max = system_uid_max.to_int()
691 conf.set('SYSTEM_UID_MAX', system_uid_max)
692 substs.set('systemuidmax', system_uid_max)
694 system_gid_max = get_option('system-gid-max')
695 if system_gid_max == -1
696 system_gid_max = run_command(
698 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
699 '/etc/login.defs').stdout().strip()
700 if system_gid_max == ''
703 system_gid_max = system_gid_max.to_int()
706 conf.set('SYSTEM_GID_MAX', system_gid_max)
707 substs.set('systemgidmax', system_gid_max)
709 dynamic_uid_min = get_option('dynamic-uid-min')
710 dynamic_uid_max = get_option('dynamic-uid-max')
711 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
712 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
713 substs.set('dynamicuidmin', dynamic_uid_min)
714 substs.set('dynamicuidmax', dynamic_uid_max)
716 container_uid_base_min = get_option('container-uid-base-min')
717 container_uid_base_max = get_option('container-uid-base-max')
718 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
719 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
720 substs.set('containeruidbasemin', container_uid_base_min)
721 substs.set('containeruidbasemax', container_uid_base_max)
723 nobody_user = get_option('nobody-user')
724 nobody_group = get_option('nobody-group')
726 if not meson.is_cross_build()
727 getent_result = run_command('getent', 'passwd', '65534')
728 if getent_result.returncode() == 0
729 name = getent_result.stdout().split(':')[0]
730 if name != nobody_user
732 '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) +
733 'Your build will result in an user table setup that is incompatible with the local system.')
736 id_result = run_command('id', '-u', nobody_user)
737 if id_result.returncode() == 0
738 id = id_result.stdout().to_int()
741 '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) +
742 'Your build will result in an user table setup that is incompatible with the local system.')
746 getent_result = run_command('getent', 'group', '65534')
747 if getent_result.returncode() == 0
748 name = getent_result.stdout().split(':')[0]
749 if name != nobody_group
751 '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) +
752 'Your build will result in an group table setup that is incompatible with the local system.')
755 id_result = run_command('id', '-g', nobody_group)
756 if id_result.returncode() == 0
757 id = id_result.stdout().to_int()
760 '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) +
761 'Your build will result in an group table setup that is incompatible with the local system.')
765 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
767 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
768 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
771 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
772 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
773 substs.set('NOBODY_USER_NAME', nobody_user)
774 substs.set('NOBODY_GROUP_NAME', nobody_group)
776 tty_gid = get_option('tty-gid')
777 conf.set('TTY_GID', tty_gid)
778 substs.set('TTY_GID', tty_gid)
780 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
781 users_gid = get_option('users-gid')
782 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
784 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
785 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
787 dev_kvm_mode = get_option('dev-kvm-mode')
788 substs.set('DEV_KVM_MODE', dev_kvm_mode)
789 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
790 group_render_mode = get_option('group-render-mode')
791 substs.set('GROUP_RENDER_MODE', group_render_mode)
792 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
794 kill_user_processes = get_option('default-kill-user-processes')
795 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
796 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
797 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
799 dns_servers = get_option('dns-servers')
800 conf.set_quoted('DNS_SERVERS', dns_servers)
801 substs.set('DNS_SERVERS', dns_servers)
803 ntp_servers = get_option('ntp-servers')
804 conf.set_quoted('NTP_SERVERS', ntp_servers)
805 substs.set('NTP_SERVERS', ntp_servers)
807 default_locale = get_option('default-locale')
808 if default_locale == ''
809 if not meson.is_cross_build()
810 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
811 default_locale = run_command(choose_default_locale_sh).stdout().strip()
813 default_locale = 'C.UTF-8'
816 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
818 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
820 service_watchdog = get_option('service-watchdog')
821 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
822 substs.set('SERVICE_WATCHDOG', watchdog_value)
824 substs.set('SUSHELL', get_option('debug-shell'))
825 substs.set('DEBUGTTY', get_option('debug-tty'))
826 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
828 enable_debug_hashmap = false
829 enable_debug_mmap_cache = false
830 enable_debug_siphash = false
831 foreach name : get_option('debug-extra')
833 enable_debug_hashmap = true
834 elif name == 'mmap-cache'
835 enable_debug_mmap_cache = true
836 elif name == 'siphash'
837 enable_debug_siphash = true
839 message('unknown debug option "@0@", ignoring'.format(name))
842 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
843 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
844 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
846 conf.set10('VALGRIND', get_option('valgrind'))
847 conf.set10('LOG_TRACE', get_option('log-trace'))
849 default_user_path = get_option('user-path')
850 if default_user_path != ''
851 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
852 default_user_path_display = default_user_path
854 # meson 0.49 fails when ?: is used in .format()
855 default_user_path_display = '(same as system services)'
859 #####################################################################
861 threads = dependency('threads')
862 librt = cc.find_library('rt')
863 libm = cc.find_library('m')
864 libdl = cc.find_library('dl')
865 libcrypt = cc.find_library('crypt')
867 libcap = dependency('libcap', required : false)
868 if not libcap.found()
869 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
870 libcap = cc.find_library('cap')
873 libmount = dependency('mount',
874 version : fuzzer_build ? '>= 0' : '>= 2.30')
876 want_libfdisk = get_option('fdisk')
877 if want_libfdisk != 'false' and not skip_deps
878 libfdisk = dependency('fdisk',
879 required : want_libfdisk == 'true')
880 have = libfdisk.found()
885 conf.set10('HAVE_LIBFDISK', have)
887 want_seccomp = get_option('seccomp')
888 if want_seccomp != 'false' and not skip_deps
889 libseccomp = dependency('libseccomp',
890 version : '>= 2.3.1',
891 required : want_seccomp == 'true')
892 have = libseccomp.found()
897 conf.set10('HAVE_SECCOMP', have)
899 want_selinux = get_option('selinux')
900 if want_selinux != 'false' and not skip_deps
901 libselinux = dependency('libselinux',
902 version : '>= 2.1.9',
903 required : want_selinux == 'true')
904 have = libselinux.found()
909 conf.set10('HAVE_SELINUX', have)
911 want_apparmor = get_option('apparmor')
912 if want_apparmor != 'false' and not skip_deps
913 libapparmor = dependency('libapparmor',
914 required : want_apparmor == 'true')
915 have = libapparmor.found()
920 conf.set10('HAVE_APPARMOR', have)
922 smack_run_label = get_option('smack-run-label')
923 if smack_run_label != ''
924 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
927 want_polkit = get_option('polkit')
928 install_polkit = false
929 install_polkit_pkla = false
930 if want_polkit != 'false' and not skip_deps
931 install_polkit = true
933 libpolkit = dependency('polkit-gobject-1',
935 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
936 message('Old polkit detected, will install pkla files')
937 install_polkit_pkla = true
940 conf.set10('ENABLE_POLKIT', install_polkit)
942 want_acl = get_option('acl')
943 if want_acl != 'false' and not skip_deps
944 libacl = cc.find_library('acl', required : want_acl == 'true')
945 have = libacl.found()
950 conf.set10('HAVE_ACL', have)
952 want_audit = get_option('audit')
953 if want_audit != 'false' and not skip_deps
954 libaudit = dependency('audit', required : want_audit == 'true')
955 have = libaudit.found()
960 conf.set10('HAVE_AUDIT', have)
962 want_blkid = get_option('blkid')
963 if want_blkid != 'false' and not skip_deps
964 libblkid = dependency('blkid', required : want_blkid == 'true')
965 have = libblkid.found()
970 conf.set10('HAVE_BLKID', have)
972 want_kmod = get_option('kmod')
973 if want_kmod != 'false' and not skip_deps
974 libkmod = dependency('libkmod',
976 required : want_kmod == 'true')
977 have = libkmod.found()
982 conf.set10('HAVE_KMOD', have)
984 want_pam = get_option('pam')
985 if want_pam != 'false' and not skip_deps
986 libpam = cc.find_library('pam', required : want_pam == 'true')
987 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
988 have = libpam.found() and libpam_misc.found()
994 conf.set10('HAVE_PAM', have)
996 want_microhttpd = get_option('microhttpd')
997 if want_microhttpd != 'false' and not skip_deps
998 libmicrohttpd = dependency('libmicrohttpd',
999 version : '>= 0.9.33',
1000 required : want_microhttpd == 'true')
1001 have = libmicrohttpd.found()
1006 conf.set10('HAVE_MICROHTTPD', have)
1008 want_libcryptsetup = get_option('libcryptsetup')
1009 if want_libcryptsetup != 'false' and not skip_deps
1010 libcryptsetup = dependency('libcryptsetup',
1011 version : '>= 2.0.1',
1012 required : want_libcryptsetup == 'true')
1013 have = libcryptsetup.found()
1018 conf.set10('HAVE_LIBCRYPTSETUP', have)
1020 want_libcurl = get_option('libcurl')
1021 if want_libcurl != 'false' and not skip_deps
1022 libcurl = dependency('libcurl',
1023 version : '>= 7.32.0',
1024 required : want_libcurl == 'true')
1025 have = libcurl.found()
1030 conf.set10('HAVE_LIBCURL', have)
1032 want_libidn = get_option('libidn')
1033 want_libidn2 = get_option('libidn2')
1034 if want_libidn == 'true' and want_libidn2 == 'true'
1035 error('libidn and libidn2 cannot be requested simultaneously')
1038 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1039 libidn = dependency('libidn2',
1040 required : want_libidn2 == 'true')
1041 have = libidn.found()
1046 conf.set10('HAVE_LIBIDN2', have)
1047 if not have and want_libidn != 'false' and not skip_deps
1048 # libidn is used for both libidn and libidn2 objects
1049 libidn = dependency('libidn',
1050 required : want_libidn == 'true')
1051 have = libidn.found()
1055 conf.set10('HAVE_LIBIDN', have)
1057 want_libiptc = get_option('libiptc')
1058 if want_libiptc != 'false' and not skip_deps
1059 libiptc = dependency('libiptc',
1060 required : want_libiptc == 'true')
1061 have = libiptc.found()
1066 conf.set10('HAVE_LIBIPTC', have)
1068 want_qrencode = get_option('qrencode')
1069 if want_qrencode != 'false' and not skip_deps
1070 libqrencode = dependency('libqrencode',
1071 required : want_qrencode == 'true')
1072 have = libqrencode.found()
1077 conf.set10('HAVE_QRENCODE', have)
1079 want_gcrypt = get_option('gcrypt')
1080 if want_gcrypt != 'false' and not skip_deps
1081 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1082 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1083 have = libgcrypt.found() and libgpg_error.found()
1088 # link to neither of the libs if one is not found
1092 conf.set10('HAVE_GCRYPT', have)
1094 want_gnutls = get_option('gnutls')
1095 if want_gnutls != 'false' and not skip_deps
1096 libgnutls = dependency('gnutls',
1097 version : '>= 3.1.4',
1098 required : want_gnutls == 'true')
1099 have = libgnutls.found()
1104 conf.set10('HAVE_GNUTLS', have)
1106 want_openssl = get_option('openssl')
1107 if want_openssl != 'false' and not skip_deps
1108 libopenssl = dependency('openssl',
1109 version : '>= 1.1.0',
1110 required : want_openssl == 'true')
1111 have = libopenssl.found()
1116 conf.set10('HAVE_OPENSSL', have)
1118 want_p11kit = get_option('p11kit')
1119 if want_p11kit != 'false' and not skip_deps
1120 libp11kit = dependency('p11-kit-1',
1121 version : '>= 0.23.3',
1122 required : want_p11kit == 'true')
1123 have = libp11kit.found()
1128 conf.set10('HAVE_P11KIT', have)
1130 want_elfutils = get_option('elfutils')
1131 if want_elfutils != 'false' and not skip_deps
1132 libdw = dependency('libdw',
1133 required : want_elfutils == 'true')
1134 have = libdw.found()
1139 conf.set10('HAVE_ELFUTILS', have)
1141 want_zlib = get_option('zlib')
1142 if want_zlib != 'false' and not skip_deps
1143 libz = dependency('zlib',
1144 required : want_zlib == 'true')
1150 conf.set10('HAVE_ZLIB', have)
1152 want_bzip2 = get_option('bzip2')
1153 if want_bzip2 != 'false' and not skip_deps
1154 libbzip2 = cc.find_library('bz2',
1155 required : want_bzip2 == 'true')
1156 have = libbzip2.found()
1161 conf.set10('HAVE_BZIP2', have)
1163 want_xz = get_option('xz')
1164 if want_xz != 'false' and not skip_deps
1165 libxz = dependency('liblzma',
1166 required : want_xz == 'true')
1167 have = libxz.found()
1172 conf.set10('HAVE_XZ', have)
1174 want_lz4 = get_option('lz4')
1175 if want_lz4 != 'false' and not skip_deps
1176 liblz4 = dependency('liblz4',
1177 version : '>= 1.3.0',
1178 required : want_lz4 == 'true')
1179 have = liblz4.found()
1184 conf.set10('HAVE_LZ4', have)
1186 want_xkbcommon = get_option('xkbcommon')
1187 if want_xkbcommon != 'false' and not skip_deps
1188 libxkbcommon = dependency('xkbcommon',
1189 version : '>= 0.3.0',
1190 required : want_xkbcommon == 'true')
1191 have = libxkbcommon.found()
1196 conf.set10('HAVE_XKBCOMMON', have)
1198 want_pcre2 = get_option('pcre2')
1199 if want_pcre2 != 'false'
1200 libpcre2 = dependency('libpcre2-8',
1201 required : want_pcre2 == 'true')
1202 have = libpcre2.found()
1207 conf.set10('HAVE_PCRE2', have)
1209 want_glib = get_option('glib')
1210 if want_glib != 'false' and not skip_deps
1211 libglib = dependency('glib-2.0',
1212 version : '>= 2.22.0',
1213 required : want_glib == 'true')
1214 libgobject = dependency('gobject-2.0',
1215 version : '>= 2.22.0',
1216 required : want_glib == 'true')
1217 libgio = dependency('gio-2.0',
1218 required : want_glib == 'true')
1219 have = libglib.found() and libgobject.found() and libgio.found()
1226 conf.set10('HAVE_GLIB', have)
1228 want_dbus = get_option('dbus')
1229 if want_dbus != 'false' and not skip_deps
1230 libdbus = dependency('dbus-1',
1231 version : '>= 1.3.2',
1232 required : want_dbus == 'true')
1233 have = libdbus.found()
1238 conf.set10('HAVE_DBUS', have)
1240 default_dnssec = get_option('default-dnssec')
1242 default_dnssec = 'no'
1244 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1245 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1246 default_dnssec = 'no'
1248 conf.set('DEFAULT_DNSSEC_MODE',
1249 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1250 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1252 dns_over_tls = get_option('dns-over-tls')
1253 if dns_over_tls != 'false'
1254 if dns_over_tls == 'openssl'
1257 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1258 if dns_over_tls == 'gnutls' and not have_gnutls
1259 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1262 if dns_over_tls == 'gnutls' or have_gnutls
1263 have_openssl = false
1265 have_openssl = conf.get('HAVE_OPENSSL') == 1
1266 if dns_over_tls != 'auto' and not have_openssl
1267 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1268 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1271 have = have_gnutls or have_openssl
1275 have_openssl = false
1277 conf.set10('ENABLE_DNS_OVER_TLS', have)
1278 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1279 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1281 default_dns_over_tls = get_option('default-dns-over-tls')
1283 default_dns_over_tls = 'no'
1285 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1286 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.')
1287 default_dns_over_tls = 'no'
1289 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1290 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1291 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1293 want_repart = get_option('repart')
1294 if want_repart != 'false'
1295 have = (conf.get('HAVE_OPENSSL') == 1 and
1296 conf.get('HAVE_LIBFDISK') == 1)
1297 if want_repart == 'true' and not have
1298 error('repart support was requested, but dependencies are not available')
1303 conf.set10('ENABLE_REPART', have)
1305 want_importd = get_option('importd')
1306 if want_importd != 'false'
1307 have = (conf.get('HAVE_LIBCURL') == 1 and
1308 conf.get('HAVE_ZLIB') == 1 and
1309 conf.get('HAVE_XZ') == 1 and
1310 conf.get('HAVE_GCRYPT') == 1)
1311 if want_importd == 'true' and not have
1312 error('importd support was requested, but dependencies are not available')
1317 conf.set10('ENABLE_IMPORTD', have)
1319 want_remote = get_option('remote')
1320 if want_remote != 'false'
1321 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1322 conf.get('HAVE_LIBCURL') == 1]
1323 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1324 # it's possible to build one without the other. Complain only if
1325 # support was explicitly requested. The auxiliary files like sysusers
1326 # config should be installed when any of the programs are built.
1327 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1328 error('remote support was requested, but dependencies are not available')
1330 have = have_deps[0] or have_deps[1]
1334 conf.set10('ENABLE_REMOTE', have)
1336 foreach term : ['utmp',
1370 have = get_option(term)
1371 name = 'ENABLE_' + term.underscorify().to_upper()
1372 conf.set10(name, have)
1375 foreach tuple : [['nss-mymachines', 'machined'],
1376 ['nss-resolve', 'resolve']]
1377 want = get_option(tuple[0])
1379 have = get_option(tuple[1])
1380 if want == 'true' and not have
1381 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1386 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1387 conf.set10(name, have)
1391 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1392 'ENABLE_NSS_MYMACHINES',
1393 'ENABLE_NSS_RESOLVE',
1394 'ENABLE_NSS_SYSTEMD']
1395 if conf.get(term) == 1
1399 conf.set10('ENABLE_NSS', enable_nss)
1401 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1406 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1408 #####################################################################
1410 if get_option('efi')
1411 efi_arch = host_machine.cpu_family()
1413 if efi_arch == 'x86'
1414 EFI_MACHINE_TYPE_NAME = 'ia32'
1415 gnu_efi_arch = 'ia32'
1416 elif efi_arch == 'x86_64'
1417 EFI_MACHINE_TYPE_NAME = 'x64'
1418 gnu_efi_arch = 'x86_64'
1419 elif efi_arch == 'arm'
1420 EFI_MACHINE_TYPE_NAME = 'arm'
1421 gnu_efi_arch = 'arm'
1422 elif efi_arch == 'aarch64'
1423 EFI_MACHINE_TYPE_NAME = 'aa64'
1424 gnu_efi_arch = 'aarch64'
1426 EFI_MACHINE_TYPE_NAME = ''
1431 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1433 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1437 conf.set10('ENABLE_EFI', have)
1439 #####################################################################
1441 config_h = configure_file(
1442 output : 'config.h',
1443 configuration : conf)
1445 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1447 includes = include_directories('src/basic',
1452 'src/journal-remote',
1456 'src/time-wait-sync',
1462 'src/libsystemd/sd-bus',
1463 'src/libsystemd/sd-device',
1464 'src/libsystemd/sd-event',
1465 'src/libsystemd/sd-hwdb',
1466 'src/libsystemd/sd-id128',
1467 'src/libsystemd/sd-netlink',
1468 'src/libsystemd/sd-network',
1469 'src/libsystemd/sd-resolve',
1470 'src/libsystemd-network',
1473 add_project_arguments('-include', 'config.h', language : 'c')
1475 generate_gperfs = find_program('tools/generate-gperfs.py')
1479 subdir('src/systemd')
1481 subdir('src/libsystemd')
1482 subdir('src/libsystemd-network')
1483 subdir('src/journal')
1486 libjournal_core = static_library(
1488 libjournal_core_sources,
1490 include_directories : includes,
1493 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1494 libsystemd = shared_library(
1497 version : libsystemd_version,
1498 include_directories : includes,
1499 link_args : ['-shared',
1500 '-Wl,--version-script=' + libsystemd_sym_path],
1501 link_with : [libbasic,
1503 link_whole : [libsystemd_static,
1505 dependencies : [threads,
1509 link_depends : libsystemd_sym,
1511 install_dir : rootlibdir)
1513 static_libsystemd = get_option('static-libsystemd')
1514 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1516 install_libsystemd_static = static_library(
1519 journal_client_sources,
1521 basic_gcrypt_sources,
1523 include_directories : includes,
1524 build_by_default : static_libsystemd != 'false',
1525 install : static_libsystemd != 'false',
1526 install_dir : rootlibdir,
1527 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1528 dependencies : [threads,
1537 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1539 #Generate autosuspend rules
1540 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1542 ############################################################
1544 # binaries that have --help and are intended for use by humans,
1545 # usually, but not always, installed in /bin.
1546 public_programs = []
1548 subdir('src/libudev')
1549 subdir('src/shared')
1551 subdir('src/shutdown')
1553 subdir('src/network')
1555 subdir('src/analyze')
1556 subdir('src/journal-remote')
1557 subdir('src/coredump')
1558 subdir('src/pstore')
1559 subdir('src/hostname')
1560 subdir('src/import')
1561 subdir('src/partition')
1562 subdir('src/kernel-install')
1563 subdir('src/locale')
1564 subdir('src/machine')
1565 subdir('src/portable')
1566 subdir('src/userdb')
1567 subdir('src/nspawn')
1568 subdir('src/resolve')
1569 subdir('src/timedate')
1570 subdir('src/timesync')
1571 subdir('src/vconsole')
1572 subdir('src/boot/efi')
1579 ############################################################
1581 # only static linking apart from libdl, to make sure that the
1582 # module is linked to all libraries that it uses.
1583 test_dlopen = executable(
1587 include_directories : includes,
1588 link_with : [libbasic],
1589 dependencies : [libdl],
1590 build_by_default : want_tests != 'false')
1592 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1593 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h'],
1594 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1595 ['resolve', 'ENABLE_NSS_RESOLVE']]
1597 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1601 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1602 version_script_arg = join_paths(project_source_root, sym)
1604 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1605 if tuple.length() > 2
1606 sources += tuple[2].split()
1609 nss = shared_library(
1614 include_directories : includes,
1615 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1616 link_args : ['-Wl,-z,nodelete',
1618 '-Wl,--version-script=' + version_script_arg],
1619 link_with : [libsystemd_static,
1622 dependencies : [threads,
1626 install_dir : rootlibdir)
1628 # We cannot use shared_module because it does not support version suffix.
1629 # Unfortunately shared_library insists on creating the symlink…
1630 meson.add_install_script('sh', '-c',
1631 'rm $DESTDIR@0@/libnss_@1@.so'
1632 .format(rootlibdir, module))
1634 if want_tests != 'false'
1635 test('dlopen-nss_' + module,
1637 # path to dlopen must include a slash
1638 args : nss.full_path())
1643 ############################################################
1645 executable('systemd',
1647 include_directories : includes,
1648 link_with : [libcore,
1650 dependencies : [versiondep,
1657 install_rpath : rootlibexecdir,
1659 install_dir : rootlibexecdir)
1661 meson.add_install_script(meson_make_symlink,
1662 join_paths(rootlibexecdir, 'systemd'),
1663 join_paths(rootsbindir, 'init'))
1665 exe = executable('systemd-analyze',
1666 systemd_analyze_sources,
1667 include_directories : includes,
1668 link_with : [libcore,
1670 dependencies : [versiondep,
1677 install_rpath : rootlibexecdir,
1679 public_programs += exe
1681 executable('systemd-journald',
1682 systemd_journald_sources,
1683 include_directories : includes,
1684 link_with : [libjournal_core,
1686 dependencies : [threads,
1690 install_rpath : rootlibexecdir,
1692 install_dir : rootlibexecdir)
1694 exe = executable('systemd-cat',
1695 systemd_cat_sources,
1696 include_directories : includes,
1697 link_with : [libjournal_core,
1699 dependencies : [threads],
1700 install_rpath : rootlibexecdir,
1702 public_programs += exe
1704 exe = executable('journalctl',
1706 include_directories : includes,
1707 link_with : [libshared],
1708 dependencies : [threads,
1713 install_rpath : rootlibexecdir,
1715 install_dir : rootbindir)
1716 public_programs += exe
1718 executable('systemd-getty-generator',
1719 'src/getty-generator/getty-generator.c',
1720 include_directories : includes,
1721 link_with : [libshared],
1722 install_rpath : rootlibexecdir,
1724 install_dir : systemgeneratordir)
1726 executable('systemd-debug-generator',
1727 'src/debug-generator/debug-generator.c',
1728 include_directories : includes,
1729 link_with : [libshared],
1730 install_rpath : rootlibexecdir,
1732 install_dir : systemgeneratordir)
1734 executable('systemd-run-generator',
1735 'src/run-generator/run-generator.c',
1736 include_directories : includes,
1737 link_with : [libshared],
1738 install_rpath : rootlibexecdir,
1740 install_dir : systemgeneratordir)
1742 executable('systemd-fstab-generator',
1743 'src/fstab-generator/fstab-generator.c',
1744 include_directories : includes,
1745 link_with : [libcore_shared,
1747 install_rpath : rootlibexecdir,
1749 install_dir : systemgeneratordir)
1751 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1752 executable('30-systemd-environment-d-generator',
1753 'src/environment-d-generator/environment-d-generator.c',
1754 include_directories : includes,
1755 link_with : [libshared],
1756 install_rpath : rootlibexecdir,
1758 install_dir : userenvgeneratordir)
1760 meson.add_install_script(meson_make_symlink,
1761 join_paths(sysconfdir, 'environment'),
1762 join_paths(environmentdir, '99-environment.conf'))
1765 if conf.get('ENABLE_HIBERNATE') == 1
1766 executable('systemd-hibernate-resume-generator',
1767 'src/hibernate-resume/hibernate-resume-generator.c',
1768 include_directories : includes,
1769 link_with : [libshared],
1770 install_rpath : rootlibexecdir,
1772 install_dir : systemgeneratordir)
1774 executable('systemd-hibernate-resume',
1775 'src/hibernate-resume/hibernate-resume.c',
1776 include_directories : includes,
1777 link_with : [libshared],
1778 install_rpath : rootlibexecdir,
1780 install_dir : rootlibexecdir)
1783 if conf.get('HAVE_BLKID') == 1
1784 executable('systemd-gpt-auto-generator',
1785 'src/gpt-auto-generator/gpt-auto-generator.c',
1786 'src/shared/blkid-util.h',
1787 include_directories : includes,
1788 link_with : [libshared],
1789 dependencies : libblkid,
1790 install_rpath : rootlibexecdir,
1792 install_dir : systemgeneratordir)
1794 exe = executable('systemd-dissect',
1795 'src/dissect/dissect.c',
1796 include_directories : includes,
1797 link_with : [libshared],
1798 install_rpath : rootlibexecdir,
1800 install_dir : rootlibexecdir)
1801 public_programs += exe
1804 if conf.get('ENABLE_RESOLVE') == 1
1805 executable('systemd-resolved',
1806 systemd_resolved_sources,
1807 include_directories : includes,
1808 link_with : [libshared,
1810 libsystemd_resolve_core],
1811 dependencies : systemd_resolved_dependencies,
1812 install_rpath : rootlibexecdir,
1814 install_dir : rootlibexecdir)
1816 exe = executable('resolvectl',
1818 include_directories : includes,
1819 link_with : [libshared,
1821 libsystemd_resolve_core],
1822 dependencies : [threads,
1826 install_rpath : rootlibexecdir,
1828 public_programs += exe
1830 meson.add_install_script(meson_make_symlink,
1831 join_paths(bindir, 'resolvectl'),
1832 join_paths(rootsbindir, 'resolvconf'))
1834 meson.add_install_script(meson_make_symlink,
1835 join_paths(bindir, 'resolvectl'),
1836 join_paths(bindir, 'systemd-resolve'))
1839 if conf.get('ENABLE_LOGIND') == 1
1840 executable('systemd-logind',
1841 systemd_logind_sources,
1842 include_directories : includes,
1843 link_with : [liblogind_core,
1845 dependencies : [threads,
1847 install_rpath : rootlibexecdir,
1849 install_dir : rootlibexecdir)
1851 exe = executable('loginctl',
1853 include_directories : includes,
1854 link_with : [libshared],
1855 dependencies : [threads,
1858 install_rpath : rootlibexecdir,
1860 install_dir : rootbindir)
1861 public_programs += exe
1863 exe = executable('systemd-inhibit',
1864 'src/login/inhibit.c',
1865 include_directories : includes,
1866 link_with : [libshared],
1867 install_rpath : rootlibexecdir,
1869 install_dir : rootbindir)
1870 public_programs += exe
1872 if conf.get('HAVE_PAM') == 1
1873 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1874 pam_systemd = shared_library(
1878 include_directories : includes,
1879 link_args : ['-shared',
1880 '-Wl,--version-script=' + version_script_arg],
1881 link_with : [libsystemd_static,
1883 dependencies : [threads,
1886 link_depends : pam_systemd_sym,
1888 install_dir : pamlibdir)
1890 if want_tests != 'false'
1891 test('dlopen-pam_systemd',
1893 # path to dlopen must include a slash
1894 args : pam_systemd.full_path())
1898 executable('systemd-user-runtime-dir',
1899 user_runtime_dir_sources,
1900 include_directories : includes,
1901 link_with : [libshared],
1902 install_rpath : rootlibexecdir,
1904 install_dir : rootlibexecdir)
1907 if conf.get('HAVE_PAM') == 1
1908 executable('systemd-user-sessions',
1909 'src/user-sessions/user-sessions.c',
1910 include_directories : includes,
1911 link_with : [libshared],
1912 install_rpath : rootlibexecdir,
1914 install_dir : rootlibexecdir)
1917 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1918 exe = executable('bootctl',
1919 'src/boot/bootctl.c',
1920 include_directories : includes,
1921 link_with : [libshared],
1922 dependencies : [libblkid],
1923 install_rpath : rootlibexecdir,
1925 public_programs += exe
1927 executable('systemd-bless-boot',
1928 'src/boot/bless-boot.c',
1929 include_directories : includes,
1930 link_with : [libshared],
1931 dependencies : [libblkid],
1932 install_rpath : rootlibexecdir,
1934 install_dir : rootlibexecdir)
1936 executable('systemd-bless-boot-generator',
1937 'src/boot/bless-boot-generator.c',
1938 include_directories : includes,
1939 link_with : [libshared],
1940 install_rpath : rootlibexecdir,
1942 install_dir : systemgeneratordir)
1945 executable('systemd-boot-check-no-failures',
1946 'src/boot/boot-check-no-failures.c',
1947 include_directories : includes,
1948 link_with : [libshared],
1949 dependencies : [libblkid],
1950 install_rpath : rootlibexecdir,
1952 install_dir : rootlibexecdir)
1954 exe = executable('systemd-socket-activate', 'src/activate/activate.c',
1955 include_directories : includes,
1956 link_with : [libshared],
1957 dependencies : [threads],
1958 install_rpath : rootlibexecdir,
1960 public_programs += exe
1963 if get_option('link-systemctl-shared')
1964 systemctl_link_with = [libshared]
1966 systemctl_link_with = [libsystemd_static,
1972 exe = executable('systemctl',
1973 'src/systemctl/systemctl.c',
1974 'src/systemctl/sysv-compat.h',
1975 'src/systemctl/sysv-compat.c',
1976 include_directories : includes,
1977 link_with : systemctl_link_with,
1978 dependencies : [threads,
1983 install_rpath : rootlibexecdir,
1985 install_dir : rootbindir)
1986 public_programs += exe
1988 if conf.get('ENABLE_PORTABLED') == 1
1989 executable('systemd-portabled',
1990 systemd_portabled_sources,
1991 include_directories : includes,
1992 link_with : [libshared],
1993 dependencies : [threads],
1994 install_rpath : rootlibexecdir,
1996 install_dir : rootlibexecdir)
1998 exe = executable('portablectl', 'src/portable/portablectl.c',
1999 include_directories : includes,
2000 link_with : [libshared],
2001 dependencies : [threads],
2002 install_rpath : rootlibexecdir,
2004 install_dir : rootbindir)
2005 public_programs += exe
2008 if conf.get('ENABLE_USERDB') == 1
2009 executable('systemd-userwork',
2010 systemd_userwork_sources,
2011 include_directories : includes,
2012 link_with : [libshared],
2013 dependencies : [threads],
2014 install_rpath : rootlibexecdir,
2016 install_dir : rootlibexecdir)
2018 executable('systemd-userdbd',
2019 systemd_userdbd_sources,
2020 include_directories : includes,
2021 link_with : [libshared],
2022 dependencies : [threads],
2023 install_rpath : rootlibexecdir,
2025 install_dir : rootlibexecdir)
2027 executable('userdbctl',
2029 include_directories : includes,
2030 link_with : [libshared],
2031 dependencies : [threads],
2032 install_rpath : rootlibexecdir,
2034 install_dir : rootbindir)
2037 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
2038 meson.add_install_script(meson_make_symlink,
2039 join_paths(rootbindir, 'systemctl'),
2040 join_paths(rootsbindir, alias))
2043 if conf.get('ENABLE_BACKLIGHT') == 1
2044 executable('systemd-backlight',
2045 'src/backlight/backlight.c',
2046 include_directories : includes,
2047 link_with : [libshared],
2048 install_rpath : rootlibexecdir,
2050 install_dir : rootlibexecdir)
2053 if conf.get('ENABLE_RFKILL') == 1
2054 executable('systemd-rfkill',
2055 'src/rfkill/rfkill.c',
2056 include_directories : includes,
2057 link_with : [libshared],
2058 install_rpath : rootlibexecdir,
2060 install_dir : rootlibexecdir)
2063 executable('systemd-system-update-generator',
2064 'src/system-update-generator/system-update-generator.c',
2065 include_directories : includes,
2066 link_with : [libshared],
2067 install_rpath : rootlibexecdir,
2069 install_dir : systemgeneratordir)
2071 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2072 systemd_cryptsetup_sources = files('''
2073 src/cryptsetup/cryptsetup.c
2074 src/cryptsetup/cryptsetup-pkcs11.h
2077 if conf.get('HAVE_P11KIT') == 1
2078 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2081 executable('systemd-cryptsetup',
2082 systemd_cryptsetup_sources,
2083 include_directories : includes,
2084 link_with : [libshared],
2085 dependencies : [libcryptsetup,
2087 install_rpath : rootlibexecdir,
2089 install_dir : rootlibexecdir)
2091 executable('systemd-cryptsetup-generator',
2092 'src/cryptsetup/cryptsetup-generator.c',
2093 include_directories : includes,
2094 link_with : [libshared],
2095 dependencies : [libcryptsetup],
2096 install_rpath : rootlibexecdir,
2098 install_dir : systemgeneratordir)
2100 executable('systemd-veritysetup',
2101 'src/veritysetup/veritysetup.c',
2102 include_directories : includes,
2103 link_with : [libshared],
2104 dependencies : [libcryptsetup],
2105 install_rpath : rootlibexecdir,
2107 install_dir : rootlibexecdir)
2109 executable('systemd-veritysetup-generator',
2110 'src/veritysetup/veritysetup-generator.c',
2111 include_directories : includes,
2112 link_with : [libshared],
2113 dependencies : [libcryptsetup],
2114 install_rpath : rootlibexecdir,
2116 install_dir : systemgeneratordir)
2119 if conf.get('HAVE_SYSV_COMPAT') == 1
2120 executable('systemd-sysv-generator',
2121 'src/sysv-generator/sysv-generator.c',
2122 include_directories : includes,
2123 link_with : [libshared],
2124 install_rpath : rootlibexecdir,
2126 install_dir : systemgeneratordir)
2128 executable('systemd-rc-local-generator',
2129 'src/rc-local-generator/rc-local-generator.c',
2130 include_directories : includes,
2131 link_with : [libshared],
2132 install_rpath : rootlibexecdir,
2134 install_dir : systemgeneratordir)
2137 if conf.get('ENABLE_HOSTNAMED') == 1
2138 executable('systemd-hostnamed',
2139 'src/hostname/hostnamed.c',
2140 include_directories : includes,
2141 link_with : [libshared],
2142 install_rpath : rootlibexecdir,
2144 install_dir : rootlibexecdir)
2146 exe = executable('hostnamectl',
2147 'src/hostname/hostnamectl.c',
2148 include_directories : includes,
2149 link_with : [libshared],
2150 install_rpath : rootlibexecdir,
2152 public_programs += exe
2155 if conf.get('ENABLE_LOCALED') == 1
2156 if conf.get('HAVE_XKBCOMMON') == 1
2157 # logind will load libxkbcommon.so dynamically on its own
2163 executable('systemd-localed',
2164 systemd_localed_sources,
2165 include_directories : includes,
2166 link_with : [libshared],
2167 dependencies : deps,
2168 install_rpath : rootlibexecdir,
2170 install_dir : rootlibexecdir)
2172 exe = executable('localectl',
2174 include_directories : includes,
2175 link_with : [libshared],
2176 install_rpath : rootlibexecdir,
2178 public_programs += exe
2181 if conf.get('ENABLE_TIMEDATED') == 1
2182 executable('systemd-timedated',
2183 'src/timedate/timedated.c',
2184 include_directories : includes,
2185 link_with : [libshared],
2186 install_rpath : rootlibexecdir,
2188 install_dir : rootlibexecdir)
2191 if conf.get('ENABLE_TIMEDATECTL') == 1
2192 exe = executable('timedatectl',
2193 'src/timedate/timedatectl.c',
2194 include_directories : includes,
2195 install_rpath : rootlibexecdir,
2196 link_with : [libshared],
2197 dependencies : [libm],
2199 public_programs += exe
2202 if conf.get('ENABLE_TIMESYNCD') == 1
2203 executable('systemd-timesyncd',
2204 systemd_timesyncd_sources,
2205 include_directories : includes,
2206 link_with : [libshared],
2207 dependencies : [threads,
2209 install_rpath : rootlibexecdir,
2211 install_dir : rootlibexecdir)
2213 executable('systemd-time-wait-sync',
2214 'src/time-wait-sync/time-wait-sync.c',
2215 include_directories : includes,
2216 link_with : [libshared],
2217 install_rpath : rootlibexecdir,
2219 install_dir : rootlibexecdir)
2222 if conf.get('ENABLE_MACHINED') == 1
2223 executable('systemd-machined',
2224 systemd_machined_sources,
2225 include_directories : includes,
2226 link_with : [libmachine_core,
2228 install_rpath : rootlibexecdir,
2230 install_dir : rootlibexecdir)
2232 exe = executable('machinectl',
2233 'src/machine/machinectl.c',
2234 include_directories : includes,
2235 link_with : [libshared],
2236 dependencies : [threads,
2239 install_rpath : rootlibexecdir,
2241 install_dir : rootbindir)
2242 public_programs += exe
2245 if conf.get('ENABLE_IMPORTD') == 1
2246 executable('systemd-importd',
2247 systemd_importd_sources,
2248 include_directories : includes,
2249 link_with : [libshared],
2250 dependencies : [threads],
2251 install_rpath : rootlibexecdir,
2253 install_dir : rootlibexecdir)
2255 systemd_pull = executable('systemd-pull',
2256 systemd_pull_sources,
2257 include_directories : includes,
2258 link_with : [libshared],
2259 dependencies : [versiondep,
2265 install_rpath : rootlibexecdir,
2267 install_dir : rootlibexecdir)
2269 systemd_import = executable('systemd-import',
2270 systemd_import_sources,
2271 include_directories : includes,
2272 link_with : [libshared],
2273 dependencies : [libcurl,
2277 install_rpath : rootlibexecdir,
2279 install_dir : rootlibexecdir)
2281 systemd_import_fs = executable('systemd-import-fs',
2282 systemd_import_fs_sources,
2283 include_directories : includes,
2284 link_with : [libshared],
2285 install_rpath : rootlibexecdir,
2287 install_dir : rootlibexecdir)
2289 systemd_export = executable('systemd-export',
2290 systemd_export_sources,
2291 include_directories : includes,
2292 link_with : [libshared],
2293 dependencies : [libcurl,
2297 install_rpath : rootlibexecdir,
2299 install_dir : rootlibexecdir)
2301 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2304 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2305 exe = executable('systemd-journal-upload',
2306 systemd_journal_upload_sources,
2307 include_directories : includes,
2308 link_with : [libshared],
2309 dependencies : [versiondep,
2315 install_rpath : rootlibexecdir,
2317 install_dir : rootlibexecdir)
2318 public_programs += exe
2321 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2322 s_j_remote = executable('systemd-journal-remote',
2323 systemd_journal_remote_sources,
2324 include_directories : includes,
2325 link_with : [libshared,
2326 libsystemd_journal_remote],
2327 dependencies : [threads,
2332 install_rpath : rootlibexecdir,
2334 install_dir : rootlibexecdir)
2336 s_j_gatewayd = executable('systemd-journal-gatewayd',
2337 systemd_journal_gatewayd_sources,
2338 include_directories : includes,
2339 link_with : [libshared],
2340 dependencies : [threads,
2345 install_rpath : rootlibexecdir,
2347 install_dir : rootlibexecdir)
2348 public_programs += [s_j_remote, s_j_gatewayd]
2351 if conf.get('ENABLE_COREDUMP') == 1
2352 executable('systemd-coredump',
2353 systemd_coredump_sources,
2354 include_directories : includes,
2355 link_with : [libshared],
2356 dependencies : [threads,
2361 install_rpath : rootlibexecdir,
2363 install_dir : rootlibexecdir)
2365 exe = executable('coredumpctl',
2366 coredumpctl_sources,
2367 include_directories : includes,
2368 link_with : [libshared],
2369 dependencies : [threads,
2372 install_rpath : rootlibexecdir,
2374 public_programs += exe
2377 if conf.get('ENABLE_PSTORE') == 1
2378 executable('systemd-pstore',
2379 systemd_pstore_sources,
2380 include_directories : includes,
2381 link_with : [libshared],
2382 dependencies : [threads,
2387 install_rpath : rootlibexecdir,
2389 install_dir : rootlibexecdir)
2392 if conf.get('ENABLE_BINFMT') == 1
2393 exe = executable('systemd-binfmt',
2394 'src/binfmt/binfmt.c',
2395 include_directories : includes,
2396 link_with : [libshared],
2397 install_rpath : rootlibexecdir,
2399 install_dir : rootlibexecdir)
2400 public_programs += exe
2402 meson.add_install_script('sh', '-c',
2403 mkdir_p.format(binfmtdir))
2404 meson.add_install_script('sh', '-c',
2405 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2408 if conf.get('ENABLE_REPART') == 1
2409 executable('systemd-repart',
2410 systemd_repart_sources,
2411 include_directories : includes,
2412 link_with : [libshared],
2413 dependencies : [threads,
2418 install_rpath : rootlibexecdir,
2420 install_dir : rootbindir)
2423 if conf.get('ENABLE_VCONSOLE') == 1
2424 executable('systemd-vconsole-setup',
2425 'src/vconsole/vconsole-setup.c',
2426 include_directories : includes,
2427 link_with : [libshared],
2428 install_rpath : rootlibexecdir,
2430 install_dir : rootlibexecdir)
2433 if conf.get('ENABLE_RANDOMSEED') == 1
2434 executable('systemd-random-seed',
2435 'src/random-seed/random-seed.c',
2436 include_directories : includes,
2437 link_with : [libshared],
2438 install_rpath : rootlibexecdir,
2440 install_dir : rootlibexecdir)
2443 if conf.get('ENABLE_FIRSTBOOT') == 1
2444 executable('systemd-firstboot',
2445 'src/firstboot/firstboot.c',
2446 include_directories : includes,
2447 link_with : [libshared],
2448 dependencies : [libcrypt],
2449 install_rpath : rootlibexecdir,
2451 install_dir : rootbindir)
2454 executable('systemd-remount-fs',
2455 'src/remount-fs/remount-fs.c',
2456 include_directories : includes,
2457 link_with : [libcore_shared,
2459 install_rpath : rootlibexecdir,
2461 install_dir : rootlibexecdir)
2463 executable('systemd-machine-id-setup',
2464 'src/machine-id-setup/machine-id-setup-main.c',
2465 include_directories : includes,
2466 link_with : [libcore_shared,
2468 install_rpath : rootlibexecdir,
2470 install_dir : rootbindir)
2472 executable('systemd-fsck',
2474 include_directories : includes,
2475 link_with : [libshared],
2476 install_rpath : rootlibexecdir,
2478 install_dir : rootlibexecdir)
2480 executable('systemd-growfs',
2481 'src/partition/growfs.c',
2482 include_directories : includes,
2483 link_with : [libshared],
2484 dependencies : [libcryptsetup],
2485 install_rpath : rootlibexecdir,
2487 install_dir : rootlibexecdir)
2489 executable('systemd-makefs',
2490 'src/partition/makefs.c',
2491 include_directories : includes,
2492 link_with : [libshared],
2493 install_rpath : rootlibexecdir,
2495 install_dir : rootlibexecdir)
2497 executable('systemd-sleep',
2498 'src/sleep/sleep.c',
2499 include_directories : includes,
2500 link_with : [libshared],
2501 install_rpath : rootlibexecdir,
2503 install_dir : rootlibexecdir)
2505 install_data('src/sleep/sleep.conf',
2506 install_dir : pkgsysconfdir)
2508 exe = executable('systemd-sysctl',
2509 'src/sysctl/sysctl.c',
2510 include_directories : includes,
2511 link_with : [libshared],
2512 install_rpath : rootlibexecdir,
2514 install_dir : rootlibexecdir)
2515 public_programs += exe
2517 executable('systemd-ac-power',
2518 'src/ac-power/ac-power.c',
2519 include_directories : includes,
2520 link_with : [libshared],
2521 install_rpath : rootlibexecdir,
2523 install_dir : rootlibexecdir)
2525 exe = executable('systemd-detect-virt',
2526 'src/detect-virt/detect-virt.c',
2527 include_directories : includes,
2528 link_with : [libshared],
2529 install_rpath : rootlibexecdir,
2531 public_programs += exe
2533 exe = executable('systemd-delta',
2534 'src/delta/delta.c',
2535 include_directories : includes,
2536 link_with : [libshared],
2537 install_rpath : rootlibexecdir,
2539 public_programs += exe
2541 exe = executable('systemd-escape',
2542 'src/escape/escape.c',
2543 include_directories : includes,
2544 link_with : [libshared],
2545 install_rpath : rootlibexecdir,
2547 install_dir : rootbindir)
2548 public_programs += exe
2550 exe = executable('systemd-notify',
2551 'src/notify/notify.c',
2552 include_directories : includes,
2553 link_with : [libshared],
2554 install_rpath : rootlibexecdir,
2556 install_dir : rootbindir)
2557 public_programs += exe
2559 executable('systemd-volatile-root',
2560 'src/volatile-root/volatile-root.c',
2561 include_directories : includes,
2562 link_with : [libshared],
2563 install_rpath : rootlibexecdir,
2565 install_dir : rootlibexecdir)
2567 executable('systemd-cgroups-agent',
2568 'src/cgroups-agent/cgroups-agent.c',
2569 include_directories : includes,
2570 link_with : [libshared],
2571 install_rpath : rootlibexecdir,
2573 install_dir : rootlibexecdir)
2575 exe = executable('systemd-id128',
2576 'src/id128/id128.c',
2577 include_directories : includes,
2578 link_with : [libshared],
2579 install_rpath : rootlibexecdir,
2581 public_programs += exe
2583 exe = executable('systemd-path',
2585 include_directories : includes,
2586 link_with : [libshared],
2587 install_rpath : rootlibexecdir,
2589 public_programs += exe
2591 exe = executable('systemd-ask-password',
2592 'src/ask-password/ask-password.c',
2593 include_directories : includes,
2594 link_with : [libshared],
2595 install_rpath : rootlibexecdir,
2597 install_dir : rootbindir)
2598 public_programs += exe
2600 executable('systemd-reply-password',
2601 'src/reply-password/reply-password.c',
2602 include_directories : includes,
2603 link_with : [libshared],
2604 install_rpath : rootlibexecdir,
2606 install_dir : rootlibexecdir)
2608 exe = executable('systemd-tty-ask-password-agent',
2609 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2610 include_directories : includes,
2611 link_with : [libshared],
2612 install_rpath : rootlibexecdir,
2614 install_dir : rootbindir)
2615 public_programs += exe
2617 exe = executable('systemd-cgls',
2619 include_directories : includes,
2620 link_with : [libshared],
2621 install_rpath : rootlibexecdir,
2623 public_programs += exe
2625 exe = executable('systemd-cgtop',
2626 'src/cgtop/cgtop.c',
2627 include_directories : includes,
2628 link_with : [libshared],
2629 install_rpath : rootlibexecdir,
2631 public_programs += exe
2633 executable('systemd-initctl',
2634 'src/initctl/initctl.c',
2635 include_directories : includes,
2636 link_with : [libshared],
2637 install_rpath : rootlibexecdir,
2639 install_dir : rootlibexecdir)
2641 exe = executable('systemd-mount',
2642 'src/mount/mount-tool.c',
2643 include_directories : includes,
2644 link_with : [libshared],
2645 dependencies: [libmount],
2646 install_rpath : rootlibexecdir,
2648 public_programs += exe
2650 meson.add_install_script(meson_make_symlink,
2651 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2653 exe = executable('systemd-run',
2655 include_directories : includes,
2656 link_with : [libshared],
2657 install_rpath : rootlibexecdir,
2659 public_programs += exe
2661 exe = executable('systemd-stdio-bridge',
2662 'src/stdio-bridge/stdio-bridge.c',
2663 include_directories : includes,
2664 link_with : [libshared],
2665 dependencies : [versiondep],
2666 install_rpath : rootlibexecdir,
2668 public_programs += exe
2670 exe = executable('busctl',
2671 'src/busctl/busctl.c',
2672 'src/busctl/busctl-introspect.c',
2673 'src/busctl/busctl-introspect.h',
2674 include_directories : includes,
2675 link_with : [libshared],
2676 install_rpath : rootlibexecdir,
2678 public_programs += exe
2680 if conf.get('ENABLE_SYSUSERS') == 1
2681 exe = executable('systemd-sysusers',
2682 'src/sysusers/sysusers.c',
2683 include_directories : includes,
2684 link_with : [libshared],
2685 install_rpath : rootlibexecdir,
2687 install_dir : rootbindir)
2688 public_programs += exe
2691 if conf.get('ENABLE_TMPFILES') == 1
2692 exe = executable('systemd-tmpfiles',
2693 'src/tmpfiles/tmpfiles.c',
2694 include_directories : includes,
2695 link_with : [libshared],
2696 dependencies : [libacl],
2697 install_rpath : rootlibexecdir,
2699 install_dir : rootbindir)
2700 public_programs += exe
2702 if want_tests != 'false'
2703 test('test-systemd-tmpfiles',
2704 test_systemd_tmpfiles_py,
2705 # https://github.com/mesonbuild/meson/issues/2681
2706 args : exe.full_path())
2710 if conf.get('ENABLE_HWDB') == 1
2711 exe = executable('systemd-hwdb',
2713 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2714 include_directories : includes,
2715 link_with : [libudev_static],
2716 install_rpath : udev_rpath,
2718 install_dir : rootbindir)
2719 public_programs += exe
2722 if conf.get('ENABLE_QUOTACHECK') == 1
2723 executable('systemd-quotacheck',
2724 'src/quotacheck/quotacheck.c',
2725 include_directories : includes,
2726 link_with : [libshared],
2727 install_rpath : rootlibexecdir,
2729 install_dir : rootlibexecdir)
2732 exe = executable('systemd-socket-proxyd',
2733 'src/socket-proxy/socket-proxyd.c',
2734 include_directories : includes,
2735 link_with : [libshared],
2736 dependencies : [threads],
2737 install_rpath : rootlibexecdir,
2739 install_dir : rootlibexecdir)
2740 public_programs += exe
2742 exe = executable('systemd-udevd',
2743 systemd_udevd_sources,
2744 include_directories : includes,
2745 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2746 link_with : [libudev_core,
2749 dependencies : [versiondep,
2755 install_rpath : udev_rpath,
2757 install_dir : rootlibexecdir)
2758 public_programs += exe
2760 exe = executable('udevadm',
2762 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2763 include_directories : includes,
2764 link_with : [libudev_core,
2767 dependencies : [versiondep,
2773 install_rpath : udev_rpath,
2775 install_dir : rootbindir)
2776 public_programs += exe
2778 executable('systemd-shutdown',
2779 systemd_shutdown_sources,
2780 include_directories : includes,
2781 link_with : [libcore_shared,
2783 dependencies : [libmount],
2784 install_rpath : rootlibexecdir,
2786 install_dir : rootlibexecdir)
2788 executable('systemd-update-done',
2789 'src/update-done/update-done.c',
2790 include_directories : includes,
2791 link_with : [libshared],
2792 install_rpath : rootlibexecdir,
2794 install_dir : rootlibexecdir)
2796 executable('systemd-update-utmp',
2797 'src/update-utmp/update-utmp.c',
2798 include_directories : includes,
2799 link_with : [libshared],
2800 dependencies : [libaudit],
2801 install_rpath : rootlibexecdir,
2803 install_dir : rootlibexecdir)
2805 if conf.get('HAVE_KMOD') == 1
2806 executable('systemd-modules-load',
2807 'src/modules-load/modules-load.c',
2808 include_directories : includes,
2809 link_with : [libshared],
2810 dependencies : [libkmod],
2811 install_rpath : rootlibexecdir,
2813 install_dir : rootlibexecdir)
2815 meson.add_install_script('sh', '-c',
2816 mkdir_p.format(modulesloaddir))
2817 meson.add_install_script('sh', '-c',
2818 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
2821 exe = executable('systemd-nspawn',
2822 systemd_nspawn_sources,
2823 include_directories : includes,
2824 link_with : [libcore_shared,
2827 dependencies : [libblkid,
2829 install_rpath : rootlibexecdir,
2831 public_programs += exe
2833 if conf.get('ENABLE_NETWORKD') == 1
2834 executable('systemd-networkd',
2835 systemd_networkd_sources,
2836 include_directories : network_include_dir,
2837 link_with : [libnetworkd_core,
2840 networkd_link_with],
2841 dependencies : [threads],
2842 install_rpath : rootlibexecdir,
2844 install_dir : rootlibexecdir)
2846 executable('systemd-networkd-wait-online',
2847 systemd_networkd_wait_online_sources,
2848 include_directories : includes,
2849 link_with : [libnetworkd_core,
2850 networkd_link_with],
2851 install_rpath : rootlibexecdir,
2853 install_dir : rootlibexecdir)
2855 exe = executable('networkctl',
2857 include_directories : includes,
2858 link_with : [libsystemd_network,
2859 networkd_link_with],
2860 install_rpath : rootlibexecdir,
2862 install_dir : rootbindir)
2863 public_programs += exe
2865 executable('systemd-network-generator',
2866 network_generator_sources,
2867 include_directories : includes,
2868 link_with : [networkd_link_with],
2869 install_rpath : rootlibexecdir,
2871 install_dir : rootlibexecdir)
2874 executable('systemd-sulogin-shell',
2875 ['src/sulogin-shell/sulogin-shell.c'],
2876 include_directories : includes,
2877 link_with : [libshared],
2878 install_rpath : rootlibexecdir,
2880 install_dir : rootlibexecdir)
2882 ############################################################
2885 'systemd-runtest.env',
2886 output : 'systemd-runtest.env',
2887 command : ['sh', '-c', '{ ' +
2888 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
2889 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(meson.current_build_dir(), 'catalog')) +
2891 build_by_default : true)
2893 foreach tuple : tests
2895 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2896 dependencies = tuple[2]
2897 condition = tuple.length() >= 4 ? tuple[3] : ''
2898 type = tuple.length() >= 5 ? tuple[4] : ''
2899 defs = tuple.length() >= 6 ? tuple[5] : []
2900 incs = tuple.length() >= 7 ? tuple[6] : includes
2903 name = sources[0].split('/')[-1].split('.')[0]
2904 if type.startswith('timeout=')
2905 timeout = type.split('=')[1].to_int()
2909 if condition == '' or conf.get(condition) == 1
2913 include_directories : incs,
2914 link_with : link_with,
2915 dependencies : [versiondep,
2918 build_by_default : want_tests != 'false',
2919 install_rpath : rootlibexecdir,
2920 install : install_tests,
2921 install_dir : join_paths(testsdir, type))
2924 message('@0@ is a manual test'.format(name))
2925 elif type == 'unsafe' and want_tests != 'unsafe'
2926 message('@0@ is an unsafe test'.format(name))
2927 elif want_tests != 'false'
2933 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
2938 'test-libsystemd-sym',
2939 test_libsystemd_sym_c,
2940 include_directories : includes,
2941 link_with : [libsystemd],
2942 build_by_default : want_tests != 'false',
2943 install : install_tests,
2944 install_dir : testsdir)
2945 if want_tests != 'false'
2946 test('test-libsystemd-sym', exe)
2950 'test-libsystemd-static-sym',
2951 test_libsystemd_sym_c,
2952 include_directories : includes,
2953 link_with : [install_libsystemd_static],
2954 dependencies : [threads], # threads is already included in dependencies on the library,
2955 # but does not seem to get propagated. Add here as a work-around.
2956 build_by_default : want_tests != 'false' and static_libsystemd_pic,
2957 install : install_tests and static_libsystemd_pic,
2958 install_dir : testsdir)
2959 if want_tests != 'false' and static_libsystemd_pic
2960 test('test-libsystemd-static-sym', exe)
2966 include_directories : includes,
2967 c_args : '-Wno-deprecated-declarations',
2968 link_with : [libudev],
2969 build_by_default : want_tests != 'false',
2970 install : install_tests,
2971 install_dir : testsdir)
2972 if want_tests != 'false'
2973 test('test-libudev-sym', exe)
2977 'test-libudev-static-sym',
2979 include_directories : includes,
2980 c_args : '-Wno-deprecated-declarations',
2981 link_with : [install_libudev_static],
2982 build_by_default : want_tests != 'false' and static_libudev_pic,
2983 install : install_tests and static_libudev_pic,
2984 install_dir : testsdir)
2985 if want_tests != 'false' and static_libudev_pic
2986 test('test-libudev-static-sym', exe)
2989 ############################################################
2993 if get_option('tests') != 'false'
2994 foreach tuple : fuzzers
2996 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
2997 dependencies = tuple[2]
2998 defs = tuple.length() >= 4 ? tuple[3] : []
2999 incs = tuple.length() >= 5 ? tuple[4] : includes
3002 if want_ossfuzz or want_fuzzbuzz
3003 dependencies += fuzzing_engine
3005 if fuzzing_engine.found()
3006 dependencies += fuzzing_engine
3008 link_args += ['-fsanitize=fuzzer']
3011 sources += 'src/fuzz/fuzz-main.c'
3015 sources += 'src/fuzz/fuzzer-entry-point.c'
3018 name = sources[0].split('/')[-1].split('.')[0]
3020 fuzzer_exes += executable(
3023 include_directories : [incs, include_directories('src/fuzz')],
3024 link_with : link_with,
3025 dependencies : dependencies,
3027 link_args: link_args,
3032 run_target('fuzzers',
3033 depends : fuzzer_exes,
3036 ############################################################
3038 make_directive_index_py = find_program('tools/make-directive-index.py')
3039 make_man_index_py = find_program('tools/make-man-index.py')
3040 xml_helper_py = find_program('tools/xml_helper.py')
3041 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
3042 autosuspend_update_sh = find_program('tools/meson-autosuspend-update.sh')
3045 subdir('sysusers.d')
3046 subdir('tmpfiles.d')
3052 subdir('shell-completion/bash')
3053 subdir('shell-completion/zsh')
3054 subdir('docs/sysvinit')
3055 subdir('docs/var-log')
3057 install_subdir('factory/etc',
3058 install_dir : factorydir)
3060 install_data('xorg/50-systemd-user.sh',
3061 install_dir : xinitrcdir)
3062 install_data('modprobe.d/systemd.conf',
3063 install_dir : modprobedir)
3064 install_data('LICENSE.GPL2',
3068 'docs/CODING_STYLE.md',
3069 'docs/DISTRO_PORTING.md',
3070 'docs/ENVIRONMENT.md',
3072 'docs/TRANSIENT-SETTINGS.md',
3073 'docs/TRANSLATORS.md',
3074 'docs/UIDS-GIDS.md',
3075 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3076 install_dir : docdir)
3078 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3079 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3081 ############################################################
3083 meson_check_help = find_program('tools/meson-check-help.sh')
3085 foreach exec : public_programs
3086 name = exec.full_path().split('/')[-1]
3087 if want_tests != 'false'
3088 test('check-help-' + name,
3090 args : exec.full_path())
3094 ############################################################
3096 check_directives_sh = find_program('tools/check-directives.sh')
3098 if want_tests != 'false'
3099 test('check-directives',
3100 check_directives_sh,
3101 args : project_source_root)
3104 ############################################################
3106 # Enable tests for all supported sanitizers
3107 foreach tuple : sanitizers
3108 sanitizer = tuple[0]
3111 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3113 foreach p : fuzz_regression_tests
3114 b = p.split('/')[-2]
3115 c = p.split('/')[-1]
3117 name = '@0@:@1@'.format(b, sanitizer)
3120 if want_tests == 'false'
3121 message('Not compiling @0@ because tests is set to false'.format(name))
3123 exe = custom_target(
3127 command : [env, 'ln', '-fs',
3128 join_paths(build.full_path(), b),
3130 build_by_default : true)
3132 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3137 if want_tests != 'false' and slow_tests
3138 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3140 args : [exe.full_path(),
3141 join_paths(project_source_root, p)])
3148 ############################################################
3151 all_files = run_command(
3153 ['--git-dir=@0@/.git'.format(project_source_root),
3156 all_files = files(all_files.stdout().split())
3161 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3164 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3168 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3171 command : [meson_git_contrib_sh])
3175 git_head = run_command(
3177 ['--git-dir=@0@/.git'.format(project_source_root),
3178 'rev-parse', 'HEAD']).stdout().strip()
3179 git_head_short = run_command(
3181 ['--git-dir=@0@/.git'.format(project_source_root),
3182 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3186 command : ['git', 'archive',
3187 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3189 '--prefix', 'systemd-@0@/'.format(git_head),
3193 ############################################################
3195 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3198 depends : [man, libsystemd, libudev],
3199 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3201 ############################################################
3202 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3205 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3207 'split /usr: @0@'.format(split_usr),
3208 'split bin-sbin: @0@'.format(split_bin),
3209 'prefix directory: @0@'.format(prefixdir),
3210 'rootprefix directory: @0@'.format(rootprefixdir),
3211 'sysconf directory: @0@'.format(sysconfdir),
3212 'include directory: @0@'.format(includedir),
3213 'lib directory: @0@'.format(libdir),
3214 'rootlib directory: @0@'.format(rootlibdir),
3215 'SysV init scripts: @0@'.format(sysvinit_path),
3216 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3217 'PAM modules directory: @0@'.format(pamlibdir),
3218 'PAM configuration directory: @0@'.format(pamconfdir),
3219 'RPM macros directory: @0@'.format(rpmmacrosdir),
3220 'modprobe.d directory: @0@'.format(modprobedir),
3221 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3222 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3223 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3224 'bash completions directory: @0@'.format(bashcompletiondir),
3225 'zsh completions directory: @0@'.format(zshcompletiondir),
3226 'extra start script: @0@'.format(get_option('rc-local')),
3227 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3228 get_option('debug-tty')),
3229 'TTY GID: @0@'.format(tty_gid),
3230 'users GID: @0@'.format(substs.get('USERS_GID')),
3231 'maximum system UID: @0@'.format(system_uid_max),
3232 'maximum system GID: @0@'.format(system_gid_max),
3233 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3234 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3235 'minimum container UID base: @0@'.format(container_uid_base_min),
3236 'maximum container UID base: @0@'.format(container_uid_base_max),
3237 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3238 'render group access mode: @0@'.format(get_option('group-render-mode')),
3239 'certificate root directory: @0@'.format(get_option('certificate-root')),
3240 'support URL: @0@'.format(support_url),
3241 'nobody user name: @0@'.format(nobody_user),
3242 'nobody group name: @0@'.format(nobody_group),
3243 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3244 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3246 'default DNSSEC mode: @0@'.format(default_dnssec),
3247 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3248 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3249 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3250 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3251 'default locale: @0@'.format(default_locale),
3252 'default user $PATH: @0@'.format(default_user_path_display),
3253 'systemd service watchdog: @0@'.format(watchdog_opt)]
3255 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3256 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3258 'default DNS servers: @0@'.format(alt_dns_servers),
3259 'default NTP servers: @0@'.format(alt_ntp_servers)]
3261 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3262 '@@0@'.format(time_epoch)).stdout().strip()
3264 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3267 'static libsystemd: @0@'.format(static_libsystemd),
3268 'static libudev: @0@'.format(static_libudev)]
3271 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3272 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3273 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3275 if conf.get('ENABLE_EFI') == 1
3276 status += 'efi arch: @0@'.format(efi_arch)
3280 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3281 'EFI CC @0@'.format(' '.join(efi_cc)),
3282 'EFI lib directory: @0@'.format(efi_libdir),
3283 'EFI lds directory: @0@'.format(efi_ldsdir),
3284 'EFI include directory: @0@'.format(efi_incdir)]
3339 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3340 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3344 ['legacy pkla', install_polkit_pkla],
3346 ['gnu-efi', have_gnu_efi],
3359 ['man pages', want_man],
3360 ['html pages', want_html],
3361 ['man page indices', want_man and have_lxml],
3366 ['adm group', get_option('adm-group')],
3367 ['wheel group', get_option('wheel-group')],
3370 ['debug mmap cache'],
3372 ['valgrind', conf.get('VALGRIND') == 1],
3373 ['trace logging', conf.get('LOG_TRACE') == 1],
3374 ['link-udev-shared', get_option('link-udev-shared')],
3375 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3376 ['link-networkd-shared', get_option('link-networkd-shared')],
3379 if tuple.length() >= 2
3382 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3383 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3384 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3395 'enabled features: @0@'.format(', '.join(found)),
3397 'disabled features: @0@'.format(', '.join(missing)),
3399 message('\n '.join(status))
3401 if rootprefixdir != rootprefix_default
3403 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3404 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3405 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))