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 if get_option('hibernate') and not get_option('initrd')
94 error('hibernate depends on initrd')
97 conf.set10('BUMP_PROC_SYS_FS_FILE_MAX', get_option('bump-proc-sys-fs-file-max'))
98 conf.set10('BUMP_PROC_SYS_FS_NR_OPEN', get_option('bump-proc-sys-fs-nr-open'))
99 conf.set('HIGH_RLIMIT_NOFILE', 512*1024)
101 # join_paths ignores the preceding arguments if an absolute component is
102 # encountered, so this should canonicalize various paths when they are
103 # absolute or relative.
104 prefixdir = get_option('prefix')
105 if not prefixdir.startswith('/')
106 error('Prefix is not absolute: "@0@"'.format(prefixdir))
108 bindir = join_paths(prefixdir, get_option('bindir'))
109 libdir = join_paths(prefixdir, get_option('libdir'))
110 sysconfdir = join_paths(prefixdir, get_option('sysconfdir'))
111 includedir = join_paths(prefixdir, get_option('includedir'))
112 datadir = join_paths(prefixdir, get_option('datadir'))
113 localstatedir = join_paths('/', get_option('localstatedir'))
115 rootbindir = join_paths(rootprefixdir, 'bin')
116 rootsbindir = join_paths(rootprefixdir, split_bin ? 'sbin' : 'bin')
117 rootlibexecdir = join_paths(rootprefixdir, 'lib/systemd')
119 rootlibdir = get_option('rootlibdir')
121 rootlibdir = join_paths(rootprefixdir, libdir.split('/')[-1])
124 # Dirs of external packages
125 pkgconfigdatadir = get_option('pkgconfigdatadir') == '' ? join_paths(datadir, 'pkgconfig') : get_option('pkgconfigdatadir')
126 pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgconfig') : get_option('pkgconfiglibdir')
127 polkitpolicydir = join_paths(datadir, 'polkit-1/actions')
128 polkitrulesdir = join_paths(datadir, 'polkit-1/rules.d')
129 polkitpkladir = join_paths(localstatedir, 'lib/polkit-1/localauthority/10-vendor.d')
130 xinitrcdir = join_paths(sysconfdir, 'X11/xinit/xinitrc.d')
131 rpmmacrosdir = get_option('rpmmacrosdir')
132 if rpmmacrosdir != 'no'
133 rpmmacrosdir = join_paths(prefixdir, rpmmacrosdir)
135 modprobedir = join_paths(rootprefixdir, 'lib/modprobe.d')
138 pkgdatadir = join_paths(datadir, 'systemd')
139 environmentdir = join_paths(prefixdir, 'lib/environment.d')
140 pkgsysconfdir = join_paths(sysconfdir, 'systemd')
141 userunitdir = join_paths(prefixdir, 'lib/systemd/user')
142 userpresetdir = join_paths(prefixdir, 'lib/systemd/user-preset')
143 tmpfilesdir = join_paths(prefixdir, 'lib/tmpfiles.d')
144 sysusersdir = join_paths(prefixdir, 'lib/sysusers.d')
145 sysctldir = join_paths(prefixdir, 'lib/sysctl.d')
146 binfmtdir = join_paths(prefixdir, 'lib/binfmt.d')
147 modulesloaddir = join_paths(prefixdir, 'lib/modules-load.d')
148 networkdir = join_paths(rootprefixdir, 'lib/systemd/network')
149 pkgincludedir = join_paths(includedir, 'systemd')
150 systemgeneratordir = join_paths(rootlibexecdir, 'system-generators')
151 usergeneratordir = join_paths(prefixdir, 'lib/systemd/user-generators')
152 systemenvgeneratordir = join_paths(prefixdir, 'lib/systemd/system-environment-generators')
153 userenvgeneratordir = join_paths(prefixdir, 'lib/systemd/user-environment-generators')
154 systemshutdowndir = join_paths(rootlibexecdir, 'system-shutdown')
155 systemsleepdir = join_paths(rootlibexecdir, 'system-sleep')
156 systemunitdir = join_paths(rootprefixdir, 'lib/systemd/system')
157 systempresetdir = join_paths(rootprefixdir, 'lib/systemd/system-preset')
158 udevlibexecdir = join_paths(rootprefixdir, 'lib/udev')
159 udevrulesdir = join_paths(udevlibexecdir, 'rules.d')
160 udevhwdbdir = join_paths(udevlibexecdir, 'hwdb.d')
161 catalogdir = join_paths(prefixdir, 'lib/systemd/catalog')
162 kernelinstalldir = join_paths(prefixdir, 'lib/kernel/install.d')
163 factorydir = join_paths(datadir, 'factory')
164 bootlibdir = join_paths(prefixdir, 'lib/systemd/boot/efi')
165 testsdir = join_paths(prefixdir, 'lib/systemd/tests')
166 systemdstatedir = join_paths(localstatedir, 'lib/systemd')
167 catalogstatedir = join_paths(systemdstatedir, 'catalog')
168 randomseeddir = join_paths(localstatedir, 'lib/systemd')
169 profiledir = join_paths(rootlibexecdir, 'portable', 'profile')
170 ntpservicelistdir = join_paths(rootprefixdir, 'lib/systemd/ntp-units.d')
172 docdir = get_option('docdir')
174 docdir = join_paths(datadir, 'doc/systemd')
177 dbuspolicydir = get_option('dbuspolicydir')
178 if dbuspolicydir == ''
179 dbuspolicydir = join_paths(datadir, 'dbus-1/system.d')
182 dbussessionservicedir = get_option('dbussessionservicedir')
183 if dbussessionservicedir == ''
184 dbussessionservicedir = join_paths(datadir, 'dbus-1/services')
187 dbussystemservicedir = get_option('dbussystemservicedir')
188 if dbussystemservicedir == ''
189 dbussystemservicedir = join_paths(datadir, 'dbus-1/system-services')
192 pamlibdir = get_option('pamlibdir')
194 pamlibdir = join_paths(rootlibdir, 'security')
197 pamconfdir = get_option('pamconfdir')
199 pamconfdir = join_paths(sysconfdir, 'pam.d')
202 memory_accounting_default = get_option('memory-accounting-default')
203 status_unit_format_default = get_option('status-unit-format-default')
205 conf.set_quoted('PKGSYSCONFDIR', pkgsysconfdir)
206 conf.set_quoted('SYSTEM_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'system'))
207 conf.set_quoted('SYSTEM_DATA_UNIT_PATH', systemunitdir)
208 conf.set_quoted('SYSTEM_SYSVINIT_PATH', sysvinit_path)
209 conf.set_quoted('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
210 conf.set_quoted('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
212 conf.set('ANSI_OK_COLOR', 'ANSI_' + get_option('ok-color').underscorify().to_upper())
214 conf.set_quoted('USER_CONFIG_UNIT_DIR', join_paths(pkgsysconfdir, 'user'))
215 conf.set_quoted('USER_DATA_UNIT_DIR', userunitdir)
216 conf.set_quoted('CERTIFICATE_ROOT', get_option('certificate-root'))
217 conf.set_quoted('CATALOG_DATABASE', join_paths(catalogstatedir, 'database'))
218 conf.set_quoted('SYSTEMD_CGROUP_AGENT_PATH', join_paths(rootlibexecdir, 'systemd-cgroups-agent'))
219 conf.set_quoted('SYSTEMD_BINARY_PATH', join_paths(rootlibexecdir, 'systemd'))
220 conf.set_quoted('SYSTEMD_FSCK_PATH', join_paths(rootlibexecdir, 'systemd-fsck'))
221 conf.set_quoted('SYSTEMD_MAKEFS_PATH', join_paths(rootlibexecdir, 'systemd-makefs'))
222 conf.set_quoted('SYSTEMD_GROWFS_PATH', join_paths(rootlibexecdir, 'systemd-growfs'))
223 conf.set_quoted('SYSTEMD_SHUTDOWN_BINARY_PATH', join_paths(rootlibexecdir, 'systemd-shutdown'))
224 conf.set_quoted('SYSTEMCTL_BINARY_PATH', join_paths(rootbindir, 'systemctl'))
225 conf.set_quoted('SYSTEMD_TTY_ASK_PASSWORD_AGENT_BINARY_PATH', join_paths(rootbindir, 'systemd-tty-ask-password-agent'))
226 conf.set_quoted('SYSTEMD_STDIO_BRIDGE_BINARY_PATH', join_paths(bindir, 'systemd-stdio-bridge'))
227 conf.set_quoted('ROOTPREFIX', rootprefixdir)
228 conf.set_quoted('RANDOM_SEED_DIR', randomseeddir)
229 conf.set_quoted('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
230 conf.set_quoted('SYSTEMD_CRYPTSETUP_PATH', join_paths(rootlibexecdir, 'systemd-cryptsetup'))
231 conf.set_quoted('SYSTEM_GENERATOR_DIR', systemgeneratordir)
232 conf.set_quoted('USER_GENERATOR_DIR', usergeneratordir)
233 conf.set_quoted('SYSTEM_ENV_GENERATOR_DIR', systemenvgeneratordir)
234 conf.set_quoted('USER_ENV_GENERATOR_DIR', userenvgeneratordir)
235 conf.set_quoted('SYSTEM_SHUTDOWN_PATH', systemshutdowndir)
236 conf.set_quoted('SYSTEM_SLEEP_PATH', systemsleepdir)
237 conf.set_quoted('SYSTEMD_KBD_MODEL_MAP', join_paths(pkgdatadir, 'kbd-model-map'))
238 conf.set_quoted('SYSTEMD_LANGUAGE_FALLBACK_MAP', join_paths(pkgdatadir, 'language-fallback-map'))
239 conf.set_quoted('SYSTEMD_TEST_DATA', join_paths(testsdir, 'testdata'))
240 conf.set_quoted('SYSTEMD_CATALOG_DIR', catalogdir)
241 conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
242 conf.set_quoted('POLKIT_AGENT_BINARY_PATH', join_paths(bindir, 'pkttyagent'))
243 conf.set_quoted('LIBDIR', libdir)
244 conf.set_quoted('ROOTLIBDIR', rootlibdir)
245 conf.set_quoted('ROOTLIBEXECDIR', rootlibexecdir)
246 conf.set_quoted('BOOTLIBDIR', bootlibdir)
247 conf.set_quoted('SYSTEMD_PULL_PATH', join_paths(rootlibexecdir, 'systemd-pull'))
248 conf.set_quoted('SYSTEMD_IMPORT_PATH', join_paths(rootlibexecdir, 'systemd-import'))
249 conf.set_quoted('SYSTEMD_IMPORT_FS_PATH', join_paths(rootlibexecdir, 'systemd-import-fs'))
250 conf.set_quoted('SYSTEMD_EXPORT_PATH', join_paths(rootlibexecdir, 'systemd-export'))
251 conf.set_quoted('VENDOR_KEYRING_PATH', join_paths(rootlibexecdir, 'import-pubring.gpg'))
252 conf.set_quoted('USER_KEYRING_PATH', join_paths(pkgsysconfdir, 'import-pubring.gpg'))
253 conf.set_quoted('DOCUMENT_ROOT', join_paths(pkgdatadir, 'gatewayd'))
254 conf.set_quoted('SYSTEMD_HOMEWORK_PATH', join_paths(rootlibexecdir, 'systemd-homework'))
255 conf.set_quoted('SYSTEMD_USERWORK_PATH', join_paths(rootlibexecdir, 'systemd-userwork'))
256 conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default)
257 conf.set_quoted('MEMORY_ACCOUNTING_DEFAULT_YES_NO', memory_accounting_default ? 'yes' : 'no')
258 conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
260 substs.set('prefix', prefixdir)
261 substs.set('rootprefix', rootprefixdir)
262 substs.set('rootprefix_noslash', rootprefixdir_noslash)
263 substs.set('exec_prefix', prefixdir)
264 substs.set('libdir', libdir)
265 substs.set('rootlibdir', rootlibdir)
266 substs.set('includedir', includedir)
267 substs.set('sysconfdir', sysconfdir)
268 substs.set('bindir', bindir)
269 substs.set('rootbindir', rootbindir)
270 substs.set('rootlibexecdir', rootlibexecdir)
271 substs.set('systemunitdir', systemunitdir)
272 substs.set('userunitdir', userunitdir)
273 substs.set('systempresetdir', systempresetdir)
274 substs.set('userpresetdir', userpresetdir)
275 substs.set('udevhwdbdir', udevhwdbdir)
276 substs.set('udevrulesdir', udevrulesdir)
277 substs.set('udevlibexecdir', udevlibexecdir)
278 substs.set('environmentdir', environmentdir)
279 substs.set('catalogdir', catalogdir)
280 substs.set('tmpfilesdir', tmpfilesdir)
281 substs.set('sysusersdir', sysusersdir)
282 substs.set('sysctldir', sysctldir)
283 substs.set('binfmtdir', binfmtdir)
284 substs.set('modulesloaddir', modulesloaddir)
285 substs.set('modprobedir', modprobedir)
286 substs.set('systemgeneratordir', systemgeneratordir)
287 substs.set('usergeneratordir', usergeneratordir)
288 substs.set('systemenvgeneratordir', systemenvgeneratordir)
289 substs.set('userenvgeneratordir', userenvgeneratordir)
290 substs.set('systemshutdowndir', systemshutdowndir)
291 substs.set('systemsleepdir', systemsleepdir)
292 substs.set('CERTIFICATEROOT', get_option('certificate-root'))
293 substs.set('RANDOM_SEED', join_paths(randomseeddir, 'random-seed'))
294 substs.set('SYSTEM_SYSVINIT_PATH', sysvinit_path)
295 substs.set('SYSTEM_SYSVRCND_PATH', sysvrcnd_path)
296 substs.set('RC_LOCAL_SCRIPT_PATH_START', get_option('rc-local'))
297 substs.set('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_default ? 'yes' : 'no')
298 substs.set('STATUS_UNIT_FORMAT_DEFAULT', status_unit_format_default)
299 substs.set('HIGH_RLIMIT_NOFILE', conf.get('HIGH_RLIMIT_NOFILE'))
300 substs.set('BUILD_ROOT', project_build_root)
302 #####################################################################
304 cc = meson.get_compiler('c')
305 pkgconfig = import('pkgconfig')
306 check_compilation_sh = find_program('tools/check-compilation.sh')
307 meson_build_sh = find_program('tools/meson-build.sh')
309 want_tests = get_option('tests')
310 slow_tests = want_tests != 'false' and get_option('slow-tests')
311 fuzz_tests = want_tests != 'false' and get_option('fuzz-tests')
312 install_tests = get_option('install-tests')
314 if add_languages('cpp', required : fuzzer_build)
315 # Used only for tests
316 cxx = meson.get_compiler('cpp')
317 cxx_cmd = ' '.join(cxx.cmd_array())
323 fuzzing_engine = meson.get_compiler('cpp').find_library('Fuzzer', required : false)
324 if fuzzing_engine.found()
325 add_project_arguments('-fsanitize-coverage=trace-pc-guard,trace-cmp', language : 'c')
326 elif cc.has_argument('-fsanitize=fuzzer-no-link')
327 add_project_arguments('-fsanitize=fuzzer-no-link', language : 'c')
329 error('Looks like neither libFuzzer nor -fsanitize=fuzzer-no-link is supported')
332 fuzzing_engine = meson.get_compiler('cpp').find_library('FuzzingEngine')
335 # Those generate many false positives, and we do not want to change the code to
337 basic_disabled_warnings = [
338 '-Wno-unused-parameter',
339 '-Wno-missing-field-initializers',
340 '-Wno-unused-result',
341 '-Wno-format-signedness',
344 possible_cc_flags = [
347 '-Wmissing-include-dirs',
348 '-Wold-style-definition',
352 '-Wsuggest-attribute=noreturn',
353 '-Werror=missing-prototypes',
354 '-Werror=implicit-function-declaration',
355 '-Werror=missing-declarations',
356 '-Werror=return-type',
357 '-Werror=incompatible-pointer-types',
359 '-Wstrict-prototypes',
361 '-Wmissing-noreturn',
362 '-Wimplicit-fallthrough=5',
365 '-Wstrict-aliasing=2',
368 '-Werror=shift-count-overflow',
369 '-Werror=shift-overflow=2',
373 # negative arguments are correctly detected starting with meson 0.46.
374 '-Wno-error=#warnings', # clang
375 '-Wno-string-plus-int', # clang
377 # Disable -Wmaybe-uninitialized, since it's noisy on gcc 8 with
378 # optimizations enabled, producing essentially false positives.
379 '-Wno-maybe-uninitialized',
383 '-fdiagnostics-show-option',
384 '-fno-strict-aliasing',
385 '-fvisibility=hidden',
387 '-fstack-protector-strong',
388 '--param=ssp-buffer-size=4',
391 # --as-needed and --no-undefined are provided by meson by default,
392 # run mesonconf to see what is enabled
393 possible_link_flags = [
399 if cc.get_id() == 'clang'
400 possible_cc_flags += [
401 '-Wno-typedef-redefinition',
402 '-Wno-gnu-variable-sized-type-not-at-end',
406 if get_option('buildtype') != 'debug'
407 possible_cc_flags += [
408 '-ffunction-sections',
412 possible_link_flags += '-Wl,--gc-sections'
415 add_project_arguments(cc.get_supported_arguments(basic_disabled_warnings), language : 'c')
416 add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'c')
417 add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'c')
419 have = cc.has_argument('-Wzero-length-bounds')
420 conf.set10('HAVE_ZERO_LENGTH_BOUNDS', have)
424 #include <inttypes.h>
425 typedef uint64_t usec_t;
426 usec_t now(clockid_t clock);
431 ''', args: '-Werror=shadow', name : '-Werror=shadow with local shadowing')
432 add_project_arguments('-Werror=shadow', language : 'c')
436 add_project_arguments(cxx.get_supported_arguments(basic_disabled_warnings), language : 'cpp')
439 cpp = ' '.join(cc.cmd_array()) + ' -E'
441 has_wstringop_truncation = cc.has_argument('-Wstringop-truncation')
443 #####################################################################
444 # compilation result tests
446 conf.set('_GNU_SOURCE', true)
447 conf.set('__SANE_USERSPACE_TYPES__', true)
448 conf.set10('HAVE_WSTRINGOP_TRUNCATION', has_wstringop_truncation)
450 conf.set('SIZEOF_DEV_T', cc.sizeof('dev_t', prefix : '#include <sys/types.h>'))
451 conf.set('SIZEOF_INO_T', cc.sizeof('ino_t', prefix : '#include <sys/types.h>'))
452 conf.set('SIZEOF_TIME_T', cc.sizeof('time_t', prefix : '#include <sys/time.h>'))
453 conf.set('SIZEOF_RLIM_T', cc.sizeof('rlim_t', prefix : '#include <sys/resource.h>'))
457 #include <sys/stat.h>
460 foreach decl : ['char16_t',
465 # We get -1 if the size cannot be determined
466 have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0
468 if decl == 'struct statx'
470 want_linux_stat_h = false
472 have = cc.sizeof(decl,
473 prefix : decl_headers + '#include <linux/stat.h>',
474 args : '-D_GNU_SOURCE') > 0
475 want_linux_stat_h = have
479 conf.set10('HAVE_' + decl.underscorify().to_upper(), have)
482 conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h)
484 foreach ident : ['secure_getenv', '__secure_getenv']
485 conf.set10('HAVE_' + ident.to_upper(), cc.has_function(ident))
489 ['memfd_create', '''#include <sys/mman.h>'''],
490 ['gettid', '''#include <sys/types.h>
491 #include <unistd.h>'''],
492 ['pivot_root', '''#include <stdlib.h>
493 #include <unistd.h>'''], # no known header declares pivot_root
494 ['name_to_handle_at', '''#include <sys/types.h>
495 #include <sys/stat.h>
496 #include <fcntl.h>'''],
497 ['setns', '''#include <sched.h>'''],
498 ['renameat2', '''#include <stdio.h>
499 #include <fcntl.h>'''],
500 ['kcmp', '''#include <linux/kcmp.h>'''],
501 ['keyctl', '''#include <sys/types.h>
502 #include <keyutils.h>'''],
503 ['copy_file_range', '''#include <sys/syscall.h>
504 #include <unistd.h>'''],
505 ['bpf', '''#include <sys/syscall.h>
506 #include <unistd.h>'''],
507 ['statx', '''#include <sys/types.h>
508 #include <sys/stat.h>
509 #include <unistd.h>'''],
510 ['explicit_bzero' , '''#include <string.h>'''],
511 ['reallocarray', '''#include <malloc.h>'''],
512 ['set_mempolicy', '''#include <stdlib.h>
513 #include <unistd.h>'''],
514 ['get_mempolicy', '''#include <stdlib.h>
515 #include <unistd.h>'''],
516 ['pidfd_send_signal', '''#include <stdlib.h>
519 #include <sys/wait.h>'''],
520 ['pidfd_open', '''#include <stdlib.h>
523 #include <sys/wait.h>'''],
524 ['rt_sigqueueinfo', '''#include <stdlib.h>
527 #include <sys/wait.h>'''],
530 have = cc.has_function(ident[0], prefix : ident[1], args : '-D_GNU_SOURCE')
531 conf.set10('HAVE_' + ident[0].to_upper(), have)
534 if cc.has_function('getrandom', prefix : '''#include <sys/random.h>''', args : '-D_GNU_SOURCE')
535 conf.set10('USE_SYS_RANDOM_H', true)
536 conf.set10('HAVE_GETRANDOM', true)
538 have = cc.has_function('getrandom', prefix : '''#include <linux/random.h>''')
539 conf.set10('USE_SYS_RANDOM_H', false)
540 conf.set10('HAVE_GETRANDOM', have)
543 #####################################################################
545 vcs_tagger = [project_source_root + '/tools/meson-vcs-tag.sh',
547 get_option('version-tag'),
548 meson.project_version()]
551 input : 'src/version/version.h.in',
552 output : 'version.h',
555 versiondep = declare_dependency(sources: version_h)
557 sed = find_program('sed')
558 awk = find_program('awk')
559 m4 = find_program('m4')
560 stat = find_program('stat')
561 git = find_program('git', required : false)
562 env = find_program('env')
563 perl = find_program('perl', required : false)
565 meson_make_symlink = project_source_root + '/tools/meson-make-symlink.sh'
566 mkdir_p = 'mkdir -p $DESTDIR/@0@'
567 test_efi_create_disk_sh = find_program('test/test-efi-create-disk.sh')
568 splash_bmp = files('test/splash.bmp')
570 # if -Dxxx-path option is found, use that. Otherwise, check in $PATH,
571 # /usr/sbin, /sbin, and fall back to the default from middle column.
572 progs = [['quotaon', '/usr/sbin/quotaon' ],
573 ['quotacheck', '/usr/sbin/quotacheck' ],
574 ['kmod', '/usr/bin/kmod' ],
575 ['kexec', '/usr/sbin/kexec' ],
576 ['sulogin', '/usr/sbin/sulogin' ],
577 ['mount', '/usr/bin/mount', 'MOUNT_PATH'],
578 ['umount', '/usr/bin/umount', 'UMOUNT_PATH'],
579 ['loadkeys', '/usr/bin/loadkeys', 'KBD_LOADKEYS'],
580 ['setfont', '/usr/bin/setfont', 'KBD_SETFONT'],
581 ['nologin', '/usr/sbin/nologin', ],
584 path = get_option(prog[0] + '-path')
586 message('Using @1@ for @0@'.format(prog[0], path))
588 exe = find_program(prog[0],
589 '/usr/sbin/' + prog[0],
592 path = exe.found() ? exe.path() : prog[1]
594 name = prog.length() > 2 ? prog[2] : prog[0].to_upper()
595 conf.set_quoted(name, path)
596 substs.set(name, path)
599 conf.set_quoted('TELINIT', get_option('telinit-path'))
601 if run_command('ln', '--relative', '--help').returncode() != 0
602 error('ln does not support --relative (added in coreutils 8.16)')
605 ############################################################
607 gperf = find_program('gperf')
609 gperf_test_format = '''
611 const char * in_word_set(const char *, @0@);
614 gperf_snippet_format = 'echo foo,bar | @0@ -L ANSI-C'
615 gperf_snippet = run_command('sh', '-c', gperf_snippet_format.format(gperf.path()))
616 gperf_test = gperf_test_format.format('size_t', gperf_snippet.stdout())
617 if cc.compiles(gperf_test)
618 gperf_len_type = 'size_t'
620 gperf_test = gperf_test_format.format('unsigned', gperf_snippet.stdout())
621 if cc.compiles(gperf_test)
622 gperf_len_type = 'unsigned'
624 error('unable to determine gperf len type')
627 message('gperf len type is @0@'.format(gperf_len_type))
628 conf.set('GPERF_LEN_TYPE', gperf_len_type,
629 description : 'The type of gperf "len" parameter')
631 ############################################################
633 if not cc.has_header('sys/capability.h')
634 error('POSIX caps headers not found')
636 foreach header : ['crypt.h',
638 'linux/vm_sockets.h',
640 'valgrind/memcheck.h',
641 'valgrind/valgrind.h',
644 conf.set10('HAVE_' + header.underscorify().to_upper(),
645 cc.has_header(header))
648 ############################################################
650 fallback_hostname = get_option('fallback-hostname')
651 if fallback_hostname == '' or fallback_hostname[0] == '.' or fallback_hostname[0] == '-'
652 error('Invalid fallback-hostname configuration')
653 # A more extensive test is done in test-hostname-util. Let's catch
654 # the most obvious errors here so we don't fail with an assert later.
656 conf.set_quoted('FALLBACK_HOSTNAME', fallback_hostname)
658 conf.set10('ENABLE_COMPAT_GATEWAY_HOSTNAME', get_option('compat-gateway-hostname'))
659 gateway_hostnames = ['_gateway'] + (conf.get('ENABLE_COMPAT_GATEWAY_HOSTNAME') == 1 ? ['gateway'] : [])
661 default_hierarchy = get_option('default-hierarchy')
662 conf.set_quoted('DEFAULT_HIERARCHY_NAME', default_hierarchy,
663 description : 'default cgroup hierarchy as string')
664 if default_hierarchy == 'legacy'
665 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_NONE')
666 elif default_hierarchy == 'hybrid'
667 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_SYSTEMD')
669 conf.set('DEFAULT_HIERARCHY', 'CGROUP_UNIFIED_ALL')
672 default_net_naming_scheme = get_option('default-net-naming-scheme')
673 conf.set_quoted('DEFAULT_NET_NAMING_SCHEME', default_net_naming_scheme)
675 time_epoch = get_option('time-epoch')
677 source_date_epoch = run_command('sh', ['-c', 'echo "$SOURCE_DATE_EPOCH"']).stdout().strip()
678 if source_date_epoch != ''
679 time_epoch = source_date_epoch.to_int()
682 time_epoch = run_command(stat, '-c', '%Y', NEWS).stdout().to_int()
685 conf.set('TIME_EPOCH', time_epoch)
687 system_uid_max = get_option('system-uid-max')
688 if system_uid_max == -1
689 system_uid_max = run_command(
691 '/^\s*SYS_UID_MAX\s+/ { uid=$2 } END { print uid }',
692 '/etc/login.defs').stdout().strip()
693 if system_uid_max == ''
696 system_uid_max = system_uid_max.to_int()
699 conf.set('SYSTEM_UID_MAX', system_uid_max)
700 substs.set('systemuidmax', system_uid_max)
702 system_gid_max = get_option('system-gid-max')
703 if system_gid_max == -1
704 system_gid_max = run_command(
706 '/^\s*SYS_GID_MAX\s+/ { gid=$2 } END { print gid }',
707 '/etc/login.defs').stdout().strip()
708 if system_gid_max == ''
711 system_gid_max = system_gid_max.to_int()
714 conf.set('SYSTEM_GID_MAX', system_gid_max)
715 substs.set('systemgidmax', system_gid_max)
717 dynamic_uid_min = get_option('dynamic-uid-min')
718 dynamic_uid_max = get_option('dynamic-uid-max')
719 conf.set('DYNAMIC_UID_MIN', dynamic_uid_min)
720 conf.set('DYNAMIC_UID_MAX', dynamic_uid_max)
721 substs.set('dynamicuidmin', dynamic_uid_min)
722 substs.set('dynamicuidmax', dynamic_uid_max)
724 container_uid_base_min = get_option('container-uid-base-min')
725 container_uid_base_max = get_option('container-uid-base-max')
726 conf.set('CONTAINER_UID_BASE_MIN', container_uid_base_min)
727 conf.set('CONTAINER_UID_BASE_MAX', container_uid_base_max)
728 substs.set('containeruidbasemin', container_uid_base_min)
729 substs.set('containeruidbasemax', container_uid_base_max)
731 nobody_user = get_option('nobody-user')
732 nobody_group = get_option('nobody-group')
734 if not meson.is_cross_build()
735 getent_result = run_command('getent', 'passwd', '65534')
736 if getent_result.returncode() == 0
737 name = getent_result.stdout().split(':')[0]
738 if name != nobody_user
740 '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) +
741 'Your build will result in an user table setup that is incompatible with the local system.')
744 id_result = run_command('id', '-u', nobody_user)
745 if id_result.returncode() == 0
746 id = id_result.stdout().to_int()
749 '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) +
750 'Your build will result in an user table setup that is incompatible with the local system.')
754 getent_result = run_command('getent', 'group', '65534')
755 if getent_result.returncode() == 0
756 name = getent_result.stdout().split(':')[0]
757 if name != nobody_group
759 '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) +
760 'Your build will result in an group table setup that is incompatible with the local system.')
763 id_result = run_command('id', '-g', nobody_group)
764 if id_result.returncode() == 0
765 id = id_result.stdout().to_int()
768 '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) +
769 'Your build will result in an group table setup that is incompatible with the local system.')
773 if nobody_user != nobody_group and not (nobody_user == 'nobody' and nobody_group == 'nogroup')
775 'The configured user name "@0@" and group name "@0@" of the nobody user/group are not equivalent.\n'.format(nobody_user, nobody_group) +
776 'Please re-check that both "nobody-user" and "nobody-group" options are correctly set.')
779 conf.set_quoted('NOBODY_USER_NAME', nobody_user)
780 conf.set_quoted('NOBODY_GROUP_NAME', nobody_group)
781 substs.set('NOBODY_USER_NAME', nobody_user)
782 substs.set('NOBODY_GROUP_NAME', nobody_group)
784 tty_gid = get_option('tty-gid')
785 conf.set('TTY_GID', tty_gid)
786 substs.set('TTY_GID', tty_gid)
788 # Ensure provided GID argument is numeric, otherwise fallback to default assignment
789 users_gid = get_option('users-gid')
790 substs.set('USERS_GID', users_gid < 0 ? '-' : users_gid)
792 conf.set10('ENABLE_ADM_GROUP', get_option('adm-group'))
793 conf.set10('ENABLE_WHEEL_GROUP', get_option('wheel-group'))
795 dev_kvm_mode = get_option('dev-kvm-mode')
796 substs.set('DEV_KVM_MODE', dev_kvm_mode)
797 conf.set10('DEV_KVM_UACCESS', dev_kvm_mode != '0666')
798 group_render_mode = get_option('group-render-mode')
799 substs.set('GROUP_RENDER_MODE', group_render_mode)
800 conf.set10('GROUP_RENDER_UACCESS', group_render_mode != '0666')
802 kill_user_processes = get_option('default-kill-user-processes')
803 conf.set10('KILL_USER_PROCESSES', kill_user_processes)
804 conf.set_quoted('KILL_USER_PROCESSES_YES_NO', kill_user_processes ? 'yes' : 'no')
805 substs.set('KILL_USER_PROCESSES', kill_user_processes ? 'yes' : 'no')
807 dns_servers = get_option('dns-servers')
808 conf.set_quoted('DNS_SERVERS', dns_servers)
809 substs.set('DNS_SERVERS', dns_servers)
811 ntp_servers = get_option('ntp-servers')
812 conf.set_quoted('NTP_SERVERS', ntp_servers)
813 substs.set('NTP_SERVERS', ntp_servers)
815 default_locale = get_option('default-locale')
816 if default_locale == ''
817 if not meson.is_cross_build()
818 choose_default_locale_sh = find_program('tools/choose-default-locale.sh')
819 default_locale = run_command(choose_default_locale_sh).stdout().strip()
821 default_locale = 'C.UTF-8'
824 conf.set_quoted('SYSTEMD_DEFAULT_LOCALE', default_locale)
826 conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
828 service_watchdog = get_option('service-watchdog')
829 watchdog_value = service_watchdog == '' ? '' : 'WatchdogSec=' + service_watchdog
830 substs.set('SERVICE_WATCHDOG', watchdog_value)
832 substs.set('SUSHELL', get_option('debug-shell'))
833 substs.set('DEBUGTTY', get_option('debug-tty'))
834 conf.set_quoted('DEBUGTTY', get_option('debug-tty'))
836 enable_debug_hashmap = false
837 enable_debug_mmap_cache = false
838 enable_debug_siphash = false
839 foreach name : get_option('debug-extra')
841 enable_debug_hashmap = true
842 elif name == 'mmap-cache'
843 enable_debug_mmap_cache = true
844 elif name == 'siphash'
845 enable_debug_siphash = true
847 message('unknown debug option "@0@", ignoring'.format(name))
850 conf.set10('ENABLE_DEBUG_HASHMAP', enable_debug_hashmap)
851 conf.set10('ENABLE_DEBUG_MMAP_CACHE', enable_debug_mmap_cache)
852 conf.set10('ENABLE_DEBUG_SIPHASH', enable_debug_siphash)
854 conf.set10('VALGRIND', get_option('valgrind'))
855 conf.set10('LOG_TRACE', get_option('log-trace'))
857 default_user_path = get_option('user-path')
858 if default_user_path != ''
859 conf.set_quoted('DEFAULT_USER_PATH', default_user_path)
860 default_user_path_display = default_user_path
862 # meson 0.49 fails when ?: is used in .format()
863 default_user_path_display = '(same as system services)'
867 #####################################################################
869 threads = dependency('threads')
870 librt = cc.find_library('rt')
871 libm = cc.find_library('m')
872 libdl = cc.find_library('dl')
873 libcrypt = cc.find_library('crypt')
875 libcap = dependency('libcap', required : false)
876 if not libcap.found()
877 # Compat with Ubuntu 14.04 which ships libcap w/o .pc file
878 libcap = cc.find_library('cap')
881 libmount = dependency('mount',
882 version : fuzzer_build ? '>= 0' : '>= 2.30')
884 want_libfdisk = get_option('fdisk')
885 if want_libfdisk != 'false' and not skip_deps
886 libfdisk = dependency('fdisk',
887 required : want_libfdisk == 'true')
888 have = libfdisk.found()
893 conf.set10('HAVE_LIBFDISK', have)
895 want_pwquality = get_option('pwquality')
896 if want_pwquality != 'false' and not skip_deps
897 libpwquality = dependency('pwquality', required : want_pwquality == 'true')
898 have = libpwquality.found()
903 conf.set10('HAVE_PWQUALITY', have)
905 want_seccomp = get_option('seccomp')
906 if want_seccomp != 'false' and not skip_deps
907 libseccomp = dependency('libseccomp',
908 version : '>= 2.3.1',
909 required : want_seccomp == 'true')
910 have = libseccomp.found()
915 conf.set10('HAVE_SECCOMP', have)
917 want_selinux = get_option('selinux')
918 if want_selinux != 'false' and not skip_deps
919 libselinux = dependency('libselinux',
920 version : '>= 2.1.9',
921 required : want_selinux == 'true')
922 have = libselinux.found()
927 conf.set10('HAVE_SELINUX', have)
929 want_apparmor = get_option('apparmor')
930 if want_apparmor != 'false' and not skip_deps
931 libapparmor = dependency('libapparmor',
932 required : want_apparmor == 'true')
933 have = libapparmor.found()
938 conf.set10('HAVE_APPARMOR', have)
940 smack_run_label = get_option('smack-run-label')
941 if smack_run_label != ''
942 conf.set_quoted('SMACK_RUN_LABEL', smack_run_label)
945 want_polkit = get_option('polkit')
946 install_polkit = false
947 install_polkit_pkla = false
948 if want_polkit != 'false' and not skip_deps
949 install_polkit = true
951 libpolkit = dependency('polkit-gobject-1',
953 if libpolkit.found() and libpolkit.version().version_compare('< 0.106')
954 message('Old polkit detected, will install pkla files')
955 install_polkit_pkla = true
958 conf.set10('ENABLE_POLKIT', install_polkit)
960 want_acl = get_option('acl')
961 if want_acl != 'false' and not skip_deps
962 libacl = cc.find_library('acl', required : want_acl == 'true')
963 have = libacl.found()
968 conf.set10('HAVE_ACL', have)
970 want_audit = get_option('audit')
971 if want_audit != 'false' and not skip_deps
972 libaudit = dependency('audit', required : want_audit == 'true')
973 have = libaudit.found()
978 conf.set10('HAVE_AUDIT', have)
980 want_blkid = get_option('blkid')
981 if want_blkid != 'false' and not skip_deps
982 libblkid = dependency('blkid', required : want_blkid == 'true')
983 have = libblkid.found()
988 conf.set10('HAVE_BLKID', have)
990 want_kmod = get_option('kmod')
991 if want_kmod != 'false' and not skip_deps
992 libkmod = dependency('libkmod',
994 required : want_kmod == 'true')
995 have = libkmod.found()
1000 conf.set10('HAVE_KMOD', have)
1002 want_pam = get_option('pam')
1003 if want_pam != 'false' and not skip_deps
1004 libpam = cc.find_library('pam', required : want_pam == 'true')
1005 libpam_misc = cc.find_library('pam_misc', required : want_pam == 'true')
1006 have = libpam.found() and libpam_misc.found()
1012 conf.set10('HAVE_PAM', have)
1014 want_microhttpd = get_option('microhttpd')
1015 if want_microhttpd != 'false' and not skip_deps
1016 libmicrohttpd = dependency('libmicrohttpd',
1017 version : '>= 0.9.33',
1018 required : want_microhttpd == 'true')
1019 have = libmicrohttpd.found()
1024 conf.set10('HAVE_MICROHTTPD', have)
1026 want_libcryptsetup = get_option('libcryptsetup')
1027 if want_libcryptsetup != 'false' and not skip_deps
1028 libcryptsetup = dependency('libcryptsetup',
1029 version : '>= 2.0.1',
1030 required : want_libcryptsetup == 'true')
1031 have = libcryptsetup.found()
1033 conf.set10('HAVE_CRYPT_SET_METADATA_SIZE',
1034 have and cc.has_function('crypt_set_metadata_size', dependencies : libcryptsetup))
1039 conf.set10('HAVE_LIBCRYPTSETUP', have)
1041 want_libcurl = get_option('libcurl')
1042 if want_libcurl != 'false' and not skip_deps
1043 libcurl = dependency('libcurl',
1044 version : '>= 7.32.0',
1045 required : want_libcurl == 'true')
1046 have = libcurl.found()
1051 conf.set10('HAVE_LIBCURL', have)
1053 want_libidn = get_option('libidn')
1054 want_libidn2 = get_option('libidn2')
1055 if want_libidn == 'true' and want_libidn2 == 'true'
1056 error('libidn and libidn2 cannot be requested simultaneously')
1059 if want_libidn2 != 'false' and want_libidn != 'true' and not skip_deps
1060 libidn = dependency('libidn2',
1061 required : want_libidn2 == 'true')
1062 have = libidn.found()
1067 conf.set10('HAVE_LIBIDN2', have)
1068 if not have and want_libidn != 'false' and not skip_deps
1069 # libidn is used for both libidn and libidn2 objects
1070 libidn = dependency('libidn',
1071 required : want_libidn == 'true')
1072 have = libidn.found()
1076 conf.set10('HAVE_LIBIDN', have)
1078 want_libiptc = get_option('libiptc')
1079 if want_libiptc != 'false' and not skip_deps
1080 libiptc = dependency('libiptc',
1081 required : want_libiptc == 'true')
1082 have = libiptc.found()
1087 conf.set10('HAVE_LIBIPTC', have)
1089 want_qrencode = get_option('qrencode')
1090 if want_qrencode != 'false' and not skip_deps
1091 libqrencode = dependency('libqrencode',
1092 required : want_qrencode == 'true')
1093 have = libqrencode.found()
1098 conf.set10('HAVE_QRENCODE', have)
1100 want_gcrypt = get_option('gcrypt')
1101 if want_gcrypt != 'false' and not skip_deps
1102 libgcrypt = cc.find_library('gcrypt', required : want_gcrypt == 'true')
1103 libgpg_error = cc.find_library('gpg-error', required : want_gcrypt == 'true')
1104 have = libgcrypt.found() and libgpg_error.found()
1109 # link to neither of the libs if one is not found
1113 conf.set10('HAVE_GCRYPT', have)
1115 want_gnutls = get_option('gnutls')
1116 if want_gnutls != 'false' and not skip_deps
1117 libgnutls = dependency('gnutls',
1118 version : '>= 3.1.4',
1119 required : want_gnutls == 'true')
1120 have = libgnutls.found()
1125 conf.set10('HAVE_GNUTLS', have)
1127 want_openssl = get_option('openssl')
1128 if want_openssl != 'false' and not skip_deps
1129 libopenssl = dependency('openssl',
1130 version : '>= 1.1.0',
1131 required : want_openssl == 'true')
1132 have = libopenssl.found()
1137 conf.set10('HAVE_OPENSSL', have)
1139 want_p11kit = get_option('p11kit')
1140 if want_p11kit != 'false' and not skip_deps
1141 libp11kit = dependency('p11-kit-1',
1142 version : '>= 0.23.3',
1143 required : want_p11kit == 'true')
1144 have = libp11kit.found()
1149 conf.set10('HAVE_P11KIT', have)
1151 want_elfutils = get_option('elfutils')
1152 if want_elfutils != 'false' and not skip_deps
1153 libdw = dependency('libdw',
1154 required : want_elfutils == 'true')
1155 have = libdw.found()
1160 conf.set10('HAVE_ELFUTILS', have)
1162 want_zlib = get_option('zlib')
1163 if want_zlib != 'false' and not skip_deps
1164 libz = dependency('zlib',
1165 required : want_zlib == 'true')
1171 conf.set10('HAVE_ZLIB', have)
1173 want_bzip2 = get_option('bzip2')
1174 if want_bzip2 != 'false' and not skip_deps
1175 libbzip2 = cc.find_library('bz2',
1176 required : want_bzip2 == 'true')
1177 have = libbzip2.found()
1182 conf.set10('HAVE_BZIP2', have)
1184 want_xz = get_option('xz')
1185 if want_xz != 'false' and not skip_deps
1186 libxz = dependency('liblzma',
1187 required : want_xz == 'true')
1188 have = libxz.found()
1193 conf.set10('HAVE_XZ', have)
1195 want_lz4 = get_option('lz4')
1196 if want_lz4 != 'false' and not skip_deps
1197 liblz4 = dependency('liblz4',
1198 version : '>= 1.3.0',
1199 required : want_lz4 == 'true')
1200 have = liblz4.found()
1205 conf.set10('HAVE_LZ4', have)
1207 want_zstd = get_option('zstd')
1208 if want_zstd != 'false' and not skip_deps
1209 libzstd = dependency('libzstd',
1210 required : want_zstd == 'true',
1211 version : '>= 1.4.0')
1212 have = libzstd.found()
1217 conf.set10('HAVE_ZSTD', have)
1219 want_xkbcommon = get_option('xkbcommon')
1220 if want_xkbcommon != 'false' and not skip_deps
1221 libxkbcommon = dependency('xkbcommon',
1222 version : '>= 0.3.0',
1223 required : want_xkbcommon == 'true')
1224 have = libxkbcommon.found()
1229 conf.set10('HAVE_XKBCOMMON', have)
1231 want_pcre2 = get_option('pcre2')
1232 if want_pcre2 != 'false'
1233 libpcre2 = dependency('libpcre2-8',
1234 required : want_pcre2 == 'true')
1235 have = libpcre2.found()
1240 conf.set10('HAVE_PCRE2', have)
1242 want_glib = get_option('glib')
1243 if want_glib != 'false' and not skip_deps
1244 libglib = dependency('glib-2.0',
1245 version : '>= 2.22.0',
1246 required : want_glib == 'true')
1247 libgobject = dependency('gobject-2.0',
1248 version : '>= 2.22.0',
1249 required : want_glib == 'true')
1250 libgio = dependency('gio-2.0',
1251 required : want_glib == 'true')
1252 have = libglib.found() and libgobject.found() and libgio.found()
1259 conf.set10('HAVE_GLIB', have)
1261 want_dbus = get_option('dbus')
1262 if want_dbus != 'false' and not skip_deps
1263 libdbus = dependency('dbus-1',
1264 version : '>= 1.3.2',
1265 required : want_dbus == 'true')
1266 have = libdbus.found()
1271 conf.set10('HAVE_DBUS', have)
1273 default_dnssec = get_option('default-dnssec')
1275 default_dnssec = 'no'
1277 if default_dnssec != 'no' and conf.get('HAVE_GCRYPT') == 0
1278 message('default-dnssec cannot be set to yes or allow-downgrade when gcrypt is disabled. Setting default-dnssec to no.')
1279 default_dnssec = 'no'
1281 conf.set('DEFAULT_DNSSEC_MODE',
1282 'DNSSEC_' + default_dnssec.underscorify().to_upper())
1283 substs.set('DEFAULT_DNSSEC_MODE', default_dnssec)
1285 dns_over_tls = get_option('dns-over-tls')
1286 if dns_over_tls != 'false'
1287 if dns_over_tls == 'openssl'
1290 have_gnutls = (conf.get('HAVE_GNUTLS') == 1 and libgnutls.version().version_compare('>= 3.6.0'))
1291 if dns_over_tls == 'gnutls' and not have_gnutls
1292 error('DNS-over-TLS support was requested with gnutls, but dependencies are not available')
1295 if dns_over_tls == 'gnutls' or have_gnutls
1296 have_openssl = false
1298 have_openssl = conf.get('HAVE_OPENSSL') == 1
1299 if dns_over_tls != 'auto' and not have_openssl
1300 str = dns_over_tls == 'openssl' ? ' with openssl' : ''
1301 error('DNS-over-TLS support was requested@0@, but dependencies are not available'.format(str))
1304 have = have_gnutls or have_openssl
1308 have_openssl = false
1310 conf.set10('ENABLE_DNS_OVER_TLS', have)
1311 conf.set10('DNS_OVER_TLS_USE_GNUTLS', have_gnutls)
1312 conf.set10('DNS_OVER_TLS_USE_OPENSSL', have_openssl)
1314 default_dns_over_tls = get_option('default-dns-over-tls')
1316 default_dns_over_tls = 'no'
1318 if default_dns_over_tls != 'no' and conf.get('ENABLE_DNS_OVER_TLS') == 0
1319 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.')
1320 default_dns_over_tls = 'no'
1322 conf.set('DEFAULT_DNS_OVER_TLS_MODE',
1323 'DNS_OVER_TLS_' + default_dns_over_tls.underscorify().to_upper())
1324 substs.set('DEFAULT_DNS_OVER_TLS_MODE', default_dns_over_tls)
1326 default_mdns = get_option('default-mdns')
1327 conf.set('DEFAULT_MDNS_MODE',
1328 'RESOLVE_SUPPORT_' + default_mdns.to_upper())
1329 substs.set('DEFAULT_MDNS_MODE', default_mdns)
1331 default_llmnr = get_option('default-llmnr')
1332 conf.set('DEFAULT_LLMNR_MODE',
1333 'RESOLVE_SUPPORT_' + default_llmnr.to_upper())
1334 substs.set('DEFAULT_LLMNR_MODE', default_llmnr)
1336 want_repart = get_option('repart')
1337 if want_repart != 'false'
1338 have = (conf.get('HAVE_OPENSSL') == 1 and
1339 conf.get('HAVE_LIBFDISK') == 1)
1340 if want_repart == 'true' and not have
1341 error('repart support was requested, but dependencies are not available')
1346 conf.set10('ENABLE_REPART', have)
1348 want_importd = get_option('importd')
1349 if want_importd != 'false'
1350 have = (conf.get('HAVE_LIBCURL') == 1 and
1351 conf.get('HAVE_ZLIB') == 1 and
1352 conf.get('HAVE_XZ') == 1 and
1353 conf.get('HAVE_GCRYPT') == 1)
1354 if want_importd == 'true' and not have
1355 error('importd support was requested, but dependencies are not available')
1360 conf.set10('ENABLE_IMPORTD', have)
1362 want_homed = get_option('homed')
1363 if want_homed != 'false'
1364 have = (conf.get('HAVE_OPENSSL') == 1 and
1365 conf.get('HAVE_LIBFDISK') == 1 and
1366 conf.get('HAVE_LIBCRYPTSETUP') == 1)
1367 if want_homed == 'true' and not have
1368 error('homed support was requested, but dependencies are not available')
1373 conf.set10('ENABLE_HOMED', have)
1375 have = have and conf.get('HAVE_PAM') == 1
1376 conf.set10('ENABLE_PAM_HOME', have)
1378 want_remote = get_option('remote')
1379 if want_remote != 'false'
1380 have_deps = [conf.get('HAVE_MICROHTTPD') == 1,
1381 conf.get('HAVE_LIBCURL') == 1]
1382 # sd-j-remote requires µhttpd, and sd-j-upload requires libcurl, so
1383 # it's possible to build one without the other. Complain only if
1384 # support was explicitly requested. The auxiliary files like sysusers
1385 # config should be installed when any of the programs are built.
1386 if want_remote == 'true' and not (have_deps[0] and have_deps[1])
1387 error('remote support was requested, but dependencies are not available')
1389 have = have_deps[0] or have_deps[1]
1393 conf.set10('ENABLE_REMOTE', have)
1395 foreach term : ['utmp',
1431 have = get_option(term)
1432 name = 'ENABLE_' + term.underscorify().to_upper()
1433 conf.set10(name, have)
1436 foreach tuple : [['nss-mymachines', 'machined'],
1437 ['nss-resolve', 'resolve']]
1438 want = get_option(tuple[0])
1440 have = get_option(tuple[1])
1441 if want == 'true' and not have
1442 error('@0@ is requested but @1@ is disabled'.format(tuple[0], tuple[1]))
1447 name = 'ENABLE_' + tuple[0].underscorify().to_upper()
1448 conf.set10(name, have)
1452 foreach term : ['ENABLE_NSS_MYHOSTNAME',
1453 'ENABLE_NSS_MYMACHINES',
1454 'ENABLE_NSS_RESOLVE',
1455 'ENABLE_NSS_SYSTEMD']
1456 if conf.get(term) == 1
1460 conf.set10('ENABLE_NSS', enable_nss)
1462 conf.set10('ENABLE_TIMEDATECTL', get_option('timedated') or get_option('timesyncd'))
1467 conf.set10('SYSTEMD_SLOW_TESTS_DEFAULT', slow_tests)
1469 #####################################################################
1471 if get_option('efi')
1472 efi_arch = host_machine.cpu_family()
1474 if efi_arch == 'x86'
1475 EFI_MACHINE_TYPE_NAME = 'ia32'
1476 gnu_efi_arch = 'ia32'
1477 elif efi_arch == 'x86_64'
1478 EFI_MACHINE_TYPE_NAME = 'x64'
1479 gnu_efi_arch = 'x86_64'
1480 elif efi_arch == 'arm'
1481 EFI_MACHINE_TYPE_NAME = 'arm'
1482 gnu_efi_arch = 'arm'
1483 elif efi_arch == 'aarch64'
1484 EFI_MACHINE_TYPE_NAME = 'aa64'
1485 gnu_efi_arch = 'aarch64'
1487 EFI_MACHINE_TYPE_NAME = ''
1492 conf.set_quoted('EFI_MACHINE_TYPE_NAME', EFI_MACHINE_TYPE_NAME)
1494 conf.set('SD_TPM_PCR', get_option('tpm-pcrindex'))
1498 conf.set10('ENABLE_EFI', have)
1500 #####################################################################
1502 config_h = configure_file(
1503 output : 'config.h',
1504 configuration : conf)
1506 meson_apply_m4 = find_program('tools/meson-apply-m4.sh')
1508 includes = include_directories('src/basic',
1514 'src/journal-remote',
1518 'src/time-wait-sync',
1524 'src/xdg-autostart-generator',
1525 'src/libsystemd/sd-bus',
1526 'src/libsystemd/sd-device',
1527 'src/libsystemd/sd-event',
1528 'src/libsystemd/sd-hwdb',
1529 'src/libsystemd/sd-id128',
1530 'src/libsystemd/sd-netlink',
1531 'src/libsystemd/sd-network',
1532 'src/libsystemd/sd-resolve',
1533 'src/libsystemd-network',
1536 add_project_arguments('-include', 'config.h', language : 'c')
1538 generate_gperfs = find_program('tools/generate-gperfs.py')
1542 subdir('src/systemd')
1544 subdir('src/libsystemd')
1545 subdir('src/libsystemd-network')
1546 subdir('src/journal')
1549 libjournal_core = static_library(
1551 libjournal_core_sources,
1553 include_directories : includes,
1556 libsystemd_sym_path = '@0@/@1@'.format(project_source_root, libsystemd_sym)
1557 libsystemd = shared_library(
1560 version : libsystemd_version,
1561 include_directories : includes,
1562 link_args : ['-shared',
1563 '-Wl,--version-script=' + libsystemd_sym_path],
1564 link_with : [libbasic,
1566 link_whole : [libsystemd_static,
1568 dependencies : [threads,
1573 link_depends : libsystemd_sym,
1575 install_dir : rootlibdir)
1577 static_libsystemd = get_option('static-libsystemd')
1578 static_libsystemd_pic = static_libsystemd == 'true' or static_libsystemd == 'pic'
1580 install_libsystemd_static = static_library(
1583 journal_client_sources,
1585 basic_gcrypt_sources,
1587 include_directories : includes,
1588 build_by_default : static_libsystemd != 'false',
1589 install : static_libsystemd != 'false',
1590 install_dir : rootlibdir,
1591 pic : static_libsystemd == 'true' or static_libsystemd == 'pic',
1592 dependencies : [threads,
1602 c_args : libsystemd_c_args + (static_libsystemd_pic ? [] : ['-fno-PIC']))
1604 # Generate autosuspend rules
1605 make_autosuspend_rules_py = find_program('tools/make-autosuspend-rules.py')
1607 ############################################################
1609 # binaries that have --help and are intended for use by humans,
1610 # usually, but not always, installed in /bin.
1611 public_programs = []
1613 subdir('src/libudev')
1614 subdir('src/shared')
1616 subdir('src/shutdown')
1618 subdir('src/network')
1620 subdir('src/analyze')
1621 subdir('src/journal-remote')
1622 subdir('src/coredump')
1623 subdir('src/pstore')
1624 subdir('src/hostname')
1625 subdir('src/import')
1626 subdir('src/partition')
1627 subdir('src/kernel-install')
1628 subdir('src/locale')
1629 subdir('src/machine')
1630 subdir('src/portable')
1631 subdir('src/userdb')
1633 subdir('src/nspawn')
1634 subdir('src/resolve')
1635 subdir('src/timedate')
1636 subdir('src/timesync')
1637 subdir('src/vconsole')
1638 subdir('src/boot/efi')
1645 ############################################################
1647 # only static linking apart from libdl, to make sure that the
1648 # module is linked to all libraries that it uses.
1649 test_dlopen = executable(
1653 include_directories : includes,
1654 link_with : [libbasic],
1655 dependencies : [libdl],
1656 build_by_default : want_tests != 'false')
1658 foreach tuple : [['myhostname', 'ENABLE_NSS_MYHOSTNAME'],
1659 ['systemd', 'ENABLE_NSS_SYSTEMD', 'src/nss-systemd/userdb-glue.c src/nss-systemd/userdb-glue.h'],
1660 ['mymachines', 'ENABLE_NSS_MYMACHINES'],
1661 ['resolve', 'ENABLE_NSS_RESOLVE']]
1663 condition = tuple[1] == '' or conf.get(tuple[1]) == 1
1667 sym = 'src/nss-@0@/nss-@0@.sym'.format(module)
1668 version_script_arg = join_paths(project_source_root, sym)
1670 sources = ['src/nss-@0@/nss-@0@.c'.format(module)]
1671 if tuple.length() > 2
1672 sources += tuple[2].split()
1675 nss = shared_library(
1680 include_directories : includes,
1681 # Note that we link NSS modules with '-z nodelete' so that mempools never get orphaned
1682 link_args : ['-Wl,-z,nodelete',
1684 '-Wl,--version-script=' + version_script_arg],
1685 link_with : [libsystemd_static,
1688 dependencies : [threads,
1692 install_dir : rootlibdir)
1694 # We cannot use shared_module because it does not support version suffix.
1695 # Unfortunately shared_library insists on creating the symlink…
1696 meson.add_install_script('sh', '-c',
1697 'rm $DESTDIR@0@/libnss_@1@.so'
1698 .format(rootlibdir, module))
1700 if want_tests != 'false'
1701 test('dlopen-nss_' + module,
1703 # path to dlopen must include a slash
1704 args : nss.full_path())
1709 ############################################################
1714 include_directories : includes,
1715 link_with : [libcore,
1717 dependencies : [versiondep,
1724 install_rpath : rootlibexecdir,
1726 install_dir : rootlibexecdir)
1728 meson.add_install_script(meson_make_symlink,
1729 join_paths(rootlibexecdir, 'systemd'),
1730 join_paths(rootsbindir, 'init'))
1732 public_programs += executable(
1734 systemd_analyze_sources,
1735 include_directories : includes,
1736 link_with : [libcore,
1738 dependencies : [versiondep,
1745 install_rpath : rootlibexecdir,
1746 install : get_option('analyze'))
1750 systemd_journald_sources,
1751 include_directories : includes,
1752 link_with : [libjournal_core,
1754 dependencies : [threads,
1759 install_rpath : rootlibexecdir,
1761 install_dir : rootlibexecdir)
1763 public_programs += executable(
1765 systemd_cat_sources,
1766 include_directories : includes,
1767 link_with : [libjournal_core,
1769 dependencies : [threads],
1770 install_rpath : rootlibexecdir,
1773 public_programs += executable(
1776 include_directories : includes,
1777 link_with : [libshared],
1778 dependencies : [threads,
1784 install_rpath : rootlibexecdir,
1786 install_dir : rootbindir)
1789 'systemd-getty-generator',
1790 'src/getty-generator/getty-generator.c',
1791 include_directories : includes,
1792 link_with : [libshared],
1793 install_rpath : rootlibexecdir,
1795 install_dir : systemgeneratordir)
1798 'systemd-debug-generator',
1799 'src/debug-generator/debug-generator.c',
1800 include_directories : includes,
1801 link_with : [libshared],
1802 install_rpath : rootlibexecdir,
1804 install_dir : systemgeneratordir)
1807 'systemd-run-generator',
1808 'src/run-generator/run-generator.c',
1809 include_directories : includes,
1810 link_with : [libshared],
1811 install_rpath : rootlibexecdir,
1813 install_dir : systemgeneratordir)
1816 'systemd-fstab-generator',
1817 'src/fstab-generator/fstab-generator.c',
1818 include_directories : includes,
1819 link_with : [libcore_shared,
1821 install_rpath : rootlibexecdir,
1823 install_dir : systemgeneratordir)
1825 if conf.get('ENABLE_ENVIRONMENT_D') == 1
1827 '30-systemd-environment-d-generator',
1828 'src/environment-d-generator/environment-d-generator.c',
1829 include_directories : includes,
1830 link_with : [libshared],
1831 install_rpath : rootlibexecdir,
1833 install_dir : userenvgeneratordir)
1835 meson.add_install_script(meson_make_symlink,
1836 join_paths(sysconfdir, 'environment'),
1837 join_paths(environmentdir, '99-environment.conf'))
1840 if conf.get('ENABLE_HIBERNATE') == 1
1842 'systemd-hibernate-resume-generator',
1843 'src/hibernate-resume/hibernate-resume-generator.c',
1844 include_directories : includes,
1845 link_with : [libshared],
1846 install_rpath : rootlibexecdir,
1848 install_dir : systemgeneratordir)
1851 'systemd-hibernate-resume',
1852 'src/hibernate-resume/hibernate-resume.c',
1853 include_directories : includes,
1854 link_with : [libshared],
1855 install_rpath : rootlibexecdir,
1857 install_dir : rootlibexecdir)
1860 if conf.get('HAVE_BLKID') == 1
1862 'systemd-gpt-auto-generator',
1863 'src/gpt-auto-generator/gpt-auto-generator.c',
1864 'src/shared/blkid-util.h',
1865 include_directories : includes,
1866 link_with : [libshared],
1867 dependencies : libblkid,
1868 install_rpath : rootlibexecdir,
1870 install_dir : systemgeneratordir)
1872 public_programs += executable(
1874 'src/dissect/dissect.c',
1875 include_directories : includes,
1876 link_with : [libshared],
1877 install_rpath : rootlibexecdir,
1879 install_dir : rootlibexecdir)
1882 if conf.get('ENABLE_RESOLVE') == 1
1885 systemd_resolved_sources,
1886 include_directories : includes,
1887 link_with : [libshared,
1889 libsystemd_resolve_core],
1890 dependencies : systemd_resolved_dependencies,
1891 install_rpath : rootlibexecdir,
1893 install_dir : rootlibexecdir)
1895 public_programs += executable(
1898 include_directories : includes,
1899 link_with : [libshared,
1901 libsystemd_resolve_core],
1902 dependencies : [threads,
1906 install_rpath : rootlibexecdir,
1909 meson.add_install_script(meson_make_symlink,
1910 join_paths(bindir, 'resolvectl'),
1911 join_paths(rootsbindir, 'resolvconf'))
1913 meson.add_install_script(meson_make_symlink,
1914 join_paths(bindir, 'resolvectl'),
1915 join_paths(bindir, 'systemd-resolve'))
1918 if conf.get('ENABLE_LOGIND') == 1
1921 systemd_logind_sources,
1922 include_directories : includes,
1923 link_with : [liblogind_core,
1925 dependencies : [threads,
1927 install_rpath : rootlibexecdir,
1929 install_dir : rootlibexecdir)
1931 public_programs += executable(
1934 include_directories : includes,
1935 link_with : [libshared],
1936 dependencies : [threads,
1940 install_rpath : rootlibexecdir,
1942 install_dir : rootbindir)
1944 public_programs += executable(
1946 'src/login/inhibit.c',
1947 include_directories : includes,
1948 link_with : [libshared],
1949 install_rpath : rootlibexecdir,
1951 install_dir : rootbindir)
1953 if conf.get('HAVE_PAM') == 1
1954 version_script_arg = join_paths(project_source_root, pam_systemd_sym)
1955 pam_systemd = shared_library(
1959 include_directories : includes,
1960 link_args : ['-shared',
1961 '-Wl,--version-script=' + version_script_arg],
1962 link_with : [libsystemd_static,
1964 dependencies : [threads,
1967 link_depends : pam_systemd_sym,
1969 install_dir : pamlibdir)
1971 if want_tests != 'false'
1972 test('dlopen-pam_systemd',
1974 # path to dlopen must include a slash
1975 args : pam_systemd.full_path())
1980 'systemd-user-runtime-dir',
1981 user_runtime_dir_sources,
1982 include_directories : includes,
1983 link_with : [libshared],
1984 install_rpath : rootlibexecdir,
1986 install_dir : rootlibexecdir)
1989 if conf.get('HAVE_PAM') == 1
1991 'systemd-user-sessions',
1992 'src/user-sessions/user-sessions.c',
1993 include_directories : includes,
1994 link_with : [libshared],
1995 install_rpath : rootlibexecdir,
1997 install_dir : rootlibexecdir)
2000 if conf.get('ENABLE_EFI') == 1 and conf.get('HAVE_BLKID') == 1
2001 public_programs += executable(
2003 'src/boot/bootctl.c',
2004 include_directories : includes,
2005 link_with : [libshared],
2006 dependencies : [libblkid],
2007 install_rpath : rootlibexecdir,
2010 public_programs += executable(
2011 'systemd-bless-boot',
2012 'src/boot/bless-boot.c',
2013 include_directories : includes,
2014 link_with : [libshared],
2015 dependencies : [libblkid],
2016 install_rpath : rootlibexecdir,
2018 install_dir : rootlibexecdir)
2021 'systemd-bless-boot-generator',
2022 'src/boot/bless-boot-generator.c',
2023 include_directories : includes,
2024 link_with : [libshared],
2025 install_rpath : rootlibexecdir,
2027 install_dir : systemgeneratordir)
2031 'systemd-boot-check-no-failures',
2032 'src/boot/boot-check-no-failures.c',
2033 include_directories : includes,
2034 link_with : [libshared],
2035 dependencies : [libblkid],
2036 install_rpath : rootlibexecdir,
2038 install_dir : rootlibexecdir)
2040 public_programs += executable(
2041 'systemd-socket-activate',
2042 'src/activate/activate.c',
2043 include_directories : includes,
2044 link_with : [libshared],
2045 dependencies : [threads],
2046 install_rpath : rootlibexecdir,
2049 if get_option('link-systemctl-shared')
2050 systemctl_link_with = [libshared]
2052 systemctl_link_with = [libsystemd_static,
2058 public_programs += executable(
2060 'src/systemctl/systemctl.c',
2061 'src/systemctl/sysv-compat.h',
2062 'src/systemctl/sysv-compat.c',
2063 include_directories : includes,
2064 link_with : systemctl_link_with,
2065 dependencies : [threads,
2071 install_rpath : rootlibexecdir,
2073 install_dir : rootbindir)
2075 if conf.get('ENABLE_PORTABLED') == 1
2077 'systemd-portabled',
2078 systemd_portabled_sources,
2079 include_directories : includes,
2080 link_with : [libshared],
2081 dependencies : [threads],
2082 install_rpath : rootlibexecdir,
2084 install_dir : rootlibexecdir)
2086 public_programs += executable(
2088 'src/portable/portablectl.c',
2089 include_directories : includes,
2090 link_with : [libshared],
2091 dependencies : [threads],
2092 install_rpath : rootlibexecdir,
2094 install_dir : rootbindir)
2097 if conf.get('ENABLE_USERDB') == 1
2100 systemd_userwork_sources,
2101 include_directories : includes,
2102 link_with : [libshared],
2103 dependencies : [threads],
2104 install_rpath : rootlibexecdir,
2106 install_dir : rootlibexecdir)
2110 systemd_userdbd_sources,
2111 include_directories : includes,
2112 link_with : [libshared],
2113 dependencies : [threads],
2114 install_rpath : rootlibexecdir,
2116 install_dir : rootlibexecdir)
2118 public_programs += executable(
2121 include_directories : includes,
2122 link_with : [libshared],
2123 dependencies : [threads],
2124 install_rpath : rootlibexecdir,
2126 install_dir : rootbindir)
2129 if conf.get('ENABLE_HOMED') == 1
2132 systemd_homework_sources,
2133 include_directories : includes,
2134 link_with : [libshared],
2135 dependencies : [threads,
2142 install_rpath : rootlibexecdir,
2144 install_dir : rootlibexecdir)
2148 systemd_homed_sources,
2149 include_directories : includes,
2150 link_with : [libshared],
2151 dependencies : [threads,
2155 install_rpath : rootlibexecdir,
2157 install_dir : rootlibexecdir)
2159 public_programs += executable(
2162 include_directories : includes,
2163 link_with : [libshared],
2164 dependencies : [threads,
2169 install_rpath : rootlibexecdir,
2171 install_dir : rootbindir)
2173 if conf.get('HAVE_PAM') == 1
2174 version_script_arg = join_paths(project_source_root, pam_systemd_home_sym)
2175 pam_systemd = shared_library(
2179 include_directories : includes,
2180 link_args : ['-shared',
2181 '-Wl,--version-script=' + version_script_arg],
2182 link_with : [libsystemd_static,
2184 dependencies : [threads,
2188 link_depends : pam_systemd_home_sym,
2190 install_dir : pamlibdir)
2194 foreach alias : (['halt', 'poweroff', 'reboot', 'shutdown'] +
2195 (conf.get('HAVE_SYSV_COMPAT') == 1 ? ['runlevel', 'telinit'] : []))
2196 meson.add_install_script(meson_make_symlink,
2197 join_paths(rootbindir, 'systemctl'),
2198 join_paths(rootsbindir, alias))
2201 meson.add_install_script(meson_make_symlink,
2202 join_paths(rootbindir, 'udevadm'),
2203 join_paths(rootlibexecdir, 'systemd-udevd'))
2205 if conf.get('ENABLE_BACKLIGHT') == 1
2207 'systemd-backlight',
2208 'src/backlight/backlight.c',
2209 include_directories : includes,
2210 link_with : [libshared],
2211 install_rpath : rootlibexecdir,
2213 install_dir : rootlibexecdir)
2216 if conf.get('ENABLE_RFKILL') == 1
2219 'src/rfkill/rfkill.c',
2220 include_directories : includes,
2221 link_with : [libshared],
2222 install_rpath : rootlibexecdir,
2224 install_dir : rootlibexecdir)
2228 'systemd-system-update-generator',
2229 'src/system-update-generator/system-update-generator.c',
2230 include_directories : includes,
2231 link_with : [libshared],
2232 install_rpath : rootlibexecdir,
2234 install_dir : systemgeneratordir)
2236 if conf.get('HAVE_LIBCRYPTSETUP') == 1
2237 systemd_cryptsetup_sources = files('''
2238 src/cryptsetup/cryptsetup-pkcs11.h
2239 src/cryptsetup/cryptsetup-util.c
2240 src/cryptsetup/cryptsetup-util.h
2241 src/cryptsetup/cryptsetup.c
2244 if conf.get('HAVE_P11KIT') == 1
2245 systemd_cryptsetup_sources += files('src/cryptsetup/cryptsetup-pkcs11.c')
2249 'systemd-cryptsetup',
2250 systemd_cryptsetup_sources,
2251 include_directories : includes,
2252 link_with : [libshared],
2253 dependencies : [libcryptsetup,
2255 install_rpath : rootlibexecdir,
2257 install_dir : rootlibexecdir)
2260 'systemd-cryptsetup-generator',
2261 'src/cryptsetup/cryptsetup-generator.c',
2262 include_directories : includes,
2263 link_with : [libshared],
2264 dependencies : [libcryptsetup],
2265 install_rpath : rootlibexecdir,
2267 install_dir : systemgeneratordir)
2270 'systemd-veritysetup',
2271 'src/veritysetup/veritysetup.c',
2272 include_directories : includes,
2273 link_with : [libshared],
2274 dependencies : [libcryptsetup],
2275 install_rpath : rootlibexecdir,
2277 install_dir : rootlibexecdir)
2280 'systemd-veritysetup-generator',
2281 'src/veritysetup/veritysetup-generator.c',
2282 include_directories : includes,
2283 link_with : [libshared],
2284 dependencies : [libcryptsetup],
2285 install_rpath : rootlibexecdir,
2287 install_dir : systemgeneratordir)
2290 if conf.get('HAVE_SYSV_COMPAT') == 1
2292 'systemd-sysv-generator',
2293 'src/sysv-generator/sysv-generator.c',
2294 include_directories : includes,
2295 link_with : [libshared],
2296 install_rpath : rootlibexecdir,
2298 install_dir : systemgeneratordir)
2301 'systemd-rc-local-generator',
2302 'src/rc-local-generator/rc-local-generator.c',
2303 include_directories : includes,
2304 link_with : [libshared],
2305 install_rpath : rootlibexecdir,
2307 install_dir : systemgeneratordir)
2310 if conf.get('ENABLE_XDG_AUTOSTART') == 1
2312 'systemd-xdg-autostart-generator',
2313 'src/xdg-autostart-generator/xdg-autostart-generator.c',
2314 'src/xdg-autostart-generator/xdg-autostart-service.c',
2315 include_directories : includes,
2316 link_with : [libshared],
2317 install_rpath : rootlibexecdir,
2319 install_dir : usergeneratordir)
2322 'systemd-xdg-autostart-condition',
2323 'src/xdg-autostart-generator/xdg-autostart-condition.c',
2324 include_directories : includes,
2325 link_with : [libshared],
2326 install_rpath : rootlibexecdir,
2328 install_dir : rootlibexecdir)
2331 if conf.get('ENABLE_HOSTNAMED') == 1
2333 'systemd-hostnamed',
2334 'src/hostname/hostnamed.c',
2335 include_directories : includes,
2336 link_with : [libshared],
2337 install_rpath : rootlibexecdir,
2339 install_dir : rootlibexecdir)
2341 public_programs += executable(
2343 'src/hostname/hostnamectl.c',
2344 include_directories : includes,
2345 link_with : [libshared],
2346 install_rpath : rootlibexecdir,
2350 if conf.get('ENABLE_LOCALED') == 1
2351 if conf.get('HAVE_XKBCOMMON') == 1
2352 # logind will load libxkbcommon.so dynamically on its own
2360 systemd_localed_sources,
2361 include_directories : includes,
2362 link_with : [libshared],
2363 dependencies : deps,
2364 install_rpath : rootlibexecdir,
2366 install_dir : rootlibexecdir)
2368 public_programs += executable(
2371 include_directories : includes,
2372 link_with : [libshared],
2373 install_rpath : rootlibexecdir,
2377 if conf.get('ENABLE_TIMEDATED') == 1
2379 'systemd-timedated',
2380 'src/timedate/timedated.c',
2381 include_directories : includes,
2382 link_with : [libshared],
2383 install_rpath : rootlibexecdir,
2385 install_dir : rootlibexecdir)
2388 if conf.get('ENABLE_TIMEDATECTL') == 1
2389 public_programs += executable(
2391 'src/timedate/timedatectl.c',
2392 include_directories : includes,
2393 install_rpath : rootlibexecdir,
2394 link_with : [libshared],
2395 dependencies : [libm],
2399 if conf.get('ENABLE_TIMESYNCD') == 1
2400 if get_option('link-timesyncd-shared')
2401 timesyncd_link_with = [libshared]
2403 timesyncd_link_with = [libsystemd_static,
2410 'systemd-timesyncd',
2411 systemd_timesyncd_sources,
2412 include_directories : includes,
2413 link_with : [timesyncd_link_with],
2414 dependencies : [threads,
2416 install_rpath : rootlibexecdir,
2418 install_dir : rootlibexecdir)
2421 'systemd-time-wait-sync',
2422 'src/time-wait-sync/time-wait-sync.c',
2423 include_directories : includes,
2424 link_with : [timesyncd_link_with],
2425 install_rpath : rootlibexecdir,
2427 install_dir : rootlibexecdir)
2430 if conf.get('ENABLE_MACHINED') == 1
2433 systemd_machined_sources,
2434 include_directories : includes,
2435 link_with : [libmachine_core,
2437 install_rpath : rootlibexecdir,
2439 install_dir : rootlibexecdir)
2441 public_programs += executable(
2443 'src/machine/machinectl.c',
2444 include_directories : includes,
2445 link_with : [libshared],
2446 dependencies : [threads,
2450 install_rpath : rootlibexecdir,
2452 install_dir : rootbindir)
2455 if conf.get('ENABLE_IMPORTD') == 1
2458 systemd_importd_sources,
2459 include_directories : includes,
2460 link_with : [libshared],
2461 dependencies : [threads],
2462 install_rpath : rootlibexecdir,
2464 install_dir : rootlibexecdir)
2466 systemd_pull = executable(
2468 systemd_pull_sources,
2469 include_directories : includes,
2470 link_with : [libshared],
2471 dependencies : [versiondep,
2477 install_rpath : rootlibexecdir,
2479 install_dir : rootlibexecdir)
2481 systemd_import = executable(
2483 systemd_import_sources,
2484 include_directories : includes,
2485 link_with : [libshared],
2486 dependencies : [libcurl,
2490 install_rpath : rootlibexecdir,
2492 install_dir : rootlibexecdir)
2494 systemd_import_fs = executable(
2495 'systemd-import-fs',
2496 systemd_import_fs_sources,
2497 include_directories : includes,
2498 link_with : [libshared],
2499 install_rpath : rootlibexecdir,
2501 install_dir : rootlibexecdir)
2503 systemd_export = executable(
2505 systemd_export_sources,
2506 include_directories : includes,
2507 link_with : [libshared],
2508 dependencies : [libcurl,
2512 install_rpath : rootlibexecdir,
2514 install_dir : rootlibexecdir)
2516 public_programs += [systemd_pull, systemd_import, systemd_import_fs, systemd_export]
2519 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_LIBCURL') == 1
2520 public_programs += executable(
2521 'systemd-journal-upload',
2522 systemd_journal_upload_sources,
2523 include_directories : includes,
2524 link_with : [libshared],
2525 dependencies : [versiondep,
2532 install_rpath : rootlibexecdir,
2534 install_dir : rootlibexecdir)
2537 if conf.get('ENABLE_REMOTE') == 1 and conf.get('HAVE_MICROHTTPD') == 1
2538 public_programs += executable(
2539 'systemd-journal-remote',
2540 systemd_journal_remote_sources,
2541 include_directories : includes,
2542 link_with : [libshared,
2543 libsystemd_journal_remote],
2544 dependencies : [threads,
2550 install_rpath : rootlibexecdir,
2552 install_dir : rootlibexecdir)
2554 public_programs += executable(
2555 'systemd-journal-gatewayd',
2556 systemd_journal_gatewayd_sources,
2557 include_directories : includes,
2558 link_with : [libshared],
2559 dependencies : [threads,
2565 install_rpath : rootlibexecdir,
2567 install_dir : rootlibexecdir)
2570 if conf.get('ENABLE_COREDUMP') == 1
2573 systemd_coredump_sources,
2574 include_directories : includes,
2575 link_with : [libshared],
2576 dependencies : [threads,
2582 install_rpath : rootlibexecdir,
2584 install_dir : rootlibexecdir)
2586 public_programs += executable(
2588 coredumpctl_sources,
2589 include_directories : includes,
2590 link_with : [libshared],
2591 dependencies : [threads,
2595 install_rpath : rootlibexecdir,
2599 if conf.get('ENABLE_PSTORE') == 1
2602 systemd_pstore_sources,
2603 include_directories : includes,
2604 link_with : [libshared],
2605 dependencies : [threads,
2611 install_rpath : rootlibexecdir,
2613 install_dir : rootlibexecdir)
2616 if conf.get('ENABLE_BINFMT') == 1
2617 public_programs += executable(
2619 'src/binfmt/binfmt.c',
2620 include_directories : includes,
2621 link_with : [libshared],
2622 install_rpath : rootlibexecdir,
2624 install_dir : rootlibexecdir)
2626 meson.add_install_script('sh', '-c',
2627 mkdir_p.format(binfmtdir))
2628 meson.add_install_script('sh', '-c',
2629 mkdir_p.format(join_paths(sysconfdir, 'binfmt.d')))
2632 if conf.get('ENABLE_REPART') == 1
2635 systemd_repart_sources,
2636 include_directories : includes,
2637 link_with : [libshared],
2638 dependencies : [threads,
2643 install_rpath : rootlibexecdir,
2645 install_dir : rootbindir)
2647 if want_tests != 'false'
2650 args : exe.full_path())
2654 if conf.get('ENABLE_VCONSOLE') == 1
2656 'systemd-vconsole-setup',
2657 'src/vconsole/vconsole-setup.c',
2658 include_directories : includes,
2659 link_with : [libshared],
2660 install_rpath : rootlibexecdir,
2662 install_dir : rootlibexecdir)
2665 if conf.get('ENABLE_RANDOMSEED') == 1
2667 'systemd-random-seed',
2668 'src/random-seed/random-seed.c',
2669 include_directories : includes,
2670 link_with : [libshared],
2671 install_rpath : rootlibexecdir,
2673 install_dir : rootlibexecdir)
2676 if conf.get('ENABLE_FIRSTBOOT') == 1
2678 'systemd-firstboot',
2679 'src/firstboot/firstboot.c',
2680 include_directories : includes,
2681 link_with : [libshared],
2682 dependencies : [libcrypt],
2683 install_rpath : rootlibexecdir,
2685 install_dir : rootbindir)
2689 'systemd-remount-fs',
2690 'src/remount-fs/remount-fs.c',
2691 include_directories : includes,
2692 link_with : [libcore_shared,
2694 install_rpath : rootlibexecdir,
2696 install_dir : rootlibexecdir)
2699 'systemd-machine-id-setup',
2700 'src/machine-id-setup/machine-id-setup-main.c',
2701 include_directories : includes,
2702 link_with : [libcore_shared,
2704 install_rpath : rootlibexecdir,
2706 install_dir : rootbindir)
2711 include_directories : includes,
2712 link_with : [libshared],
2713 install_rpath : rootlibexecdir,
2715 install_dir : rootlibexecdir)
2717 executable('systemd-growfs',
2718 'src/partition/growfs.c',
2719 include_directories : includes,
2720 link_with : [libshared],
2721 dependencies : [libcryptsetup],
2722 install_rpath : rootlibexecdir,
2724 install_dir : rootlibexecdir)
2728 'src/partition/makefs.c',
2729 include_directories : includes,
2730 link_with : [libshared],
2731 install_rpath : rootlibexecdir,
2733 install_dir : rootlibexecdir)
2737 'src/sleep/sleep.c',
2738 include_directories : includes,
2739 link_with : [libshared],
2740 install_rpath : rootlibexecdir,
2742 install_dir : rootlibexecdir)
2744 install_data('src/sleep/sleep.conf',
2745 install_dir : pkgsysconfdir)
2747 public_programs += executable(
2749 'src/sysctl/sysctl.c',
2750 include_directories : includes,
2751 link_with : [libshared],
2752 install_rpath : rootlibexecdir,
2754 install_dir : rootlibexecdir)
2758 'src/ac-power/ac-power.c',
2759 include_directories : includes,
2760 link_with : [libshared],
2761 install_rpath : rootlibexecdir,
2763 install_dir : rootlibexecdir)
2765 public_programs += executable(
2766 'systemd-detect-virt',
2767 'src/detect-virt/detect-virt.c',
2768 include_directories : includes,
2769 link_with : [libshared],
2770 install_rpath : rootlibexecdir,
2773 public_programs += executable(
2775 'src/delta/delta.c',
2776 include_directories : includes,
2777 link_with : [libshared],
2778 install_rpath : rootlibexecdir,
2781 public_programs += executable(
2783 'src/escape/escape.c',
2784 include_directories : includes,
2785 link_with : [libshared],
2786 install_rpath : rootlibexecdir,
2788 install_dir : rootbindir)
2790 public_programs += executable(
2792 'src/notify/notify.c',
2793 include_directories : includes,
2794 link_with : [libshared],
2795 install_rpath : rootlibexecdir,
2797 install_dir : rootbindir)
2800 'systemd-volatile-root',
2801 'src/volatile-root/volatile-root.c',
2802 include_directories : includes,
2803 link_with : [libshared],
2804 install_rpath : rootlibexecdir,
2805 install : conf.get('ENABLE_INITRD') == 1,
2806 install_dir : rootlibexecdir)
2809 'systemd-cgroups-agent',
2810 'src/cgroups-agent/cgroups-agent.c',
2811 include_directories : includes,
2812 link_with : [libshared],
2813 install_rpath : rootlibexecdir,
2815 install_dir : rootlibexecdir)
2817 public_programs += executable(
2819 'src/id128/id128.c',
2820 include_directories : includes,
2821 link_with : [libshared],
2822 install_rpath : rootlibexecdir,
2825 public_programs += executable(
2828 include_directories : includes,
2829 link_with : [libshared],
2830 install_rpath : rootlibexecdir,
2833 public_programs += executable(
2834 'systemd-ask-password',
2835 'src/ask-password/ask-password.c',
2836 include_directories : includes,
2837 link_with : [libshared],
2838 install_rpath : rootlibexecdir,
2840 install_dir : rootbindir)
2843 'systemd-reply-password',
2844 'src/reply-password/reply-password.c',
2845 include_directories : includes,
2846 link_with : [libshared],
2847 install_rpath : rootlibexecdir,
2849 install_dir : rootlibexecdir)
2851 public_programs += executable(
2852 'systemd-tty-ask-password-agent',
2853 'src/tty-ask-password-agent/tty-ask-password-agent.c',
2854 include_directories : includes,
2855 link_with : [libshared],
2856 install_rpath : rootlibexecdir,
2858 install_dir : rootbindir)
2860 public_programs += executable(
2863 include_directories : includes,
2864 link_with : [libshared],
2865 install_rpath : rootlibexecdir,
2868 public_programs += executable(
2870 'src/cgtop/cgtop.c',
2871 include_directories : includes,
2872 link_with : [libshared],
2873 install_rpath : rootlibexecdir,
2878 'src/initctl/initctl.c',
2879 include_directories : includes,
2880 link_with : [libshared],
2881 install_rpath : rootlibexecdir,
2882 install : (conf.get('HAVE_SYSV_COMPAT') == 1),
2883 install_dir : rootlibexecdir)
2885 public_programs += executable(
2887 'src/mount/mount-tool.c',
2888 include_directories : includes,
2889 link_with : [libshared],
2890 dependencies: [libmount],
2891 install_rpath : rootlibexecdir,
2894 meson.add_install_script(meson_make_symlink,
2895 'systemd-mount', join_paths(bindir, 'systemd-umount'))
2897 public_programs += executable(
2900 include_directories : includes,
2901 link_with : [libshared],
2902 install_rpath : rootlibexecdir,
2905 public_programs += executable(
2906 'systemd-stdio-bridge',
2907 'src/stdio-bridge/stdio-bridge.c',
2908 include_directories : includes,
2909 link_with : [libshared],
2910 dependencies : [versiondep],
2911 install_rpath : rootlibexecdir,
2914 public_programs += executable(
2916 'src/busctl/busctl.c',
2917 'src/busctl/busctl-introspect.c',
2918 'src/busctl/busctl-introspect.h',
2919 include_directories : includes,
2920 link_with : [libshared],
2921 install_rpath : rootlibexecdir,
2924 if conf.get('ENABLE_SYSUSERS') == 1
2925 public_programs += executable(
2927 'src/sysusers/sysusers.c',
2928 include_directories : includes,
2929 link_with : [libshared],
2930 install_rpath : rootlibexecdir,
2932 install_dir : rootbindir)
2935 if conf.get('ENABLE_TMPFILES') == 1
2938 'src/tmpfiles/tmpfiles.c',
2939 'src/tmpfiles/offline-passwd.c',
2940 'src/tmpfiles/offline-passwd.h',
2941 include_directories : includes,
2942 link_with : [libshared],
2943 dependencies : [libacl],
2944 install_rpath : rootlibexecdir,
2946 install_dir : rootbindir)
2947 public_programs += exe
2949 if want_tests != 'false'
2950 test('test-systemd-tmpfiles',
2951 test_systemd_tmpfiles_py,
2952 # https://github.com/mesonbuild/meson/issues/2681
2953 args : exe.full_path())
2957 if conf.get('ENABLE_HWDB') == 1
2958 public_programs += executable(
2961 'src/libsystemd/sd-hwdb/hwdb-internal.h',
2962 include_directories : includes,
2963 link_with : [libudev_static],
2964 install_rpath : udev_rpath,
2966 install_dir : rootbindir)
2969 if conf.get('ENABLE_QUOTACHECK') == 1
2971 'systemd-quotacheck',
2972 'src/quotacheck/quotacheck.c',
2973 include_directories : includes,
2974 link_with : [libshared],
2975 install_rpath : rootlibexecdir,
2977 install_dir : rootlibexecdir)
2980 public_programs += executable(
2981 'systemd-socket-proxyd',
2982 'src/socket-proxy/socket-proxyd.c',
2983 include_directories : includes,
2984 link_with : [libshared],
2985 dependencies : [threads],
2986 install_rpath : rootlibexecdir,
2988 install_dir : rootlibexecdir)
2990 public_programs += executable(
2993 c_args : '-DLOG_REALM=LOG_REALM_UDEV',
2994 include_directories : includes,
2995 link_with : [libudev_core,
2998 dependencies : [versiondep,
3004 install_rpath : udev_rpath,
3006 install_dir : rootbindir)
3010 systemd_shutdown_sources,
3011 include_directories : includes,
3012 link_with : [libcore_shared,
3014 dependencies : [libmount],
3015 install_rpath : rootlibexecdir,
3017 install_dir : rootlibexecdir)
3020 'systemd-update-done',
3021 'src/update-done/update-done.c',
3022 include_directories : includes,
3023 link_with : [libshared],
3024 install_rpath : rootlibexecdir,
3026 install_dir : rootlibexecdir)
3029 'systemd-update-utmp',
3030 'src/update-utmp/update-utmp.c',
3031 include_directories : includes,
3032 link_with : [libshared],
3033 dependencies : [libaudit],
3034 install_rpath : rootlibexecdir,
3036 install_dir : rootlibexecdir)
3038 if conf.get('HAVE_KMOD') == 1
3040 'systemd-modules-load',
3041 'src/modules-load/modules-load.c',
3042 include_directories : includes,
3043 link_with : [libshared],
3044 dependencies : [libkmod],
3045 install_rpath : rootlibexecdir,
3047 install_dir : rootlibexecdir)
3049 meson.add_install_script('sh', '-c',
3050 mkdir_p.format(modulesloaddir))
3051 meson.add_install_script('sh', '-c',
3052 mkdir_p.format(join_paths(sysconfdir, 'modules-load.d')))
3055 public_programs += executable(
3057 systemd_nspawn_sources,
3058 include_directories : includes,
3059 link_with : [libcore_shared,
3062 dependencies : [libblkid,
3064 install_rpath : rootlibexecdir,
3067 if conf.get('ENABLE_NETWORKD') == 1
3070 systemd_networkd_sources,
3071 include_directories : network_include_dir,
3072 link_with : [libnetworkd_core,
3075 networkd_link_with],
3076 dependencies : [threads],
3077 install_rpath : rootlibexecdir,
3079 install_dir : rootlibexecdir)
3082 'systemd-networkd-wait-online',
3083 systemd_networkd_wait_online_sources,
3084 include_directories : includes,
3085 link_with : [libnetworkd_core,
3086 networkd_link_with],
3087 install_rpath : rootlibexecdir,
3089 install_dir : rootlibexecdir)
3091 public_programs += executable(
3094 include_directories : includes,
3095 link_with : [libsystemd_network,
3096 networkd_link_with],
3097 install_rpath : rootlibexecdir,
3099 install_dir : rootbindir)
3102 'systemd-network-generator',
3103 network_generator_sources,
3104 include_directories : includes,
3105 link_with : [networkd_link_with],
3106 install_rpath : rootlibexecdir,
3108 install_dir : rootlibexecdir)
3110 if want_tests != 'false'
3111 test('test-network-generator-conversion',
3112 test_network_generator_conversion_sh,
3113 # https://github.com/mesonbuild/meson/issues/2681
3114 args : exe.full_path())
3119 'systemd-sulogin-shell',
3120 ['src/sulogin-shell/sulogin-shell.c'],
3121 include_directories : includes,
3122 link_with : [libshared],
3123 install_rpath : rootlibexecdir,
3125 install_dir : rootlibexecdir)
3127 ############################################################
3130 'systemd-runtest.env',
3131 output : 'systemd-runtest.env',
3132 command : ['sh', '-c', '{ ' +
3133 'echo SYSTEMD_TEST_DATA=@0@; '.format(join_paths(project_source_root, 'test')) +
3134 'echo SYSTEMD_CATALOG_DIR=@0@; '.format(join_paths(project_build_root, 'catalog')) +
3136 build_by_default : true)
3138 foreach tuple : tests
3140 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3141 dependencies = tuple[2]
3142 condition = tuple.length() >= 4 ? tuple[3] : ''
3143 type = tuple.length() >= 5 ? tuple[4] : ''
3144 defs = tuple.length() >= 6 ? tuple[5] : []
3145 incs = tuple.length() >= 7 ? tuple[6] : includes
3148 name = sources[0].split('/')[-1].split('.')[0]
3149 if type.startswith('timeout=')
3150 timeout = type.split('=')[1].to_int()
3154 if condition == '' or conf.get(condition) == 1
3158 include_directories : incs,
3159 link_with : link_with,
3160 dependencies : [versiondep,
3163 build_by_default : want_tests != 'false',
3164 install_rpath : rootlibexecdir,
3165 install : install_tests,
3166 install_dir : join_paths(testsdir, type))
3169 message('@0@ is a manual test'.format(name))
3170 elif type == 'unsafe' and want_tests != 'unsafe'
3171 message('@0@ is an unsafe test'.format(name))
3172 elif want_tests != 'false'
3178 message('Not compiling @0@ because @1@ is not true'.format(name, condition))
3183 'test-libsystemd-sym',
3184 test_libsystemd_sym_c,
3185 include_directories : includes,
3186 link_with : [libsystemd],
3187 build_by_default : want_tests != 'false',
3188 install : install_tests,
3189 install_dir : testsdir)
3190 if want_tests != 'false'
3191 test('test-libsystemd-sym', exe)
3195 'test-libsystemd-static-sym',
3196 test_libsystemd_sym_c,
3197 include_directories : includes,
3198 link_with : [install_libsystemd_static],
3199 dependencies : [threads], # threads is already included in dependencies on the library,
3200 # but does not seem to get propagated. Add here as a work-around.
3201 build_by_default : want_tests != 'false' and static_libsystemd_pic,
3202 install : install_tests and static_libsystemd_pic,
3203 install_dir : testsdir)
3204 if want_tests != 'false' and static_libsystemd_pic
3205 test('test-libsystemd-static-sym', exe)
3211 include_directories : includes,
3212 c_args : '-Wno-deprecated-declarations',
3213 link_with : [libudev],
3214 build_by_default : want_tests != 'false',
3215 install : install_tests,
3216 install_dir : testsdir)
3217 if want_tests != 'false'
3218 test('test-libudev-sym', exe)
3222 'test-libudev-static-sym',
3224 include_directories : includes,
3225 c_args : '-Wno-deprecated-declarations',
3226 link_with : [install_libudev_static],
3227 build_by_default : want_tests != 'false' and static_libudev_pic,
3228 install : install_tests and static_libudev_pic,
3229 install_dir : testsdir)
3230 if want_tests != 'false' and static_libudev_pic
3231 test('test-libudev-static-sym', exe)
3234 ############################################################
3238 if get_option('tests') != 'false'
3239 foreach tuple : fuzzers
3241 link_with = tuple[1].length() > 0 ? tuple[1] : [libshared]
3242 dependencies = tuple[2]
3243 defs = tuple.length() >= 4 ? tuple[3] : []
3244 incs = tuple.length() >= 5 ? tuple[4] : includes
3248 dependencies += fuzzing_engine
3250 if fuzzing_engine.found()
3251 dependencies += fuzzing_engine
3253 link_args += ['-fsanitize=fuzzer']
3256 sources += 'src/fuzz/fuzz-main.c'
3259 name = sources[0].split('/')[-1].split('.')[0]
3261 fuzzer_exes += executable(
3264 include_directories : [incs, include_directories('src/fuzz')],
3265 link_with : link_with,
3266 dependencies : dependencies,
3268 link_args: link_args,
3275 depends : fuzzer_exes,
3278 ############################################################
3280 make_directive_index_py = find_program('tools/make-directive-index.py')
3281 make_man_index_py = find_program('tools/make-man-index.py')
3282 xml_helper_py = find_program('tools/xml_helper.py')
3283 hwdb_update_sh = find_program('tools/hwdb-update.sh')
3284 autosuspend_update_sh = find_program('tools/autosuspend-update.sh')
3287 subdir('sysusers.d')
3288 subdir('tmpfiles.d')
3294 subdir('shell-completion/bash')
3295 subdir('shell-completion/zsh')
3296 subdir('docs/sysvinit')
3297 subdir('docs/var-log')
3299 install_subdir('factory/etc',
3300 install_dir : factorydir)
3302 install_data('xorg/50-systemd-user.sh',
3303 install_dir : xinitrcdir)
3304 install_data('modprobe.d/systemd.conf',
3305 install_dir : modprobedir)
3306 install_data('LICENSE.GPL2',
3310 'docs/CODING_STYLE.md',
3311 'docs/DISTRO_PORTING.md',
3312 'docs/ENVIRONMENT.md',
3314 'docs/TRANSIENT-SETTINGS.md',
3315 'docs/TRANSLATORS.md',
3316 'docs/UIDS-GIDS.md',
3317 'src/libsystemd/sd-bus/GVARIANT-SERIALIZATION',
3318 install_dir : docdir)
3320 meson.add_install_script('sh', '-c', mkdir_p.format(systemdstatedir))
3321 meson.add_install_script('sh', '-c', 'touch $DESTDIR@0@'.format(prefixdir))
3323 ############################################################
3325 check_help = find_program('tools/check-help.sh')
3327 foreach exec : public_programs
3328 name = exec.full_path().split('/')[-1]
3329 if want_tests != 'false'
3330 test('check-help-' + name,
3332 args : exec.full_path())
3336 ############################################################
3338 check_directives_sh = find_program('tools/check-directives.sh')
3340 if want_tests != 'false'
3341 test('check-directives',
3342 check_directives_sh,
3343 args : project_source_root)
3346 ############################################################
3348 # Enable tests for all supported sanitizers
3349 foreach tuple : sanitizers
3350 sanitizer = tuple[0]
3353 if cc.has_link_argument('-fsanitize=@0@'.format(sanitizer))
3355 foreach p : fuzz_regression_tests
3356 b = p.split('/')[-2]
3357 c = p.split('/')[-1]
3359 name = '@0@:@1@'.format(b, sanitizer)
3362 if want_tests == 'false'
3363 message('Not compiling @0@ because tests is set to false'.format(name))
3364 elif slow_tests or fuzz_tests
3365 exe = custom_target(
3369 command : [env, 'ln', '-fs',
3370 join_paths(build.full_path(), b),
3372 build_by_default : true)
3374 message('Not compiling @0@ because slow-tests/fuzz-tests is set to false'.format(name))
3379 if want_tests != 'false' and (slow_tests or fuzz_tests)
3380 test('@0@:@1@:@2@'.format(b, c, sanitizer),
3382 env : ['UBSAN_OPTIONS=print_stacktrace=1:print_summary=1:halt_on_error=1'],
3384 args : [exe.full_path(),
3385 join_paths(project_source_root, p)])
3392 ############################################################
3395 all_files = run_command(
3397 ['--git-dir=@0@/.git'.format(project_source_root),
3400 all_files = files(all_files.stdout().split())
3405 command : [env, 'etags', '-o', '@0@/TAGS'.format(project_source_root)] + all_files)
3408 command : [env, 'ctags', '-o', '@0@/tags'.format(project_source_root)] + all_files)
3412 git_contrib_sh = find_program('tools/git-contrib.sh')
3415 command : [git_contrib_sh])
3419 git_head = run_command(
3421 ['--git-dir=@0@/.git'.format(project_source_root),
3422 'rev-parse', 'HEAD']).stdout().strip()
3423 git_head_short = run_command(
3425 ['--git-dir=@0@/.git'.format(project_source_root),
3426 'rev-parse', '--short=7', 'HEAD']).stdout().strip()
3430 command : ['git', 'archive',
3431 '-o', '@0@/systemd-@1@.tar.gz'.format(project_source_root,
3433 '--prefix', 'systemd-@0@/'.format(git_head),
3437 ############################################################
3439 check_api_docs_sh = find_program('tools/check-api-docs.sh')
3442 depends : [man, libsystemd, libudev],
3443 command : [check_api_docs_sh, libsystemd.full_path(), libudev.full_path()])
3445 ############################################################
3446 watchdog_opt = service_watchdog == '' ? 'disabled' : service_watchdog
3449 '@0@ @1@'.format(meson.project_name(), meson.project_version()),
3451 'split /usr: @0@'.format(split_usr),
3452 'split bin-sbin: @0@'.format(split_bin),
3453 'prefix directory: @0@'.format(prefixdir),
3454 'rootprefix directory: @0@'.format(rootprefixdir),
3455 'sysconf directory: @0@'.format(sysconfdir),
3456 'include directory: @0@'.format(includedir),
3457 'lib directory: @0@'.format(libdir),
3458 'rootlib directory: @0@'.format(rootlibdir),
3459 'SysV init scripts: @0@'.format(sysvinit_path),
3460 'SysV rc?.d directories: @0@'.format(sysvrcnd_path),
3461 'PAM modules directory: @0@'.format(pamlibdir),
3462 'PAM configuration directory: @0@'.format(pamconfdir),
3463 'RPM macros directory: @0@'.format(rpmmacrosdir),
3464 'modprobe.d directory: @0@'.format(modprobedir),
3465 'D-Bus policy directory: @0@'.format(dbuspolicydir),
3466 'D-Bus session directory: @0@'.format(dbussessionservicedir),
3467 'D-Bus system directory: @0@'.format(dbussystemservicedir),
3468 'bash completions directory: @0@'.format(bashcompletiondir),
3469 'zsh completions directory: @0@'.format(zshcompletiondir),
3470 'extra start script: @0@'.format(get_option('rc-local')),
3471 'debug shell: @0@ @ @1@'.format(get_option('debug-shell'),
3472 get_option('debug-tty')),
3473 'TTY GID: @0@'.format(tty_gid),
3474 'users GID: @0@'.format(substs.get('USERS_GID')),
3475 'maximum system UID: @0@'.format(system_uid_max),
3476 'maximum system GID: @0@'.format(system_gid_max),
3477 'minimum dynamic UID: @0@'.format(dynamic_uid_min),
3478 'maximum dynamic UID: @0@'.format(dynamic_uid_max),
3479 'minimum container UID base: @0@'.format(container_uid_base_min),
3480 'maximum container UID base: @0@'.format(container_uid_base_max),
3481 '/dev/kvm access mode: @0@'.format(get_option('dev-kvm-mode')),
3482 'render group access mode: @0@'.format(get_option('group-render-mode')),
3483 'certificate root directory: @0@'.format(get_option('certificate-root')),
3484 'support URL: @0@'.format(support_url),
3485 'nobody user name: @0@'.format(nobody_user),
3486 'nobody group name: @0@'.format(nobody_group),
3487 'fallback hostname: @0@'.format(get_option('fallback-hostname')),
3488 'symbolic gateway hostnames: @0@'.format(', '.join(gateway_hostnames)),
3490 'default DNSSEC mode: @0@'.format(default_dnssec),
3491 'default DNS-over-TLS mode: @0@'.format(default_dns_over_tls),
3492 'default mDNS mode: @0@'.format(default_mdns),
3493 'default LLMNR mode: @0@'.format(default_llmnr),
3494 'default cgroup hierarchy: @0@'.format(default_hierarchy),
3495 'default net.naming-scheme setting: @0@'.format(default_net_naming_scheme),
3496 'default KillUserProcesses setting: @0@'.format(kill_user_processes),
3497 'default locale: @0@'.format(default_locale),
3498 'default user $PATH: @0@'.format(default_user_path_display),
3499 'systemd service watchdog: @0@'.format(watchdog_opt)]
3501 alt_dns_servers = '\n '.join(dns_servers.split(' '))
3502 alt_ntp_servers = '\n '.join(ntp_servers.split(' '))
3504 'default DNS servers: @0@'.format(alt_dns_servers),
3505 'default NTP servers: @0@'.format(alt_ntp_servers)]
3507 alt_time_epoch = run_command('date', '-Is', '-u', '-d',
3508 '@@0@'.format(time_epoch)).stdout().strip()
3510 'time epoch: @0@ (@1@)'.format(time_epoch, alt_time_epoch)]
3513 'static libsystemd: @0@'.format(static_libsystemd),
3514 'static libudev: @0@'.format(static_libudev)]
3517 # CFLAGS: ${OUR_CFLAGS} ${CFLAGS}
3518 # CPPFLAGS: ${OUR_CPPFLAGS} ${CPPFLAGS}
3519 # LDFLAGS: ${OUR_LDFLAGS} ${LDFLAGS}
3521 if conf.get('ENABLE_EFI') == 1
3522 status += 'efi arch: @0@'.format(efi_arch)
3526 'EFI machine type: @0@'.format(EFI_MACHINE_TYPE_NAME),
3527 'EFI CC @0@'.format(' '.join(efi_cc)),
3528 'EFI lds: @0@'.format(efi_lds),
3529 'EFI crt0: @0@'.format(efi_crt0),
3530 'EFI include directory: @0@'.format(efi_incdir)]
3591 ['DNS-over-TLS(gnutls)', conf.get('DNS_OVER_TLS_USE_GNUTLS') == 1],
3592 ['DNS-over-TLS(openssl)', conf.get('DNS_OVER_TLS_USE_OPENSSL') == 1],
3596 ['legacy pkla', install_polkit_pkla],
3598 ['gnu-efi', have_gnu_efi],
3611 ['man pages', want_man],
3612 ['html pages', want_html],
3613 ['man page indices', want_man and have_lxml],
3618 ['adm group', get_option('adm-group')],
3619 ['wheel group', get_option('wheel-group')],
3622 ['debug mmap cache'],
3624 ['valgrind', conf.get('VALGRIND') == 1],
3625 ['trace logging', conf.get('LOG_TRACE') == 1],
3626 ['install tests', install_tests],
3627 ['link-udev-shared', get_option('link-udev-shared')],
3628 ['link-systemctl-shared', get_option('link-systemctl-shared')],
3629 ['link-networkd-shared', get_option('link-networkd-shared')],
3630 ['link-timesyncd-shared', get_option('link-timesyncd-shared')],
3631 ['kernel-install', get_option('kernel-install')],
3632 ['systemd-analyze', get_option('analyze')],
3635 if tuple.length() >= 2
3638 ident1 = 'HAVE_' + tuple[0].underscorify().to_upper()
3639 ident2 = 'ENABLE_' + tuple[0].underscorify().to_upper()
3640 cond = conf.get(ident1, 0) == 1 or conf.get(ident2, 0) == 1
3651 'enabled features: @0@'.format(', '.join(found)),
3653 'disabled features: @0@'.format(', '.join(missing)),
3655 message('\n '.join(status))
3657 if rootprefixdir != rootprefix_default
3659 'Note that the installation prefix was changed to "@0@".\n'.format(rootprefixdir) +
3660 'systemd used fixed names for unit file directories and other paths, so anything\n' +
3661 'except the default ("@0@") is strongly discouraged.'.format(rootprefix_default))