1 # SPDX-License-Identifier: LGPL-2.1+
3 project('systemd', 'c',
13 meson_version : '>= 0.46',
16 libsystemd_version = '0.28.0'
17 libudev_version = '1.6.17'
19 # We need the same data in two different formats, ugh!
20 # Also, for hysterical reasons, we use different variable
21 # names, sometimes. Not all variables are included in every
23 conf = configuration_data()
24 conf.set('PROJECT_VERSION', meson.project_version(),
25 description : 'Numerical project version (used where a simple number is expected)')
27 substs = configuration_data()
28 substs.set('PROJECT_URL', 'https://www.freedesktop.org/wiki/Software/systemd')
29 substs.set('PROJECT_VERSION', meson.project_version(),
30 description : 'Numerical project version (used where a simple number is expected)')
32 # This is to be used instead of meson.source_root(), as the latter will return
33 # the wrong result when systemd is being built as a meson subproject
34 project_source_root = meson.current_source_dir()
35 project_build_root = meson.current_build_dir()
36 relative_source_path = run_command('realpath',
37 '--relative-to=@0@'.format(project_build_root),
38 project_source_root).stdout().strip()
39 conf.set_quoted('RELATIVE_SOURCE_PATH', relative_source_path)
41 want_ossfuzz = get_option('oss-fuzz')
42 want_libfuzzer = get_option('llvm-fuzz')
43 if want_ossfuzz + want_libfuzzer > 1
44 error('only one of oss-fuzz or llvm-fuzz can be specified')
47 skip_deps = want_ossfuzz or want_libfuzzer
48 fuzzer_build = want_ossfuzz or want_libfuzzer
50 #####################################################################
52 # Try to install the git pre-commit hook
53 add_git_hook_sh = find_program('tools/add-git-hook.sh', required : false)
54 if add_git_hook_sh.found()
55 git_hook = run_command(add_git_hook_sh)
56 if git_hook.returncode() == 0
57 message(git_hook.stdout().strip())
61 #####################################################################
63 if get_option('split-usr') == 'auto'
64 split_usr = run_command('test', '-L', '/bin').returncode() != 0
66 split_usr = get_option('split-usr') == 'true'
68 conf.set10('HAVE_SPLIT_USR', split_usr,
69 description : '/usr/bin and /bin directories are separate')
71 if get_option('split-bin') == 'auto'
72 split_bin = run_command('test', '-L', '/usr/sbin').returncode() != 0
74 split_bin = get_option('split-bin') == 'true'
76 conf.set10('HAVE_SPLIT_BIN', split_bin,
77 description : 'bin and sbin directories are separate')
79 rootprefixdir = get_option('rootprefix')
80 # Unusual rootprefixdir values are used by some distros
81 # (see https://github.com/systemd/systemd/pull/7461).
82 rootprefix_default = split_usr ? '/' : '/usr'
83 if rootprefixdir == ''
84 rootprefixdir = rootprefix_default
86 rootprefixdir_noslash = rootprefixdir == '/' ? '' : rootprefixdir
88 sysvinit_path = get_option('sysvinit-path')
89 sysvrcnd_path = get_option('sysvrcnd-path')
90 conf.set10('HAVE_SYSV_COMPAT', sysvinit_path != '' and sysvrcnd_path != '',
91 description : 'SysV init scripts and rcN.d links are supported')
93 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
94 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
95 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
97 # join_paths ignores the preceding arguments if an absolute component is
98 # encountered, so this should canonicalize various paths when they are
99 # absolute or relative.
100 prefixdir = get_option('prefix')
101 if not prefixdir.startswith('/')
102 error('Prefix is not absolute: "@0@"'.format(prefixdir))
104 bindir = join_paths(prefixdir, get_option('bindir'))
105 libdir = join_paths(prefixdir, get_option('libdir'))
106 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
107 includedir = join_paths(prefixdir, get_option('includedir'))
108 datadir = join_paths(prefixdir, get_option('datadir'))
109 localstatedir = join_paths('/', get_option('localstatedir'))
111 rootbindir = join_paths(rootprefixdir, 'bin')
112 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
113 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
115 rootlibdir = get_option('rootlibdir')
117 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
120 # Dirs of external packages
121 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
122 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
123 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
124 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
125 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
126 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
127 rpmmacrosdir = get_option('rpmmacrosdir')
128 if rpmmacrosdir != 'no'
129 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
131 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
134 pkgdatadir = join_paths(datadir, 'systemd')
135 environmentdir = join_paths(prefixdir, 'lib/environment.d')
136 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
137 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
138 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
139 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
140 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
141 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
142 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
143 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
144 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
145 pkgincludedir = join_paths(includedir, 'systemd')
146 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
147 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
148 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
149 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
150 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
151 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
152 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
153 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
154 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
155 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
156 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
157 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
158 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
159 factorydir = join_paths(datadir, 'factory')
160 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
161 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
162 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
163 catalogstatedir = join_paths(systemdstatedir, 'catalog')
164 randomseeddir = join_paths(localstatedir, 'lib/systemd')
165 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
166 ntpservicelistdir = join_paths(rootprefixdir, 'lib/systemd/ntp-units.d')
168 docdir = get_option('docdir')
170 docdir = join_paths(datadir, 'doc/systemd')
173 dbuspolicydir = get_option('dbuspolicydir')
174 if dbuspolicydir == ''
175 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
178 dbussessionservicedir = get_option('dbussessionservicedir')
179 if dbussessionservicedir == ''
180 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
183 dbussystemservicedir = get_option('dbussystemservicedir')
184 if dbussystemservicedir == ''
185 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
188 pamlibdir = get_option('pamlibdir')
190 pamlibdir = join_paths(rootlibdir, 'security')
193 pamconfdir = get_option('pamconfdir')
195 pamconfdir = join_paths(sysconfdir, 'pam.d')
198 memory_accounting_default = get_option('memory-accounting-default')
199 status_unit_format_default = get_option('status-unit-format-default')
201 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
202 conf.set_quoted('SYSTEM_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'system'))
203 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
204 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
205 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
206 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
208 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
210 conf.set_quoted('USER_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'user'))
211 conf.set_quoted('USER_DATA_UNIT_DIR', userunitdir)
212 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
213 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
214 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
215 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
216 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
217 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
218 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
219 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
220 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
221 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
222 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
223 conf.set_quoted('ROOTPREFIX', rootprefixdir)
224 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
225 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
226 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
227 conf.set_quoted('SYSTEM_GENERATOR_DIR', systemgeneratordir)
228 conf.set_quoted('USER_GENERATOR_DIR', usergeneratordir)
229 conf.set_quoted('SYSTEM_ENV_GENERATOR_DIR', systemenvgeneratordir)
230 conf.set_quoted('USER_ENV_GENERATOR_DIR', userenvgeneratordir)
231 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
232 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
233 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
234 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
235 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
236 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
237 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
238 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
239 conf.set_quoted('LIBDIR', libdir)
240 conf.set_quoted('ROOTLIBDIR', rootlibdir)
241 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
242 conf.set_quoted('BOOTLIBDIR', bootlibdir)
243 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
244 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
245 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
246 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
247 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
248 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
249 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
250 conf.set_quoted('SYSTEMD_HOMEWORK_PATH', join_paths(rootlibexecdir, 'systemd-homework'))
251 conf.set_quoted('SYSTEMD_USERWORK_PATH', join_paths(rootlibexecdir, 'systemd-userwork'))
252 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
253 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
254 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
256 substs.set('prefix', prefixdir)
257 substs.set('rootprefix', rootprefixdir)
258 substs.set('rootprefix_noslash', rootprefixdir_noslash)
259 substs.set('exec_prefix', prefixdir)
260 substs.set('libdir', libdir)
261 substs.set('rootlibdir', rootlibdir)
262 substs.set('includedir', includedir)
263 substs.set('sysconfdir', sysconfdir)
264 substs.set('bindir', bindir)
265 substs.set('rootbindir', rootbindir)
266 substs.set('rootlibexecdir', rootlibexecdir)
267 substs.set('systemunitdir', systemunitdir)
268 substs.set('userunitdir', userunitdir)
269 substs.set('systempresetdir', systempresetdir)
270 substs.set('userpresetdir', userpresetdir)
271 substs.set('udevhwdbdir', udevhwdbdir)
272 substs.set('udevrulesdir', udevrulesdir)
273 substs.set('udevlibexecdir', udevlibexecdir)
274 substs.set('environmentdir', environmentdir)
275 substs.set('catalogdir', catalogdir)
276 substs.set('tmpfilesdir', tmpfilesdir)
277 substs.set('sysusersdir', sysusersdir)
278 substs.set('sysctldir', sysctldir)
279 substs.set('binfmtdir', binfmtdir)
280 substs.set('modulesloaddir', modulesloaddir)
281 substs.set('modprobedir', modprobedir)
282 substs.set('systemgeneratordir', systemgeneratordir)
283 substs.set('usergeneratordir', usergeneratordir)
284 substs.set('systemenvgeneratordir', systemenvgeneratordir)
285 substs.set('userenvgeneratordir', userenvgeneratordir)
286 substs.set('systemshutdowndir', systemshutdowndir)
287 substs.set('systemsleepdir', systemsleepdir)
288 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
289 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
290 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
291 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
292 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
293 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
294 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
295 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
296 substs.set('BUILD_ROOT', project_build_root)
298 #####################################################################
300 cc = meson.get_compiler('c')
301 pkgconfig = import('pkgconfig')
302 check_compilation_sh = find_program('tools/meson-check-compilation.sh')
303 meson_build_sh = find_program('tools/meson-build.sh')
305 want_tests = get_option('tests')
306 slow_tests = want_tests != 'false' and get_option('slow-tests')
307 install_tests = get_option('install-tests')
309 if add_languages('cpp', required : fuzzer_build)
310 # Used only for tests
311 cxx = meson.get_compiler('cpp')
312 cxx_cmd = ' '.join(cxx.cmd_array())
318 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
319 if fuzzing_engine.found()
320 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
321 elif cc.has_argument('-fsanitize=fuzzer-no-link')
322 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
324 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
327 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
330 # Those generate many false positives, and we do not want to change the code to
332 basic_disabled_warnings = [
333 '-Wno-unused-parameter',
334 '-Wno-missing-field-initializers',
335 '-Wno-unused-result',
336 '-Wno-format-signedness',
338 if get_option('b_ndebug') == 'true'
339 # With asserts disabled with get a bunch of warnings about variables which
340 # are used only in the asserts. This is not useful at all, so let's just silence
342 basic_disabled_warnings += [
343 '-Wno-unused-variable',
344 '-Wno-unused-but-set-variable',
348 possible_cc_flags = [
351 '-Wmissing-include-dirs',
352 '-Wold-style-definition',
356 '-Wsuggest-attribute=noreturn',
357 '-Werror=missing-prototypes',
358 '-Werror=implicit-function-declaration',
359 '-Werror=missing-declarations',
360 '-Werror=return-type',
361 '-Werror=incompatible-pointer-types',
363 '-Wstrict-prototypes',
365 '-Wmissing-noreturn',
366 '-Wimplicit-fallthrough=5',
369 '-Wstrict-aliasing=2',
372 '-Werror=shift-count-overflow',
373 '-Werror=shift-overflow=2',
377 # negative arguments are correctly detected starting with meson 0.46.
378 '-Wno-error=#warnings', # clang
379 '-Wno-string-plus-int', # clang
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_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
452 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
453 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
454 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
458 #include <sys/stat.h>
461 foreach decl : ['char16_t',
466 # We get -1 if the size cannot be determined
467 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
469 if decl == 'struct statx'
471 want_linux_stat_h = false
473 have = cc.sizeof(decl,
474 prefix : decl_headers + '#include <linux/stat.h>',
475 args : '-D_GNU_SOURCE') > 0
476 want_linux_stat_h = have
480 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
483 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
485 foreach ident : ['secure_getenv', '__secure_getenv']
486 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
490 ['memfd_create', '''#include <sys/mman.h>'''],
491 ['gettid', '''#include <sys/types.h>
492 #include <unistd.h>'''],
493 ['pivot_root', '''#include <stdlib.h>
494 #include <unistd.h>'''], # no known header declares pivot_root
495 ['name_to_handle_at', '''#include <sys/types.h>
496 #include <sys/stat.h>
497 #include <fcntl.h>'''],
498 ['setns', '''#include <sched.h>'''],
499 ['renameat2', '''#include <stdio.h>
500 #include <fcntl.h>'''],
501 ['kcmp', '''#include <linux/kcmp.h>'''],
502 ['keyctl', '''#include <sys/types.h>
503 #include <keyutils.h>'''],
504 ['copy_file_range', '''#include <sys/syscall.h>
505 #include <unistd.h>'''],
506 ['bpf', '''#include <sys/syscall.h>
507 #include <unistd.h>'''],
508 ['statx', '''#include <sys/types.h>
509 #include <sys/stat.h>
510 #include <unistd.h>'''],
511 ['explicit_bzero' , '''#include <string.h>'''],
512 ['reallocarray', '''#include <malloc.h>'''],
513 ['set_mempolicy', '''#include <stdlib.h>
514 #include <unistd.h>'''],
515 ['get_mempolicy', '''#include <stdlib.h>
516 #include <unistd.h>'''],
517 ['pidfd_send_signal', '''#include <stdlib.h>
520 #include <sys/wait.h>'''],
521 ['pidfd_open', '''#include <stdlib.h>
524 #include <sys/wait.h>'''],
525 ['rt_sigqueueinfo', '''#include <stdlib.h>
528 #include <sys/wait.h>'''],
531 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
532 conf.set10('HAVE_' + ident[0].to_upper(), have)
535 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
536 conf.set10('USE_SYS_RANDOM_H', true)
537 conf.set10('HAVE_GETRANDOM', true)
539 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
540 conf.set10('USE_SYS_RANDOM_H', false)
541 conf.set10('HAVE_GETRANDOM', have)
544 #####################################################################
546 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
548 get_option('version-tag'),
549 meson.project_version()]
552 input : 'src/version/version.h.in',
553 output : 'version.h',
556 versiondep = declare_dependency(sources: version_h)
558 sed = find_program('sed')
559 awk = find_program('awk')
560 m4 = find_program('m4')
561 stat = find_program('stat')
562 git = find_program('git', required : false)
563 env = find_program('env')
564 perl = find_program('perl', required : false)
566 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
567 mkdir_p = 'mkdir -p $DESTDIR/@0@'
568 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
569 splash_bmp = files('test/splash.bmp')
571 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
572 # /usr/sbin, /sbin, and fall back to the default from middle column.
573 progs = [['quotaon', '/usr/sbin/quotaon' ],
574 ['quotacheck', '/usr/sbin/quotacheck' ],
575 ['kmod', '/usr/bin/kmod' ],
576 ['kexec', '/usr/sbin/kexec' ],
577 ['sulogin', '/usr/sbin/sulogin' ],
578 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
579 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
580 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
581 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
582 ['nologin', '/usr/sbin/nologin', ],
585 path = get_option(prog[0] + '-path')
587 message('Using @1@ for @0@'.format(prog[0], path))
589 exe = find_program(prog[0],
590 '/usr/sbin/' + prog[0],
593 path = exe.found() ? exe.path() : prog[1]
595 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
596 conf.set_quoted(name, path)
597 substs.set(name, path)
600 conf.set_quoted('TELINIT', get_option('telinit-path'))
602 if run_command('ln', '--relative', '--help').returncode() != 0
603 error('ln does not support --relative (added in coreutils 8.16)')
606 ############################################################
608 gperf = find_program('gperf')
610 gperf_test_format = '''
612 const char * in_word_set(const char *, @0@);
615 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
616 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
617 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
618 if cc.compiles(gperf_test)
619 gperf_len_type = 'size_t'
621 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
622 if cc.compiles(gperf_test)
623 gperf_len_type = 'unsigned'
625 error('unable to determine gperf len type')
628 message('gperf len type is @0@'.format(gperf_len_type))
629 conf.set('GPERF_LEN_TYPE', gperf_len_type,
630 description : 'The type of gperf "len" parameter')
632 ############################################################
634 if not cc.has_header('sys/capability.h')
635 error('POSIX caps headers not found')
637 foreach header : ['crypt.h',
639 'linux/vm_sockets.h',
641 'valgrind/memcheck.h',
642 'valgrind/valgrind.h',
645 conf.set10('HAVE_' + header.underscorify().to_upper(),
646 cc.has_header(header))
649 ############################################################
651 conf.set_quoted('FALLBACK_HOSTNAME', get_option('fallback-hostname'))
652 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
653 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
655 default_hierarchy = get_option('default-hierarchy')
656 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
657 description : 'default cgroup hierarchy as string')
658 if default_hierarchy == 'legacy'
659 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
660 elif default_hierarchy == 'hybrid'
661 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
663 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
666 default_net_naming_scheme = get_option('default-net-naming-scheme')
667 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
669 time_epoch = get_option('time-epoch')
672 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
674 conf.set('TIME_EPOCH', time_epoch)
676 system_uid_max = get_option('system-uid-max')
677 if system_uid_max == -1
678 system_uid_max = run_command(
680 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
681 '/etc/login.defs').stdout().strip()
682 if system_uid_max == ''
685 system_uid_max = system_uid_max.to_int()
688 conf.set('SYSTEM_UID_MAX', system_uid_max)
689 substs.set('systemuidmax', system_uid_max)
691 system_gid_max = get_option('system-gid-max')
692 if system_gid_max == -1
693 system_gid_max = run_command(
695 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
696 '/etc/login.defs').stdout().strip()
697 if system_gid_max == ''
700 system_gid_max = system_gid_max.to_int()
703 conf.set('SYSTEM_GID_MAX', system_gid_max)
704 substs.set('systemgidmax', system_gid_max)
706 dynamic_uid_min = get_option('dynamic-uid-min')
707 dynamic_uid_max = get_option('dynamic-uid-max')
708 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
709 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
710 substs.set('dynamicuidmin', dynamic_uid_min)
711 substs.set('dynamicuidmax', dynamic_uid_max)
713 container_uid_base_min = get_option('container-uid-base-min')
714 container_uid_base_max = get_option('container-uid-base-max')
715 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
716 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
717 substs.set('containeruidbasemin', container_uid_base_min)
718 substs.set('containeruidbasemax', container_uid_base_max)
720 nobody_user = get_option('nobody-user')
721 nobody_group = get_option('nobody-group')
723 if not meson.is_cross_build()
724 getent_result = run_command('getent', 'passwd', '65534')
725 if getent_result.returncode() == 0
726 name = getent_result.stdout().split(':')[0]
727 if name != nobody_user
729 '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) +
730 'Your build will result in an user table setup that is incompatible with the local system.')
733 id_result = run_command('id', '-u', nobody_user)
734 if id_result.returncode() == 0
735 id = id_result.stdout().to_int()
738 '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) +
739 'Your build will result in an user table setup that is incompatible with the local system.')
743 getent_result = run_command('getent', 'group', '65534')
744 if getent_result.returncode() == 0
745 name = getent_result.stdout().split(':')[0]
746 if name != nobody_group
748 '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) +
749 'Your build will result in an group table setup that is incompatible with the local system.')
752 id_result = run_command('id', '-g', nobody_group)
753 if id_result.returncode() == 0
754 id = id_result.stdout().to_int()
757 '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) +
758 'Your build will result in an group table setup that is incompatible with the local system.')
762 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
764 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
765 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
768 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
769 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
770 substs.set('NOBODY_USER_NAME', nobody_user)
771 substs.set('NOBODY_GROUP_NAME', nobody_group)
773 tty_gid = get_option('tty-gid')
774 conf.set('TTY_GID', tty_gid)
775 substs.set('TTY_GID', tty_gid)
777 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
778 users_gid = get_option('users-gid')
779 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
781 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
782 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
784 dev_kvm_mode = get_option('dev-kvm-mode')
785 substs.set('DEV_KVM_MODE', dev_kvm_mode)
786 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
787 group_render_mode = get_option('group-render-mode')
788 substs.set('GROUP_RENDER_MODE', group_render_mode)
789 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
791 kill_user_processes = get_option('default-kill-user-processes')
792 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
793 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
794 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
796 dns_servers = get_option('dns-servers')
797 conf.set_quoted('DNS_SERVERS', dns_servers)
798 substs.set('DNS_SERVERS', dns_servers)
800 ntp_servers = get_option('ntp-servers')
801 conf.set_quoted('NTP_SERVERS', ntp_servers)
802 substs.set('NTP_SERVERS', ntp_servers)
804 default_locale = get_option('default-locale')
805 if default_locale == ''
806 if not meson.is_cross_build()
807 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
808 default_locale = run_command(choose_default_locale_sh).stdout().strip()
810 default_locale = 'C.UTF-8'
813 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
815 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
817 service_watchdog = get_option('service-watchdog')
818 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
819 substs.set('SERVICE_WATCHDOG', watchdog_value)
821 substs.set('SUSHELL', get_option('debug-shell'))
822 substs.set('DEBUGTTY', get_option('debug-tty'))
823 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
825 enable_debug_hashmap = false
826 enable_debug_mmap_cache = false
827 enable_debug_siphash = false
828 foreach name : get_option('debug-extra')
830 enable_debug_hashmap = true
831 elif name == 'mmap-cache'
832 enable_debug_mmap_cache = true
833 elif name == 'siphash'
834 enable_debug_siphash = true
836 message('unknown debug option "@0@", ignoring'.format(name))
839 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
840 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
841 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
843 conf.set10('VALGRIND', get_option('valgrind'))
844 conf.set10('LOG_TRACE', get_option('log-trace'))
846 default_user_path = get_option('user-path')
847 if default_user_path != ''
848 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
849 default_user_path_display = default_user_path
851 # meson 0.49 fails when ?: is used in .format()
852 default_user_path_display = '(same as system services)'
856 #####################################################################
858 threads = dependency('threads')
859 librt = cc.find_library('rt')
860 libm = cc.find_library('m')
861 libdl = cc.find_library('dl')
862 libcrypt = cc.find_library('crypt')
864 libcap = dependency('libcap', required : false)
865 if not libcap.found()
866 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
867 libcap = cc.find_library('cap')
870 libmount = dependency('mount',
871 version : fuzzer_build ? '>= 0' : '>= 2.30')
873 want_libfdisk = get_option('fdisk')
874 if want_libfdisk != 'false' and not skip_deps
875 libfdisk = dependency('fdisk',
876 required : want_libfdisk == 'true')
877 have = libfdisk.found()
882 conf.set10('HAVE_LIBFDISK', have)
884 want_pwquality = get_option('pwquality')
885 if want_pwquality != 'false' and not skip_deps
886 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
887 have = libpwquality.found()
892 conf.set10('HAVE_PWQUALITY', have)
894 want_seccomp = get_option('seccomp')
895 if want_seccomp != 'false' and not skip_deps
896 libseccomp = dependency('libseccomp',
897 version : '>= 2.3.1',
898 required : want_seccomp == 'true')
899 have = libseccomp.found()
904 conf.set10('HAVE_SECCOMP', have)
906 want_selinux = get_option('selinux')
907 if want_selinux != 'false' and not skip_deps
908 libselinux = dependency('libselinux',
909 version : '>= 2.1.9',
910 required : want_selinux == 'true')
911 have = libselinux.found()
916 conf.set10('HAVE_SELINUX', have)
918 want_apparmor = get_option('apparmor')
919 if want_apparmor != 'false' and not skip_deps
920 libapparmor = dependency('libapparmor',
921 required : want_apparmor == 'true')
922 have = libapparmor.found()
927 conf.set10('HAVE_APPARMOR', have)
929 smack_run_label = get_option('smack-run-label')
930 if smack_run_label != ''
931 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
934 want_polkit = get_option('polkit')
935 install_polkit = false
936 install_polkit_pkla = false
937 if want_polkit != 'false' and not skip_deps
938 install_polkit = true
940 libpolkit = dependency('polkit-gobject-1',
942 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
943 message('Old polkit detected, will install pkla files')
944 install_polkit_pkla = true
947 conf.set10('ENABLE_POLKIT', install_polkit)
949 want_acl = get_option('acl')
950 if want_acl != 'false' and not skip_deps
951 libacl = cc.find_library('acl', required : want_acl == 'true')
952 have = libacl.found()
957 conf.set10('HAVE_ACL', have)
959 want_audit = get_option('audit')
960 if want_audit != 'false' and not skip_deps
961 libaudit = dependency('audit', required : want_audit == 'true')
962 have = libaudit.found()
967 conf.set10('HAVE_AUDIT', have)
969 want_blkid = get_option('blkid')
970 if want_blkid != 'false' and not skip_deps
971 libblkid = dependency('blkid', required : want_blkid == 'true')
972 have = libblkid.found()
977 conf.set10('HAVE_BLKID', have)
979 want_kmod = get_option('kmod')
980 if want_kmod != 'false' and not skip_deps
981 libkmod = dependency('libkmod',
983 required : want_kmod == 'true')
984 have = libkmod.found()
989 conf.set10('HAVE_KMOD', have)
991 want_pam = get_option('pam')
992 if want_pam != 'false' and not skip_deps
993 libpam = cc.find_library('pam', required : want_pam == 'true')
994 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
995 have = libpam.found() and libpam_misc.found()
1001 conf.set10('HAVE_PAM', have)
1003 want_microhttpd = get_option('microhttpd')
1004 if want_microhttpd != 'false' and not skip_deps
1005 libmicrohttpd = dependency('libmicrohttpd',
1006 version : '>= 0.9.33',
1007 required : want_microhttpd == 'true')
1008 have = libmicrohttpd.found()
1013 conf.set10('HAVE_MICROHTTPD', have)
1015 want_libcryptsetup = get_option('libcryptsetup')
1016 if want_libcryptsetup != 'false' and not skip_deps
1017 libcryptsetup = dependency('libcryptsetup',
1018 version : '>= 2.0.1',
1019 required : want_libcryptsetup == 'true')
1020 have = libcryptsetup.found()
1022 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1023 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
1028 conf.set10('HAVE_LIBCRYPTSETUP', have)
1030 want_libcurl = get_option('libcurl')
1031 if want_libcurl != 'false' and not skip_deps
1032 libcurl = dependency('libcurl',
1033 version : '>= 7.32.0',
1034 required : want_libcurl == 'true')
1035 have = libcurl.found()
1040 conf.set10('HAVE_LIBCURL', have)
1042 want_libidn = get_option('libidn')
1043 want_libidn2 = get_option('libidn2')
1044 if want_libidn == 'true' and want_libidn2 == 'true'
1045 error('libidn and libidn2 cannot be requested simultaneously')
1048 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1049 libidn = dependency('libidn2',
1050 required : want_libidn2 == 'true')
1051 have = libidn.found()
1056 conf.set10('HAVE_LIBIDN2', have)
1057 if not have and want_libidn != 'false' and not skip_deps
1058 # libidn is used for both libidn and libidn2 objects
1059 libidn = dependency('libidn',
1060 required : want_libidn == 'true')
1061 have = libidn.found()
1065 conf.set10('HAVE_LIBIDN', have)
1067 want_libiptc = get_option('libiptc')
1068 if want_libiptc != 'false' and not skip_deps
1069 libiptc = dependency('libiptc',
1070 required : want_libiptc == 'true')
1071 have = libiptc.found()
1076 conf.set10('HAVE_LIBIPTC', have)
1078 want_qrencode = get_option('qrencode')
1079 if want_qrencode != 'false' and not skip_deps
1080 libqrencode = dependency('libqrencode',
1081 required : want_qrencode == 'true')
1082 have = libqrencode.found()
1087 conf.set10('HAVE_QRENCODE', have)
1089 want_gcrypt = get_option('gcrypt')
1090 if want_gcrypt != 'false' and not skip_deps
1091 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1092 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1093 have = libgcrypt.found() and libgpg_error.found()
1098 # link to neither of the libs if one is not found
1102 conf.set10('HAVE_GCRYPT', have)
1104 want_gnutls = get_option('gnutls')
1105 if want_gnutls != 'false' and not skip_deps
1106 libgnutls = dependency('gnutls',
1107 version : '>= 3.1.4',
1108 required : want_gnutls == 'true')
1109 have = libgnutls.found()
1114 conf.set10('HAVE_GNUTLS', have)
1116 want_openssl = get_option('openssl')
1117 if want_openssl != 'false' and not skip_deps
1118 libopenssl = dependency('openssl',
1119 version : '>= 1.1.0',
1120 required : want_openssl == 'true')
1121 have = libopenssl.found()
1126 conf.set10('HAVE_OPENSSL', have)
1128 want_p11kit = get_option('p11kit')
1129 if want_p11kit != 'false' and not skip_deps
1130 libp11kit = dependency('p11-kit-1',
1131 version : '>= 0.23.3',
1132 required : want_p11kit == 'true')
1133 have = libp11kit.found()
1138 conf.set10('HAVE_P11KIT', have)
1140 want_elfutils = get_option('elfutils')
1141 if want_elfutils != 'false' and not skip_deps
1142 libdw = dependency('libdw',
1143 required : want_elfutils == 'true')
1144 have = libdw.found()
1149 conf.set10('HAVE_ELFUTILS', have)
1151 want_zlib = get_option('zlib')
1152 if want_zlib != 'false' and not skip_deps
1153 libz = dependency('zlib',
1154 required : want_zlib == 'true')
1160 conf.set10('HAVE_ZLIB', have)
1162 want_bzip2 = get_option('bzip2')
1163 if want_bzip2 != 'false' and not skip_deps
1164 libbzip2 = cc.find_library('bz2',
1165 required : want_bzip2 == 'true')
1166 have = libbzip2.found()
1171 conf.set10('HAVE_BZIP2', have)
1173 want_xz = get_option('xz')
1174 if want_xz != 'false' and not skip_deps
1175 libxz = dependency('liblzma',
1176 required : want_xz == 'true')
1177 have = libxz.found()
1182 conf.set10('HAVE_XZ', have)
1184 want_lz4 = get_option('lz4')
1185 if want_lz4 != 'false' and not skip_deps
1186 liblz4 = dependency('liblz4',
1187 version : '>= 1.3.0',
1188 required : want_lz4 == 'true')
1189 have = liblz4.found()
1194 conf.set10('HAVE_LZ4', have)
1196 want_zstd = get_option('zstd')
1197 if want_zstd != 'false' and not skip_deps
1198 libzstd = dependency('libzstd',
1199 required : want_zstd == 'true',
1200 version : '>= 1.4.0')
1201 have = libzstd.found()
1206 conf.set10('HAVE_ZSTD', have)
1208 want_xkbcommon = get_option('xkbcommon')
1209 if want_xkbcommon != 'false' and not skip_deps
1210 libxkbcommon = dependency('xkbcommon',
1211 version : '>= 0.3.0',
1212 required : want_xkbcommon == 'true')
1213 have = libxkbcommon.found()
1218 conf.set10('HAVE_XKBCOMMON', have)
1220 want_pcre2 = get_option('pcre2')
1221 if want_pcre2 != 'false'
1222 libpcre2 = dependency('libpcre2-8',
1223 required : want_pcre2 == 'true')
1224 have = libpcre2.found()
1229 conf.set10('HAVE_PCRE2', have)
1231 want_glib = get_option('glib')
1232 if want_glib != 'false' and not skip_deps
1233 libglib = dependency('glib-2.0',
1234 version : '>= 2.22.0',
1235 required : want_glib == 'true')
1236 libgobject = dependency('gobject-2.0',
1237 version : '>= 2.22.0',
1238 required : want_glib == 'true')
1239 libgio = dependency('gio-2.0',
1240 required : want_glib == 'true')
1241 have = libglib.found() and libgobject.found() and libgio.found()
1248 conf.set10('HAVE_GLIB', have)
1250 want_dbus = get_option('dbus')
1251 if want_dbus != 'false' and not skip_deps
1252 libdbus = dependency('dbus-1',
1253 version : '>= 1.3.2',
1254 required : want_dbus == 'true')
1255 have = libdbus.found()
1260 conf.set10('HAVE_DBUS', have)
1262 default_dnssec = get_option('default-dnssec')
1264 default_dnssec = 'no'
1266 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1267 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1268 default_dnssec = 'no'
1270 conf.set('DEFAULT_DNSSEC_MODE',
1271 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1272 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1274 dns_over_tls = get_option('dns-over-tls')
1275 if dns_over_tls != 'false'
1276 if dns_over_tls == 'openssl'
1279 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1280 if dns_over_tls == 'gnutls' and not have_gnutls
1281 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1284 if dns_over_tls == 'gnutls' or have_gnutls
1285 have_openssl = false
1287 have_openssl = conf.get('HAVE_OPENSSL') == 1
1288 if dns_over_tls != 'auto' and not have_openssl
1289 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1290 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1293 have = have_gnutls or have_openssl
1297 have_openssl = false
1299 conf.set10('ENABLE_DNS_OVER_TLS', have)
1300 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1301 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1303 default_dns_over_tls = get_option('default-dns-over-tls')
1305 default_dns_over_tls = 'no'
1307 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1308 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.')
1309 default_dns_over_tls = 'no'
1311 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1312 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1313 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1315 default_mdns = get_option('default-mdns')
1316 conf.set('DEFAULT_MDNS_MODE',
1317 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
1318 substs.set('DEFAULT_MDNS_MODE', default_mdns)
1320 default_llmnr = get_option('default-llmnr')
1321 conf.set('DEFAULT_LLMNR_MODE',
1322 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
1323 substs.set('DEFAULT_LLMNR_MODE', default_llmnr)
1325 want_repart = get_option('repart')
1326 if want_repart != 'false'
1327 have = (conf.get('HAVE_OPENSSL') == 1 and
1328 conf.get('HAVE_LIBFDISK') == 1)
1329 if want_repart == 'true' and not have
1330 error('repart support was requested, but dependencies are not available')
1335 conf.set10('ENABLE_REPART', have)
1337 want_importd = get_option('importd')
1338 if want_importd != 'false'
1339 have = (conf.get('HAVE_LIBCURL') == 1 and
1340 conf.get('HAVE_ZLIB') == 1 and
1341 conf.get('HAVE_XZ') == 1 and
1342 conf.get('HAVE_GCRYPT') == 1)
1343 if want_importd == 'true' and not have
1344 error('importd support was requested, but dependencies are not available')
1349 conf.set10('ENABLE_IMPORTD', have)
1351 want_homed = get_option('homed')
1352 if want_homed != 'false'
1353 have = (conf.get('HAVE_OPENSSL') == 1 and
1354 conf.get('HAVE_LIBFDISK') == 1 and
1355 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1356 if want_homed == 'true' and not have
1357 error('homed support was requested, but dependencies are not available')
1362 conf.set10('ENABLE_HOMED', have)
1364 have = have and conf.get('HAVE_PAM') == 1
1365 conf.set10('ENABLE_PAM_HOME', have)
1367 want_remote = get_option('remote')
1368 if want_remote != 'false'
1369 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1370 conf.get('HAVE_LIBCURL') == 1]
1371 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1372 # it's possible to build one without the other. Complain only if
1373 # support was explicitly requested. The auxiliary files like sysusers
1374 # config should be installed when any of the programs are built.
1375 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1376 error('remote support was requested, but dependencies are not available')
1378 have = have_deps[0] or have_deps[1]
1382 conf.set10('ENABLE_REMOTE', have)
1384 foreach term : ['utmp',
1418 have = get_option(term)
1419 name = 'ENABLE_' + term.underscorify().to_upper()
1420 conf.set10(name, have)
1423 foreach tuple : [['nss-mymachines', 'machined'],
1424 ['nss-resolve', 'resolve']]
1425 want = get_option(tuple[0])
1427 have = get_option(tuple[1])
1428 if want == 'true' and not have
1429 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1434 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1435 conf.set10(name, have)
1439 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1440 'ENABLE_NSS_MYMACHINES',
1441 'ENABLE_NSS_RESOLVE',
1442 'ENABLE_NSS_SYSTEMD']
1443 if conf.get(term) == 1
1447 conf.set10('ENABLE_NSS', enable_nss)
1449 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1454 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1456 #####################################################################
1458 if get_option('efi')
1459 efi_arch = host_machine.cpu_family()
1461 if efi_arch == 'x86'
1462 EFI_MACHINE_TYPE_NAME = 'ia32'
1463 gnu_efi_arch = 'ia32'
1464 elif efi_arch == 'x86_64'
1465 EFI_MACHINE_TYPE_NAME = 'x64'
1466 gnu_efi_arch = 'x86_64'
1467 elif efi_arch == 'arm'
1468 EFI_MACHINE_TYPE_NAME = 'arm'
1469 gnu_efi_arch = 'arm'
1470 elif efi_arch == 'aarch64'
1471 EFI_MACHINE_TYPE_NAME = 'aa64'
1472 gnu_efi_arch = 'aarch64'
1474 EFI_MACHINE_TYPE_NAME = ''
1479 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1481 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1485 conf.set10('ENABLE_EFI', have)
1487 #####################################################################
1489 config_h = configure_file(
1490 output : 'config.h',
1491 configuration : conf)
1493 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1495 includes = include_directories('src/basic',
1500 'src/journal-remote',
1504 'src/time-wait-sync',
1510 'src/libsystemd/sd-bus',
1511 'src/libsystemd/sd-device',
1512 'src/libsystemd/sd-event',
1513 'src/libsystemd/sd-hwdb',
1514 'src/libsystemd/sd-id128',
1515 'src/libsystemd/sd-netlink',
1516 'src/libsystemd/sd-network',
1517 'src/libsystemd/sd-resolve',
1518 'src/libsystemd-network',
1521 add_project_arguments('-include', 'config.h', language : 'c')
1523 generate_gperfs = find_program('tools/generate-gperfs.py')
1527 subdir('src/systemd')
1529 subdir('src/libsystemd')
1530 subdir('src/libsystemd-network')
1531 subdir('src/journal')
1534 libjournal_core = static_library(
1536 libjournal_core_sources,
1538 include_directories : includes,
1541 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1542 libsystemd = shared_library(
1545 version : libsystemd_version,
1546 include_directories : includes,
1547 link_args : ['-shared',
1548 '-Wl,--version-script=' + libsystemd_sym_path],
1549 link_with : [libbasic,
1551 link_whole : [libsystemd_static,
1553 dependencies : [threads,
1558 link_depends : libsystemd_sym,
1560 install_dir : rootlibdir)
1562 static_libsystemd = get_option('static-libsystemd')
1563 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1565 install_libsystemd_static = static_library(
1568 journal_client_sources,
1570 basic_gcrypt_sources,
1572 include_directories : includes,
1573 build_by_default : static_libsystemd != 'false',
1574 install : static_libsystemd != 'false',
1575 install_dir : rootlibdir,
1576 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1577 dependencies : [threads,
1587 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1589 # Generate autosuspend rules
1590 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1592 ############################################################
1594 # binaries that have --help and are intended for use by humans,
1595 # usually, but not always, installed in /bin.
1596 public_programs = []
1598 subdir('src/libudev')
1599 subdir('src/shared')
1601 subdir('src/shutdown')
1603 subdir('src/network')
1605 subdir('src/analyze')
1606 subdir('src/journal-remote')
1607 subdir('src/coredump')
1608 subdir('src/pstore')
1609 subdir('src/hostname')
1610 subdir('src/import')
1611 subdir('src/partition')
1612 subdir('src/kernel-install')
1613 subdir('src/locale')
1614 subdir('src/machine')
1615 subdir('src/portable')
1616 subdir('src/userdb')
1618 subdir('src/nspawn')
1619 subdir('src/resolve')
1620 subdir('src/timedate')
1621 subdir('src/timesync')
1622 subdir('src/vconsole')
1623 subdir('src/boot/efi')
1630 ############################################################
1632 # only static linking apart from libdl, to make sure that the
1633 # module is linked to all libraries that it uses.
1634 test_dlopen = executable(
1638 include_directories : includes,
1639 link_with : [libbasic],
1640 dependencies : [libdl],
1641 build_by_default : want_tests != 'false')
1643 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1644 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h'],
1645 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1646 ['resolve', 'ENABLE_NSS_RESOLVE']]
1648 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1652 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1653 version_script_arg = join_paths(project_source_root, sym)
1655 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1656 if tuple.length() > 2
1657 sources += tuple[2].split()
1660 nss = shared_library(
1665 include_directories : includes,
1666 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1667 link_args : ['-Wl,-z,nodelete',
1669 '-Wl,--version-script=' + version_script_arg],
1670 link_with : [libsystemd_static,
1673 dependencies : [threads,
1677 install_dir : rootlibdir)
1679 # We cannot use shared_module because it does not support version suffix.
1680 # Unfortunately shared_library insists on creating the symlink…
1681 meson.add_install_script('sh', '-c',
1682 'rm $DESTDIR@0@/libnss_@1@.so'
1683 .format(rootlibdir, module))
1685 if want_tests != 'false'
1686 test('dlopen-nss_' + module,
1688 # path to dlopen must include a slash
1689 args : nss.full_path())
1694 ############################################################
1699 include_directories : includes,
1700 link_with : [libcore,
1702 dependencies : [versiondep,
1709 install_rpath : rootlibexecdir,
1711 install_dir : rootlibexecdir)
1713 meson.add_install_script(meson_make_symlink,
1714 join_paths(rootlibexecdir, 'systemd'),
1715 join_paths(rootsbindir, 'init'))
1717 public_programs += executable(
1719 systemd_analyze_sources,
1720 include_directories : includes,
1721 link_with : [libcore,
1723 dependencies : [versiondep,
1730 install_rpath : rootlibexecdir,
1731 install : get_option('analyze'))
1735 systemd_journald_sources,
1736 include_directories : includes,
1737 link_with : [libjournal_core,
1739 dependencies : [threads,
1744 install_rpath : rootlibexecdir,
1746 install_dir : rootlibexecdir)
1748 public_programs += executable(
1750 systemd_cat_sources,
1751 include_directories : includes,
1752 link_with : [libjournal_core,
1754 dependencies : [threads],
1755 install_rpath : rootlibexecdir,
1758 public_programs += executable(
1761 include_directories : includes,
1762 link_with : [libshared],
1763 dependencies : [threads,
1769 install_rpath : rootlibexecdir,
1771 install_dir : rootbindir)
1774 'systemd-getty-generator',
1775 'src/getty-generator/getty-generator.c',
1776 include_directories : includes,
1777 link_with : [libshared],
1778 install_rpath : rootlibexecdir,
1780 install_dir : systemgeneratordir)
1783 'systemd-debug-generator',
1784 'src/debug-generator/debug-generator.c',
1785 include_directories : includes,
1786 link_with : [libshared],
1787 install_rpath : rootlibexecdir,
1789 install_dir : systemgeneratordir)
1792 'systemd-run-generator',
1793 'src/run-generator/run-generator.c',
1794 include_directories : includes,
1795 link_with : [libshared],
1796 install_rpath : rootlibexecdir,
1798 install_dir : systemgeneratordir)
1801 'systemd-fstab-generator',
1802 'src/fstab-generator/fstab-generator.c',
1803 include_directories : includes,
1804 link_with : [libcore_shared,
1806 install_rpath : rootlibexecdir,
1808 install_dir : systemgeneratordir)
1810 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1812 '30-systemd-environment-d-generator',
1813 'src/environment-d-generator/environment-d-generator.c',
1814 include_directories : includes,
1815 link_with : [libshared],
1816 install_rpath : rootlibexecdir,
1818 install_dir : userenvgeneratordir)
1820 meson.add_install_script(meson_make_symlink,
1821 join_paths(sysconfdir, 'environment'),
1822 join_paths(environmentdir, '99-environment.conf'))
1825 if conf.get('ENABLE_HIBERNATE') == 1
1827 'systemd-hibernate-resume-generator',
1828 'src/hibernate-resume/hibernate-resume-generator.c',
1829 include_directories : includes,
1830 link_with : [libshared],
1831 install_rpath : rootlibexecdir,
1833 install_dir : systemgeneratordir)
1836 'systemd-hibernate-resume',
1837 'src/hibernate-resume/hibernate-resume.c',
1838 include_directories : includes,
1839 link_with : [libshared],
1840 install_rpath : rootlibexecdir,
1842 install_dir : rootlibexecdir)
1845 if conf.get('HAVE_BLKID') == 1
1847 'systemd-gpt-auto-generator',
1848 'src/gpt-auto-generator/gpt-auto-generator.c',
1849 'src/shared/blkid-util.h',
1850 include_directories : includes,
1851 link_with : [libshared],
1852 dependencies : libblkid,
1853 install_rpath : rootlibexecdir,
1855 install_dir : systemgeneratordir)
1857 public_programs += executable(
1859 'src/dissect/dissect.c',
1860 include_directories : includes,
1861 link_with : [libshared],
1862 install_rpath : rootlibexecdir,
1864 install_dir : rootlibexecdir)
1867 if conf.get('ENABLE_RESOLVE') == 1
1870 systemd_resolved_sources,
1871 include_directories : includes,
1872 link_with : [libshared,
1874 libsystemd_resolve_core],
1875 dependencies : systemd_resolved_dependencies,
1876 install_rpath : rootlibexecdir,
1878 install_dir : rootlibexecdir)
1880 public_programs += executable(
1883 include_directories : includes,
1884 link_with : [libshared,
1886 libsystemd_resolve_core],
1887 dependencies : [threads,
1891 install_rpath : rootlibexecdir,
1894 meson.add_install_script(meson_make_symlink,
1895 join_paths(bindir, 'resolvectl'),
1896 join_paths(rootsbindir, 'resolvconf'))
1898 meson.add_install_script(meson_make_symlink,
1899 join_paths(bindir, 'resolvectl'),
1900 join_paths(bindir, 'systemd-resolve'))
1903 if conf.get('ENABLE_LOGIND') == 1
1906 systemd_logind_sources,
1907 include_directories : includes,
1908 link_with : [liblogind_core,
1910 dependencies : [threads,
1912 install_rpath : rootlibexecdir,
1914 install_dir : rootlibexecdir)
1916 public_programs += executable(
1919 include_directories : includes,
1920 link_with : [libshared],
1921 dependencies : [threads,
1925 install_rpath : rootlibexecdir,
1927 install_dir : rootbindir)
1929 public_programs += executable(
1931 'src/login/inhibit.c',
1932 include_directories : includes,
1933 link_with : [libshared],
1934 install_rpath : rootlibexecdir,
1936 install_dir : rootbindir)
1938 if conf.get('HAVE_PAM') == 1
1939 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1940 pam_systemd = shared_library(
1944 include_directories : includes,
1945 link_args : ['-shared',
1946 '-Wl,--version-script=' + version_script_arg],
1947 link_with : [libsystemd_static,
1949 dependencies : [threads,
1952 link_depends : pam_systemd_sym,
1954 install_dir : pamlibdir)
1956 if want_tests != 'false'
1957 test('dlopen-pam_systemd',
1959 # path to dlopen must include a slash
1960 args : pam_systemd.full_path())
1965 'systemd-user-runtime-dir',
1966 user_runtime_dir_sources,
1967 include_directories : includes,
1968 link_with : [libshared],
1969 install_rpath : rootlibexecdir,
1971 install_dir : rootlibexecdir)
1974 if conf.get('HAVE_PAM') == 1
1976 'systemd-user-sessions',
1977 'src/user-sessions/user-sessions.c',
1978 include_directories : includes,
1979 link_with : [libshared],
1980 install_rpath : rootlibexecdir,
1982 install_dir : rootlibexecdir)
1985 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
1986 public_programs += executable(
1988 'src/boot/bootctl.c',
1989 include_directories : includes,
1990 link_with : [libshared],
1991 dependencies : [libblkid],
1992 install_rpath : rootlibexecdir,
1995 public_programs += executable(
1996 'systemd-bless-boot',
1997 'src/boot/bless-boot.c',
1998 include_directories : includes,
1999 link_with : [libshared],
2000 dependencies : [libblkid],
2001 install_rpath : rootlibexecdir,
2003 install_dir : rootlibexecdir)
2006 'systemd-bless-boot-generator',
2007 'src/boot/bless-boot-generator.c',
2008 include_directories : includes,
2009 link_with : [libshared],
2010 install_rpath : rootlibexecdir,
2012 install_dir : systemgeneratordir)
2016 'systemd-boot-check-no-failures',
2017 'src/boot/boot-check-no-failures.c',
2018 include_directories : includes,
2019 link_with : [libshared],
2020 dependencies : [libblkid],
2021 install_rpath : rootlibexecdir,
2023 install_dir : rootlibexecdir)
2025 public_programs += executable(
2026 'systemd-socket-activate',
2027 'src/activate/activate.c',
2028 include_directories : includes,
2029 link_with : [libshared],
2030 dependencies : [threads],
2031 install_rpath : rootlibexecdir,
2034 if get_option('link-systemctl-shared')
2035 systemctl_link_with = [libshared]
2037 systemctl_link_with = [libsystemd_static,
2043 public_programs += executable(
2045 'src/systemctl/systemctl.c',
2046 'src/systemctl/sysv-compat.h',
2047 'src/systemctl/sysv-compat.c',
2048 include_directories : includes,
2049 link_with : systemctl_link_with,
2050 dependencies : [threads,
2056 install_rpath : rootlibexecdir,
2058 install_dir : rootbindir)
2060 if conf.get('ENABLE_PORTABLED') == 1
2062 'systemd-portabled',
2063 systemd_portabled_sources,
2064 include_directories : includes,
2065 link_with : [libshared],
2066 dependencies : [threads],
2067 install_rpath : rootlibexecdir,
2069 install_dir : rootlibexecdir)
2071 public_programs += executable(
2073 'src/portable/portablectl.c',
2074 include_directories : includes,
2075 link_with : [libshared],
2076 dependencies : [threads],
2077 install_rpath : rootlibexecdir,
2079 install_dir : rootbindir)
2082 if conf.get('ENABLE_USERDB') == 1
2085 systemd_userwork_sources,
2086 include_directories : includes,
2087 link_with : [libshared],
2088 dependencies : [threads],
2089 install_rpath : rootlibexecdir,
2091 install_dir : rootlibexecdir)
2095 systemd_userdbd_sources,
2096 include_directories : includes,
2097 link_with : [libshared],
2098 dependencies : [threads],
2099 install_rpath : rootlibexecdir,
2101 install_dir : rootlibexecdir)
2103 public_programs += executable(
2106 include_directories : includes,
2107 link_with : [libshared],
2108 dependencies : [threads],
2109 install_rpath : rootlibexecdir,
2111 install_dir : rootbindir)
2114 if conf.get('ENABLE_HOMED') == 1
2117 systemd_homework_sources,
2118 include_directories : includes,
2119 link_with : [libshared],
2120 dependencies : [threads,
2127 install_rpath : rootlibexecdir,
2129 install_dir : rootlibexecdir)
2133 systemd_homed_sources,
2134 include_directories : includes,
2135 link_with : [libshared],
2136 dependencies : [threads,
2140 install_rpath : rootlibexecdir,
2142 install_dir : rootlibexecdir)
2144 public_programs += executable(
2147 include_directories : includes,
2148 link_with : [libshared],
2149 dependencies : [threads,
2154 install_rpath : rootlibexecdir,
2156 install_dir : rootbindir)
2158 if conf.get('HAVE_PAM') == 1
2159 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2160 pam_systemd = shared_library(
2164 include_directories : includes,
2165 link_args : ['-shared',
2166 '-Wl,--version-script=' + version_script_arg],
2167 link_with : [libsystemd_static,
2169 dependencies : [threads,
2173 link_depends : pam_systemd_home_sym,
2175 install_dir : pamlibdir)
2179 foreach alias : ['halt', 'poweroff', 'reboot', 'runlevel', 'shutdown', 'telinit']
2180 meson.add_install_script(meson_make_symlink,
2181 join_paths(rootbindir, 'systemctl'),
2182 join_paths(rootsbindir, alias))
2185 if conf.get('ENABLE_BACKLIGHT') == 1
2187 'systemd-backlight',
2188 'src/backlight/backlight.c',
2189 include_directories : includes,
2190 link_with : [libshared],
2191 install_rpath : rootlibexecdir,
2193 install_dir : rootlibexecdir)
2196 if conf.get('ENABLE_RFKILL') == 1
2199 'src/rfkill/rfkill.c',
2200 include_directories : includes,
2201 link_with : [libshared],
2202 install_rpath : rootlibexecdir,
2204 install_dir : rootlibexecdir)
2208 'systemd-system-update-generator',
2209 'src/system-update-generator/system-update-generator.c',
2210 include_directories : includes,
2211 link_with : [libshared],
2212 install_rpath : rootlibexecdir,
2214 install_dir : systemgeneratordir)
2216 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2217 systemd_cryptsetup_sources = files('''
2218 src/cryptsetup/cryptsetup.c
2219 src/cryptsetup/cryptsetup-pkcs11.h
2222 if conf.get('HAVE_P11KIT') == 1
2223 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2227 'systemd-cryptsetup',
2228 systemd_cryptsetup_sources,
2229 include_directories : includes,
2230 link_with : [libshared],
2231 dependencies : [libcryptsetup,
2233 install_rpath : rootlibexecdir,
2235 install_dir : rootlibexecdir)
2238 'systemd-cryptsetup-generator',
2239 'src/cryptsetup/cryptsetup-generator.c',
2240 include_directories : includes,
2241 link_with : [libshared],
2242 dependencies : [libcryptsetup],
2243 install_rpath : rootlibexecdir,
2245 install_dir : systemgeneratordir)
2248 'systemd-veritysetup',
2249 'src/veritysetup/veritysetup.c',
2250 include_directories : includes,
2251 link_with : [libshared],
2252 dependencies : [libcryptsetup],
2253 install_rpath : rootlibexecdir,
2255 install_dir : rootlibexecdir)
2258 'systemd-veritysetup-generator',
2259 'src/veritysetup/veritysetup-generator.c',
2260 include_directories : includes,
2261 link_with : [libshared],
2262 dependencies : [libcryptsetup],
2263 install_rpath : rootlibexecdir,
2265 install_dir : systemgeneratordir)
2268 if conf.get('HAVE_SYSV_COMPAT') == 1
2270 'systemd-sysv-generator',
2271 'src/sysv-generator/sysv-generator.c',
2272 include_directories : includes,
2273 link_with : [libshared],
2274 install_rpath : rootlibexecdir,
2276 install_dir : systemgeneratordir)
2279 'systemd-rc-local-generator',
2280 'src/rc-local-generator/rc-local-generator.c',
2281 include_directories : includes,
2282 link_with : [libshared],
2283 install_rpath : rootlibexecdir,
2285 install_dir : systemgeneratordir)
2288 if conf.get('ENABLE_HOSTNAMED') == 1
2290 'systemd-hostnamed',
2291 'src/hostname/hostnamed.c',
2292 include_directories : includes,
2293 link_with : [libshared],
2294 install_rpath : rootlibexecdir,
2296 install_dir : rootlibexecdir)
2298 public_programs += executable(
2300 'src/hostname/hostnamectl.c',
2301 include_directories : includes,
2302 link_with : [libshared],
2303 install_rpath : rootlibexecdir,
2307 if conf.get('ENABLE_LOCALED') == 1
2308 if conf.get('HAVE_XKBCOMMON') == 1
2309 # logind will load libxkbcommon.so dynamically on its own
2317 systemd_localed_sources,
2318 include_directories : includes,
2319 link_with : [libshared],
2320 dependencies : deps,
2321 install_rpath : rootlibexecdir,
2323 install_dir : rootlibexecdir)
2325 public_programs += executable(
2328 include_directories : includes,
2329 link_with : [libshared],
2330 install_rpath : rootlibexecdir,
2334 if conf.get('ENABLE_TIMEDATED') == 1
2336 'systemd-timedated',
2337 'src/timedate/timedated.c',
2338 include_directories : includes,
2339 link_with : [libshared],
2340 install_rpath : rootlibexecdir,
2342 install_dir : rootlibexecdir)
2345 if conf.get('ENABLE_TIMEDATECTL') == 1
2346 public_programs += executable(
2348 'src/timedate/timedatectl.c',
2349 include_directories : includes,
2350 install_rpath : rootlibexecdir,
2351 link_with : [libshared],
2352 dependencies : [libm],
2356 if conf.get('ENABLE_TIMESYNCD') == 1
2357 if get_option('link-timesyncd-shared')
2358 timesyncd_link_with = [libshared]
2360 timesyncd_link_with = [libsystemd_static,
2367 'systemd-timesyncd',
2368 systemd_timesyncd_sources,
2369 include_directories : includes,
2370 link_with : [timesyncd_link_with],
2371 dependencies : [threads,
2373 install_rpath : rootlibexecdir,
2375 install_dir : rootlibexecdir)
2378 'systemd-time-wait-sync',
2379 'src/time-wait-sync/time-wait-sync.c',
2380 include_directories : includes,
2381 link_with : [timesyncd_link_with],
2382 install_rpath : rootlibexecdir,
2384 install_dir : rootlibexecdir)
2387 if conf.get('ENABLE_MACHINED') == 1
2390 systemd_machined_sources,
2391 include_directories : includes,
2392 link_with : [libmachine_core,
2394 install_rpath : rootlibexecdir,
2396 install_dir : rootlibexecdir)
2398 public_programs += executable(
2400 'src/machine/machinectl.c',
2401 include_directories : includes,
2402 link_with : [libshared],
2403 dependencies : [threads,
2407 install_rpath : rootlibexecdir,
2409 install_dir : rootbindir)
2412 if conf.get('ENABLE_IMPORTD') == 1
2415 systemd_importd_sources,
2416 include_directories : includes,
2417 link_with : [libshared],
2418 dependencies : [threads],
2419 install_rpath : rootlibexecdir,
2421 install_dir : rootlibexecdir)
2423 systemd_pull = executable(
2425 systemd_pull_sources,
2426 include_directories : includes,
2427 link_with : [libshared],
2428 dependencies : [versiondep,
2434 install_rpath : rootlibexecdir,
2436 install_dir : rootlibexecdir)
2438 systemd_import = executable(
2440 systemd_import_sources,
2441 include_directories : includes,
2442 link_with : [libshared],
2443 dependencies : [libcurl,
2447 install_rpath : rootlibexecdir,
2449 install_dir : rootlibexecdir)
2451 systemd_import_fs = executable(
2452 'systemd-import-fs',
2453 systemd_import_fs_sources,
2454 include_directories : includes,
2455 link_with : [libshared],
2456 install_rpath : rootlibexecdir,
2458 install_dir : rootlibexecdir)
2460 systemd_export = executable(
2462 systemd_export_sources,
2463 include_directories : includes,
2464 link_with : [libshared],
2465 dependencies : [libcurl,
2469 install_rpath : rootlibexecdir,
2471 install_dir : rootlibexecdir)
2473 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2476 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2477 public_programs += executable(
2478 'systemd-journal-upload',
2479 systemd_journal_upload_sources,
2480 include_directories : includes,
2481 link_with : [libshared],
2482 dependencies : [versiondep,
2489 install_rpath : rootlibexecdir,
2491 install_dir : rootlibexecdir)
2494 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2495 public_programs += executable(
2496 'systemd-journal-remote',
2497 systemd_journal_remote_sources,
2498 include_directories : includes,
2499 link_with : [libshared,
2500 libsystemd_journal_remote],
2501 dependencies : [threads,
2507 install_rpath : rootlibexecdir,
2509 install_dir : rootlibexecdir)
2511 public_programs += executable(
2512 'systemd-journal-gatewayd',
2513 systemd_journal_gatewayd_sources,
2514 include_directories : includes,
2515 link_with : [libshared],
2516 dependencies : [threads,
2522 install_rpath : rootlibexecdir,
2524 install_dir : rootlibexecdir)
2527 if conf.get('ENABLE_COREDUMP') == 1
2530 systemd_coredump_sources,
2531 include_directories : includes,
2532 link_with : [libshared],
2533 dependencies : [threads,
2539 install_rpath : rootlibexecdir,
2541 install_dir : rootlibexecdir)
2543 public_programs += executable(
2545 coredumpctl_sources,
2546 include_directories : includes,
2547 link_with : [libshared],
2548 dependencies : [threads,
2552 install_rpath : rootlibexecdir,
2556 if conf.get('ENABLE_PSTORE') == 1
2559 systemd_pstore_sources,
2560 include_directories : includes,
2561 link_with : [libshared],
2562 dependencies : [threads,
2568 install_rpath : rootlibexecdir,
2570 install_dir : rootlibexecdir)
2573 if conf.get('ENABLE_BINFMT') == 1
2574 public_programs += executable(
2576 'src/binfmt/binfmt.c',
2577 include_directories : includes,
2578 link_with : [libshared],
2579 install_rpath : rootlibexecdir,
2581 install_dir : rootlibexecdir)
2583 meson.add_install_script('sh', '-c',
2584 mkdir_p.format(binfmtdir))
2585 meson.add_install_script('sh', '-c',
2586 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2589 if conf.get('ENABLE_REPART') == 1
2592 systemd_repart_sources,
2593 include_directories : includes,
2594 link_with : [libshared],
2595 dependencies : [threads,
2600 install_rpath : rootlibexecdir,
2602 install_dir : rootbindir)
2604 if want_tests != 'false'
2607 args : exe.full_path())
2611 if conf.get('ENABLE_VCONSOLE') == 1
2613 'systemd-vconsole-setup',
2614 'src/vconsole/vconsole-setup.c',
2615 include_directories : includes,
2616 link_with : [libshared],
2617 install_rpath : rootlibexecdir,
2619 install_dir : rootlibexecdir)
2622 if conf.get('ENABLE_RANDOMSEED') == 1
2624 'systemd-random-seed',
2625 'src/random-seed/random-seed.c',
2626 include_directories : includes,
2627 link_with : [libshared],
2628 install_rpath : rootlibexecdir,
2630 install_dir : rootlibexecdir)
2633 if conf.get('ENABLE_FIRSTBOOT') == 1
2635 'systemd-firstboot',
2636 'src/firstboot/firstboot.c',
2637 include_directories : includes,
2638 link_with : [libshared],
2639 dependencies : [libcrypt],
2640 install_rpath : rootlibexecdir,
2642 install_dir : rootbindir)
2646 'systemd-remount-fs',
2647 'src/remount-fs/remount-fs.c',
2648 include_directories : includes,
2649 link_with : [libcore_shared,
2651 install_rpath : rootlibexecdir,
2653 install_dir : rootlibexecdir)
2656 'systemd-machine-id-setup',
2657 'src/machine-id-setup/machine-id-setup-main.c',
2658 include_directories : includes,
2659 link_with : [libcore_shared,
2661 install_rpath : rootlibexecdir,
2663 install_dir : rootbindir)
2668 include_directories : includes,
2669 link_with : [libshared],
2670 install_rpath : rootlibexecdir,
2672 install_dir : rootlibexecdir)
2674 executable('systemd-growfs',
2675 'src/partition/growfs.c',
2676 include_directories : includes,
2677 link_with : [libshared],
2678 dependencies : [libcryptsetup],
2679 install_rpath : rootlibexecdir,
2681 install_dir : rootlibexecdir)
2685 'src/partition/makefs.c',
2686 include_directories : includes,
2687 link_with : [libshared],
2688 install_rpath : rootlibexecdir,
2690 install_dir : rootlibexecdir)
2694 'src/sleep/sleep.c',
2695 include_directories : includes,
2696 link_with : [libshared],
2697 install_rpath : rootlibexecdir,
2699 install_dir : rootlibexecdir)
2701 install_data('src/sleep/sleep.conf',
2702 install_dir : pkgsysconfdir)
2704 public_programs += executable(
2706 'src/sysctl/sysctl.c',
2707 include_directories : includes,
2708 link_with : [libshared],
2709 install_rpath : rootlibexecdir,
2711 install_dir : rootlibexecdir)
2715 'src/ac-power/ac-power.c',
2716 include_directories : includes,
2717 link_with : [libshared],
2718 install_rpath : rootlibexecdir,
2720 install_dir : rootlibexecdir)
2722 public_programs += executable(
2723 'systemd-detect-virt',
2724 'src/detect-virt/detect-virt.c',
2725 include_directories : includes,
2726 link_with : [libshared],
2727 install_rpath : rootlibexecdir,
2730 public_programs += executable(
2732 'src/delta/delta.c',
2733 include_directories : includes,
2734 link_with : [libshared],
2735 install_rpath : rootlibexecdir,
2738 public_programs += executable(
2740 'src/escape/escape.c',
2741 include_directories : includes,
2742 link_with : [libshared],
2743 install_rpath : rootlibexecdir,
2745 install_dir : rootbindir)
2747 public_programs += executable(
2749 'src/notify/notify.c',
2750 include_directories : includes,
2751 link_with : [libshared],
2752 install_rpath : rootlibexecdir,
2754 install_dir : rootbindir)
2757 'systemd-volatile-root',
2758 'src/volatile-root/volatile-root.c',
2759 include_directories : includes,
2760 link_with : [libshared],
2761 install_rpath : rootlibexecdir,
2763 install_dir : rootlibexecdir)
2766 'systemd-cgroups-agent',
2767 'src/cgroups-agent/cgroups-agent.c',
2768 include_directories : includes,
2769 link_with : [libshared],
2770 install_rpath : rootlibexecdir,
2772 install_dir : rootlibexecdir)
2774 public_programs += executable(
2776 'src/id128/id128.c',
2777 include_directories : includes,
2778 link_with : [libshared],
2779 install_rpath : rootlibexecdir,
2782 public_programs += executable(
2785 include_directories : includes,
2786 link_with : [libshared],
2787 install_rpath : rootlibexecdir,
2790 public_programs += executable(
2791 'systemd-ask-password',
2792 'src/ask-password/ask-password.c',
2793 include_directories : includes,
2794 link_with : [libshared],
2795 install_rpath : rootlibexecdir,
2797 install_dir : rootbindir)
2800 'systemd-reply-password',
2801 'src/reply-password/reply-password.c',
2802 include_directories : includes,
2803 link_with : [libshared],
2804 install_rpath : rootlibexecdir,
2806 install_dir : rootlibexecdir)
2808 public_programs += executable(
2809 'systemd-tty-ask-password-agent',
2810 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2811 include_directories : includes,
2812 link_with : [libshared],
2813 install_rpath : rootlibexecdir,
2815 install_dir : rootbindir)
2817 public_programs += executable(
2820 include_directories : includes,
2821 link_with : [libshared],
2822 install_rpath : rootlibexecdir,
2825 public_programs += executable(
2827 'src/cgtop/cgtop.c',
2828 include_directories : includes,
2829 link_with : [libshared],
2830 install_rpath : rootlibexecdir,
2835 'src/initctl/initctl.c',
2836 include_directories : includes,
2837 link_with : [libshared],
2838 install_rpath : rootlibexecdir,
2840 install_dir : rootlibexecdir)
2842 public_programs += executable(
2844 'src/mount/mount-tool.c',
2845 include_directories : includes,
2846 link_with : [libshared],
2847 dependencies: [libmount],
2848 install_rpath : rootlibexecdir,
2851 meson.add_install_script(meson_make_symlink,
2852 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2854 public_programs += executable(
2857 include_directories : includes,
2858 link_with : [libshared],
2859 install_rpath : rootlibexecdir,
2862 public_programs += executable(
2863 'systemd-stdio-bridge',
2864 'src/stdio-bridge/stdio-bridge.c',
2865 include_directories : includes,
2866 link_with : [libshared],
2867 dependencies : [versiondep],
2868 install_rpath : rootlibexecdir,
2871 public_programs += executable(
2873 'src/busctl/busctl.c',
2874 'src/busctl/busctl-introspect.c',
2875 'src/busctl/busctl-introspect.h',
2876 include_directories : includes,
2877 link_with : [libshared],
2878 install_rpath : rootlibexecdir,
2881 if conf.get('ENABLE_SYSUSERS') == 1
2882 public_programs += executable(
2884 'src/sysusers/sysusers.c',
2885 include_directories : includes,
2886 link_with : [libshared],
2887 install_rpath : rootlibexecdir,
2889 install_dir : rootbindir)
2892 if conf.get('ENABLE_TMPFILES') == 1
2895 'src/tmpfiles/tmpfiles.c',
2896 include_directories : includes,
2897 link_with : [libshared],
2898 dependencies : [libacl],
2899 install_rpath : rootlibexecdir,
2901 install_dir : rootbindir)
2902 public_programs += exe
2904 if want_tests != 'false'
2905 test('test-systemd-tmpfiles',
2906 test_systemd_tmpfiles_py,
2907 # https://github.com/mesonbuild/meson/issues/2681
2908 args : exe.full_path())
2912 if conf.get('ENABLE_HWDB') == 1
2913 public_programs += executable(
2916 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2917 include_directories : includes,
2918 link_with : [libudev_static],
2919 install_rpath : udev_rpath,
2921 install_dir : rootbindir)
2924 if conf.get('ENABLE_QUOTACHECK') == 1
2926 'systemd-quotacheck',
2927 'src/quotacheck/quotacheck.c',
2928 include_directories : includes,
2929 link_with : [libshared],
2930 install_rpath : rootlibexecdir,
2932 install_dir : rootlibexecdir)
2935 public_programs += executable(
2936 'systemd-socket-proxyd',
2937 'src/socket-proxy/socket-proxyd.c',
2938 include_directories : includes,
2939 link_with : [libshared],
2940 dependencies : [threads],
2941 install_rpath : rootlibexecdir,
2943 install_dir : rootlibexecdir)
2945 public_programs += executable(
2947 systemd_udevd_sources,
2948 include_directories : includes,
2949 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2950 link_with : [libudev_core,
2953 dependencies : [versiondep,
2959 install_rpath : udev_rpath,
2961 install_dir : rootlibexecdir)
2963 public_programs += executable(
2966 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2967 include_directories : includes,
2968 link_with : [libudev_core,
2971 dependencies : [versiondep,
2977 install_rpath : udev_rpath,
2979 install_dir : rootbindir)
2983 systemd_shutdown_sources,
2984 include_directories : includes,
2985 link_with : [libcore_shared,
2987 dependencies : [libmount],
2988 install_rpath : rootlibexecdir,
2990 install_dir : rootlibexecdir)
2993 'systemd-update-done',
2994 'src/update-done/update-done.c',
2995 include_directories : includes,
2996 link_with : [libshared],
2997 install_rpath : rootlibexecdir,
2999 install_dir : rootlibexecdir)
3002 'systemd-update-utmp',
3003 'src/update-utmp/update-utmp.c',
3004 include_directories : includes,
3005 link_with : [libshared],
3006 dependencies : [libaudit],
3007 install_rpath : rootlibexecdir,
3009 install_dir : rootlibexecdir)
3011 if conf.get('HAVE_KMOD') == 1
3013 'systemd-modules-load',
3014 'src/modules-load/modules-load.c',
3015 include_directories : includes,
3016 link_with : [libshared],
3017 dependencies : [libkmod],
3018 install_rpath : rootlibexecdir,
3020 install_dir : rootlibexecdir)
3022 meson.add_install_script('sh', '-c',
3023 mkdir_p.format(modulesloaddir))
3024 meson.add_install_script('sh', '-c',
3025 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
3028 public_programs += executable(
3030 systemd_nspawn_sources,
3031 include_directories : includes,
3032 link_with : [libcore_shared,
3035 dependencies : [libblkid,
3037 install_rpath : rootlibexecdir,
3040 if conf.get('ENABLE_NETWORKD') == 1
3043 systemd_networkd_sources,
3044 include_directories : network_include_dir,
3045 link_with : [libnetworkd_core,
3048 networkd_link_with],
3049 dependencies : [threads],
3050 install_rpath : rootlibexecdir,
3052 install_dir : rootlibexecdir)
3055 'systemd-networkd-wait-online',
3056 systemd_networkd_wait_online_sources,
3057 include_directories : includes,
3058 link_with : [libnetworkd_core,
3059 networkd_link_with],
3060 install_rpath : rootlibexecdir,
3062 install_dir : rootlibexecdir)
3064 public_programs += executable(
3067 include_directories : includes,
3068 link_with : [libsystemd_network,
3069 networkd_link_with],
3070 install_rpath : rootlibexecdir,
3072 install_dir : rootbindir)
3075 'systemd-network-generator',
3076 network_generator_sources,
3077 include_directories : includes,
3078 link_with : [networkd_link_with],
3079 install_rpath : rootlibexecdir,
3081 install_dir : rootlibexecdir)
3083 if want_tests != 'false'
3084 test('test-network-generator-conversion',
3085 test_network_generator_conversion_sh,
3086 # https://github.com/mesonbuild/meson/issues/2681
3087 args : exe.full_path())
3092 'systemd-sulogin-shell',
3093 ['src/sulogin-shell/sulogin-shell.c'],
3094 include_directories : includes,
3095 link_with : [libshared],
3096 install_rpath : rootlibexecdir,
3098 install_dir : rootlibexecdir)
3100 ############################################################
3103 'systemd-runtest.env',
3104 output : 'systemd-runtest.env',
3105 command : ['sh', '-c', '{ ' +
3106 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
3107 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
3109 build_by_default : true)
3111 foreach tuple : tests
3113 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3114 dependencies = tuple[2]
3115 condition = tuple.length() >= 4 ? tuple[3] : ''
3116 type = tuple.length() >= 5 ? tuple[4] : ''
3117 defs = tuple.length() >= 6 ? tuple[5] : []
3118 incs = tuple.length() >= 7 ? tuple[6] : includes
3121 name = sources[0].split('/')[-1].split('.')[0]
3122 if type.startswith('timeout=')
3123 timeout = type.split('=')[1].to_int()
3127 if condition == '' or conf.get(condition) == 1
3131 include_directories : incs,
3132 link_with : link_with,
3133 dependencies : [versiondep,
3136 build_by_default : want_tests != 'false',
3137 install_rpath : rootlibexecdir,
3138 install : install_tests,
3139 install_dir : join_paths(testsdir, type))
3142 message('@0@ is a manual test'.format(name))
3143 elif type == 'unsafe' and want_tests != 'unsafe'
3144 message('@0@ is an unsafe test'.format(name))
3145 elif want_tests != 'false'
3151 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3156 'test-libsystemd-sym',
3157 test_libsystemd_sym_c,
3158 include_directories : includes,
3159 link_with : [libsystemd],
3160 build_by_default : want_tests != 'false',
3161 install : install_tests,
3162 install_dir : testsdir)
3163 if want_tests != 'false'
3164 test('test-libsystemd-sym', exe)
3168 'test-libsystemd-static-sym',
3169 test_libsystemd_sym_c,
3170 include_directories : includes,
3171 link_with : [install_libsystemd_static],
3172 dependencies : [threads], # threads is already included in dependencies on the library,
3173 # but does not seem to get propagated. Add here as a work-around.
3174 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3175 install : install_tests and static_libsystemd_pic,
3176 install_dir : testsdir)
3177 if want_tests != 'false' and static_libsystemd_pic
3178 test('test-libsystemd-static-sym', exe)
3184 include_directories : includes,
3185 c_args : '-Wno-deprecated-declarations',
3186 link_with : [libudev],
3187 build_by_default : want_tests != 'false',
3188 install : install_tests,
3189 install_dir : testsdir)
3190 if want_tests != 'false'
3191 test('test-libudev-sym', exe)
3195 'test-libudev-static-sym',
3197 include_directories : includes,
3198 c_args : '-Wno-deprecated-declarations',
3199 link_with : [install_libudev_static],
3200 build_by_default : want_tests != 'false' and static_libudev_pic,
3201 install : install_tests and static_libudev_pic,
3202 install_dir : testsdir)
3203 if want_tests != 'false' and static_libudev_pic
3204 test('test-libudev-static-sym', exe)
3207 ############################################################
3211 if get_option('tests') != 'false'
3212 foreach tuple : fuzzers
3214 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3215 dependencies = tuple[2]
3216 defs = tuple.length() >= 4 ? tuple[3] : []
3217 incs = tuple.length() >= 5 ? tuple[4] : includes
3221 dependencies += fuzzing_engine
3223 if fuzzing_engine.found()
3224 dependencies += fuzzing_engine
3226 link_args += ['-fsanitize=fuzzer']
3229 sources += 'src/fuzz/fuzz-main.c'
3232 name = sources[0].split('/')[-1].split('.')[0]
3234 fuzzer_exes += executable(
3237 include_directories : [incs, include_directories('src/fuzz')],
3238 link_with : link_with,
3239 dependencies : dependencies,
3241 link_args: link_args,
3248 depends : fuzzer_exes,
3251 ############################################################
3253 make_directive_index_py = find_program('tools/make-directive-index.py')
3254 make_man_index_py = find_program('tools/make-man-index.py')
3255 xml_helper_py = find_program('tools/xml_helper.py')
3256 hwdb_update_sh = find_program('tools/meson-hwdb-update.sh')
3257 autosuspend_update_sh = find_program('tools/meson-autosuspend-update.sh')
3260 subdir('sysusers.d')
3261 subdir('tmpfiles.d')
3267 subdir('shell-completion/bash')
3268 subdir('shell-completion/zsh')
3269 subdir('docs/sysvinit')
3270 subdir('docs/var-log')
3272 install_subdir('factory/etc',
3273 install_dir : factorydir)
3275 install_data('xorg/50-systemd-user.sh',
3276 install_dir : xinitrcdir)
3277 install_data('modprobe.d/systemd.conf',
3278 install_dir : modprobedir)
3279 install_data('LICENSE.GPL2',
3283 'docs/CODING_STYLE.md',
3284 'docs/DISTRO_PORTING.md',
3285 'docs/ENVIRONMENT.md',
3287 'docs/TRANSIENT-SETTINGS.md',
3288 'docs/TRANSLATORS.md',
3289 'docs/UIDS-GIDS.md',
3290 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3291 install_dir : docdir)
3293 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3294 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3296 ############################################################
3298 meson_check_help = find_program('tools/meson-check-help.sh')
3300 foreach exec : public_programs
3301 name = exec.full_path().split('/')[-1]
3302 if want_tests != 'false'
3303 test('check-help-' + name,
3305 args : exec.full_path())
3309 ############################################################
3311 check_directives_sh = find_program('tools/check-directives.sh')
3313 if want_tests != 'false'
3314 test('check-directives',
3315 check_directives_sh,
3316 args : project_source_root)
3319 ############################################################
3321 # Enable tests for all supported sanitizers
3322 foreach tuple : sanitizers
3323 sanitizer = tuple[0]
3326 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3328 foreach p : fuzz_regression_tests
3329 b = p.split('/')[-2]
3330 c = p.split('/')[-1]
3332 name = '@0@:@1@'.format(b, sanitizer)
3335 if want_tests == 'false'
3336 message('Not compiling @0@ because tests is set to false'.format(name))
3338 exe = custom_target(
3342 command : [env, 'ln', '-fs',
3343 join_paths(build.full_path(), b),
3345 build_by_default : true)
3347 message('Not compiling @0@ because slow-tests is set to false'.format(name))
3352 if want_tests != 'false' and slow_tests
3353 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3355 args : [exe.full_path(),
3356 join_paths(project_source_root, p)])
3363 ############################################################
3366 all_files = run_command(
3368 ['--git-dir=@0@/.git'.format(project_source_root),
3371 all_files = files(all_files.stdout().split())
3376 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3379 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3383 meson_git_contrib_sh = find_program('tools/meson-git-contrib.sh')
3386 command : [meson_git_contrib_sh])
3390 git_head = run_command(
3392 ['--git-dir=@0@/.git'.format(project_source_root),
3393 'rev-parse', 'HEAD']).stdout().strip()
3394 git_head_short = run_command(
3396 ['--git-dir=@0@/.git'.format(project_source_root),
3397 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3401 command : ['git', 'archive',
3402 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3404 '--prefix', 'systemd-@0@/'.format(git_head),
3408 ############################################################
3410 meson_check_api_docs_sh = find_program('tools/meson-check-api-docs.sh')
3413 depends : [man, libsystemd, libudev],
3414 command : [meson_check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3416 ############################################################
3417 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3420 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3422 'split /usr: @0@'.format(split_usr),
3423 'split bin-sbin: @0@'.format(split_bin),
3424 'prefix directory: @0@'.format(prefixdir),
3425 'rootprefix directory: @0@'.format(rootprefixdir),
3426 'sysconf directory: @0@'.format(sysconfdir),
3427 'include directory: @0@'.format(includedir),
3428 'lib directory: @0@'.format(libdir),
3429 'rootlib directory: @0@'.format(rootlibdir),
3430 'SysV init scripts: @0@'.format(sysvinit_path),
3431 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3432 'PAM modules directory: @0@'.format(pamlibdir),
3433 'PAM configuration directory: @0@'.format(pamconfdir),
3434 'RPM macros directory: @0@'.format(rpmmacrosdir),
3435 'modprobe.d directory: @0@'.format(modprobedir),
3436 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3437 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3438 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3439 'bash completions directory: @0@'.format(bashcompletiondir),
3440 'zsh completions directory: @0@'.format(zshcompletiondir),
3441 'extra start script: @0@'.format(get_option('rc-local')),
3442 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3443 get_option('debug-tty')),
3444 'TTY GID: @0@'.format(tty_gid),
3445 'users GID: @0@'.format(substs.get('USERS_GID')),
3446 'maximum system UID: @0@'.format(system_uid_max),
3447 'maximum system GID: @0@'.format(system_gid_max),
3448 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3449 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3450 'minimum container UID base: @0@'.format(container_uid_base_min),
3451 'maximum container UID base: @0@'.format(container_uid_base_max),
3452 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3453 'render group access mode: @0@'.format(get_option('group-render-mode')),
3454 'certificate root directory: @0@'.format(get_option('certificate-root')),
3455 'support URL: @0@'.format(support_url),
3456 'nobody user name: @0@'.format(nobody_user),
3457 'nobody group name: @0@'.format(nobody_group),
3458 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3459 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3461 'default DNSSEC mode: @0@'.format(default_dnssec),
3462 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3463 'default mDNS mode: @0@'.format(default_mdns),
3464 'default LLMNR mode: @0@'.format(default_llmnr),
3465 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3466 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3467 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3468 'default locale: @0@'.format(default_locale),
3469 'default user $PATH: @0@'.format(default_user_path_display),
3470 'systemd service watchdog: @0@'.format(watchdog_opt)]
3472 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3473 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3475 'default DNS servers: @0@'.format(alt_dns_servers),
3476 'default NTP servers: @0@'.format(alt_ntp_servers)]
3478 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3479 '@@0@'.format(time_epoch)).stdout().strip()
3481 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3484 'static libsystemd: @0@'.format(static_libsystemd),
3485 'static libudev: @0@'.format(static_libudev)]
3488 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3489 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3490 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3492 if conf.get('ENABLE_EFI') == 1
3493 status += 'efi arch: @0@'.format(efi_arch)
3497 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3498 'EFI CC @0@'.format(' '.join(efi_cc)),
3499 'EFI lds: @0@'.format(efi_lds),
3500 'EFI crt0: @0@'.format(efi_crt0),
3501 'EFI include directory: @0@'.format(efi_incdir)]
3560 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3561 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3565 ['legacy pkla', install_polkit_pkla],
3567 ['gnu-efi', have_gnu_efi],
3580 ['man pages', want_man],
3581 ['html pages', want_html],
3582 ['man page indices', want_man and have_lxml],
3587 ['adm group', get_option('adm-group')],
3588 ['wheel group', get_option('wheel-group')],
3591 ['debug mmap cache'],
3593 ['valgrind', conf.get('VALGRIND') == 1],
3594 ['trace logging', conf.get('LOG_TRACE') == 1],
3595 ['install tests', install_tests],
3596 ['link-udev-shared', get_option('link-udev-shared')],
3597 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3598 ['link-networkd-shared', get_option('link-networkd-shared')],
3599 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3600 ['kernel-install', get_option('kernel-install')],
3601 ['systemd-analyze', get_option('analyze')],
3604 if tuple.length() >= 2
3607 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3608 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3609 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3620 'enabled features: @0@'.format(', '.join(found)),
3622 'disabled features: @0@'.format(', '.join(missing)),
3624 message('\n '.join(status))
3626 if rootprefixdir != rootprefix_default
3628 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3629 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3630 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))